{
return try {
@@ -57,7 +62,7 @@ class BinanceNetworkManager(isTestNet: Boolean) {
for (binanceFee in feeData) {
if (binanceFee.transactionFee != null) {
fee = binanceFee.transactionFee?.value?.toBigDecimal()
- ?.movePointLeft(Blockchain.Binance.decimals.toInt())
+ ?.movePointLeft(Blockchain.Binance.decimals())
break
}
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceResponse.kt
similarity index 87%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceResponse.kt
index 19b1d6790e..94ac501363 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/network/BinanceResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.binance.network
+package com.tangem.blockchain.blockchains.binance.network
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrder.java
similarity index 82%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrder.java
index 25851c0dd9..848458ae27 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
*
@@ -87,15 +87,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.CancelOrder.class, com.tangem.blockchain.binance.proto.CancelOrder.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrder.class, com.tangem.blockchain.blockchains.binance.proto.CancelOrder.Builder.class);
}
public static final int SENDER_FIELD_NUMBER = 1;
@@ -247,10 +247,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.CancelOrder)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.CancelOrder)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.CancelOrder other = (com.tangem.blockchain.binance.proto.CancelOrder) obj;
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrder other = (com.tangem.blockchain.blockchains.binance.proto.CancelOrder) obj;
if (!getSender()
.equals(other.getSender())) return false;
@@ -280,69 +280,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.CancelOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -355,7 +355,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.CancelOrder prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.CancelOrder prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -380,21 +380,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.CancelOrder)
- com.tangem.blockchain.binance.proto.CancelOrderOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrderOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.CancelOrder.class, com.tangem.blockchain.binance.proto.CancelOrder.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrder.class, com.tangem.blockchain.blockchains.binance.proto.CancelOrder.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.CancelOrder.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.CancelOrder.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -424,17 +424,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_CancelOrder_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.CancelOrder getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.CancelOrder.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.CancelOrder getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.CancelOrder.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.CancelOrder build() {
- com.tangem.blockchain.binance.proto.CancelOrder result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.CancelOrder build() {
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrder result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -442,8 +442,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.CancelOrder buildPartial() {
- com.tangem.blockchain.binance.proto.CancelOrder result = new com.tangem.blockchain.binance.proto.CancelOrder(this);
+ public com.tangem.blockchain.blockchains.binance.proto.CancelOrder buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrder result = new com.tangem.blockchain.blockchains.binance.proto.CancelOrder(this);
result.sender_ = sender_;
result.symbol_ = symbol_;
result.refid_ = refid_;
@@ -485,16 +485,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.CancelOrder) {
- return mergeFrom((com.tangem.blockchain.binance.proto.CancelOrder)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.CancelOrder) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.CancelOrder)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.CancelOrder other) {
- if (other == com.tangem.blockchain.binance.proto.CancelOrder.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.CancelOrder other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.CancelOrder.getDefaultInstance()) return this;
if (other.getSender() != com.google.protobuf.ByteString.EMPTY) {
setSender(other.getSender());
}
@@ -521,11 +521,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.CancelOrder parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.CancelOrder parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.CancelOrder) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.CancelOrder) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -770,12 +770,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.CancelOrder)
- private static final com.tangem.blockchain.binance.proto.CancelOrder DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.CancelOrder DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.CancelOrder();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.CancelOrder();
}
- public static com.tangem.blockchain.binance.proto.CancelOrder getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.CancelOrder getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -800,7 +800,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.CancelOrder getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.CancelOrder getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrderOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrderOrBuilder.java
similarity index 95%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrderOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrderOrBuilder.java
index 0e64ead9c6..d38131e1a8 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/CancelOrderOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/CancelOrderOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface CancelOrderOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.CancelOrder)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrder.java
similarity index 87%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrder.java
index dbcdad4485..3772da239c 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
*
@@ -112,15 +112,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.NewOrder.class, com.tangem.blockchain.binance.proto.NewOrder.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.NewOrder.class, com.tangem.blockchain.blockchains.binance.proto.NewOrder.Builder.class);
}
public static final int SENDER_FIELD_NUMBER = 1;
@@ -372,10 +372,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.NewOrder)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.NewOrder)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.NewOrder other = (com.tangem.blockchain.binance.proto.NewOrder) obj;
+ com.tangem.blockchain.blockchains.binance.proto.NewOrder other = (com.tangem.blockchain.blockchains.binance.proto.NewOrder) obj;
if (!getSender()
.equals(other.getSender())) return false;
@@ -430,69 +430,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.NewOrder parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -505,7 +505,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.NewOrder prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.NewOrder prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -530,21 +530,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.NewOrder)
- com.tangem.blockchain.binance.proto.NewOrderOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.NewOrderOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.NewOrder.class, com.tangem.blockchain.binance.proto.NewOrder.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.NewOrder.class, com.tangem.blockchain.blockchains.binance.proto.NewOrder.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.NewOrder.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.NewOrder.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -584,17 +584,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_NewOrder_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.NewOrder getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.NewOrder.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.NewOrder getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.NewOrder.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.NewOrder build() {
- com.tangem.blockchain.binance.proto.NewOrder result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.NewOrder build() {
+ com.tangem.blockchain.blockchains.binance.proto.NewOrder result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -602,8 +602,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.NewOrder buildPartial() {
- com.tangem.blockchain.binance.proto.NewOrder result = new com.tangem.blockchain.binance.proto.NewOrder(this);
+ public com.tangem.blockchain.blockchains.binance.proto.NewOrder buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.NewOrder result = new com.tangem.blockchain.blockchains.binance.proto.NewOrder(this);
result.sender_ = sender_;
result.id_ = id_;
result.symbol_ = symbol_;
@@ -650,16 +650,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.NewOrder) {
- return mergeFrom((com.tangem.blockchain.binance.proto.NewOrder)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.NewOrder) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.NewOrder)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.NewOrder other) {
- if (other == com.tangem.blockchain.binance.proto.NewOrder.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.NewOrder other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.NewOrder.getDefaultInstance()) return this;
if (other.getSender() != com.google.protobuf.ByteString.EMPTY) {
setSender(other.getSender());
}
@@ -701,11 +701,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.NewOrder parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.NewOrder parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.NewOrder) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.NewOrder) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -1140,12 +1140,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.NewOrder)
- private static final com.tangem.blockchain.binance.proto.NewOrder DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.NewOrder DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.NewOrder();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.NewOrder();
}
- public static com.tangem.blockchain.binance.proto.NewOrder getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.NewOrder getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -1170,7 +1170,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.NewOrder getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.NewOrder getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrderOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrderOrBuilder.java
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrderOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrderOrBuilder.java
index 90cc743439..42c4c45549 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/NewOrderOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/NewOrderOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface NewOrderOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.NewOrder)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Send.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Send.java
similarity index 75%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/Send.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Send.java
index b5b491d6ac..6a8d21f1f9 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Send.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Send.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
*
@@ -50,20 +50,20 @@ private static final long serialVersionUID = 0L;
break;
case 10: {
if (!((mutable_bitField0_ & 0x00000001) != 0)) {
- inputs_ = new java.util.ArrayList();
+ inputs_ = new java.util.ArrayList();
mutable_bitField0_ |= 0x00000001;
}
inputs_.add(
- input.readMessage(com.tangem.blockchain.binance.proto.Send.Input.parser(), extensionRegistry));
+ input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Input.parser(), extensionRegistry));
break;
}
case 18: {
if (!((mutable_bitField0_ & 0x00000002) != 0)) {
- outputs_ = new java.util.ArrayList();
+ outputs_ = new java.util.ArrayList();
mutable_bitField0_ |= 0x00000002;
}
outputs_.add(
- input.readMessage(com.tangem.blockchain.binance.proto.Send.Output.parser(), extensionRegistry));
+ input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Output.parser(), extensionRegistry));
break;
}
default: {
@@ -93,15 +93,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.class, com.tangem.blockchain.binance.proto.Send.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.class, com.tangem.blockchain.blockchains.binance.proto.Send.Builder.class);
}
public interface TokenOrBuilder extends
@@ -199,15 +199,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.Token.class, com.tangem.blockchain.binance.proto.Send.Token.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token.class, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder.class);
}
public static final int DENOM_FIELD_NUMBER = 1;
@@ -299,10 +299,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.Send.Token)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Token)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.Send.Token other = (com.tangem.blockchain.binance.proto.Send.Token) obj;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token other = (com.tangem.blockchain.blockchains.binance.proto.Send.Token) obj;
if (!getDenom()
.equals(other.getDenom())) return false;
@@ -329,69 +329,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Token parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -404,7 +404,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send.Token prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send.Token prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -429,21 +429,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.Send.Token)
- com.tangem.blockchain.binance.proto.Send.TokenOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.Token.class, com.tangem.blockchain.binance.proto.Send.Token.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token.class, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.Send.Token.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.Token.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -471,17 +471,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Token_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Token getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Token build() {
- com.tangem.blockchain.binance.proto.Send.Token result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token build() {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -489,8 +489,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Token buildPartial() {
- com.tangem.blockchain.binance.proto.Send.Token result = new com.tangem.blockchain.binance.proto.Send.Token(this);
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token result = new com.tangem.blockchain.blockchains.binance.proto.Send.Token(this);
result.denom_ = denom_;
result.amount_ = amount_;
onBuilt();
@@ -531,16 +531,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.Send.Token) {
- return mergeFrom((com.tangem.blockchain.binance.proto.Send.Token)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Token) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send.Token)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send.Token other) {
- if (other == com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send.Token other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance()) return this;
if (!other.getDenom().isEmpty()) {
denom_ = other.denom_;
onChanged();
@@ -563,11 +563,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.Send.Token parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.Send.Token) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send.Token) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -688,12 +688,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.Send.Token)
- private static final com.tangem.blockchain.binance.proto.Send.Token DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.Send.Token DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send.Token();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send.Token();
}
- public static com.tangem.blockchain.binance.proto.Send.Token getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Token getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -718,7 +718,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Token getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
@@ -736,12 +736,12 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- java.util.List
+ java.util.List
getCoinsList();
/**
* repeated .transaction.Send.Token coins = 2;
*/
- com.tangem.blockchain.binance.proto.Send.Token getCoins(int index);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index);
/**
* repeated .transaction.Send.Token coins = 2;
*/
@@ -749,12 +749,12 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- java.util.List extends com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsOrBuilderList();
/**
* repeated .transaction.Send.Token coins = 2;
*/
- com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+ com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
int index);
}
/**
@@ -805,11 +805,11 @@ private static final long serialVersionUID = 0L;
}
case 18: {
if (!((mutable_bitField0_ & 0x00000002) != 0)) {
- coins_ = new java.util.ArrayList();
+ coins_ = new java.util.ArrayList();
mutable_bitField0_ |= 0x00000002;
}
coins_.add(
- input.readMessage(com.tangem.blockchain.binance.proto.Send.Token.parser(), extensionRegistry));
+ input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Token.parser(), extensionRegistry));
break;
}
default: {
@@ -836,15 +836,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.Input.class, com.tangem.blockchain.binance.proto.Send.Input.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input.class, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder.class);
}
private int bitField0_;
@@ -858,17 +858,17 @@ private static final long serialVersionUID = 0L;
}
public static final int COINS_FIELD_NUMBER = 2;
- private java.util.List coins_;
+ private java.util.List coins_;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List getCoinsList() {
+ public java.util.List getCoinsList() {
return coins_;
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsOrBuilderList() {
return coins_;
}
@@ -881,13 +881,13 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
return coins_.get(index);
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
int index) {
return coins_.get(index);
}
@@ -939,10 +939,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.Send.Input)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Input)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.Send.Input other = (com.tangem.blockchain.binance.proto.Send.Input) obj;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input other = (com.tangem.blockchain.blockchains.binance.proto.Send.Input) obj;
if (!getAddress()
.equals(other.getAddress())) return false;
@@ -970,69 +970,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Input parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -1045,7 +1045,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send.Input prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send.Input prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -1066,21 +1066,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.Send.Input)
- com.tangem.blockchain.binance.proto.Send.InputOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.Input.class, com.tangem.blockchain.binance.proto.Send.Input.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input.class, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.Send.Input.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.Input.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -1113,17 +1113,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Input_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Input getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Input build() {
- com.tangem.blockchain.binance.proto.Send.Input result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input build() {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -1131,8 +1131,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Input buildPartial() {
- com.tangem.blockchain.binance.proto.Send.Input result = new com.tangem.blockchain.binance.proto.Send.Input(this);
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input result = new com.tangem.blockchain.blockchains.binance.proto.Send.Input(this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
result.address_ = address_;
@@ -1184,16 +1184,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.Send.Input) {
- return mergeFrom((com.tangem.blockchain.binance.proto.Send.Input)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Input) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send.Input)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send.Input other) {
- if (other == com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send.Input other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance()) return this;
if (other.getAddress() != com.google.protobuf.ByteString.EMPTY) {
setAddress(other.getAddress());
}
@@ -1238,11 +1238,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.Send.Input parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.Send.Input) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send.Input) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -1282,22 +1282,22 @@ private static final long serialVersionUID = 0L;
return this;
}
- private java.util.List coins_ =
+ private java.util.List coins_ =
java.util.Collections.emptyList();
private void ensureCoinsIsMutable() {
if (!((bitField0_ & 0x00000002) != 0)) {
- coins_ = new java.util.ArrayList(coins_);
+ coins_ = new java.util.ArrayList(coins_);
bitField0_ |= 0x00000002;
}
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List getCoinsList() {
+ public java.util.List getCoinsList() {
if (coinsBuilder_ == null) {
return java.util.Collections.unmodifiableList(coins_);
} else {
@@ -1317,7 +1317,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
if (coinsBuilder_ == null) {
return coins_.get(index);
} else {
@@ -1328,7 +1328,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder setCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
if (coinsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -1345,7 +1345,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder setCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
coins_.set(index, builderForValue.build());
@@ -1358,7 +1358,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public Builder addCoins(com.tangem.blockchain.binance.proto.Send.Token value) {
+ public Builder addCoins(com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
if (coinsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -1375,7 +1375,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
if (coinsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -1392,7 +1392,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addCoins(
- com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
coins_.add(builderForValue.build());
@@ -1406,7 +1406,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
coins_.add(index, builderForValue.build());
@@ -1420,7 +1420,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addAllCoins(
- Iterable extends com.tangem.blockchain.binance.proto.Send.Token> values) {
+ Iterable extends com.tangem.blockchain.blockchains.binance.proto.Send.Token> values) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -1460,14 +1460,14 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token.Builder getCoinsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder getCoinsBuilder(
int index) {
return getCoinsFieldBuilder().getBuilder(index);
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
int index) {
if (coinsBuilder_ == null) {
return coins_.get(index); } else {
@@ -1477,7 +1477,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsOrBuilderList() {
if (coinsBuilder_ != null) {
return coinsBuilder_.getMessageOrBuilderList();
@@ -1488,31 +1488,31 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder() {
return getCoinsFieldBuilder().addBuilder(
- com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder(
int index) {
return getCoinsFieldBuilder().addBuilder(
- index, com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+ index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List
+ public java.util.List
getCoinsBuilderList() {
return getCoinsFieldBuilder().getBuilderList();
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsFieldBuilder() {
if (coinsBuilder_ == null) {
coinsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>(
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>(
coins_,
((bitField0_ & 0x00000002) != 0),
getParentForChildren(),
@@ -1538,12 +1538,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.Send.Input)
- private static final com.tangem.blockchain.binance.proto.Send.Input DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.Send.Input DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send.Input();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send.Input();
}
- public static com.tangem.blockchain.binance.proto.Send.Input getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Input getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -1568,7 +1568,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Input getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
@@ -1586,12 +1586,12 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- java.util.List
+ java.util.List
getCoinsList();
/**
* repeated .transaction.Send.Token coins = 2;
*/
- com.tangem.blockchain.binance.proto.Send.Token getCoins(int index);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index);
/**
* repeated .transaction.Send.Token coins = 2;
*/
@@ -1599,12 +1599,12 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- java.util.List extends com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsOrBuilderList();
/**
* repeated .transaction.Send.Token coins = 2;
*/
- com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+ com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
int index);
}
/**
@@ -1655,11 +1655,11 @@ private static final long serialVersionUID = 0L;
}
case 18: {
if (!((mutable_bitField0_ & 0x00000002) != 0)) {
- coins_ = new java.util.ArrayList();
+ coins_ = new java.util.ArrayList();
mutable_bitField0_ |= 0x00000002;
}
coins_.add(
- input.readMessage(com.tangem.blockchain.binance.proto.Send.Token.parser(), extensionRegistry));
+ input.readMessage(com.tangem.blockchain.blockchains.binance.proto.Send.Token.parser(), extensionRegistry));
break;
}
default: {
@@ -1686,15 +1686,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.Output.class, com.tangem.blockchain.binance.proto.Send.Output.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output.class, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder.class);
}
private int bitField0_;
@@ -1708,17 +1708,17 @@ private static final long serialVersionUID = 0L;
}
public static final int COINS_FIELD_NUMBER = 2;
- private java.util.List coins_;
+ private java.util.List coins_;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List getCoinsList() {
+ public java.util.List getCoinsList() {
return coins_;
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsOrBuilderList() {
return coins_;
}
@@ -1731,13 +1731,13 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
return coins_.get(index);
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
int index) {
return coins_.get(index);
}
@@ -1789,10 +1789,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.Send.Output)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Output)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.Send.Output other = (com.tangem.blockchain.binance.proto.Send.Output) obj;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output other = (com.tangem.blockchain.blockchains.binance.proto.Send.Output) obj;
if (!getAddress()
.equals(other.getAddress())) return false;
@@ -1820,69 +1820,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send.Output parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -1895,7 +1895,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send.Output prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send.Output prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -1916,21 +1916,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.Send.Output)
- com.tangem.blockchain.binance.proto.Send.OutputOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.Output.class, com.tangem.blockchain.binance.proto.Send.Output.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output.class, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.Send.Output.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.Output.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -1963,17 +1963,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_Output_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Output getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Output build() {
- com.tangem.blockchain.binance.proto.Send.Output result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output build() {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -1981,8 +1981,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Output buildPartial() {
- com.tangem.blockchain.binance.proto.Send.Output result = new com.tangem.blockchain.binance.proto.Send.Output(this);
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output result = new com.tangem.blockchain.blockchains.binance.proto.Send.Output(this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
result.address_ = address_;
@@ -2034,16 +2034,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.Send.Output) {
- return mergeFrom((com.tangem.blockchain.binance.proto.Send.Output)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send.Output) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send.Output)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send.Output other) {
- if (other == com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send.Output other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance()) return this;
if (other.getAddress() != com.google.protobuf.ByteString.EMPTY) {
setAddress(other.getAddress());
}
@@ -2088,11 +2088,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.Send.Output parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.Send.Output) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send.Output) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -2132,22 +2132,22 @@ private static final long serialVersionUID = 0L;
return this;
}
- private java.util.List coins_ =
+ private java.util.List coins_ =
java.util.Collections.emptyList();
private void ensureCoinsIsMutable() {
if (!((bitField0_ & 0x00000002) != 0)) {
- coins_ = new java.util.ArrayList(coins_);
+ coins_ = new java.util.ArrayList(coins_);
bitField0_ |= 0x00000002;
}
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder> coinsBuilder_;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List getCoinsList() {
+ public java.util.List getCoinsList() {
if (coinsBuilder_ == null) {
return java.util.Collections.unmodifiableList(coins_);
} else {
@@ -2167,7 +2167,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token getCoins(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token getCoins(int index) {
if (coinsBuilder_ == null) {
return coins_.get(index);
} else {
@@ -2178,7 +2178,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder setCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
if (coinsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -2195,7 +2195,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder setCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
coins_.set(index, builderForValue.build());
@@ -2208,7 +2208,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public Builder addCoins(com.tangem.blockchain.binance.proto.Send.Token value) {
+ public Builder addCoins(com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
if (coinsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -2225,7 +2225,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token value) {
if (coinsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -2242,7 +2242,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addCoins(
- com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
coins_.add(builderForValue.build());
@@ -2256,7 +2256,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addCoins(
- int index, com.tangem.blockchain.binance.proto.Send.Token.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder builderForValue) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
coins_.add(index, builderForValue.build());
@@ -2270,7 +2270,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Token coins = 2;
*/
public Builder addAllCoins(
- Iterable extends com.tangem.blockchain.binance.proto.Send.Token> values) {
+ Iterable extends com.tangem.blockchain.blockchains.binance.proto.Send.Token> values) {
if (coinsBuilder_ == null) {
ensureCoinsIsMutable();
com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -2310,14 +2310,14 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token.Builder getCoinsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder getCoinsBuilder(
int index) {
return getCoinsFieldBuilder().getBuilder(index);
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder getCoinsOrBuilder(
int index) {
if (coinsBuilder_ == null) {
return coins_.get(index); } else {
@@ -2327,7 +2327,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsOrBuilderList() {
if (coinsBuilder_ != null) {
return coinsBuilder_.getMessageOrBuilderList();
@@ -2338,31 +2338,31 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder() {
return getCoinsFieldBuilder().addBuilder(
- com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Token.Builder addCoinsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder addCoinsBuilder(
int index) {
return getCoinsFieldBuilder().addBuilder(
- index, com.tangem.blockchain.binance.proto.Send.Token.getDefaultInstance());
+ index, com.tangem.blockchain.blockchains.binance.proto.Send.Token.getDefaultInstance());
}
/**
* repeated .transaction.Send.Token coins = 2;
*/
- public java.util.List
+ public java.util.List
getCoinsBuilderList() {
return getCoinsFieldBuilder().getBuilderList();
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>
getCoinsFieldBuilder() {
if (coinsBuilder_ == null) {
coinsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Token, com.tangem.blockchain.binance.proto.Send.Token.Builder, com.tangem.blockchain.binance.proto.Send.TokenOrBuilder>(
+ com.tangem.blockchain.blockchains.binance.proto.Send.Token, com.tangem.blockchain.blockchains.binance.proto.Send.Token.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.TokenOrBuilder>(
coins_,
((bitField0_ & 0x00000002) != 0),
getParentForChildren(),
@@ -2388,12 +2388,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.Send.Output)
- private static final com.tangem.blockchain.binance.proto.Send.Output DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.Send.Output DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send.Output();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send.Output();
}
- public static com.tangem.blockchain.binance.proto.Send.Output getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.Send.Output getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -2418,24 +2418,24 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send.Output getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
}
public static final int INPUTS_FIELD_NUMBER = 1;
- private java.util.List inputs_;
+ private java.util.List inputs_;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public java.util.List getInputsList() {
+ public java.util.List getInputsList() {
return inputs_;
}
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.InputOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>
getInputsOrBuilderList() {
return inputs_;
}
@@ -2448,29 +2448,29 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.Input getInputs(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input getInputs(int index) {
return inputs_.get(index);
}
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
int index) {
return inputs_.get(index);
}
public static final int OUTPUTS_FIELD_NUMBER = 2;
- private java.util.List outputs_;
+ private java.util.List outputs_;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public java.util.List getOutputsList() {
+ public java.util.List getOutputsList() {
return outputs_;
}
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>
getOutputsOrBuilderList() {
return outputs_;
}
@@ -2483,13 +2483,13 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Output getOutputs(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output getOutputs(int index) {
return outputs_.get(index);
}
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
int index) {
return outputs_.get(index);
}
@@ -2541,10 +2541,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.Send)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.Send)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.Send other = (com.tangem.blockchain.binance.proto.Send) obj;
+ com.tangem.blockchain.blockchains.binance.proto.Send other = (com.tangem.blockchain.blockchains.binance.proto.Send) obj;
if (!getInputsList()
.equals(other.getInputsList())) return false;
@@ -2574,69 +2574,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.Send parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.Send parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -2649,7 +2649,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.Send prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.Send prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -2674,21 +2674,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.Send)
- com.tangem.blockchain.binance.proto.SendOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.SendOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.Send.class, com.tangem.blockchain.binance.proto.Send.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.Send.class, com.tangem.blockchain.blockchains.binance.proto.Send.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.Send.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.Send.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -2726,17 +2726,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_Send_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.Send getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.Send.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.Send getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.Send.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.Send build() {
- com.tangem.blockchain.binance.proto.Send result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.Send build() {
+ com.tangem.blockchain.blockchains.binance.proto.Send result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -2744,8 +2744,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send buildPartial() {
- com.tangem.blockchain.binance.proto.Send result = new com.tangem.blockchain.binance.proto.Send(this);
+ public com.tangem.blockchain.blockchains.binance.proto.Send buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.Send result = new com.tangem.blockchain.blockchains.binance.proto.Send(this);
int from_bitField0_ = bitField0_;
if (inputsBuilder_ == null) {
if (((bitField0_ & 0x00000001) != 0)) {
@@ -2803,16 +2803,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.Send) {
- return mergeFrom((com.tangem.blockchain.binance.proto.Send)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.Send) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.Send)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.Send other) {
- if (other == com.tangem.blockchain.binance.proto.Send.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.Send other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.Send.getDefaultInstance()) return this;
if (inputsBuilder_ == null) {
if (!other.inputs_.isEmpty()) {
if (inputs_.isEmpty()) {
@@ -2880,11 +2880,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.Send parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.Send parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.Send) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.Send) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -2895,22 +2895,22 @@ private static final long serialVersionUID = 0L;
}
private int bitField0_;
- private java.util.List inputs_ =
+ private java.util.List inputs_ =
java.util.Collections.emptyList();
private void ensureInputsIsMutable() {
if (!((bitField0_ & 0x00000001) != 0)) {
- inputs_ = new java.util.ArrayList(inputs_);
+ inputs_ = new java.util.ArrayList(inputs_);
bitField0_ |= 0x00000001;
}
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Input, com.tangem.blockchain.binance.proto.Send.Input.Builder, com.tangem.blockchain.binance.proto.Send.InputOrBuilder> inputsBuilder_;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder> inputsBuilder_;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public java.util.List getInputsList() {
+ public java.util.List getInputsList() {
if (inputsBuilder_ == null) {
return java.util.Collections.unmodifiableList(inputs_);
} else {
@@ -2930,7 +2930,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.Input getInputs(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input getInputs(int index) {
if (inputsBuilder_ == null) {
return inputs_.get(index);
} else {
@@ -2941,7 +2941,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Input inputs = 1;
*/
public Builder setInputs(
- int index, com.tangem.blockchain.binance.proto.Send.Input value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input value) {
if (inputsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -2958,7 +2958,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Input inputs = 1;
*/
public Builder setInputs(
- int index, com.tangem.blockchain.binance.proto.Send.Input.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builderForValue) {
if (inputsBuilder_ == null) {
ensureInputsIsMutable();
inputs_.set(index, builderForValue.build());
@@ -2971,7 +2971,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public Builder addInputs(com.tangem.blockchain.binance.proto.Send.Input value) {
+ public Builder addInputs(com.tangem.blockchain.blockchains.binance.proto.Send.Input value) {
if (inputsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -2988,7 +2988,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Input inputs = 1;
*/
public Builder addInputs(
- int index, com.tangem.blockchain.binance.proto.Send.Input value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input value) {
if (inputsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -3005,7 +3005,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Input inputs = 1;
*/
public Builder addInputs(
- com.tangem.blockchain.binance.proto.Send.Input.Builder builderForValue) {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builderForValue) {
if (inputsBuilder_ == null) {
ensureInputsIsMutable();
inputs_.add(builderForValue.build());
@@ -3019,7 +3019,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Input inputs = 1;
*/
public Builder addInputs(
- int index, com.tangem.blockchain.binance.proto.Send.Input.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder builderForValue) {
if (inputsBuilder_ == null) {
ensureInputsIsMutable();
inputs_.add(index, builderForValue.build());
@@ -3033,7 +3033,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Input inputs = 1;
*/
public Builder addAllInputs(
- Iterable extends com.tangem.blockchain.binance.proto.Send.Input> values) {
+ Iterable extends com.tangem.blockchain.blockchains.binance.proto.Send.Input> values) {
if (inputsBuilder_ == null) {
ensureInputsIsMutable();
com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -3073,14 +3073,14 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.Input.Builder getInputsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder getInputsBuilder(
int index) {
return getInputsFieldBuilder().getBuilder(index);
}
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
int index) {
if (inputsBuilder_ == null) {
return inputs_.get(index); } else {
@@ -3090,7 +3090,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.InputOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>
getInputsOrBuilderList() {
if (inputsBuilder_ != null) {
return inputsBuilder_.getMessageOrBuilderList();
@@ -3101,31 +3101,31 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.Input.Builder addInputsBuilder() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder addInputsBuilder() {
return getInputsFieldBuilder().addBuilder(
- com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance());
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance());
}
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public com.tangem.blockchain.binance.proto.Send.Input.Builder addInputsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder addInputsBuilder(
int index) {
return getInputsFieldBuilder().addBuilder(
- index, com.tangem.blockchain.binance.proto.Send.Input.getDefaultInstance());
+ index, com.tangem.blockchain.blockchains.binance.proto.Send.Input.getDefaultInstance());
}
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- public java.util.List
+ public java.util.List
getInputsBuilderList() {
return getInputsFieldBuilder().getBuilderList();
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Input, com.tangem.blockchain.binance.proto.Send.Input.Builder, com.tangem.blockchain.binance.proto.Send.InputOrBuilder>
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>
getInputsFieldBuilder() {
if (inputsBuilder_ == null) {
inputsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Input, com.tangem.blockchain.binance.proto.Send.Input.Builder, com.tangem.blockchain.binance.proto.Send.InputOrBuilder>(
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input, com.tangem.blockchain.blockchains.binance.proto.Send.Input.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>(
inputs_,
((bitField0_ & 0x00000001) != 0),
getParentForChildren(),
@@ -3135,22 +3135,22 @@ private static final long serialVersionUID = 0L;
return inputsBuilder_;
}
- private java.util.List outputs_ =
+ private java.util.List outputs_ =
java.util.Collections.emptyList();
private void ensureOutputsIsMutable() {
if (!((bitField0_ & 0x00000002) != 0)) {
- outputs_ = new java.util.ArrayList(outputs_);
+ outputs_ = new java.util.ArrayList(outputs_);
bitField0_ |= 0x00000002;
}
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Output, com.tangem.blockchain.binance.proto.Send.Output.Builder, com.tangem.blockchain.binance.proto.Send.OutputOrBuilder> outputsBuilder_;
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder> outputsBuilder_;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public java.util.List getOutputsList() {
+ public java.util.List getOutputsList() {
if (outputsBuilder_ == null) {
return java.util.Collections.unmodifiableList(outputs_);
} else {
@@ -3170,7 +3170,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Output getOutputs(int index) {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output getOutputs(int index) {
if (outputsBuilder_ == null) {
return outputs_.get(index);
} else {
@@ -3181,7 +3181,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Output outputs = 2;
*/
public Builder setOutputs(
- int index, com.tangem.blockchain.binance.proto.Send.Output value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output value) {
if (outputsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -3198,7 +3198,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Output outputs = 2;
*/
public Builder setOutputs(
- int index, com.tangem.blockchain.binance.proto.Send.Output.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builderForValue) {
if (outputsBuilder_ == null) {
ensureOutputsIsMutable();
outputs_.set(index, builderForValue.build());
@@ -3211,7 +3211,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public Builder addOutputs(com.tangem.blockchain.binance.proto.Send.Output value) {
+ public Builder addOutputs(com.tangem.blockchain.blockchains.binance.proto.Send.Output value) {
if (outputsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -3228,7 +3228,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Output outputs = 2;
*/
public Builder addOutputs(
- int index, com.tangem.blockchain.binance.proto.Send.Output value) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output value) {
if (outputsBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
@@ -3245,7 +3245,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Output outputs = 2;
*/
public Builder addOutputs(
- com.tangem.blockchain.binance.proto.Send.Output.Builder builderForValue) {
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builderForValue) {
if (outputsBuilder_ == null) {
ensureOutputsIsMutable();
outputs_.add(builderForValue.build());
@@ -3259,7 +3259,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Output outputs = 2;
*/
public Builder addOutputs(
- int index, com.tangem.blockchain.binance.proto.Send.Output.Builder builderForValue) {
+ int index, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder builderForValue) {
if (outputsBuilder_ == null) {
ensureOutputsIsMutable();
outputs_.add(index, builderForValue.build());
@@ -3273,7 +3273,7 @@ private static final long serialVersionUID = 0L;
* repeated .transaction.Send.Output outputs = 2;
*/
public Builder addAllOutputs(
- Iterable extends com.tangem.blockchain.binance.proto.Send.Output> values) {
+ Iterable extends com.tangem.blockchain.blockchains.binance.proto.Send.Output> values) {
if (outputsBuilder_ == null) {
ensureOutputsIsMutable();
com.google.protobuf.AbstractMessageLite.Builder.addAll(
@@ -3313,14 +3313,14 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Output.Builder getOutputsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder getOutputsBuilder(
int index) {
return getOutputsFieldBuilder().getBuilder(index);
}
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
int index) {
if (outputsBuilder_ == null) {
return outputs_.get(index); } else {
@@ -3330,7 +3330,7 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public java.util.List extends com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>
+ public java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>
getOutputsOrBuilderList() {
if (outputsBuilder_ != null) {
return outputsBuilder_.getMessageOrBuilderList();
@@ -3341,31 +3341,31 @@ private static final long serialVersionUID = 0L;
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Output.Builder addOutputsBuilder() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder addOutputsBuilder() {
return getOutputsFieldBuilder().addBuilder(
- com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance());
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance());
}
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public com.tangem.blockchain.binance.proto.Send.Output.Builder addOutputsBuilder(
+ public com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder addOutputsBuilder(
int index) {
return getOutputsFieldBuilder().addBuilder(
- index, com.tangem.blockchain.binance.proto.Send.Output.getDefaultInstance());
+ index, com.tangem.blockchain.blockchains.binance.proto.Send.Output.getDefaultInstance());
}
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- public java.util.List
+ public java.util.List
getOutputsBuilderList() {
return getOutputsFieldBuilder().getBuilderList();
}
private com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Output, com.tangem.blockchain.binance.proto.Send.Output.Builder, com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>
getOutputsFieldBuilder() {
if (outputsBuilder_ == null) {
outputsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
- com.tangem.blockchain.binance.proto.Send.Output, com.tangem.blockchain.binance.proto.Send.Output.Builder, com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>(
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output, com.tangem.blockchain.blockchains.binance.proto.Send.Output.Builder, com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>(
outputs_,
((bitField0_ & 0x00000002) != 0),
getParentForChildren(),
@@ -3391,12 +3391,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.Send)
- private static final com.tangem.blockchain.binance.proto.Send DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.Send DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.Send();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.Send();
}
- public static com.tangem.blockchain.binance.proto.Send getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.Send getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -3421,7 +3421,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.Send getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.Send getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/SendOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/SendOrBuilder.java
similarity index 61%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/SendOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/SendOrBuilder.java
index 3b619425a2..326ab8de28 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/SendOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/SendOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface SendOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.Send)
@@ -10,12 +10,12 @@ public interface SendOrBuilder extends
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- java.util.List
+ java.util.List
getInputsList();
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- com.tangem.blockchain.binance.proto.Send.Input getInputs(int index);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Input getInputs(int index);
/**
* repeated .transaction.Send.Input inputs = 1;
*/
@@ -23,23 +23,23 @@ public interface SendOrBuilder extends
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- java.util.List extends com.tangem.blockchain.binance.proto.Send.InputOrBuilder>
+ java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder>
getInputsOrBuilderList();
/**
* repeated .transaction.Send.Input inputs = 1;
*/
- com.tangem.blockchain.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
+ com.tangem.blockchain.blockchains.binance.proto.Send.InputOrBuilder getInputsOrBuilder(
int index);
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- java.util.List
+ java.util.List
getOutputsList();
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- com.tangem.blockchain.binance.proto.Send.Output getOutputs(int index);
+ com.tangem.blockchain.blockchains.binance.proto.Send.Output getOutputs(int index);
/**
* repeated .transaction.Send.Output outputs = 2;
*/
@@ -47,11 +47,11 @@ public interface SendOrBuilder extends
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- java.util.List extends com.tangem.blockchain.binance.proto.Send.OutputOrBuilder>
+ java.util.List extends com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder>
getOutputsOrBuilderList();
/**
* repeated .transaction.Send.Output outputs = 2;
*/
- com.tangem.blockchain.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
+ com.tangem.blockchain.blockchains.binance.proto.Send.OutputOrBuilder getOutputsOrBuilder(
int index);
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignature.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignature.java
similarity index 77%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignature.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignature.java
index a47f46f543..1cadb9f802 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignature.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignature.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
* Protobuf type {@code transaction.StdSignature}
@@ -85,15 +85,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.StdSignature.class, com.tangem.blockchain.binance.proto.StdSignature.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.Builder.class);
}
public interface PubKeyOrBuilder extends
@@ -163,15 +163,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.binance.proto.StdSignature.PubKey.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.Builder.class);
}
private byte memoizedIsInitialized = -1;
@@ -207,10 +207,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.StdSignature.PubKey)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.StdSignature.PubKey other = (com.tangem.blockchain.binance.proto.StdSignature.PubKey) obj;
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey other = (com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey) obj;
if (!unknownFields.equals(other.unknownFields)) return false;
return true;
@@ -228,69 +228,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -303,7 +303,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.StdSignature.PubKey prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -328,21 +328,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.StdSignature.PubKey)
- com.tangem.blockchain.binance.proto.StdSignature.PubKeyOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKeyOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.binance.proto.StdSignature.PubKey.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.StdSignature.PubKey.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -366,17 +366,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_PubKey_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.StdSignature.PubKey.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature.PubKey build() {
- com.tangem.blockchain.binance.proto.StdSignature.PubKey result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey build() {
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -384,8 +384,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature.PubKey buildPartial() {
- com.tangem.blockchain.binance.proto.StdSignature.PubKey result = new com.tangem.blockchain.binance.proto.StdSignature.PubKey(this);
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey result = new com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey(this);
onBuilt();
return result;
}
@@ -424,16 +424,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.StdSignature.PubKey) {
- return mergeFrom((com.tangem.blockchain.binance.proto.StdSignature.PubKey)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.StdSignature.PubKey other) {
- if (other == com.tangem.blockchain.binance.proto.StdSignature.PubKey.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey.getDefaultInstance()) return this;
this.mergeUnknownFields(other.unknownFields);
onChanged();
return this;
@@ -449,11 +449,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.StdSignature.PubKey parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.StdSignature.PubKey) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -479,12 +479,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.StdSignature.PubKey)
- private static final com.tangem.blockchain.binance.proto.StdSignature.PubKey DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.StdSignature.PubKey();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey();
}
- public static com.tangem.blockchain.binance.proto.StdSignature.PubKey getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -509,7 +509,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature.PubKey getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
@@ -628,10 +628,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.StdSignature)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.StdSignature other = (com.tangem.blockchain.binance.proto.StdSignature) obj;
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature other = (com.tangem.blockchain.blockchains.binance.proto.StdSignature) obj;
if (!getPubKey()
.equals(other.getPubKey())) return false;
@@ -667,69 +667,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdSignature parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -742,7 +742,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.StdSignature prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.StdSignature prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -763,21 +763,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.StdSignature)
- com.tangem.blockchain.binance.proto.StdSignatureOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.StdSignatureOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.StdSignature.class, com.tangem.blockchain.binance.proto.StdSignature.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature.class, com.tangem.blockchain.blockchains.binance.proto.StdSignature.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.StdSignature.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.StdSignature.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -809,17 +809,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdSignature_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.StdSignature.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.StdSignature.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature build() {
- com.tangem.blockchain.binance.proto.StdSignature result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature build() {
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -827,8 +827,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature buildPartial() {
- com.tangem.blockchain.binance.proto.StdSignature result = new com.tangem.blockchain.binance.proto.StdSignature(this);
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature result = new com.tangem.blockchain.blockchains.binance.proto.StdSignature(this);
result.pubKey_ = pubKey_;
result.signature_ = signature_;
result.accountNumber_ = accountNumber_;
@@ -871,16 +871,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.StdSignature) {
- return mergeFrom((com.tangem.blockchain.binance.proto.StdSignature)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.StdSignature) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.StdSignature)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.StdSignature other) {
- if (other == com.tangem.blockchain.binance.proto.StdSignature.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.StdSignature other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.StdSignature.getDefaultInstance()) return this;
if (other.getPubKey() != com.google.protobuf.ByteString.EMPTY) {
setPubKey(other.getPubKey());
}
@@ -908,11 +908,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.StdSignature parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.StdSignature parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.StdSignature) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.StdSignature) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -1096,12 +1096,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.StdSignature)
- private static final com.tangem.blockchain.binance.proto.StdSignature DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.StdSignature DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.StdSignature();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.StdSignature();
}
- public static com.tangem.blockchain.binance.proto.StdSignature getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.StdSignature getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -1126,7 +1126,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.StdSignature getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.StdSignature getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignatureOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignatureOrBuilder.java
similarity index 95%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignatureOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignatureOrBuilder.java
index 622113ae4c..cc73a528fd 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdSignatureOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdSignatureOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface StdSignatureOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.StdSignature)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTx.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTx.java
similarity index 88%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTx.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTx.java
index 92c61b4366..637a9f4ac7 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTx.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTx.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
*
@@ -109,15 +109,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.StdTx.class, com.tangem.blockchain.binance.proto.StdTx.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.StdTx.class, com.tangem.blockchain.blockchains.binance.proto.StdTx.Builder.class);
}
private int bitField0_;
@@ -337,10 +337,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.StdTx)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.StdTx)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.StdTx other = (com.tangem.blockchain.binance.proto.StdTx) obj;
+ com.tangem.blockchain.blockchains.binance.proto.StdTx other = (com.tangem.blockchain.blockchains.binance.proto.StdTx) obj;
if (!getMsgsList()
.equals(other.getMsgsList())) return false;
@@ -383,69 +383,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.StdTx parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -458,7 +458,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.StdTx prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.StdTx prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -483,21 +483,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.StdTx)
- com.tangem.blockchain.binance.proto.StdTxOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.StdTxOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.StdTx.class, com.tangem.blockchain.binance.proto.StdTx.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.StdTx.class, com.tangem.blockchain.blockchains.binance.proto.StdTx.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.StdTx.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.StdTx.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -531,17 +531,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_StdTx_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.StdTx getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.StdTx.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.StdTx getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.StdTx.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.StdTx build() {
- com.tangem.blockchain.binance.proto.StdTx result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.StdTx build() {
+ com.tangem.blockchain.blockchains.binance.proto.StdTx result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -549,8 +549,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.StdTx buildPartial() {
- com.tangem.blockchain.binance.proto.StdTx result = new com.tangem.blockchain.binance.proto.StdTx(this);
+ public com.tangem.blockchain.blockchains.binance.proto.StdTx buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.StdTx result = new com.tangem.blockchain.blockchains.binance.proto.StdTx(this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
if (((bitField0_ & 0x00000001) != 0)) {
@@ -605,16 +605,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.StdTx) {
- return mergeFrom((com.tangem.blockchain.binance.proto.StdTx)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.StdTx) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.StdTx)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.StdTx other) {
- if (other == com.tangem.blockchain.binance.proto.StdTx.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.StdTx other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.StdTx.getDefaultInstance()) return this;
if (!other.msgs_.isEmpty()) {
if (msgs_.isEmpty()) {
msgs_ = other.msgs_;
@@ -660,11 +660,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.StdTx parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.StdTx parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.StdTx) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.StdTx) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -1068,12 +1068,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.StdTx)
- private static final com.tangem.blockchain.binance.proto.StdTx DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.StdTx DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.StdTx();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.StdTx();
}
- public static com.tangem.blockchain.binance.proto.StdTx getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.StdTx getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -1098,7 +1098,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.StdTx getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.StdTx getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTxOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTxOrBuilder.java
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTxOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTxOrBuilder.java
index b8e6b81057..1e2f47be6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/StdTxOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/StdTxOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface StdTxOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.StdTx)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreeze.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreeze.java
similarity index 80%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreeze.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreeze.java
index f0cfab3b22..bc61584e2a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreeze.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreeze.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
*
@@ -85,15 +85,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.TokenFreeze.class, com.tangem.blockchain.binance.proto.TokenFreeze.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.Builder.class);
}
public static final int FROM_FIELD_NUMBER = 1;
@@ -217,10 +217,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.TokenFreeze)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.TokenFreeze)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.TokenFreeze other = (com.tangem.blockchain.binance.proto.TokenFreeze) obj;
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreeze other = (com.tangem.blockchain.blockchains.binance.proto.TokenFreeze) obj;
if (!getFrom()
.equals(other.getFrom())) return false;
@@ -251,69 +251,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -326,7 +326,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.TokenFreeze prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.TokenFreeze prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -351,21 +351,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.TokenFreeze)
- com.tangem.blockchain.binance.proto.TokenFreezeOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreezeOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.TokenFreeze.class, com.tangem.blockchain.binance.proto.TokenFreeze.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.TokenFreeze.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -395,17 +395,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenFreeze_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.TokenFreeze getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.TokenFreeze.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.TokenFreeze build() {
- com.tangem.blockchain.binance.proto.TokenFreeze result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze build() {
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreeze result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -413,8 +413,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.TokenFreeze buildPartial() {
- com.tangem.blockchain.binance.proto.TokenFreeze result = new com.tangem.blockchain.binance.proto.TokenFreeze(this);
+ public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreeze result = new com.tangem.blockchain.blockchains.binance.proto.TokenFreeze(this);
result.from_ = from_;
result.symbol_ = symbol_;
result.amount_ = amount_;
@@ -456,16 +456,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.TokenFreeze) {
- return mergeFrom((com.tangem.blockchain.binance.proto.TokenFreeze)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.TokenFreeze) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.TokenFreeze)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.TokenFreeze other) {
- if (other == com.tangem.blockchain.binance.proto.TokenFreeze.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.TokenFreeze other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.TokenFreeze.getDefaultInstance()) return this;
if (other.getFrom() != com.google.protobuf.ByteString.EMPTY) {
setFrom(other.getFrom());
}
@@ -491,11 +491,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.TokenFreeze parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.TokenFreeze parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.TokenFreeze) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.TokenFreeze) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -689,12 +689,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.TokenFreeze)
- private static final com.tangem.blockchain.binance.proto.TokenFreeze DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.TokenFreeze DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.TokenFreeze();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.TokenFreeze();
}
- public static com.tangem.blockchain.binance.proto.TokenFreeze getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenFreeze getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -719,7 +719,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.TokenFreeze getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.TokenFreeze getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreezeOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreezeOrBuilder.java
similarity index 93%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreezeOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreezeOrBuilder.java
index d0e30a2b2a..b4a525e026 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenFreezeOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenFreezeOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface TokenFreezeOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.TokenFreeze)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreeze.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreeze.java
similarity index 80%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreeze.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreeze.java
index 48167e4b06..e1f660b591 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreeze.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreeze.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
/**
*
@@ -85,15 +85,15 @@ private static final long serialVersionUID = 0L;
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.binance.proto.TokenUnfreeze.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.Builder.class);
}
public static final int FROM_FIELD_NUMBER = 1;
@@ -217,10 +217,10 @@ private static final long serialVersionUID = 0L;
if (obj == this) {
return true;
}
- if (!(obj instanceof com.tangem.blockchain.binance.proto.TokenUnfreeze)) {
+ if (!(obj instanceof com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze)) {
return super.equals(obj);
}
- com.tangem.blockchain.binance.proto.TokenUnfreeze other = (com.tangem.blockchain.binance.proto.TokenUnfreeze) obj;
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze other = (com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze) obj;
if (!getFrom()
.equals(other.getFrom())) return false;
@@ -251,69 +251,69 @@ private static final long serialVersionUID = 0L;
return hash;
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
java.nio.ByteBuffer data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
java.nio.ByteBuffer data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(byte[] data)
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseDelimitedFrom(java.io.InputStream input)
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseDelimitedFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return com.google.protobuf.GeneratedMessageV3
.parseWithIOException(PARSER, input);
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze parseFrom(
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
@@ -326,7 +326,7 @@ private static final long serialVersionUID = 0L;
public static Builder newBuilder() {
return DEFAULT_INSTANCE.toBuilder();
}
- public static Builder newBuilder(com.tangem.blockchain.binance.proto.TokenUnfreeze prototype) {
+ public static Builder newBuilder(com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze prototype) {
return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
}
@Override
@@ -351,21 +351,21 @@ private static final long serialVersionUID = 0L;
public static final class Builder extends
com.google.protobuf.GeneratedMessageV3.Builder implements
// @@protoc_insertion_point(builder_implements:transaction.TokenUnfreeze)
- com.tangem.blockchain.binance.proto.TokenUnfreezeOrBuilder {
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreezeOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
}
@Override
protected FieldAccessorTable
internalGetFieldAccessorTable() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_fieldAccessorTable
.ensureFieldAccessorsInitialized(
- com.tangem.blockchain.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.binance.proto.TokenUnfreeze.Builder.class);
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.class, com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.Builder.class);
}
- // Construct using com.tangem.blockchain.binance.proto.TokenUnfreeze.newBuilder()
+ // Construct using com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
@@ -395,17 +395,17 @@ private static final long serialVersionUID = 0L;
@Override
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
- return com.tangem.blockchain.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
+ return com.tangem.blockchain.blockchains.binance.proto.Transaction.internal_static_transaction_TokenUnfreeze_descriptor;
}
@Override
- public com.tangem.blockchain.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
- return com.tangem.blockchain.binance.proto.TokenUnfreeze.getDefaultInstance();
+ public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
+ return com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.getDefaultInstance();
}
@Override
- public com.tangem.blockchain.binance.proto.TokenUnfreeze build() {
- com.tangem.blockchain.binance.proto.TokenUnfreeze result = buildPartial();
+ public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze build() {
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
@@ -413,8 +413,8 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.TokenUnfreeze buildPartial() {
- com.tangem.blockchain.binance.proto.TokenUnfreeze result = new com.tangem.blockchain.binance.proto.TokenUnfreeze(this);
+ public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze buildPartial() {
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze result = new com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze(this);
result.from_ = from_;
result.symbol_ = symbol_;
result.amount_ = amount_;
@@ -456,16 +456,16 @@ private static final long serialVersionUID = 0L;
}
@Override
public Builder mergeFrom(com.google.protobuf.Message other) {
- if (other instanceof com.tangem.blockchain.binance.proto.TokenUnfreeze) {
- return mergeFrom((com.tangem.blockchain.binance.proto.TokenUnfreeze)other);
+ if (other instanceof com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze) {
+ return mergeFrom((com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze)other);
} else {
super.mergeFrom(other);
return this;
}
}
- public Builder mergeFrom(com.tangem.blockchain.binance.proto.TokenUnfreeze other) {
- if (other == com.tangem.blockchain.binance.proto.TokenUnfreeze.getDefaultInstance()) return this;
+ public Builder mergeFrom(com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze other) {
+ if (other == com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze.getDefaultInstance()) return this;
if (other.getFrom() != com.google.protobuf.ByteString.EMPTY) {
setFrom(other.getFrom());
}
@@ -491,11 +491,11 @@ private static final long serialVersionUID = 0L;
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
- com.tangem.blockchain.binance.proto.TokenUnfreeze parsedMessage = null;
+ com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
- parsedMessage = (com.tangem.blockchain.binance.proto.TokenUnfreeze) e.getUnfinishedMessage();
+ parsedMessage = (com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze) e.getUnfinishedMessage();
throw e.unwrapIOException();
} finally {
if (parsedMessage != null) {
@@ -689,12 +689,12 @@ private static final long serialVersionUID = 0L;
}
// @@protoc_insertion_point(class_scope:transaction.TokenUnfreeze)
- private static final com.tangem.blockchain.binance.proto.TokenUnfreeze DEFAULT_INSTANCE;
+ private static final com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze DEFAULT_INSTANCE;
static {
- DEFAULT_INSTANCE = new com.tangem.blockchain.binance.proto.TokenUnfreeze();
+ DEFAULT_INSTANCE = new com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze();
}
- public static com.tangem.blockchain.binance.proto.TokenUnfreeze getDefaultInstance() {
+ public static com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze getDefaultInstance() {
return DEFAULT_INSTANCE;
}
@@ -719,7 +719,7 @@ private static final long serialVersionUID = 0L;
}
@Override
- public com.tangem.blockchain.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
+ public com.tangem.blockchain.blockchains.binance.proto.TokenUnfreeze getDefaultInstanceForType() {
return DEFAULT_INSTANCE;
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreezeOrBuilder.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreezeOrBuilder.java
similarity index 94%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreezeOrBuilder.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreezeOrBuilder.java
index 7b05351dc3..4b8e0b4d5e 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/TokenUnfreezeOrBuilder.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/TokenUnfreezeOrBuilder.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public interface TokenUnfreezeOrBuilder extends
// @@protoc_insertion_point(interface_extends:transaction.TokenUnfreeze)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Transaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Transaction.java
similarity index 99%
rename from blockchain/src/main/java/com/tangem/blockchain/binance/proto/Transaction.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Transaction.java
index f50167e356..9d79bb6c9b 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/binance/proto/Transaction.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/proto/Transaction.java
@@ -1,7 +1,7 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: dex.proto
-package com.tangem.blockchain.binance.proto;
+package com.tangem.blockchain.blockchains.binance.proto;
public final class Transaction {
private Transaction() {}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
similarity index 88%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinAddress.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
index 01cdd30770..d4bf305e42 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinAddress.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt
@@ -1,6 +1,7 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
+import com.tangem.blockchain.common.AddressService
import com.tangem.common.extensions.calculateRipemd160
import com.tangem.common.extensions.calculateSha256
import org.bitcoinj.core.AddressFormatException
@@ -10,25 +11,16 @@ import org.bitcoinj.params.MainNetParams
import org.bitcoinj.params.TestNet3Params
import java.security.MessageDigest
-class BitcoinAddressFactory {
- companion object {
- fun makeAddress(walletPublicKey: ByteArray, testNet: Boolean = false): String {
+class BitcoinAddressService(private val testNet: Boolean = false): AddressService {
+ override fun makeAddress(walletPublicKey: ByteArray): String {
val netSelectionByte = if (testNet) 0x6f.toByte() else 0x00.toByte()
val hash1 = walletPublicKey.calculateSha256().calculateRipemd160()
val hash2 = byteArrayOf(netSelectionByte).plus(hash1).calculateSha256().calculateSha256()
val result = byteArrayOf(netSelectionByte) + hash1 + hash2[0] + hash2[1] + hash2[2] + hash2[3]
return Base58.encode(result)
}
- }
-}
-class BitcoinAddressValidator {
- companion object {
-
- private const val firstLetters = "123nm"
- private const val firstLettersNonTestNet = "13"
-
- fun validate(address: String, testNet: Boolean = false): Boolean {
+ override fun validate(address: String): Boolean {
if (firstLetters.contains(address.first())) {
if (testNet && firstLettersNonTestNet.contains(address.first())) return false
if (address.length !in 26..35) return false
@@ -68,5 +60,9 @@ class BitcoinAddressValidator {
false
}
}
+
+ companion object {
+ private const val firstLetters = "123nm"
+ private const val firstLettersNonTestNet = "13"
}
}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
similarity index 75%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
index 664c45fa0d..ef0cbe5500 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/BitcoinTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinTransactionBuilder.kt
@@ -1,7 +1,8 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.common.extensions.Result
+import com.tangem.blockchain.extensions.Result
+import com.tangem.common.extensions.isZero
import org.bitcoinj.core.*
import org.bitcoinj.crypto.TransactionSignature
import org.bitcoinj.script.Script
@@ -9,18 +10,20 @@ import org.bitcoinj.script.ScriptBuilder
import java.math.BigDecimal
import java.math.BigInteger
-class BitcoinTransactionBuilder(private val testNet: Boolean) {
+open class BitcoinTransactionBuilder(
+ private val walletPublicKey: ByteArray, private val testNet: Boolean = false
+) {
private lateinit var transaction: Transaction
- private var networkParameters: NetworkParameters? = null
- var unspentOutputs: List? = null
+ protected var networkParameters: NetworkParameters? = null
+ var unspentOutputs: List? = null
- fun buildToSign(
+ open fun buildToSign(
transactionData: TransactionData): Result> {
if (unspentOutputs == null) return Result.Failure(Exception("Currently there's an unconfirmed transaction"))
- val change: BigDecimal = calculateChange(transactionData)
+ val change: BigDecimal = calculateChange(transactionData, unspentOutputs!!)
networkParameters = if (testNet) {
NetworkParameters.fromID(NetworkParameters.ID_TESTNET)
@@ -37,51 +40,51 @@ class BitcoinTransactionBuilder(private val testNet: Boolean) {
return Result.Success(hashesForSign)
}
- private fun calculateChange(transactionData: TransactionData): BigDecimal {
+ open fun buildToSend(signedTransaction: ByteArray): ByteArray {
+ for (index in transaction.inputs.indices) {
+ transaction.inputs[index].scriptSig = createScript(index, signedTransaction, walletPublicKey)
+ }
+ return transaction.bitcoinSerialize()
+ }
+
+ fun getEstimateSize(transactionData: TransactionData): Result {
+ val buildTransactionResult = buildToSign(transactionData)
+ when (buildTransactionResult) {
+ is Result.Failure -> return buildTransactionResult
+ is Result.Success -> {
+ val hashes = buildTransactionResult.data
+ val finalTransaction = buildToSend(ByteArray(64 * hashes.size) { 1 })
+ return Result.Success(finalTransaction.size)
+ }
+ }
+ }
+
+ fun calculateChange(transactionData: TransactionData, unspentOutputs: List): BigDecimal {
val fullAmount = unspentOutputs!!.map { it.amount }.reduce { acc, number -> acc + number }
return fullAmount - (transactionData.amount.value!! + (transactionData.fee?.value
?: 0.toBigDecimal()))
}
- fun buildToSend(signedTransaction: ByteArray, publicKey: ByteArray): ByteArray {
- for (index in transaction.inputs.indices) {
- transaction.inputs[index].scriptSig = createScript(index, signedTransaction, publicKey)
- }
- return transaction.bitcoinSerialize()
- }
-
- private fun createScript(index: Int, signedTransaction: ByteArray, publicKey: ByteArray): Script {
+ open fun createScript(index: Int, signedTransaction: ByteArray, publicKey: ByteArray): Script {
val r = BigInteger(1, signedTransaction.copyOfRange(index * 64, 32 + index * 64))
val s = BigInteger(1, signedTransaction.copyOfRange(32 + index * 64, 64 + index * 64))
val canonicalS = ECKey.ECDSASignature(r, s).toCanonicalised().s
val signature = TransactionSignature(r, canonicalS)
return ScriptBuilder.createInputScript(signature, ECKey.fromPublicOnly(publicKey))
}
-
- fun getEstimateSize(transactionData: TransactionData, walletPublicKey: ByteArray): Result {
- val buildTransactionResult = buildToSign(transactionData)
- when (buildTransactionResult) {
- is Result.Failure -> return buildTransactionResult
- is Result.Success -> {
- val hashes = buildTransactionResult.data
- val finalTransaction = buildToSend(ByteArray(64 * hashes.size) { 1 }, walletPublicKey)
- return Result.Success(finalTransaction.size)
- }
- }
- }
}
internal fun TransactionData.toBitcoinJTransaction(networkParameters: NetworkParameters?,
- unspentOutputs: List,
+ unspentOutputs: List,
change: BigDecimal): Transaction {
val transaction = Transaction(networkParameters)
for (utxo in unspentOutputs) {
- transaction.addInput(Sha256Hash.wrap(utxo.hash), utxo.outputIndex, Script(utxo.outputScript))
+ transaction.addInput(Sha256Hash.wrap(utxo.transactionHash), utxo.outputIndex, Script(utxo.outputScript))
}
transaction.addOutput(
Coin.parseCoin(this.amount.value!!.toPlainString()),
Address.fromString(networkParameters, this.destinationAddress))
- if (change != 0.toBigDecimal()) {
+ if (!change.isZero()) {
transaction.addOutput(
Coin.parseCoin(change.toPlainString()),
Address.fromString(networkParameters,
@@ -90,9 +93,9 @@ internal fun TransactionData.toBitcoinJTransaction(networkParameters: NetworkPar
return transaction
}
-class UnspentTransaction(
+class BitcoinUnspentOutput(
val amount: BigDecimal,
val outputIndex: Long,
- val hash: ByteArray,
+ val transactionHash: ByteArray,
val outputScript: ByteArray
)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
new file mode 100644
index 0000000000..0670f32ad4
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt
@@ -0,0 +1,93 @@
+package com.tangem.blockchain.blockchains.bitcoin
+
+import android.util.Log
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinProvider
+import com.tangem.blockchain.common.*
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.common.CompletionResult
+import com.tangem.common.extensions.toHexString
+import java.math.BigDecimal
+
+open class BitcoinWalletManager(
+ cardId: String,
+ wallet: Wallet,
+ private val transactionBuilder: BitcoinTransactionBuilder,
+ private val networkManager: BitcoinProvider
+) : WalletManager(cardId, wallet), TransactionSender {
+
+ protected val blockchain = wallet.blockchain
+
+ override suspend fun update() {
+ val response = networkManager.getInfo(wallet.address)
+ when (response) {
+ is Result.Success -> updateWallet(response.data)
+ is Result.Failure -> updateError(response.error)
+ }
+ }
+
+ private fun updateWallet(response: BitcoinAddressResponse) {
+ Log.d(this::class.java.simpleName, "Balance is ${response.balance}")
+ wallet.amounts[AmountType.Coin]?.value = response.balance
+ transactionBuilder.unspentOutputs = response.unspentOutputs
+ if (response.hasUnconfirmed) {
+ if (wallet.transactions.isEmpty()) wallet.addIncomingTransaction()
+ } else {
+ wallet.transactions.clear()
+ }
+ }
+
+ private fun updateError(error: Throwable?) {
+ Log.e(this::class.java.simpleName, error?.message ?: "")
+ if (error != null) throw error
+ }
+
+ override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
+ when (val buildTransactionResult = transactionBuilder.buildToSign(transactionData)) {
+ is Result.Failure -> return SimpleResult.Failure(buildTransactionResult.error)
+ is Result.Success -> {
+ when (val signerResponse = signer.sign(buildTransactionResult.data.toTypedArray(), cardId)) {
+ is CompletionResult.Success -> {
+ val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
+ return networkManager.sendTransaction(transactionToSend.toHexString())
+ }
+ is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
+ }
+ }
+ }
+ }
+
+ override suspend fun getFee(amount: Amount, destination: String): Result> {
+ when (val feeResult = networkManager.getFee()) {
+ is Result.Failure -> return feeResult
+ is Result.Success -> {
+ val feeValue = BigDecimal.ONE.movePointLeft(blockchain.decimals())
+ amount.value = amount.value!! - feeValue
+ val sizeResult = transactionBuilder.getEstimateSize(
+ TransactionData(amount, Amount(amount, feeValue), wallet.address, destination)
+ )
+ when (sizeResult) {
+ is Result.Failure -> return sizeResult
+ is Result.Success -> {
+ val transactionSize = sizeResult.data.toBigDecimal()
+ val minFee = feeResult.data.minimalPerKb.calculateFee(transactionSize)
+ val normalFee = feeResult.data.normalPerKb.calculateFee(transactionSize)
+ val priorityFee = feeResult.data.priorityPerKb.calculateFee(transactionSize)
+ return Result.Success(
+ listOf(Amount(minFee, blockchain),
+ Amount(normalFee, blockchain),
+ Amount(priorityFee, blockchain))
+ )
+ }
+ }
+ }
+ }
+ }
+
+ private fun BigDecimal.calculateFee(transactionSize: BigDecimal): BigDecimal {
+ val bytesInKb = BigDecimal(1024)
+ return this.divide(bytesInKb).multiply(transactionSize)
+ .setScale(8, BigDecimal.ROUND_DOWN)
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
similarity index 75%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
index 55b686591e..8483883d82 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinNetworkManager.kt
@@ -1,21 +1,21 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
-import com.tangem.blockchain.bitcoin.UnspentTransaction
-import com.tangem.blockchain.bitcoin.network.api.BlockchainInfoApi
-import com.tangem.blockchain.bitcoin.network.api.BlockcypherApi
-import com.tangem.blockchain.bitcoin.network.api.EstimatefeeApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_BLOCKCHAIN_INFO
-import com.tangem.blockchain.common.network.API_BLOCKCYPHER
-import com.tangem.blockchain.common.network.API_ESTIMATEFEE
-import com.tangem.blockchain.common.network.createRetrofitInstance
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockchainInfoApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockcypherApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.EstimatefeeApi
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_BLOCKCHAIN_INFO
+import com.tangem.blockchain.network.API_BLOCKCYPHER
+import com.tangem.blockchain.network.API_ESTIMATEFEE
+import com.tangem.blockchain.network.createRetrofitInstance
import retrofit2.HttpException
import java.io.IOException
import java.math.BigDecimal
-class BitcoinNetworkManager(private val isTestNet: Boolean) : BitcoinProvider {
+class BitcoinNetworkManager(private val isTestNet: Boolean = false) : BitcoinProvider {
private val blockcypherProvider by lazy {
val api = createRetrofitInstance(API_BLOCKCYPHER)
@@ -85,16 +85,12 @@ class BitcoinNetworkManager(private val isTestNet: Boolean) : BitcoinProvider {
}
}
}
-
- companion object {
- val SATOSHI_IN_BTC = 100000000.toBigDecimal()
- }
}
data class BitcoinAddressResponse(
val balance: BigDecimal,
val hasUnconfirmed: Boolean,
- val unspentTransactions: List?
+ val unspentOutputs: List?
)
data class BitcoinFee(
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinProvider.kt
similarity index 57%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinProvider.kt
index e82fb2f67c..13e99f95d3 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BitcoinProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BitcoinProvider.kt
@@ -1,7 +1,7 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
interface BitcoinProvider {
suspend fun getInfo(address: String): Result
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
similarity index 79%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
index 7b2882ec57..cb9dc12e6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockchainInfoProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockchainInfoProvider.kt
@@ -1,12 +1,12 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
-import com.tangem.blockchain.bitcoin.UnspentTransaction
-import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager.Companion.SATOSHI_IN_BTC
-import com.tangem.blockchain.bitcoin.network.api.BlockchainInfoApi
-import com.tangem.blockchain.bitcoin.network.api.EstimatefeeApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockchainInfoApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.EstimatefeeApi
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
import com.tangem.common.extensions.hexToBytes
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
@@ -16,6 +16,7 @@ class BlockchainInfoProvider(
private val blockchainApi: BlockchainInfoApi,
private val estimatefeeApi: EstimatefeeApi
) : BitcoinProvider {
+ val decimals = Blockchain.Bitcoin.decimals()
override suspend fun getInfo(address: String): Result {
return try {
@@ -28,8 +29,8 @@ class BlockchainInfoProvider(
val unconfirmedTransactions = addressData.transactions?.find { it.blockHeight == 0L } != null
val bitcoinUnspents = unspents.unspentOutputs.map {
- UnspentTransaction(
- it.amount!!.toBigDecimal().divide(SATOSHI_IN_BTC),
+ BitcoinUnspentOutput(
+ it.amount!!.toBigDecimal().movePointLeft(decimals),
it.outputIndex!!.toLong(),
it.hash!!.hexToBytes(),
it.outputScript!!.hexToBytes())
@@ -37,7 +38,7 @@ class BlockchainInfoProvider(
Result.Success(
BitcoinAddressResponse(
- addressData.finalBalance?.toBigDecimal()?.divide(SATOSHI_IN_BTC)
+ addressData.finalBalance?.toBigDecimal()?.movePointLeft(decimals)
?: 0.toBigDecimal(), unconfirmedTransactions, bitcoinUnspents))
}
} catch (exception: Exception) {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
similarity index 64%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
index 94c9e3dd17..58b6bec6a4 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/BlockcypherProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/BlockcypherProvider.kt
@@ -1,19 +1,20 @@
-package com.tangem.blockchain.bitcoin.network
+package com.tangem.blockchain.blockchains.bitcoin.network
-import com.tangem.blockchain.bitcoin.UnspentTransaction
-import com.tangem.blockchain.bitcoin.network.BitcoinNetworkManager.Companion.SATOSHI_IN_BTC
-import com.tangem.blockchain.bitcoin.network.api.BlockcypherApi
-import com.tangem.blockchain.bitcoin.network.api.BlockcypherBody
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherFee
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherResponse
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockcypherApi
+import com.tangem.blockchain.blockchains.bitcoin.network.api.BlockcypherBody
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherFee
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherResponse
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
import com.tangem.common.extensions.hexToBytes
class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) : BitcoinProvider {
private val blockchain = "btc"
+ private val decimals = Blockchain.Bitcoin.decimals()
private val network = if (isTestNet) {
BlockcypherNetwork.Test.network
@@ -25,15 +26,15 @@ class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) :
try {
val addressData: BlockcypherResponse = retryIO { api.getAddressData(blockchain, network, address) }
val unspents = addressData.txrefs?.map {
- UnspentTransaction(
- it.amount!!.toBigDecimal().divide(SATOSHI_IN_BTC),
+ BitcoinUnspentOutput(
+ it.amount!!.toBigDecimal().movePointLeft(decimals),
it.outputIndex!!.toLong(),
it.hash!!.hexToBytes(),
it.outputScript!!.hexToBytes()
)
}
return Result.Success(BitcoinAddressResponse(
- addressData.balance!!.toBigDecimal().divide(SATOSHI_IN_BTC),
+ addressData.balance!!.toBigDecimal().movePointLeft(decimals),
addressData.unconfirmedBalance != 0L,
unspents))
@@ -43,27 +44,27 @@ class BlockcypherProvider(private val api: BlockcypherApi, isTestNet: Boolean) :
}
override suspend fun getFee(): Result {
- try {
+ return try {
val receivedFee: BlockcypherFee = retryIO { api.getFee(blockchain, network) }
- return Result.Success(
- BitcoinFee(receivedFee.minFeePerKb!!.toBigDecimal().divide(SATOSHI_IN_BTC),
- receivedFee.normalFeePerKb!!.toBigDecimal().divide(SATOSHI_IN_BTC),
- receivedFee.priorityFeePerKb!!.toBigDecimal().divide(SATOSHI_IN_BTC))
+ Result.Success(
+ BitcoinFee(receivedFee.minFeePerKb!!.toBigDecimal().movePointLeft(decimals),
+ receivedFee.normalFeePerKb!!.toBigDecimal().movePointLeft(decimals),
+ receivedFee.priorityFeePerKb!!.toBigDecimal().movePointLeft(decimals))
)
} catch (error: Exception) {
- return Result.Failure(error)
+ Result.Failure(error)
}
}
override suspend fun sendTransaction(transaction: String): SimpleResult {
- try {
+ return try {
retryIO {
api.sendTransaction(
blockchain, network, BlockcypherBody(transaction), BlockcypherToken.getToken())
}
- return SimpleResult.Success
+ SimpleResult.Success
} catch (error: Exception) {
- return SimpleResult.Failure(error)
+ SimpleResult.Failure(error)
}
}
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockchainInfoApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockchainInfoApi.kt
similarity index 64%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockchainInfoApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockchainInfoApi.kt
index 1b43631d5a..294846b58c 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockchainInfoApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockchainInfoApi.kt
@@ -1,7 +1,7 @@
-package com.tangem.blockchain.bitcoin.network.api
+package com.tangem.blockchain.blockchains.bitcoin.network.api
-import com.tangem.blockchain.bitcoin.network.response.BlockchainInfoAddress
-import com.tangem.blockchain.bitcoin.network.response.BlockchainInfoUnspents
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockchainInfoAddress
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockchainInfoUnspents
import okhttp3.ResponseBody
import retrofit2.http.*
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockcypherApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockcypherApi.kt
similarity index 80%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockcypherApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockcypherApi.kt
index 755191e81e..14b78b0e53 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/BlockcypherApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/BlockcypherApi.kt
@@ -1,9 +1,9 @@
-package com.tangem.blockchain.bitcoin.network.api
+package com.tangem.blockchain.blockchains.bitcoin.network.api
import com.squareup.moshi.JsonClass
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherFee
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherResponse
-import com.tangem.blockchain.bitcoin.network.response.BlockcypherTx
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherFee
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.response.BlockcypherTx
import retrofit2.http.*
interface BlockcypherApi {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/EstimateFeeApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/EstimateFeeApi.kt
similarity index 85%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/EstimateFeeApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/EstimateFeeApi.kt
index 22e95304db..393e03a00b 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/api/EstimateFeeApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/api/EstimateFeeApi.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.bitcoin.network.api
+package com.tangem.blockchain.blockchains.bitcoin.network.api
import retrofit2.http.GET
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockchainInfoResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockchainInfoResponse.kt
similarity index 94%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockchainInfoResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockchainInfoResponse.kt
index 015d867985..e7ec0f2734 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockchainInfoResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockchainInfoResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.bitcoin.network.response
+package com.tangem.blockchain.blockchains.bitcoin.network.response
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockcypherResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockcypherResponse.kt
similarity index 95%
rename from blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockcypherResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockcypherResponse.kt
index b1e869797a..a0e79c45b2 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/bitcoin/network/response/BlockcypherResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/network/response/BlockcypherResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.bitcoin.network.response
+package com.tangem.blockchain.blockchains.bitcoin.network.response
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt
new file mode 100644
index 0000000000..20e41a0b49
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressService.kt
@@ -0,0 +1,23 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoincash.cashaddr.BitcoinCashAddressType
+import com.tangem.blockchain.blockchains.bitcoincash.cashaddr.CashAddr
+import com.tangem.blockchain.common.AddressService
+import com.tangem.common.extensions.calculateRipemd160
+import com.tangem.common.extensions.calculateSha256
+import com.tangem.common.extensions.toCompressedPublicKey
+
+class BitcoinCashAddressService() : AddressService {
+ override fun makeAddress(walletPublicKey: ByteArray): String {
+ val publicKeyHash = walletPublicKey.toCompressedPublicKey().calculateSha256().calculateRipemd160()
+ return CashAddr.toCashAddress(BitcoinCashAddressType.P2PKH, publicKeyHash)
+ }
+
+ override fun validate(address: String): Boolean {
+ return CashAddr.isValidCashAddress(address)
+ }
+
+ fun getPublicKeyHash(address: String): ByteArray {
+ return CashAddr.decodeCashAddress(address).hash
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt
new file mode 100644
index 0000000000..5a594aa312
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashNetworkManager.kt
@@ -0,0 +1,33 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinFee
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinProvider
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_BLOCKCHAIR
+import com.tangem.blockchain.network.blockchair.BlockchairApi
+import com.tangem.blockchain.network.blockchair.BlockchairProvider
+import com.tangem.blockchain.network.createRetrofitInstance
+
+class BitcoinCashNetworkManager : BitcoinProvider {
+ private val blockchain: Blockchain = Blockchain.BitcoinCash
+
+ private val blockchairProvider by lazy {
+ val api = createRetrofitInstance(API_BLOCKCHAIR).create(BlockchairApi::class.java)
+ BlockchairProvider(api, blockchain)
+ }
+
+ override suspend fun getInfo(address: String): Result {
+ return blockchairProvider.getInfo(address)
+ }
+
+ override suspend fun getFee(): Result {
+ return blockchairProvider.getFee()
+ }
+
+ override suspend fun sendTransaction(transaction: String): SimpleResult {
+ return blockchairProvider.sendTransaction(transaction)
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java
new file mode 100644
index 0000000000..ec339789c1
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransaction.java
@@ -0,0 +1,110 @@
+package com.tangem.blockchain.blockchains.bitcoincash;
+
+import org.bitcoinj.core.Coin;
+import org.bitcoinj.core.NetworkParameters;
+import org.bitcoinj.core.Sha256Hash;
+import org.bitcoinj.core.Transaction;
+import org.bitcoinj.core.TransactionInput;
+import org.bitcoinj.core.TransactionOutput;
+import org.bitcoinj.core.UnsafeByteArrayOutputStream;
+import org.bitcoinj.core.VarInt;
+import org.bitcoinj.crypto.TransactionSignature;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.List;
+
+import static org.bitcoinj.core.Utils.uint32ToByteStreamLE;
+import static org.bitcoinj.core.Utils.uint64ToByteStreamLE;
+
+// logic from https://github.com/pokkst/bitcoincashj
+public class BitcoinCashTransaction extends Transaction {
+// private ArrayList inputs;
+// private ArrayList outputs;
+
+// private long version;
+// private long lockTime;
+
+ public final byte SIGHASH_FORK_ID = 0x40;
+
+ public BitcoinCashTransaction(NetworkParameters params) {
+ super(params);
+ }
+
+ public synchronized Sha256Hash hashForSignatureWitness(
+ int inputIndex,
+ byte[] connectedScript,
+ Coin prevValue,
+ SigHash type,
+ boolean anyoneCanPay)
+ {
+ byte sigHashType = (byte) TransactionSignature.calcSigHashValue(type, anyoneCanPay);
+ sigHashType |= SIGHASH_FORK_ID;
+
+ ByteArrayOutputStream bos = new UnsafeByteArrayOutputStream(length == UNKNOWN_LENGTH ? 256 : length + 4);
+ try {
+ byte[] hashPrevouts = new byte[32];
+ byte[] hashSequence = new byte[32];
+ byte[] hashOutputs = new byte[32];
+ anyoneCanPay = (sigHashType & SIGHASH_ANYONECANPAY_VALUE) == SIGHASH_ANYONECANPAY_VALUE;
+ List inputs = getInputs();
+ List outputs = getOutputs();
+
+ if (!anyoneCanPay) {
+ ByteArrayOutputStream bosHashPrevouts = new UnsafeByteArrayOutputStream(256);
+ for (int i = 0; i < inputs.size(); ++i) {
+ bosHashPrevouts.write(inputs.get(i).getOutpoint().getHash().getReversedBytes());
+ uint32ToByteStreamLE(inputs.get(i).getOutpoint().getIndex(), bosHashPrevouts);
+ }
+ hashPrevouts = Sha256Hash.hashTwice(bosHashPrevouts.toByteArray());
+ }
+
+ if (!anyoneCanPay && type != SigHash.SINGLE && type != SigHash.NONE) {
+ ByteArrayOutputStream bosSequence = new UnsafeByteArrayOutputStream(256);
+ for (int i = 0; i < inputs.size(); ++i) {
+ uint32ToByteStreamLE(inputs.get(i).getSequenceNumber(), bosSequence);
+ }
+ hashSequence = Sha256Hash.hashTwice(bosSequence.toByteArray());
+ }
+
+ if (type != SigHash.SINGLE && type != SigHash.NONE) {
+ ByteArrayOutputStream bosHashOutputs = new UnsafeByteArrayOutputStream(256);
+ for (int i = 0; i < outputs.size(); ++i) {
+ uint64ToByteStreamLE(
+ BigInteger.valueOf(outputs.get(i).getValue().getValue()),
+ bosHashOutputs
+ );
+ bosHashOutputs.write(new VarInt(outputs.get(i).getScriptBytes().length).encode());
+ bosHashOutputs.write(outputs.get(i).getScriptBytes());
+ }
+ hashOutputs = Sha256Hash.hashTwice(bosHashOutputs.toByteArray());
+ } else if (type == SigHash.SINGLE && inputIndex < outputs.size()) {
+ ByteArrayOutputStream bosHashOutputs = new UnsafeByteArrayOutputStream(256);
+ uint64ToByteStreamLE(
+ BigInteger.valueOf(outputs.get(inputIndex).getValue().getValue()),
+ bosHashOutputs
+ );
+ bosHashOutputs.write(new VarInt(outputs.get(inputIndex).getScriptBytes().length).encode());
+ bosHashOutputs.write(outputs.get(inputIndex).getScriptBytes());
+ hashOutputs = Sha256Hash.hashTwice(bosHashOutputs.toByteArray());
+ }
+ uint32ToByteStreamLE(getVersion(), bos);
+ bos.write(hashPrevouts);
+ bos.write(hashSequence);
+ bos.write(inputs.get(inputIndex).getOutpoint().getHash().getReversedBytes());
+ uint32ToByteStreamLE(inputs.get(inputIndex).getOutpoint().getIndex(), bos);
+ bos.write(new VarInt(connectedScript.length).encode());
+ bos.write(connectedScript);
+ uint64ToByteStreamLE(BigInteger.valueOf(prevValue.getValue()), bos);
+ uint32ToByteStreamLE(inputs.get(inputIndex).getSequenceNumber(), bos);
+ bos.write(hashOutputs);
+ uint32ToByteStreamLE(getLockTime(), bos);
+ uint32ToByteStreamLE(0x000000ff & sigHashType, bos);
+ } catch (IOException e) {
+ throw new RuntimeException(e); // Cannot happen.
+ }
+
+ return Sha256Hash.twiceOf(bos.toByteArray());
+ }
+}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt
new file mode 100644
index 0000000000..58bec1f6e3
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashTransactionBuilder.kt
@@ -0,0 +1,82 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinTransactionBuilder
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.common.TransactionData
+import com.tangem.blockchain.extensions.Result
+import com.tangem.common.extensions.isZero
+import org.bitcoinj.core.*
+import org.bitcoinj.core.LegacyAddress.fromPubKeyHash
+import org.bitcoinj.crypto.TransactionSignature
+import org.bitcoinj.script.Script
+import org.bitcoinj.script.ScriptBuilder
+import java.math.BigDecimal
+import java.math.BigInteger
+
+class BitcoinCashTransactionBuilder(private val walletPublicKey: ByteArray)
+ : BitcoinTransactionBuilder(walletPublicKey) {
+
+ private lateinit var transaction: BitcoinCashTransaction
+
+ override fun buildToSign(
+ transactionData: TransactionData): Result> {
+
+ if (unspentOutputs == null) return Result.Failure(Exception("Currently there's an unconfirmed transaction"))
+
+ val change: BigDecimal = calculateChange(transactionData, unspentOutputs!!)
+
+ networkParameters = NetworkParameters.fromID(NetworkParameters.ID_MAINNET)
+ transaction = transactionData.toBitcoinCashTransaction(networkParameters, unspentOutputs!!, change)
+
+ val hashesForSign: MutableList = MutableList(transaction.inputs.size) { byteArrayOf() }
+ for (input in transaction.inputs) {
+ val index = input.index
+ val value = Coin.parseCoin(unspentOutputs!![index].amount.toString())
+ hashesForSign[index] = transaction.hashForSignatureWitness(index, input.scriptBytes, value, Transaction.SigHash.ALL, false).bytes
+ }
+ return Result.Success(hashesForSign)
+ }
+
+ override fun buildToSend(signedTransaction: ByteArray): ByteArray {
+ for (index in transaction.inputs.indices) {
+ transaction.inputs[index].scriptSig = createScript(index, signedTransaction, walletPublicKey)
+ }
+ return transaction.bitcoinSerialize()
+ }
+
+ override fun createScript(index: Int, signedTransaction: ByteArray, publicKey: ByteArray): Script {
+ val r = BigInteger(1, signedTransaction.copyOfRange(index * 64, 32 + index * 64))
+ val s = BigInteger(1, signedTransaction.copyOfRange(32 + index * 64, 64 + index * 64))
+ val canonicalS = ECKey.ECDSASignature(r, s).toCanonicalised().s
+
+ val sigHash = 0x41
+ val signature = TransactionSignature(r, canonicalS, sigHash)
+ return ScriptBuilder.createInputScript(signature, ECKey.fromPublicOnly(publicKey))
+ }
+}
+
+internal fun TransactionData.toBitcoinCashTransaction(networkParameters: NetworkParameters?,
+ unspentOutputs: List,
+ change: BigDecimal): BitcoinCashTransaction {
+ val transaction = BitcoinCashTransaction(networkParameters)
+ for (utxo in unspentOutputs) {
+ transaction.addInput(Sha256Hash.wrap(utxo.transactionHash), utxo.outputIndex, Script(utxo.outputScript))
+ }
+ val addressService = BitcoinCashAddressService()
+ val sourceLegacyAddress =
+ fromPubKeyHash(networkParameters, addressService.getPublicKeyHash(this.sourceAddress))
+ val destinationLegacyAddress =
+ fromPubKeyHash(networkParameters, addressService.getPublicKeyHash(this.destinationAddress))
+
+ transaction.addOutput(
+ Coin.parseCoin(this.amount.value!!.toPlainString()),
+ destinationLegacyAddress
+ )
+ if (!change.isZero()) {
+ transaction.addOutput(
+ Coin.parseCoin(change.toPlainString()),
+ sourceLegacyAddress
+ )
+ }
+ return transaction
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt
new file mode 100644
index 0000000000..b0793c6cf9
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashWalletManager.kt
@@ -0,0 +1,28 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
+import com.tangem.blockchain.common.Amount
+import com.tangem.blockchain.common.TransactionSender
+import com.tangem.blockchain.common.Wallet
+import com.tangem.blockchain.extensions.Result
+import java.math.BigDecimal
+
+class BitcoinCashWalletManager(
+ cardId: String,
+ wallet: Wallet,
+ private val transactionBuilder: BitcoinCashTransactionBuilder,
+ private val networkManager: BitcoinCashNetworkManager
+) : BitcoinWalletManager(cardId, wallet, transactionBuilder, networkManager), TransactionSender {
+ override suspend fun getFee(amount: Amount, destination: String): Result> {
+ val minimalFee = BigDecimal("0.00001")
+ when (val result = super.getFee(amount, destination)) {
+ is Result.Success -> {
+ for (fee in result.data) {
+ if (fee.value!! < minimalFee) fee.value = minimalFee
+ }
+ return result
+ }
+ is Result.Failure -> return result
+ }
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java
new file mode 100644
index 0000000000..b3675c1f52
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressDecodedParts.java
@@ -0,0 +1,37 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+
+// Helper class for CashAddr
+
+public class BitcoinCashAddressDecodedParts {
+
+ String prefix;
+
+ BitcoinCashAddressType addressType;
+
+ byte[] hash;
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public void setPrefix(String prefix) {
+ this.prefix = prefix;
+ }
+
+ public BitcoinCashAddressType getAddressType() {
+ return addressType;
+ }
+
+ public void setAddressType(BitcoinCashAddressType addressType) {
+ this.addressType = addressType;
+ }
+
+ public byte[] getHash() {
+ return hash;
+ }
+
+ public void setHash(byte[] hash) {
+ this.hash = hash;
+ }
+
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java
new file mode 100644
index 0000000000..8654b29a1c
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashAddressType.java
@@ -0,0 +1,23 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+
+
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ *
+ * Distributed under the MIT software license, see the accompanying file LICENSE
+ * or http://www.opensource.org/licenses/mit-license.php.
+ */
+public enum BitcoinCashAddressType {
+
+ P2PKH((byte) 0), P2SH((byte) 8);
+
+ private final byte versionByte;
+
+ BitcoinCashAddressType(byte versionByte) {
+ this.versionByte = versionByte;
+ }
+
+ public byte getVersionByte() {
+ return versionByte;
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java
new file mode 100644
index 0000000000..04f3fef9f4
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBase32.java
@@ -0,0 +1,74 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ *
+ * Distributed under the MIT software license, see the accompanying file LICENSE
+ * or http://www.opensource.org/licenses/mit-license.php.
+ */
+public class BitcoinCashBase32 {
+
+ public static final String CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
+
+ private static final char[] CHARS = CHARSET.toCharArray();
+
+ private static Map charPositionMap;
+ static {
+ charPositionMap = new HashMap<>();
+ for (int i = 0; i < CHARS.length; i++) {
+ charPositionMap.put(CHARS[i], i);
+ }
+ if (charPositionMap.size() != 32) {
+ throw new RuntimeException("The charset must contain 32 unique characters.");
+ }
+ }
+
+ /**
+ * Encode a byte array as base32 string. This method assumes that all bytes
+ * are only from 0-31
+ *
+ * @param byteArray
+ * @return
+ */
+ public static String encode(byte[] byteArray) {
+ StringBuffer sb = new StringBuffer();
+
+ for (int i = 0; i < byteArray.length; i++) {
+ int val = (int) byteArray[i];
+
+ if (val < 0 || val > 31) {
+ throw new RuntimeException("This method assumes that all bytes are only from 0-31. Was: " + val);
+ }
+
+ sb.append(CHARS[val]);
+ }
+
+ return sb.toString();
+ }
+
+ /**
+ * Decode a base32 string back to the byte array representation
+ *
+ * @param base32String
+ * @return
+ */
+ public static byte[] decode(String base32String) {
+ byte[] bytes = new byte[base32String.length()];
+
+ char[] charArray = base32String.toCharArray();
+ for (int i = 0; i < charArray.length; i++) {
+ Integer position = charPositionMap.get(charArray[i]);
+ if (position == null) {
+ throw new RuntimeException("There seems to be an invalid char: " + charArray[i]);
+ }
+ bytes[i] = (byte) ((int) position);
+ }
+
+ return bytes;
+ }
+}
+
+
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java
new file mode 100644
index 0000000000..ec0f980198
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/BitcoinCashBitArrayConverter.java
@@ -0,0 +1,60 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ *
+ * Copyright (c) 2017 Pieter Wuille
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+public class BitcoinCashBitArrayConverter {
+
+ public static byte[] convertBits(byte[] bytes8Bits, int from, int to, boolean strictMode) {
+ int length = (int) (strictMode ? Math.floor((double) bytes8Bits.length * from / to)
+ : Math.ceil((double) bytes8Bits.length * from / to));
+ int mask = ((1 << to) - 1) & 0xff;
+ byte[] result = new byte[length];
+ int index = 0;
+ int accumulator = 0;
+ int bits = 0;
+ for (int i = 0; i < bytes8Bits.length; i++) {
+ byte value = bytes8Bits[i];
+ accumulator = (((accumulator & 0xff) << from) | (value & 0xff));
+ bits += from;
+ while (bits >= to) {
+ bits -= to;
+ result[index] = (byte) ((accumulator >> bits) & mask);
+ ++index;
+ }
+ }
+ if (!strictMode) {
+ if (bits > 0) {
+ result[index] = (byte) ((accumulator << (to - bits)) & mask);
+ ++index;
+ }
+ } else {
+ if (!(bits < from && ((accumulator << (to - bits)) & mask) == 0)) {
+ throw new RuntimeException("Strict mode was used but input couldn't be converted without padding");
+ }
+ }
+
+ return result;
+ }
+
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java
new file mode 100644
index 0000000000..8c2cd1bfab
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoincash/cashaddr/CashAddr.java
@@ -0,0 +1,225 @@
+package com.tangem.blockchain.blockchains.bitcoincash.cashaddr;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+
+
+/**
+ * Copyright (c) 2018 Tobias Brandt
+ *
+ * Distributed under the MIT software license, see the accompanying file LICENSE
+ * or http://www.opensource.org/licenses/mit-license.php.
+ */
+
+
+public class CashAddr {
+
+ public static final String CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
+
+ private static final char[] CHARS = CHARSET.toCharArray();
+
+
+ public static final String SEPARATOR = ":";
+
+ public static final String MAIN_NET_PREFIX = "bitcoincash";
+
+ public static final String TEST_NET_PREFIX = "bchtest";
+
+ public static final String ASSUMED_DEFAULT_PREFIX = MAIN_NET_PREFIX;
+
+ private static final BigInteger[] POLYMOD_GENERATORS = new BigInteger[] { new BigInteger("98f2bc8e61", 16),
+ new BigInteger("79b76d99e2", 16), new BigInteger("f33e5fb3c4", 16), new BigInteger("ae2eabe2a8", 16),
+ new BigInteger("1e4f43e470", 16) };
+
+ private static final BigInteger POLYMOD_AND_CONSTANT = new BigInteger("07ffffffff", 16);
+
+ public static String toCashAddress(BitcoinCashAddressType addressType, byte[] hash) {
+ String prefixString = MAIN_NET_PREFIX;
+ byte[] prefixBytes = getPrefixBytes(prefixString);
+ byte[] payloadBytes = concatenateByteArrays(new byte[] { addressType.getVersionByte() }, hash);
+ payloadBytes = convertBits(payloadBytes, 8, 5, false);
+ byte[] allChecksumInput = concatenateByteArrays(
+ concatenateByteArrays(concatenateByteArrays(prefixBytes, new byte[] { 0 }), payloadBytes),
+ new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 });
+ byte[] checksumBytes = calculateChecksumBytesPolymod(allChecksumInput);
+ checksumBytes = convertBits(checksumBytes, 8, 5, true);
+ String cashAddress = BitcoinCashBase32.encode(concatenateByteArrays(payloadBytes, checksumBytes));
+ return prefixString + SEPARATOR + cashAddress;
+ }
+
+ public static BitcoinCashAddressDecodedParts decodeCashAddress(String bitcoinCashAddress) {
+ if (!isValidCashAddress(bitcoinCashAddress)) {
+ throw new RuntimeException("Address wasn't valid: " + bitcoinCashAddress);
+ }
+
+ BitcoinCashAddressDecodedParts decoded = new BitcoinCashAddressDecodedParts();
+ String[] addressParts = bitcoinCashAddress.split(SEPARATOR);
+ if (addressParts.length == 2) {
+ decoded.setPrefix(addressParts[0]);
+ } else {
+ decoded.setPrefix(MAIN_NET_PREFIX);
+ }
+
+ byte[] addressData = BitcoinCashBase32.decode(addressParts[addressParts.length - 1]);
+ addressData = Arrays.copyOfRange(addressData, 0, addressData.length - 8);
+ addressData = BitcoinCashBitArrayConverter.convertBits(addressData, 5, 8, true);
+ byte versionByte = addressData[0];
+ byte[] hash = Arrays.copyOfRange(addressData, 1, addressData.length);
+
+ decoded.setAddressType(getAddressTypeFromVersionByte(versionByte));
+ decoded.setHash(hash);
+
+ return decoded;
+ }
+
+ private static BitcoinCashAddressType getAddressTypeFromVersionByte(byte versionByte) {
+ for (BitcoinCashAddressType addressType : BitcoinCashAddressType.values()) {
+ if (addressType.getVersionByte() == versionByte) {
+ return addressType;
+ }
+ }
+
+ throw new RuntimeException("Unknown version byte: " + versionByte);
+ }
+
+
+
+ public static boolean isValidCashAddress(String bitcoinCashAddress ) {
+ try {
+ if (!isSingleCase(bitcoinCashAddress))
+ return false;
+
+ bitcoinCashAddress = bitcoinCashAddress.toLowerCase();
+ String prefix;
+
+ if (bitcoinCashAddress.contains(SEPARATOR)) {
+ String[] split = bitcoinCashAddress.split(SEPARATOR);
+ prefix = split[0];
+ if (!prefix.equals(MAIN_NET_PREFIX)) {return false;} //for now we use main net only
+ bitcoinCashAddress = split[1];
+ } else {
+ prefix = MAIN_NET_PREFIX;
+ }
+ if (!bitcoinCashAddress.startsWith("q")) {return false;} //for now we use P2PKH addresses only
+
+ byte[] checksumData = concatenateByteArrays(
+ concatenateByteArrays(getPrefixBytes(prefix ), new byte[] { 0x00 }),
+ BitcoinCashBase32.decode(bitcoinCashAddress));
+
+ byte[] calculateChecksumBytesPolymod = calculateChecksumBytesPolymod(checksumData);
+ return new BigInteger(calculateChecksumBytesPolymod).compareTo(BigInteger.ZERO) == 0;
+ } catch (RuntimeException re) {
+ return false;
+ }
+ }
+
+
+
+ private static boolean isSingleCase(String bitcoinCashAddress) {
+ if (bitcoinCashAddress.equals(bitcoinCashAddress.toLowerCase())) {
+ return true;
+ }
+ if (bitcoinCashAddress.equals(bitcoinCashAddress.toUpperCase())) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @param checksumInput
+ * @return Returns a 40 bits checksum in form of 5 8-bit arrays. This still has
+ * to me mapped to 5-bit array representation
+ */
+ private static byte[] calculateChecksumBytesPolymod(byte[] checksumInput) {
+ BigInteger c = BigInteger.ONE;
+
+ for (int i = 0; i < checksumInput.length; i++) {
+ byte c0 = c.shiftRight(35).byteValue();
+ c = c.and(POLYMOD_AND_CONSTANT).shiftLeft(5)
+ .xor(new BigInteger(String.format("%02x", checksumInput[i]), 16));
+
+ if ((c0 & 0x01) != 0)
+ c = c.xor(POLYMOD_GENERATORS[0]);
+ if ((c0 & 0x02) != 0)
+ c = c.xor(POLYMOD_GENERATORS[1]);
+ if ((c0 & 0x04) != 0)
+ c = c.xor(POLYMOD_GENERATORS[2]);
+ if ((c0 & 0x08) != 0)
+ c = c.xor(POLYMOD_GENERATORS[3]);
+ if ((c0 & 0x10) != 0)
+ c = c.xor(POLYMOD_GENERATORS[4]);
+ }
+
+ byte[] checksum = c.xor(BigInteger.ONE).toByteArray();
+ if (checksum.length == 5) {
+ return checksum;
+ } else {
+ byte[] newChecksumArray = new byte[5];
+
+ System.arraycopy(checksum, Math.max(0, checksum.length - 5), newChecksumArray,
+ Math.max(0, 5 - checksum.length), Math.min(5, checksum.length));
+
+ return newChecksumArray;
+ }
+
+ }
+
+ private static byte[] getPrefixBytes(String prefixString ) {
+ byte[] prefixBytes = new byte[prefixString.length()];
+
+ char[] charArray = prefixString.toCharArray();
+ for (int i = 0; i < charArray.length; i++) {
+ prefixBytes[i] = (byte) (charArray[i] & 0x1f);
+ }
+
+ return prefixBytes;
+ }
+
+ private static byte[] concatenateByteArrays(byte[] first, byte[] second) {
+ byte[] concatenatedBytes = new byte[first.length + second.length];
+
+ System.arraycopy(first, 0, concatenatedBytes, 0, first.length);
+ System.arraycopy(second, 0, concatenatedBytes, first.length, second.length);
+
+ return concatenatedBytes;
+ }
+
+ private static byte[] convertBits(byte[] bytes8Bits, int from, int to, boolean strictMode) {
+ //Copyright (c) 2017 Pieter Wuille
+
+ int length = (int) (strictMode ? Math.floor((double) bytes8Bits.length * from / to)
+ : Math.ceil((double) bytes8Bits.length * from / to));
+ int mask = ((1 << to) - 1) & 0xff;
+ byte[] result = new byte[length];
+ int index = 0;
+ int accumulator = 0;
+ int bits = 0;
+ for (int i = 0; i < bytes8Bits.length; i++) {
+ byte value = bytes8Bits[i];
+ accumulator = (((accumulator & 0xff) << from) | (value & 0xff));
+ bits += from;
+ while (bits >= to) {
+ bits -= to;
+ result[index] = (byte) ((accumulator >> bits) & mask);
+ ++index;
+ }
+ }
+ if (!strictMode) {
+ if (bits > 0) {
+ result[index] = (byte) ((accumulator << (to - bits)) & mask);
+ ++index;
+ }
+ } else {
+ if (!(bits < from && ((accumulator << (to - bits)) & mask) == 0)) {
+ throw new RuntimeException("Strict mode was used but input couldn't be converted without padding");
+ }
+ }
+
+ return result;
+ }
+
+
+
+
+}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt
new file mode 100644
index 0000000000..ec72bc4b69
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt
@@ -0,0 +1,121 @@
+package com.tangem.blockchain.blockchains.cardano
+
+import co.nstant.`in`.cbor.CborBuilder
+import co.nstant.`in`.cbor.CborDecoder
+import co.nstant.`in`.cbor.CborEncoder
+import co.nstant.`in`.cbor.model.Array
+import co.nstant.`in`.cbor.model.ByteString
+import co.nstant.`in`.cbor.model.UnsignedInteger
+import com.tangem.blockchain.blockchains.cardano.crypto.Blake2b
+import com.tangem.blockchain.common.AddressService
+import com.tangem.blockchain.extensions.decodeBase58
+import com.tangem.blockchain.extensions.encodeBase58
+import org.spongycastle.crypto.util.DigestFactory
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.util.zip.CRC32
+
+class CardanoAddressService : AddressService {
+ override fun makeAddress(walletPublicKey: ByteArray): String {
+ val extendedPublicKey = extendPublicKey(walletPublicKey)
+
+ val pubKeyWithAttributes = getPubKeyWithAttributes(extendedPublicKey)
+ val sha3Hash = getSha3Hash(pubKeyWithAttributes)
+
+ val blake2b = Blake2b.Digest.newInstance(28)
+ val blakeHash = blake2b.digest(sha3Hash)
+
+ val hashWithAttributes = getHashWithAttributes(blakeHash)
+
+ return getAddress(hashWithAttributes)
+ }
+
+ override fun validate(address: String): Boolean {
+ val decoded = address.decodeBase58() ?: return false
+
+ return try {
+ val bais = ByteArrayInputStream(decoded)
+ val addressList =
+ (CborDecoder(bais).decode()[0] as Array).dataItems
+ val addressItemBytes = (addressList[0] as ByteString).bytes
+ val checksum = (addressList[1] as UnsignedInteger).value.toLong()
+
+ val crc32 = CRC32()
+ crc32.update(addressItemBytes)
+ val calculatedChecksum = crc32.value
+
+ checksum == calculatedChecksum
+ } catch (e: Exception) {
+ false
+ }
+ }
+
+ private fun getPubKeyWithAttributes(extendedPublicKey: ByteArray): ByteArray {
+ val pubKeyWithAttributes = ByteArrayOutputStream()
+ CborEncoder(pubKeyWithAttributes).encode(CborBuilder()
+ .addArray()
+ .add(0)
+ .addArray()
+ .add(0)
+ .add(extendedPublicKey)
+ .end()
+ .addMap()
+ .end()
+ .end()
+ .build())
+ return pubKeyWithAttributes.toByteArray()
+ }
+
+ private fun getSha3Hash(pubKeyWithAttributes: ByteArray): ByteArray {
+ val sha3Digest = DigestFactory.createSHA3_256()
+ sha3Digest.update(pubKeyWithAttributes, 0, pubKeyWithAttributes.size)
+ val sha3Hash = ByteArray(32)
+ sha3Digest.doFinal(sha3Hash, 0)
+ return sha3Hash
+ }
+
+ private fun getHashWithAttributes(blakeHash: ByteArray): ByteArray {
+ val hashWithAttributes = ByteArrayOutputStream()
+ CborEncoder(hashWithAttributes).encode(CborBuilder()
+ .addArray()
+ .add(blakeHash)
+ .addMap() //additional attributes
+ .end()
+ .add(0) //address type
+ .end()
+ .build())
+ return hashWithAttributes.toByteArray()
+ }
+
+ private fun getAddress(hashWithAttributes: ByteArray): String {
+ val checksum = getCheckSum(hashWithAttributes)
+
+ val addressItem = CborBuilder().add(hashWithAttributes).build().get(0)
+ addressItem.setTag(24)
+
+ //addr + checksum
+ val address = ByteArrayOutputStream()
+ CborEncoder(address).encode(CborBuilder()
+ .addArray()
+ .add(addressItem)
+ .add(checksum)
+ .end()
+ .build())
+
+ return address.toByteArray().encodeBase58()
+ }
+
+ private fun getCheckSum(hashWithAttributes: ByteArray): Long {
+ val crc32 = CRC32()
+ crc32.update(hashWithAttributes)
+ return crc32.value
+ }
+
+ companion object {
+ fun extendPublicKey(publicKey: ByteArray): ByteArray {
+ val zeroBytes = ByteArray(32)
+ zeroBytes.fill(0)
+ return publicKey + zeroBytes
+ }
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoTransactionBuilder.kt
similarity index 91%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoTransactionBuilder.kt
index a251e0068c..eb3d2ee289 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoTransactionBuilder.kt
@@ -1,19 +1,20 @@
-package com.tangem.blockchain.cardano
+package com.tangem.blockchain.blockchains.cardano
import co.nstant.`in`.cbor.CborBuilder
import co.nstant.`in`.cbor.CborDecoder
import co.nstant.`in`.cbor.CborEncoder
import co.nstant.`in`.cbor.builder.ArrayBuilder
-import com.tangem.blockchain.cardano.crypto.Blake2b
+import com.tangem.blockchain.blockchains.cardano.crypto.Blake2b
import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.common.extensions.decodeBase58
+import com.tangem.blockchain.extensions.decodeBase58
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.math.BigDecimal
-class CardanoTransactionBuilder() {
+class CardanoTransactionBuilder(private val walletPublicKey: ByteArray) {
+
var unspentOutputs: List = listOf()
- var transactionBody: ByteArray = ByteArray(0)
+ private var transactionBody: ByteArray = ByteArray(0)
fun buildToSign(transactionData: TransactionData): ByteArray {
val transactionBuilder = CborBuilder()
@@ -43,8 +44,8 @@ class CardanoTransactionBuilder() {
return prefixedHashBaos.toByteArray()
}
- fun buildToSend(signature: ByteArray, publicKey: ByteArray): ByteArray {
- val extendedPublicKey = CardanoAddressFactory.extendPublicKey(publicKey)
+ fun buildToSend(signature: ByteArray): ByteArray {
+ val extendedPublicKey = CardanoAddressService.extendPublicKey(walletPublicKey)
//pubkey + signature
val witnessBodyBaos = ByteArrayOutputStream()
@@ -144,7 +145,7 @@ class CardanoTransactionBuilder() {
return fullAmount - (amount + fee)
}
- fun getEstimateSize(transactionData: TransactionData, walletPublicKey: ByteArray): Int {
+ fun getEstimateSize(transactionData: TransactionData): Int {
val dummyFeeValue = BigDecimal.valueOf(0.1)
val dummyFee = transactionData.amount.copy(value = dummyFeeValue)
@@ -156,7 +157,7 @@ class CardanoTransactionBuilder() {
fee = dummyFee
)
buildToSign(dummyTransactionData)
- return buildToSend(ByteArray(64), walletPublicKey).size
+ return buildToSend(ByteArray(64)).size
}
companion object {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoWalletManager.kt
similarity index 56%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoWalletManager.kt
index 86b5f25a51..d63bb787ed 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoWalletManager.kt
@@ -1,30 +1,26 @@
-package com.tangem.blockchain.cardano
+package com.tangem.blockchain.blockchains.cardano
import android.util.Log
-import com.tangem.blockchain.cardano.network.CardanoAddressResponse
-import com.tangem.blockchain.cardano.network.CardanoNetworkManager
+import com.tangem.blockchain.blockchains.cardano.network.CardanoAddressResponse
+import com.tangem.blockchain.blockchains.cardano.network.CardanoNetworkManager
import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.encodeBase64NoWrap
-import com.tangem.blockchain.wallets.CurrencyWallet
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.encodeBase64NoWrap
import com.tangem.common.CompletionResult
+import java.math.RoundingMode
class CardanoWalletManager(
- private val cardId: String,
- private val walletPublicKey: ByteArray,
- override var wallet: CurrencyWallet
-) : WalletManager,
- TransactionSender,
- FeeProvider {
+ cardId: String,
+ wallet: Wallet,
+ private val transactionBuilder: CardanoTransactionBuilder,
+ private val networkManager: CardanoNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
- override val blockchain = Blockchain.Cardano
- private val address = blockchain.makeAddress(walletPublicKey)
- private val transactionBuilder = CardanoTransactionBuilder()
- private val networkManager = CardanoNetworkManager()
+ private val blockchain = wallet.blockchain
override suspend fun update() {
- val response = networkManager.getInfo(address)
+ val response = networkManager.getInfo(wallet.address)
when (response) {
is Result.Success -> updateWallet(response.data)
is Result.Failure -> updateError(response.error)
@@ -33,8 +29,8 @@ class CardanoWalletManager(
private fun updateWallet(response: CardanoAddressResponse) {
Log.d(this::class.java.simpleName, "Balance is ${response.balance.toString()}")
- wallet.balances[AmountType.Coin]?.value =
- response.balance.toBigDecimal().movePointLeft(blockchain.decimals.toInt())
+ wallet.amounts[AmountType.Coin]?.value =
+ response.balance.toBigDecimal().movePointLeft(blockchain.decimals())
transactionBuilder.unspentOutputs = response.unspentOutputs
}
@@ -48,7 +44,7 @@ class CardanoWalletManager(
when (val signerResponse = signer.sign(arrayOf(transactionHash), cardId)) {
is CompletionResult.Success -> {
- val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature, walletPublicKey)
+ val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
return networkManager.sendTransaction(transactionToSend.encodeBase64NoWrap())
}
is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
@@ -59,9 +55,9 @@ class CardanoWalletManager(
val a = 0.155381
val b = 0.000043946
val size = transactionBuilder.getEstimateSize(
- TransactionData(amount, null, address, destination), walletPublicKey
+ TransactionData(amount, null, wallet.address, destination)
)
- val fee = (a + b * size).toBigDecimal()
- return Result.Success(listOf(Amount(blockchain.currency, fee, address, blockchain.decimals)))
+ val fee = (a + b * size).toBigDecimal().setScale(blockchain.decimals(), RoundingMode.UP)
+ return Result.Success(listOf(Amount(amount, fee)))
}
}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/crypto/Blake2b.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/crypto/Blake2b.java
similarity index 98%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/crypto/Blake2b.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/crypto/Blake2b.java
index 01358597fd..70059e3e6a 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/crypto/Blake2b.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/crypto/Blake2b.java
@@ -17,7 +17,7 @@
this software. If not, see .
*/
-package com.tangem.blockchain.cardano.crypto;
+package com.tangem.blockchain.blockchains.cardano.crypto;
import java.io.PrintStream;
import java.io.Serializable;
@@ -25,14 +25,14 @@ import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Arrays;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.assertFail;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.exclusiveLowerBound;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.inclusiveLowerBound;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.Assert.inclusiveUpperBound;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.readInt;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.readLong;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.writeInt;
-import static com.tangem.blockchain.cardano.crypto.Blake2b.Engine.LittleEndian.writeLong;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.assertFail;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.exclusiveLowerBound;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.inclusiveLowerBound;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.Assert.inclusiveUpperBound;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.readInt;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.readLong;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.writeInt;
+import static com.tangem.blockchain.blockchains.cardano.crypto.Blake2b.Engine.LittleEndian.writeLong;
/** */
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/CardanoNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/CardanoNetworkManager.kt
similarity index 77%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/CardanoNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/CardanoNetworkManager.kt
index 1852c6b994..907dd1be92 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/CardanoNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/CardanoNetworkManager.kt
@@ -1,13 +1,13 @@
-package com.tangem.blockchain.cardano.network
+package com.tangem.blockchain.blockchains.cardano.network
-import com.tangem.blockchain.cardano.UnspentOutput
-import com.tangem.blockchain.cardano.network.adalite.AdaliteProvider
-import com.tangem.blockchain.cardano.network.api.AdaliteApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_ADALITE
-import com.tangem.blockchain.common.network.API_ADALITE_RESERVE
-import com.tangem.blockchain.common.network.createRetrofitInstance
+import com.tangem.blockchain.blockchains.cardano.UnspentOutput
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteProvider
+import com.tangem.blockchain.blockchains.cardano.network.api.AdaliteApi
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_ADALITE
+import com.tangem.blockchain.network.API_ADALITE_RESERVE
+import com.tangem.blockchain.network.createRetrofitInstance
import retrofit2.HttpException
import java.io.IOException
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
new file mode 100644
index 0000000000..523a2caab7
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteApi.kt
@@ -0,0 +1,19 @@
+package com.tangem.blockchain.blockchains.cardano.network.api
+
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteAddress
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteSendBody
+import com.tangem.blockchain.blockchains.cardano.network.adalite.AdaliteUnspents
+import retrofit2.http.*
+
+interface AdaliteApi {
+ @GET("/api/addresses/summary/{address}")
+ suspend fun getAddress(@Path("address") address: String): AdaliteAddress
+
+ @Headers("Content-Type: application/json")
+ @POST("/api/bulk/addresses/utxo")
+ suspend fun getUnspents(@Body addresses: List): AdaliteUnspents
+
+ @Headers("Content-Type: application/json")
+ @POST("/api/v2/txs/signed")
+ suspend fun sendTransaction(@Body adaliteBody: AdaliteSendBody): String // List?
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteProvider.kt
similarity index 63%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteProvider.kt
index ec05798ced..972e500ced 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteProvider.kt
@@ -1,11 +1,13 @@
-package com.tangem.blockchain.cardano.network.adalite
+package com.tangem.blockchain.blockchains.cardano.network.adalite
-import com.tangem.blockchain.cardano.network.CardanoAddressResponse
-import com.tangem.blockchain.cardano.UnspentOutput
-import com.tangem.blockchain.cardano.network.api.AdaliteApi
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
+import com.squareup.moshi.Json
+import com.tangem.blockchain.blockchains.cardano.UnspentOutput
+import com.tangem.blockchain.blockchains.cardano.network.CardanoAddressResponse
+import com.tangem.blockchain.blockchains.cardano.network.api.AdaliteApi
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
+import com.tangem.common.extensions.hexToBytes
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
@@ -15,7 +17,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
return try {
coroutineScope {
val addressDeferred = retryIO { async { api.getAddress(address) } }
- val unspentsDeferred = retryIO { async { api.getUnspents(address) } }
+ val unspentsDeferred = retryIO { async { api.getUnspents(listOf(address)) } }
val addressData = addressDeferred.await()
val unspents = unspentsDeferred.await()
@@ -24,7 +26,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
UnspentOutput(
it.amountData!!.amount!!,
it.outputIndex!!.toLong(),
- it.hash!!.toByteArray()
+ it.hash!!.hexToBytes()
)
}
@@ -42,7 +44,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
suspend fun sendTransaction(transaction: String): SimpleResult {
return try {
- retryIO { api.sendTransaction(AdaliteSendBody(transaction)) }
+ val response = retryIO { api.sendTransaction(AdaliteSendBody(transaction)) }
SimpleResult.Success
} catch (exception: Exception) {
SimpleResult.Failure(exception)
@@ -50,4 +52,7 @@ class AdaliteProvider(private val api: AdaliteApi) {
}
}
-data class AdaliteSendBody(val signedTransaction: String)
\ No newline at end of file
+data class AdaliteSendBody(
+ @Json(name = "signedTx")
+ val signedTransaction: String
+)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteResponse.kt
similarity index 91%
rename from blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteResponse.kt
index 4bc1f86894..3aee35cf62 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/network/adalite/AdaliteResponse.kt
@@ -1,11 +1,11 @@
-package com.tangem.blockchain.cardano.network.adalite
+package com.tangem.blockchain.blockchains.cardano.network.adalite
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class AdaliteAddress(
- @Json(name = "final_balance")
+ @Json(name = "Right")
var data: AdaliteAddressData? = null
)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt
new file mode 100644
index 0000000000..50b9ab2bd0
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt
@@ -0,0 +1,15 @@
+package com.tangem.blockchain.blockchains.ethereum
+
+import com.tangem.blockchain.common.AddressService
+import org.kethereum.crypto.toAddress
+import org.kethereum.erc55.hasValidERC55ChecksumOrNoChecksum
+import org.kethereum.erc55.withERC55Checksum
+import org.kethereum.model.Address
+import org.kethereum.model.PublicKey
+
+class EthereumAddressService : AddressService {
+ override fun makeAddress(walletPublicKey: ByteArray): String =
+ PublicKey(walletPublicKey.sliceArray(1..64)).toAddress().withERC55Checksum().hex
+
+ override fun validate(address: String): Boolean = Address(address).hasValidERC55ChecksumOrNoChecksum()
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumTransactionBuilder.kt
new file mode 100644
index 0000000000..ead68d974b
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumTransactionBuilder.kt
@@ -0,0 +1,115 @@
+package com.tangem.blockchain.blockchains.ethereum
+
+import com.tangem.blockchain.common.Amount
+import com.tangem.blockchain.common.AmountType
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.common.TransactionData
+import com.tangem.common.extensions.hexToBytes
+import org.kethereum.crypto.api.ec.ECDSASignature
+import org.kethereum.crypto.determineRecId
+import org.kethereum.crypto.impl.ec.canonicalise
+import org.kethereum.extensions.toBytesPadded
+import org.kethereum.extensions.toFixedLengthByteArray
+import org.kethereum.extensions.transactions.encodeRLP
+import org.kethereum.extensions.transactions.tokenTransferSignature
+import org.kethereum.keccakshortcut.keccak
+import org.kethereum.model.*
+import java.math.BigDecimal
+import java.math.BigInteger
+
+class EthereumTransactionBuilder(private val walletPublicKey: ByteArray, blockchain: Blockchain) {
+
+ private val chainId = when (blockchain) {
+ Blockchain.Ethereum -> Chain.Mainnet.id
+ Blockchain.RSK -> Chain.RskMainnet.id
+ else -> throw Exception("${blockchain.fullName} blockchain is not supported by EthereumTransactionBuilder")
+ }
+
+ fun buildToSign(transactionData: TransactionData, nonce: BigInteger?): TransactionToSign? {
+
+ val amount: BigDecimal = transactionData.amount.value ?: return null
+ val transactionFee: BigDecimal = transactionData.fee?.value ?: return null
+
+ val fee = transactionFee.movePointRight(transactionData.fee.decimals).toBigInteger()
+ val gasLimit = getGasLimit(transactionData.amount).value.toBigInteger()
+ val bigIntegerAmount = amount.movePointRight(transactionData.amount.decimals).toBigInteger()
+
+ val to: Address
+ val value: BigInteger
+ val input: ByteArray //data for smart contract
+
+ if (transactionData.amount.type == AmountType.Coin) { //coin transfer
+ to = Address(transactionData.destinationAddress)
+ value = bigIntegerAmount
+ input = ByteArray(0)
+ } else { //token transfer
+ to = Address(transactionData.contractAddress
+ ?: throw Exception("Contract address is not specified!"))
+ value = BigInteger.ZERO
+ input = createErc20TransferData(transactionData.destinationAddress, bigIntegerAmount)
+ }
+
+ val transaction = createTransactionWithDefaults(
+ from = Address(transactionData.sourceAddress),
+ to = to,
+ value = value,
+ gasPrice = fee.divide(gasLimit),
+ gasLimit = gasLimit,
+ nonce = nonce,
+ input = input
+// chain = ChainId(chainId.toLong())
+ )
+ val hash = transaction.encodeRLP(SignatureData(v = chainId.toBigInteger())).keccak()
+ return TransactionToSign(transaction, listOf(hash))
+ }
+
+ fun buildToSend(signature: ByteArray, transactionToSign: TransactionToSign): ByteArray {
+ val r = BigInteger(1, signature.copyOfRange(0, 32))
+ val s = BigInteger(1, signature.copyOfRange(32, 64))
+
+ val ecdsaSignature = ECDSASignature(r, s).canonicalise()
+
+ val recId = ecdsaSignature.determineRecId(transactionToSign.hashes[0], PublicKey(walletPublicKey.sliceArray(1..64)))
+ val v = (recId + 27 + 8 + (chainId * 2)).toBigInteger()
+ val signatureData = SignatureData(ecdsaSignature.r, ecdsaSignature.s, v)
+
+ return transactionToSign.transaction.encodeRLP(signatureData)
+ }
+
+ private fun createErc20TransferData(recepient: String, amount: BigInteger): ByteArray {
+ return tokenTransferSignature.toByteArray() +
+ recepient.substring(2).hexToBytes().toFixedLengthByteArray(32) +
+ amount.toBytesPadded(32)
+ }
+}
+
+class TransactionToSign(val transaction: Transaction, val hashes: List)
+
+enum class GasLimit(val value: Long) {
+ Default(21000),
+ Token(60000),
+ High(300000)
+}
+
+internal fun getGasLimit(amount: Amount): GasLimit {
+ return when (amount.currencySymbol) {
+ Blockchain.Ethereum.currency -> GasLimit.Default
+ "DGX" -> GasLimit.High
+ "CGT" -> GasLimit.High
+ else -> GasLimit.Token
+ }
+}
+
+enum class Chain(val id: Int) {
+ Mainnet(1),
+ Morden(2),
+ Ropsten(3),
+ Rinkeby(4),
+ RskMainnet(30),
+ RskTestnet(31),
+ Kovan(42),
+ EthereumClassicMainnet(61),
+ EthereumClassicTestnet(62),
+ Geth_private_chains(1337),
+ MaticTestnet(8995);
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
new file mode 100644
index 0000000000..5ac19d6370
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumWalletManager.kt
@@ -0,0 +1,74 @@
+package com.tangem.blockchain.blockchains.ethereum
+
+import android.util.Log
+import com.tangem.blockchain.blockchains.ethereum.network.EthereumNetworkManager
+import com.tangem.blockchain.blockchains.ethereum.network.EthereumInfoResponse
+import com.tangem.blockchain.common.*
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.common.CompletionResult
+import com.tangem.common.extensions.toHexString
+import java.math.BigDecimal
+
+class EthereumWalletManager(
+ cardId: String,
+ wallet: Wallet,
+ private val transactionBuilder: EthereumTransactionBuilder,
+ private val networkManager: EthereumNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
+
+ private val blockchain = wallet.blockchain
+
+ private var pendingTxCount = -1L
+ private var txCount = -1L
+
+ override suspend fun update() {
+
+ val result = networkManager.getInfo(wallet.address, wallet.amounts[AmountType.Token]?.address)
+ when (result) {
+ is Result.Failure -> updateError(result.error)
+ is Result.Success -> updateWallet(result.data)
+ }
+ }
+
+ private fun updateWallet(data: EthereumInfoResponse) {
+ wallet.amounts[AmountType.Coin]?.value = data.balance
+ wallet.amounts[AmountType.Token]?.value = data.tokenBalance
+ txCount = data.txCount
+ pendingTxCount = data.pendingTxCount
+ if (txCount == pendingTxCount) {
+ wallet.transactions.forEach { it.status = TransactionStatus.Confirmed }
+ } else if (wallet.transactions.isEmpty()) {
+ wallet.addIncomingTransaction()
+ }
+ }
+
+ private fun updateError(error: Throwable?) {
+ Log.e(this::class.java.simpleName, error?.message ?: "")
+ if (error != null) throw error
+ }
+
+ override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
+ val transactionToSign = transactionBuilder.buildToSign(transactionData, txCount.toBigInteger())
+ ?: return SimpleResult.Failure(Exception("Not enough data"))
+ when (val signerResponse = signer.sign(transactionToSign.hashes.toTypedArray(), cardId)) {
+ is CompletionResult.Success -> {
+ val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature, transactionToSign)
+ return networkManager.sendTransaction(String.format("0x%s", transactionToSend.toHexString()))
+ }
+ is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
+ }
+ }
+
+ override suspend fun getFee(amount: Amount, destination: String): Result> {
+ val result = networkManager.getFee(getGasLimit(amount).value)
+ when (result) {
+ is Result.Success -> {
+ val feeValues: List = result.data
+ return Result.Success(
+ feeValues.map { feeValue -> Amount(wallet.amounts[AmountType.Coin]!!, feeValue) })
+ }
+ is Result.Failure -> return result
+ }
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumApi.kt
similarity index 68%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumApi.kt
index df84fae5ad..0b0030a779 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumApi.kt
@@ -1,18 +1,19 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
import com.squareup.moshi.JsonClass
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST
+import retrofit2.http.Path
-interface InfuraApi {
+interface EthereumApi {
@Headers("Content-Type: application/json")
- @POST("v3/613a0b14833145968b1f656240c7d245")
- suspend fun postToInfura(@Body body: InfuraBody?): InfuraResponse
+ @POST("{apiKey}")
+ suspend fun post(@Body body: EthereumBody?, @Path("apiKey") apiKey: String): EthereumResponse
}
@JsonClass(generateAdapter = true)
-data class InfuraBody(
+data class EthereumBody(
val jsonrpc: String = "2.0",
val id: Int = 67,
val method: String? = null,
@@ -21,7 +22,7 @@ data class InfuraBody(
data class EthCallParams(private val data: String, private val to: String)
-enum class InfuraMethod(val value: String) {
+enum class EthereumMethod(val value: String) {
GET_BALANCE("eth_getBalance"),
GET_TRANSACTION_COUNT("eth_getTransactionCount"),
GET_PENDING_COUNT("eth_getPendingCount"),
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
similarity index 62%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
index b7318ba032..0fd3078d40 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/EthereumNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt
@@ -1,26 +1,40 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
import com.tangem.blockchain.common.Blockchain
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
-import com.tangem.blockchain.common.network.API_INFURA
-import com.tangem.blockchain.common.network.createRetrofitInstance
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
+import com.tangem.blockchain.network.API_INFURA
+import com.tangem.blockchain.network.API_RSK
+import com.tangem.blockchain.network.createRetrofitInstance
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import org.kethereum.ETH_IN_WEI
import java.math.BigDecimal
import java.math.BigInteger
+import java.math.RoundingMode
-class EthereumNetworkManager {
+class EthereumNetworkManager(blockchain: Blockchain) {
+ private val infuraPath = "v3/"
- private val api: InfuraApi by lazy {
- createRetrofitInstance(API_INFURA).create(InfuraApi::class.java)
+ private val api: EthereumApi by lazy {
+ val baseUrl = when (blockchain) {
+ Blockchain.Ethereum -> API_INFURA + infuraPath
+ Blockchain.RSK -> API_RSK
+ else -> throw Exception("${blockchain.fullName} blockchain is not supported by EthereumNetworkManager")
+ }
+ createRetrofitInstance(baseUrl).create(EthereumApi::class.java)
}
- private val provider: InfuraProvider by lazy { InfuraProvider(api) }
+ private val apiKey = when (blockchain) {
+ Blockchain.Ethereum -> INFURA_API_KEY
+ Blockchain.RSK -> ""
+ else -> throw Exception("${blockchain.fullName} blockchain is not supported by EthereumNetworkManager")
+ }
+
+ private val provider: EthereumProvider by lazy { EthereumProvider(api, apiKey) }
suspend fun sendTransaction(transaction: String): SimpleResult {
return try {
@@ -45,17 +59,17 @@ class EthereumNetworkManager {
}
}
- suspend fun getInfo(address: String, contractAddress: String? = null): Result {
+ suspend fun getInfo(address: String, contractAddress: String? = null): Result {
return try {
coroutineScope {
val balanceResponse = retryIO { async { provider.getBalance(address) } }
val txCountResponse = retryIO { async { provider.getTxCount(address) } }
val pendingTxCountResponse = retryIO { async { provider.getPendingTxCount(address) } }
- var tokenBalanceResponse: Deferred? = null
+ var tokenBalanceResponse: Deferred? = null
if (contractAddress != null) {
tokenBalanceResponse = retryIO { async { provider.getTokenBalance(address, contractAddress) } }
}
- Result.Success(EthereumResponse(
+ Result.Success(EthereumInfoResponse(
balanceResponse.await().result!!.parseAmount(),
tokenBalanceResponse?.await()?.result?.parseAmount(),
txCountResponse.await().result?.responseToNumber()?.toLong() ?: 0,
@@ -70,8 +84,8 @@ class EthereumNetworkManager {
private fun String.parseFee(gasLimit: Long): List {
val gasPrice = this.responseToNumber().toBigDecimal()
val minFee = gasPrice.multiply(gasLimit.toBigDecimal())
- val normalFee = minFee.multiply(BigDecimal(1.2))
- val priorityFee = minFee.multiply(BigDecimal(1.5))
+ val normalFee = minFee.multiply(BigDecimal(1.2)).setScale(0, RoundingMode.HALF_UP)
+ val priorityFee = minFee.multiply(BigDecimal(1.5)).setScale(0, RoundingMode.HALF_UP)
return listOf(
minFee.convertFeeToEth(),
normalFee.convertFeeToEth(),
@@ -86,14 +100,16 @@ class EthereumNetworkManager {
private fun BigDecimal.convertFeeToEth(): BigDecimal {
return this.divide(ETH_IN_WEI.toBigDecimal())
- .setScale(12, Blockchain.Ethereum.roundingMode()).stripTrailingZeros()
+ .setScale(12, BigDecimal.ROUND_DOWN).stripTrailingZeros()
}
}
-data class EthereumResponse(
+data class EthereumInfoResponse(
val balance: BigDecimal,
val tokenBalance: BigDecimal?,
val txCount: Long,
val pendingTxCount: Long
-)
\ No newline at end of file
+)
+
+private const val INFURA_API_KEY = "613a0b14833145968b1f656240c7d245"
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumProvider.kt
new file mode 100644
index 0000000000..c320f566b6
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumProvider.kt
@@ -0,0 +1,39 @@
+package com.tangem.blockchain.blockchains.ethereum.network
+
+class EthereumProvider(private val api: EthereumApi, private val apiKey: String) {
+ suspend fun getBalance(address: String) = api.post(createEthereumBody(EthereumMethod.GET_BALANCE, address), apiKey)
+ suspend fun getTokenBalance(address: String, contractAddress: String) = api.post(createEthereumBody(EthereumMethod.CALL, address, contractAddress), apiKey)
+ suspend fun getTxCount(address: String) = api.post(createEthereumBody(EthereumMethod.GET_TRANSACTION_COUNT, address), apiKey)
+ suspend fun getPendingTxCount(address: String) = api.post(createEthereumBody(EthereumMethod.GET_PENDING_COUNT, address), apiKey)
+ suspend fun getGasPrice() = api.post(createEthereumBody(EthereumMethod.GAS_PRICE), apiKey)
+ suspend fun sendTransaction(transaction: String) = api.post(createEthereumBody(EthereumMethod.SEND_RAW_TRANSACTION, transaction = transaction), apiKey)
+}
+
+private fun createEthereumBody(
+ method: EthereumMethod,
+ address: String? = null,
+ contractAddress: String? = null,
+ transaction: String? = null): EthereumBody {
+
+ return when (method) {
+ EthereumMethod.GET_BALANCE ->
+ EthereumBody(method = EthereumMethod.GET_BALANCE.value, params = listOf(address ?: "", "latest"))
+ EthereumMethod.GET_TRANSACTION_COUNT ->
+ EthereumBody(method = EthereumMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "latest"))
+ EthereumMethod.GET_PENDING_COUNT ->
+ EthereumBody(method = EthereumMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "pending"))
+ EthereumMethod.GAS_PRICE ->
+ EthereumBody(method = EthereumMethod.GAS_PRICE.value)
+ EthereumMethod.SEND_RAW_TRANSACTION ->
+ EthereumBody(method = EthereumMethod.SEND_RAW_TRANSACTION.value, params = listOf(transaction ?: ""))
+ EthereumMethod.CALL -> {
+ EthereumBody(
+ method = EthereumMethod.CALL.value,
+ params = listOf(EthCallParams(
+ "0x70a08231000000000000000000000000" + address?.substring(2), contractAddress
+ ?: ""),
+ "latest"
+ ))
+ }
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumResponse.kt
similarity index 76%
rename from blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumResponse.kt
index 6e193290b5..3e8da36c84 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumResponse.kt
@@ -1,10 +1,10 @@
-package com.tangem.blockchain.ethereum.network
+package com.tangem.blockchain.blockchains.ethereum.network
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
-data class InfuraResponse(
+data class EthereumResponse(
@Json(name = "jsonrpc")
val jsonrpc: String = "",
@@ -15,11 +15,11 @@ data class InfuraResponse(
val result: String? = null,
@Json(name = "error")
- val error: InfuraError? = null
+ val error: EthereumError? = null
)
@JsonClass(generateAdapter = true)
-data class InfuraError(
+data class EthereumError(
@Json(name = "code")
val code: Int? = null,
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt
new file mode 100644
index 0000000000..4728c0cda6
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt
@@ -0,0 +1,19 @@
+package com.tangem.blockchain.blockchains.stellar
+
+import com.tangem.blockchain.common.AddressService
+import org.stellar.sdk.KeyPair
+
+class StellarAddressService: AddressService {
+ override fun makeAddress(walletPublicKey: ByteArray): String {
+ val kp = KeyPair.fromPublicKey(walletPublicKey)
+ return kp.accountId
+ }
+
+ override fun validate(address: String): Boolean {
+ return try {
+ KeyPair.fromAccountId(address) != null
+ } catch (exception: IllegalArgumentException) {
+ false
+ }
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarNetworkManager.kt
similarity index 90%
rename from blockchain/src/main/java/com/tangem/blockchain/stellar/StellarNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarNetworkManager.kt
index 85e5cfbd04..ec6ee2cfd8 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarNetworkManager.kt
@@ -1,10 +1,10 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_STELLAR
-import com.tangem.blockchain.common.network.API_STELLAR_TESTNET
-import com.tangem.blockchain.stellar.StellarWalletManager.Companion.STROOPS_IN_XLM
+import com.tangem.blockchain.blockchains.stellar.StellarWalletManager.Companion.STROOPS_IN_XLM
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_STELLAR
+import com.tangem.blockchain.network.API_STELLAR_TESTNET
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
@@ -15,7 +15,7 @@ import org.stellar.sdk.requests.ErrorResponse
import java.io.IOException
import java.math.BigDecimal
-class StellarNetworkManager(isTestNet: Boolean) {
+class StellarNetworkManager(isTestNet: Boolean = false) {
val network: Network = if (isTestNet) Network.TESTNET else Network.PUBLIC
private val stellarServer by lazy {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarTransactionBuilder.kt
similarity index 88%
rename from blockchain/src/main/java/com/tangem/blockchain/stellar/StellarTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarTransactionBuilder.kt
index ebe47c630e..e5550fe188 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarTransactionBuilder.kt
@@ -1,10 +1,7 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
import com.tangem.blockchain.common.AmountType
import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.stellar.StellarWalletManager.Companion.BASE_FEE
-import com.tangem.blockchain.stellar.StellarWalletManager.Companion.STROOPS_IN_XLM
-import com.tangem.common.extensions.hexToBytes
import org.stellar.sdk.*
import org.stellar.sdk.xdr.AccountID
import org.stellar.sdk.xdr.DecoratedSignature
@@ -12,7 +9,7 @@ import org.stellar.sdk.xdr.Signature
import org.stellar.sdk.xdr.SignatureHint
import java.util.*
-class StellarTransactionBuilder(private val newtorkManager: StellarNetworkManager, private val publicKey: ByteArray) {
+class StellarTransactionBuilder(private val networkManager: StellarNetworkManager, private val publicKey: ByteArray) {
private lateinit var transaction: Transaction
@@ -22,7 +19,7 @@ class StellarTransactionBuilder(private val newtorkManager: StellarNetworkManage
val sourceKeyPair = KeyPair.fromAccountId(transactionData.sourceAddress)
if (transactionData.amount.type == AmountType.Coin) {
- val operation = if (newtorkManager.checkIsAccountCreated(transactionData.sourceAddress)) {
+ val operation = if (networkManager.checkIsAccountCreated(transactionData.sourceAddress)) {
PaymentOperation.Builder(destinationKeyPair.accountId,
AssetTypeNative(),
transactionData.amount.value.toString())
@@ -64,7 +61,7 @@ class StellarTransactionBuilder(private val newtorkManager: StellarNetworkManage
val maxTime = currentTime + 120
transaction = Transaction.Builder(
- Account(sourceKeyPair.accountId, sequence), newtorkManager.network)
+ Account(sourceKeyPair.accountId, sequence), networkManager.network)
.addOperation(operation)
.addTimeBounds(TimeBounds(minTime, maxTime))
.setOperationFee(fee)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarWalletManager.kt
similarity index 60%
rename from blockchain/src/main/java/com/tangem/blockchain/stellar/StellarWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarWalletManager.kt
index 754cf7fa60..fc53c55460 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarWalletManager.kt
@@ -1,33 +1,28 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
import android.util.Log
import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.wallets.CurrencyWallet
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
import com.tangem.common.CompletionResult
import java.math.BigDecimal
import java.util.*
class StellarWalletManager(
- private val cardId: String,
- walletPublicKey: ByteArray,
- override var wallet: CurrencyWallet,
- isTestNet: Boolean = false
-) : WalletManager,
- TransactionSender,
- FeeProvider {
+ cardId: String,
+ wallet: Wallet,
+ private val transactionBuilder: StellarTransactionBuilder,
+ private val networkManager: StellarNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
+
+ private val blockchain = wallet.blockchain
- override val blockchain: Blockchain = Blockchain.Stellar
- private val address = blockchain.makeAddress(walletPublicKey)
- private val networkManager = StellarNetworkManager(isTestNet)
- private val builder = StellarTransactionBuilder(networkManager, walletPublicKey)
private var baseFee = BASE_FEE
private var baseReserve = BASE_RESERVE
private var sequence = 0L
override suspend fun update() {
- val result = networkManager.getInfo(address, wallet.balances[AmountType.Token]?.address)
+ val result = networkManager.getInfo(wallet.address, wallet.amounts[AmountType.Token]?.address)
when (result) {
is Result.Failure -> updateError(result.error)
is Result.Success -> updateWallet(result.data)
@@ -35,15 +30,15 @@ class StellarWalletManager(
}
private fun updateWallet(data: StellarResponse) {
- wallet.balances[AmountType.Coin]?.value = data.balance
- wallet.balances[AmountType.Token]?.value = data.assetBalance
- wallet.balances[AmountType.Reserve]?.value = data.baseReserve
+ wallet.amounts[AmountType.Coin]?.value = data.balance
+ wallet.amounts[AmountType.Token]?.value = data.assetBalance
+ wallet.amounts[AmountType.Reserve]?.value = data.baseReserve
sequence = data.sequence
baseFee = data.baseFee
baseReserve = data.baseReserve
val currentTime = Calendar.getInstance().timeInMillis
- wallet.pendingTransactions.forEach { transaction ->
+ wallet.transactions.forEach { transaction ->
if (transaction.date?.timeInMillis ?: 0 - currentTime > 10) {
transaction.status = TransactionStatus.Confirmed
}
@@ -56,10 +51,10 @@ class StellarWalletManager(
}
override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
- val hashes = builder.buildToSign(transactionData, sequence, baseFee.toStroops())
+ val hashes = transactionBuilder.buildToSign(transactionData, sequence, baseFee.toStroops())
when (val signerResponse = signer.sign(hashes.toTypedArray(), cardId)) {
is CompletionResult.Success -> {
- val transactionToSend = builder.buildToSend(signerResponse.data.signature)
+ val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature)
return networkManager.sendTransaction(transactionToSend)
}
is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt
new file mode 100644
index 0000000000..9c0b49c23a
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt
@@ -0,0 +1,35 @@
+package com.tangem.blockchain.blockchains.xrp
+
+import com.ripple.encodings.addresses.Addresses
+import com.tangem.blockchain.common.AddressService
+import com.tangem.common.extensions.calculateRipemd160
+import com.tangem.common.extensions.calculateSha256
+import com.tangem.common.extensions.toCompressedPublicKey
+
+class XrpAddressService : AddressService {
+ override fun makeAddress(walletPublicKey: ByteArray): String {
+ val canonicalPublicKey = canonizePublicKey(walletPublicKey)
+ val publicKeyHash = canonicalPublicKey.calculateSha256().calculateRipemd160()
+ return Addresses.encodeAccountID(publicKeyHash)
+ }
+
+ override fun validate(address: String): Boolean {
+ return try {
+ Addresses.decodeAccountID(address)
+ address.startsWith("r")
+ } catch (excpetion: Exception) {
+ false
+ }
+ }
+
+ companion object {
+ fun canonizePublicKey(publicKey: ByteArray): ByteArray {
+ val compressedPublicKey = publicKey.toCompressedPublicKey()
+ return if (compressedPublicKey.size == 32) {
+ byteArrayOf(0xED.toByte()) + compressedPublicKey
+ } else {
+ compressedPublicKey
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpTransactionBuilder.kt
similarity index 86%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/XrpTransactionBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpTransactionBuilder.kt
index a91258d524..1906d38fb1 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpTransactionBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpTransactionBuilder.kt
@@ -1,20 +1,21 @@
-package com.tangem.blockchain.xrp
+package com.tangem.blockchain.blockchains.xrp
import com.ripple.core.coretypes.AccountID
import com.ripple.core.coretypes.Amount
import com.ripple.core.coretypes.uint.UInt32
import com.ripple.crypto.ecdsa.ECDSASignature
import com.ripple.utils.HashUtils
+import com.tangem.blockchain.blockchains.xrp.override.XrpPayment
+import com.tangem.blockchain.blockchains.xrp.override.XrpSignedTransaction
import com.tangem.blockchain.common.TransactionData
-import com.tangem.blockchain.common.extensions.bigIntegerValue
-import com.tangem.blockchain.xrp.override.XrpPayment
-import com.tangem.blockchain.xrp.override.XrpSignedTransaction
+import com.tangem.blockchain.extensions.bigIntegerValue
import org.bitcoinj.core.ECKey
import java.math.BigInteger
class XrpTransactionBuilder(walletPublicKey: ByteArray) {
- private val canonicalPublicKey = XrpAddressFactory.canonizePublicKey(walletPublicKey)
var sequence: Long? = null
+
+ private val canonicalPublicKey = XrpAddressService.canonizePublicKey(walletPublicKey)
private var transaction: XrpSignedTransaction? = null
fun buildToSign(transactionData: TransactionData): ByteArray {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpWalletManager.kt
similarity index 56%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpWalletManager.kt
index cf6c8206a8..4301da80ad 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpWalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpWalletManager.kt
@@ -1,34 +1,24 @@
-package com.tangem.blockchain.xrp
+package com.tangem.blockchain.blockchains.xrp
import android.util.Log
+import com.tangem.blockchain.blockchains.xrp.network.XrpInfoResponse
+import com.tangem.blockchain.blockchains.xrp.network.XrpNetworkManager
import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.wallets.CurrencyWallet
-import com.tangem.blockchain.xrp.network.XrpInfoResponse
-import com.tangem.blockchain.xrp.network.XrpNetworkManager
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
import com.tangem.common.CompletionResult
class XrpWalletManager(
- private val cardId: String,
- private val walletPublicKey: ByteArray,
- override var wallet: CurrencyWallet
-) : WalletManager,
- TransactionSender,
- FeeProvider {
+ cardId: String,
+ wallet: Wallet,
+ private val transactionBuilder: XrpTransactionBuilder,
+ private val networkManager: XrpNetworkManager
+) : WalletManager(cardId, wallet), TransactionSender {
- override val blockchain = Blockchain.XRP
- private val address = blockchain.makeAddress(walletPublicKey)
- private val transactionBuilder = XrpTransactionBuilder(walletPublicKey)
- private val networkManager = XrpNetworkManager()
-
- init {
- wallet.balances[AmountType.Coin] = Amount(null, blockchain)
- wallet.balances[AmountType.Reserve] = Amount(null, blockchain, type = AmountType.Reserve)
- }
+ private val blockchain = wallet.blockchain
override suspend fun update() {
- val result = networkManager.getInfo(address)
+ val result = networkManager.getInfo(wallet.address)
when (result) {
is Result.Success -> updateWallet(result.data)
is Result.Failure -> updateError(result.error)
@@ -37,25 +27,19 @@ class XrpWalletManager(
private fun updateWallet(response: XrpInfoResponse) {
Log.d(this::class.java.simpleName, "Balance is ${response.balance}")
- wallet.balances[AmountType.Reserve]?.value = response.reserveBase
+ wallet.amounts[AmountType.Reserve]?.value = response.reserveBase
if (!response.accountFound) {
updateError(Exception("Account not found")) //TODO rework, add reserve
return
}
- wallet.balances[AmountType.Coin]?.value = response.balance - response.reserveBase
+ wallet.amounts[AmountType.Coin]?.value = response.balance - response.reserveBase
transactionBuilder.sequence = response.sequence
if (response.hasUnconfirmed) {
- if (wallet.pendingTransactions.isEmpty()) {
- wallet.pendingTransactions.add(TransactionData(
- Amount(blockchain.currency, decimals = blockchain.decimals),
- null,
- "unknown",
- wallet.address))
- }
+ if (wallet.transactions.isEmpty()) wallet.addIncomingTransaction()
} else {
- wallet.pendingTransactions.clear()
+ wallet.transactions.clear()
}
}
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/XrpNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/XrpNetworkManager.kt
similarity index 84%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/XrpNetworkManager.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/XrpNetworkManager.kt
index 8066fe1bea..7191b98d53 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/XrpNetworkManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/XrpNetworkManager.kt
@@ -1,12 +1,12 @@
-package com.tangem.blockchain.xrp.network
+package com.tangem.blockchain.blockchains.xrp.network
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.network.API_RIPPLED
-import com.tangem.blockchain.common.network.API_RIPPLED_RESERVE
-import com.tangem.blockchain.common.network.createRetrofitInstance
-import com.tangem.blockchain.xrp.network.rippled.RippledApi
-import com.tangem.blockchain.xrp.network.rippled.RippledProvider
+import com.tangem.blockchain.blockchains.xrp.network.rippled.RippledApi
+import com.tangem.blockchain.blockchains.xrp.network.rippled.RippledProvider
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.network.API_RIPPLED
+import com.tangem.blockchain.network.API_RIPPLED_RESERVE
+import com.tangem.blockchain.network.createRetrofitInstance
import retrofit2.HttpException
import java.io.IOException
import java.math.BigDecimal
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledApi.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledApi.kt
similarity index 94%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledApi.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledApi.kt
index e881830e69..bf4fbef679 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledApi.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledApi.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.network.rippled
+package com.tangem.blockchain.blockchains.xrp.network.rippled
import retrofit2.http.Body
import retrofit2.http.Headers
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledProvider.kt
similarity index 90%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledProvider.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledProvider.kt
index 73e67cd19c..bfceb241ca 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledProvider.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledProvider.kt
@@ -1,16 +1,16 @@
-package com.tangem.blockchain.xrp.network.rippled
+package com.tangem.blockchain.blockchains.xrp.network.rippled
+import com.tangem.blockchain.blockchains.xrp.network.XrpFeeResponse
+import com.tangem.blockchain.blockchains.xrp.network.XrpInfoResponse
import com.tangem.blockchain.common.Blockchain
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.common.extensions.retryIO
-import com.tangem.blockchain.xrp.network.XrpFeeResponse
-import com.tangem.blockchain.xrp.network.XrpInfoResponse
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
class RippledProvider(private val api: RippledApi) {
- private val decimals = Blockchain.XRP.decimals.toInt()
+ private val decimals = Blockchain.XRP.decimals()
suspend fun getInfo(address: String): Result {
return try {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledResponse.kt
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledResponse.kt
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledResponse.kt
index 47d91f3634..c8137a6cd5 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/network/rippled/RippledResponse.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/network/rippled/RippledResponse.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.network.rippled
+package com.tangem.blockchain.blockchains.xrp.network.rippled
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpBase58.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpBase58.java
similarity index 98%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpBase58.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpBase58.java
index 3ab3f6f16a..24c47219bf 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpBase58.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpBase58.java
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.override;
+package com.tangem.blockchain.blockchains.xrp.override;
import java.math.BigInteger;
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpPayment.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpPayment.java
similarity index 85%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpPayment.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpPayment.java
index 1fa01213a5..d00d8184bd 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpPayment.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpPayment.java
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.override;
+package com.tangem.blockchain.blockchains.xrp.override;
import com.ripple.core.types.known.tx.txns.Payment;
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpSignedTransaction.java b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpSignedTransaction.java
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpSignedTransaction.java
rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpSignedTransaction.java
index 926a176adb..a455b853fa 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/override/XrpSignedTransaction.java
+++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/override/XrpSignedTransaction.java
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.xrp.override;
+package com.tangem.blockchain.blockchains.xrp.override;
import com.ripple.core.coretypes.Amount;
import com.ripple.core.coretypes.Blob;
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt
deleted file mode 100644
index 3aecd18ff1..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/CardanoAddress.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.tangem.blockchain.cardano
-
-import co.nstant.`in`.cbor.CborBuilder
-import co.nstant.`in`.cbor.CborDecoder
-import co.nstant.`in`.cbor.CborEncoder
-import co.nstant.`in`.cbor.model.Array
-import co.nstant.`in`.cbor.model.ByteString
-import co.nstant.`in`.cbor.model.UnsignedInteger
-import com.tangem.blockchain.cardano.crypto.Blake2b
-import com.tangem.blockchain.common.extensions.decodeBase58
-import com.tangem.blockchain.common.extensions.encodeBase58
-import org.spongycastle.crypto.util.DigestFactory
-import java.io.ByteArrayInputStream
-import java.io.ByteArrayOutputStream
-import java.util.zip.CRC32
-
-class CardanoAddressFactory {
- companion object {
- fun makeAddress(cardPublicKey: ByteArray, testNet: Boolean = false): String {
- val extendedPublicKey = extendPublicKey(cardPublicKey)
-
- val pubKeyWithAttributesBaos = ByteArrayOutputStream()
- CborEncoder(pubKeyWithAttributesBaos).encode(CborBuilder()
- .addArray()
- .add(0)
- .addArray()
- .add(0)
- .add(extendedPublicKey)
- .end()
- .addMap()
- .end()
- .end()
- .build())
- val pubKeyWithAttributes = pubKeyWithAttributesBaos.toByteArray()
-
- val sha3Digest = DigestFactory.createSHA3_256()
- sha3Digest.update(pubKeyWithAttributes, 0, pubKeyWithAttributes.size)
- val sha3Hash = ByteArray(32)
- sha3Digest.doFinal(sha3Hash, 0)
-
- val blake2b = Blake2b.Digest.newInstance(28)
- val blakeHash = blake2b.digest(sha3Hash)
-
- val hashWithAttributesBaos = ByteArrayOutputStream()
- CborEncoder(hashWithAttributesBaos).encode(CborBuilder()
- .addArray()
- .add(blakeHash)
- .addMap() //additional attributes
- .end()
- .add(0) //address type
- .end()
- .build())
- val hashWithAttributes = hashWithAttributesBaos.toByteArray()
-
- val crc32 = CRC32()
- crc32.update(hashWithAttributes)
- val checksum = crc32.value
-
- val addressItem = CborBuilder().add(hashWithAttributes).build().get(0)
- addressItem.setTag(24)
-
- //addr + checksum
- val addressBaos = ByteArrayOutputStream()
- CborEncoder(addressBaos).encode(CborBuilder()
- .addArray()
- .add(addressItem)
- .add(checksum)
- .end()
- .build())
-
- val hexAddress = addressBaos.toByteArray()
- return hexAddress.encodeBase58()
- }
-
- fun extendPublicKey(publicKey: ByteArray): ByteArray {
- val zeroBytes = ByteArray(32)
- zeroBytes.fill(0)
- return publicKey + zeroBytes
- }
- }
-}
-
-class CardanoAddressValidator {
- companion object {
- fun validate(address: String): Boolean {
- val decoded = address.decodeBase58() ?: return false
-
- return try {
- val bais = ByteArrayInputStream(decoded)
- val addressList =
- (CborDecoder(bais).decode()[0] as Array).dataItems
- val addressItemBytes = (addressList[0] as ByteString).bytes
- val checksum = (addressList[1] as UnsignedInteger).value.toLong()
-
- val crc32 = CRC32()
- crc32.update(addressItemBytes)
- val calculatedChecksum = crc32.value
-
- checksum == calculatedChecksum
- } catch (e: Exception) {
- false
- }
- }
- }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt b/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt
deleted file mode 100644
index e394d424f6..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/cardano/network/adalite/AdaliteApi.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.tangem.blockchain.cardano.network.api
-
-import com.tangem.blockchain.cardano.network.adalite.AdaliteAddress
-import com.tangem.blockchain.cardano.network.adalite.AdaliteSendBody
-import com.tangem.blockchain.cardano.network.adalite.AdaliteUnspents
-import retrofit2.http.*
-import shadow.okhttp3.ResponseBody
-
-interface AdaliteApi {
- @GET("/api/addresses/summary/{address}")
- suspend fun getAddress(@Path("address") address: String): AdaliteAddress
-
- @Headers("Content-Type: application/json")
- @POST("/api/bulk/addresses/utxo")
- suspend fun getUnspents(@Body address: String): AdaliteUnspents
-
- @Headers("Content-Type: application/json")
- @POST("/api/v2/txs/signed")
- suspend fun sendTransaction(@Body adaliteBody: AdaliteSendBody): ResponseBody // List?
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt b/blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt
new file mode 100644
index 0000000000..2e408eaee2
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/AddressService.kt
@@ -0,0 +1,6 @@
+package com.tangem.blockchain.common
+
+interface AddressService {
+ fun makeAddress(walletPublicKey: ByteArray): String
+ fun validate(address: String): Boolean
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
new file mode 100644
index 0000000000..bf30907a9e
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt
@@ -0,0 +1,26 @@
+package com.tangem.blockchain.common
+
+import java.math.BigDecimal
+
+data class Amount(
+ val currencySymbol: String,
+ var value: BigDecimal? = null,
+ val address: String? = null,
+ val decimals: Int,
+ val type: AmountType = AmountType.Coin
+) {
+ constructor(
+ value: BigDecimal?,
+ blockchain: Blockchain,
+ address: String? = null,
+ type: AmountType = AmountType.Coin
+ ) : this(blockchain.currency, value, address, blockchain.decimals(), type)
+
+ constructor(token: Token, value: BigDecimal? = null) :
+ this(token.symbol, value, token.contractAddress, token.decimals, AmountType.Token)
+
+ constructor(amount: Amount, value: BigDecimal) :
+ this(amount.currencySymbol, value, amount.address, amount.decimals, amount.type)
+}
+
+enum class AmountType { Coin, Token, Reserve }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
index 5d98bdceef..c579c2d3db 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Blockchain.kt
@@ -1,74 +1,87 @@
package com.tangem.blockchain.common
-import com.tangem.blockchain.binance.BinanceAddressFactory
-import com.tangem.blockchain.binance.BinanceAddressValidator
-import com.tangem.blockchain.bitcoin.BitcoinAddressFactory
-import com.tangem.blockchain.bitcoin.BitcoinAddressValidator
-import com.tangem.blockchain.cardano.CardanoAddressFactory
-import com.tangem.blockchain.cardano.CardanoAddressValidator
-import com.tangem.blockchain.ethereum.EthereumAddressFactory
-import com.tangem.blockchain.ethereum.EthereumAddressValidator
-
-import com.tangem.blockchain.stellar.StellarAddressFactory
-import com.tangem.blockchain.xrp.XrpAddressFactory
-import com.tangem.blockchain.xrp.XrpAddressValidator
-
-import java.math.BigDecimal
+import com.tangem.blockchain.blockchains.binance.BinanceAddressService
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinAddressService
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashAddressService
+import com.tangem.blockchain.blockchains.cardano.CardanoAddressService
+import com.tangem.blockchain.blockchains.ethereum.EthereumAddressService
+import com.tangem.blockchain.blockchains.stellar.StellarAddressService
+import com.tangem.blockchain.blockchains.xrp.XrpAddressService
enum class Blockchain(
val id: String,
val currency: String,
- val decimals: Byte,
- val fullName: String,
- val pendingTransactionTimeout: Int
+ val fullName: String
) {
- Unknown("", "", 0, "", 0),
- Bitcoin("BTC", "BTC", 8, "Bitcoin", 0),
- BitcoinTestnet("BTC/test", "BTCt", 8, "Bitcoin Testnet", 0),
- Ethereum("ETH", "ETH", 18, "Ethereum", 0),
- Rootstock("", "", 18, "", 0),
- Cardano("CARDANO", "ADA", 6, "Cardano", 0),
- XRP("XRP", "XRP", 6, "XRP Ledger", 0),
- Binance("BINANCE", "BNB", 8, "Binance", 0),
- BinanceTestnet("BINANCE/test", "BNBt", 8, "Binance", 0),
- Stellar("XLM", "XLM", 7, "Stellar", 0);
+ Unknown("", "", ""),
+ Bitcoin("BTC", "BTC", "Bitcoin"),
+ BitcoinTestnet("BTC/test", "BTCt", "Bitcoin Testnet"),
+ BitcoinCash("BCH", "BCH", "Bitcoin Cash"),
+ Ethereum("ETH", "ETH", "Ethereum"),
+ RSK("RSK", "RBTC", "RSK"),
+ Cardano("CARDANO", "ADA", "Cardano"),
+ XRP("XRP", "XRP", "XRP Ledger"),
+ Binance("BINANCE", "BNB", "Binance"),
+ BinanceTestnet("BINANCE/test", "BNBt", "Binance"),
+ Stellar("XLM", "XLM", "Stellar");
- fun roundingMode(): Int = when (this) {
- Bitcoin, Ethereum, Rootstock, Binance -> BigDecimal.ROUND_DOWN
- Cardano -> BigDecimal.ROUND_UP
- else -> BigDecimal.ROUND_HALF_UP
+ fun decimals(): Int = when (this) {
+ Bitcoin, BitcoinTestnet, BitcoinCash, Binance, BinanceTestnet -> 8
+ Cardano, XRP -> 6
+ Ethereum, RSK -> 18
+ Stellar -> 7
+ Unknown -> 0
}
- fun makeAddress(walletPublicKey: ByteArray): String {
- return when (this) {
- Unknown -> throw Exception("unsupported blockchain")
- Bitcoin -> BitcoinAddressFactory.makeAddress(walletPublicKey)
- BitcoinTestnet -> BitcoinAddressFactory.makeAddress(walletPublicKey, testNet = true)
- Ethereum -> EthereumAddressFactory.makeAddress(walletPublicKey)
-// Rootstock -> RootstockAddressFactory.makeAddress(cardPublicKey)
- Cardano -> CardanoAddressFactory.makeAddress(walletPublicKey)
- XRP -> XrpAddressFactory.makeAddress(walletPublicKey)
- Binance -> BinanceAddressFactory.makeAddress(walletPublicKey)
- BinanceTestnet -> BinanceAddressFactory.makeAddress(walletPublicKey, testNet = true)
- Stellar -> StellarAddressFactory.makeAddress(walletPublicKey)
- else -> throw Exception("unsupported blockchain")
- }
+ fun pendingTransactionsTimeout(): Int = when (this) {
+ else -> 0
}
- fun validateAddress(address: String): Boolean {
- return when (this) {
- Unknown -> throw Exception("unsupported blockchain")
- Bitcoin -> BitcoinAddressValidator.validate(address)
- BitcoinTestnet -> BitcoinAddressValidator.validate(address, testNet = true)
- Ethereum -> EthereumAddressValidator.validate(address)
-// Rootstock -> RootstockAddressValidator.validate(address)
- Cardano -> CardanoAddressValidator.validate(address)
- XRP -> XrpAddressValidator.validate(address)
- Binance -> BinanceAddressValidator.validate(address)
- BinanceTestnet -> BinanceAddressValidator.validate(address, testNet = true)
-// Stellar -> StellarAddressValidator.validate(address)
- else -> throw Exception("unsupported blockchain")
+ fun makeAddress(walletPublicKey: ByteArray): String = getAddressService().makeAddress(walletPublicKey)
+
+ fun validateAddress(address: String): Boolean = getAddressService().validate(address)
+
+ private fun getAddressService(): AddressService = when (this) {
+ Unknown -> throw Exception("unsupported blockchain")
+ Bitcoin -> BitcoinAddressService()
+ BitcoinTestnet -> BitcoinAddressService(true)
+ BitcoinCash -> BitcoinCashAddressService()
+ Ethereum, RSK -> EthereumAddressService()
+ Cardano -> CardanoAddressService()
+ XRP -> XrpAddressService()
+ Binance -> BinanceAddressService()
+ BinanceTestnet -> BinanceAddressService(true)
+ Stellar -> StellarAddressService()
+ }
+
+ fun getShareUri(address: String): String = when (this) {
+ Bitcoin -> "bitcoin:$address"
+ Ethereum -> "ethereum:$address"
+ XRP -> "ripple:$address"
+ else -> address
+ }
+
+ fun getExploreUrl(address: String, token: Token? = null): String = when (this) {
+ Binance -> "https://explorer.binance.org/address/$address"
+ Bitcoin -> "https://blockchain.info/address/$address"
+ BitcoinTestnet -> "https://live.blockcypher.com/btc-testnet/address/$address"
+ BitcoinCash -> "https://blockchair.com/bitcoin-cash/address/$address"
+ Cardano -> "https://cardanoexplorer.com/address/$address"
+ Ethereum -> if (token == null) {
+ "https://etherscan.io/address/"
+ } else {
+ "https://etherscan.io/token/${token.contractAddress}?a=$address"
}
+ RSK -> {
+ var url = "https://explorer.rsk.co/address/$address"
+ if (token != null) {
+ url += "?__tab=tokens"
+ }
+ url
+ }
+ Stellar -> "https://stellar.expert/explorer/public/account/$address"
+ XRP -> "https://xrpscan.com/account/$address"
+ else -> throw Exception("Explore URL not defined!")
}
companion object {
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Token.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Token.kt
new file mode 100644
index 0000000000..26fbb8af6b
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Token.kt
@@ -0,0 +1,7 @@
+package com.tangem.blockchain.common
+
+data class Token(
+ val symbol: String,
+ val contractAddress: String,
+ val decimals: Int
+)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt b/blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt
new file mode 100644
index 0000000000..d1774c0b99
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/TransactionData.kt
@@ -0,0 +1,19 @@
+package com.tangem.blockchain.common
+
+import java.util.*
+
+data class TransactionData(
+ val amount: Amount,
+ val fee: Amount?,
+ val sourceAddress: String,
+ val destinationAddress: String,
+ val contractAddress: String? = null,
+ var status: TransactionStatus = TransactionStatus.Unconfirmed,
+ var date: Calendar? = null,
+ val hash: String? = null
+)
+
+
+enum class TransactionStatus { Confirmed, Unconfirmed }
+
+enum class TransactionError { WrongAmount, WrongFee, WrongTotal }
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
index 6cca63b075..9273763196 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt
@@ -3,53 +3,59 @@ package com.tangem.blockchain.common
import java.math.BigDecimal
import java.util.*
-interface Wallet {
- val config: WalletConfig
- val address: String
- val exploreUrl: String?
- val shareUrl: String?
-}
-
-class WalletConfig(
- val allowFeeSelection: Boolean,
- val allowFeeInclusion: Boolean,
- var allowExtract: Boolean = false,
- var allowLoad: Boolean = false
-)
-
-data class Amount(
- val currencySymbol: String,
- var value: BigDecimal? = null,
- val address: String? = null,
- val decimals: Byte,
- val type: AmountType = AmountType.Coin
+class Wallet(
+ val blockchain: Blockchain,
+ val address: String,
+ val token: Token? = null
) {
- constructor(
- value: BigDecimal?,
- blockchain: Blockchain,
- address: String? = null,
- type: AmountType = AmountType.Coin
- ) : this(blockchain.currency, value, address, blockchain.decimals, type)
+ val exploreUrl: String
+ val shareUrl: String
+ val transactions: MutableList = mutableListOf()
+ val amounts: MutableMap = mutableMapOf()
- constructor(token: Token, value: BigDecimal? = null) :
- this(token.symbol, value, token.contractAddress, token.decimals, AmountType.Token)
-}
+ init {
+ setAmount(Amount(null, blockchain, address))
+ if (token != null) setAmount(Amount(token))
-data class TransactionData(
- val amount: Amount,
- val fee: Amount?,
- val sourceAddress: String,
- val destinationAddress: String,
- var status: TransactionStatus = TransactionStatus.Unconfirmed,
- var date: Calendar? = null
-)
+ exploreUrl = blockchain.getExploreUrl(address, token)
+ shareUrl = blockchain.getShareUri(address)
+ }
-enum class AmountType { Coin, Token, Reserve }
+ fun setAmount(amount: Amount) {
+ amounts[amount.type] = amount
+ }
-enum class TransactionStatus { Confirmed, Unconfirmed }
+ fun setCoinValue(value: BigDecimal) {
+ val amount = Amount(value, blockchain, address)
+ setAmount(amount)
+ }
-enum class ValidationError { WrongAmount, WrongFee, WrongTotal }
+ fun setTokenValue(value: BigDecimal) {
+ if (token != null) {
+ val amount = Amount(token, value)
+ setAmount(amount)
+ }
+ }
+
+ fun setReserveValue(value: BigDecimal) {
+ val amount = Amount(value, blockchain, address, AmountType.Reserve)
+ setAmount(amount)
+ }
+
+ fun addTransaction(transaction: TransactionData) {
+ transactions.add(transaction.copy(date = Calendar.getInstance()))
+ }
+
+ fun addIncomingTransaction() {
+ val dummyAmount = Amount(null, blockchain)
+ val transaction = TransactionData(dummyAmount, dummyAmount,
+ "unknown", address, date = Calendar.getInstance()
+ )
+ transactions.add(transaction)
+ }
+
+ fun fundsAvailable(amountType: AmountType): BigDecimal {
+ return amounts[amountType]?.value ?: BigDecimal.ZERO
+ }
-interface TransactionValidator {
- fun validateTransaction(amount: Amount, fee: Amount?): EnumSet
}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt
index 6fe5a862ea..3271af9575 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManager.kt
@@ -1,26 +1,48 @@
package com.tangem.blockchain.common
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.wallets.CurrencyWallet
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.isAboveZero
import com.tangem.commands.SignResponse
import com.tangem.common.CompletionResult
+import java.math.BigDecimal
+import java.util.*
-interface WalletManager {
- var wallet: CurrencyWallet
- val blockchain: Blockchain
+abstract class WalletManager(val cardId: String, var wallet: Wallet) {
- suspend fun update()
+ abstract suspend fun update()
+
+ fun createTransaction(amount: Amount, fee: Amount, destination: String): TransactionData {
+ return TransactionData(amount, fee,
+ wallet.address, destination, wallet.token?.contractAddress,
+ TransactionStatus.Unconfirmed, Calendar.getInstance(), null)
+ }
+
+ fun validateTransaction(amount: Amount, fee: Amount?): EnumSet {
+ val errors = EnumSet.noneOf(TransactionError::class.java)
+
+ if (!validateAmount(amount)) errors.add(TransactionError.WrongAmount)
+ if (fee == null) return errors
+
+ if (!validateAmount(fee)) errors.add(TransactionError.WrongFee)
+ val total = (amount.value ?: BigDecimal.ZERO) + (fee.value ?: BigDecimal.ZERO)
+ if (!validateAmount(Amount(amount, total))) errors.add(TransactionError.WrongTotal)
+
+ return errors
+ }
+
+ private fun validateAmount(amount: Amount): Boolean {
+ return !amount.isAboveZero() &&
+ wallet.fundsAvailable(amount.type) >= amount.value
+ }
}
interface TransactionSender {
- suspend fun send(transactionData: TransactionData, signer: TransactionSigner) : SimpleResult
+ suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult
+ suspend fun getFee(amount: Amount, destination: String): Result>
+
}
interface TransactionSigner {
suspend fun sign(hashes: Array, cardId: String): CompletionResult
-}
-
-interface FeeProvider {
- suspend fun getFee(amount: Amount, destination: String): Result>
}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
index 3b2d48fb04..621ed2f129 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt
@@ -1,15 +1,29 @@
package com.tangem.blockchain.common
-import com.tangem.blockchain.binance.BinanceWalletManager
-import com.tangem.blockchain.bitcoin.BitcoinWalletManager
-import com.tangem.blockchain.cardano.CardanoWalletManager
-import com.tangem.blockchain.ethereum.Chain
-import com.tangem.blockchain.ethereum.EthereumWalletManager
+import com.tangem.blockchain.blockchains.binance.BinanceTransactionBuilder
+import com.tangem.blockchain.blockchains.binance.BinanceWalletManager
+import com.tangem.blockchain.blockchains.binance.network.BinanceNetworkManager
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinTransactionBuilder
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinNetworkManager
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashNetworkManager
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashTransactionBuilder
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashWalletManager
+import com.tangem.blockchain.blockchains.cardano.CardanoTransactionBuilder
+import com.tangem.blockchain.blockchains.cardano.CardanoWalletManager
+import com.tangem.blockchain.blockchains.cardano.network.CardanoNetworkManager
+import com.tangem.blockchain.blockchains.ethereum.EthereumTransactionBuilder
+import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager
+import com.tangem.blockchain.blockchains.ethereum.network.EthereumNetworkManager
+import com.tangem.blockchain.blockchains.stellar.StellarNetworkManager
+import com.tangem.blockchain.blockchains.stellar.StellarTransactionBuilder
-import com.tangem.blockchain.stellar.StellarWalletManager
-import com.tangem.blockchain.wallets.CurrencyWallet
-import com.tangem.blockchain.xrp.XrpWalletManager
+import com.tangem.blockchain.blockchains.stellar.StellarWalletManager
+import com.tangem.blockchain.blockchains.xrp.XrpTransactionBuilder
+import com.tangem.blockchain.blockchains.xrp.XrpWalletManager
+import com.tangem.blockchain.blockchains.xrp.network.XrpNetworkManager
import com.tangem.commands.Card
+import com.tangem.common.extensions.toCompressedPublicKey
object WalletManagerFactory {
@@ -18,69 +32,76 @@ object WalletManagerFactory {
val blockchainName: String = card.cardData?.blockchainName ?: return null
val blockchain = Blockchain.fromId(blockchainName)
- val token = getToken(card)
- val wallet = CurrencyWallet.newInstance(blockchain, blockchain.makeAddress(walletPublicKey), token)
+ val cardId = card.cardId
+ val token = getToken(card)
+
+ val wallet = Wallet(blockchain, blockchain.makeAddress(walletPublicKey), token)
when (blockchain) {
Blockchain.Bitcoin -> {
return BitcoinWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet
+ cardId, wallet,
+ BitcoinTransactionBuilder(walletPublicKey),
+ BitcoinNetworkManager()
)
}
Blockchain.BitcoinTestnet -> {
return BitcoinWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet,
- isTestNet = true
+ cardId, wallet,
+ BitcoinTransactionBuilder(walletPublicKey, true),
+ BitcoinNetworkManager(true)
)
}
- Blockchain.Ethereum -> {
- val chain = Chain.Mainnet
+ Blockchain.BitcoinCash -> {
+ return BitcoinCashWalletManager(
+ cardId, wallet,
+ BitcoinCashTransactionBuilder(walletPublicKey.toCompressedPublicKey()),
+ BitcoinCashNetworkManager()
+ )
+ }
+ Blockchain.Ethereum, Blockchain.RSK -> {
return EthereumWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet,
- chain = chain
+ cardId, wallet,
+ EthereumTransactionBuilder(walletPublicKey, blockchain),
+ EthereumNetworkManager(blockchain)
)
}
Blockchain.Stellar -> {
+ val networkManager = StellarNetworkManager()
+
return StellarWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet
+ cardId, wallet,
+ StellarTransactionBuilder(networkManager, walletPublicKey),
+ networkManager
)
}
Blockchain.Cardano -> {
return CardanoWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet
+ cardId, wallet,
+ CardanoTransactionBuilder(walletPublicKey),
+ CardanoNetworkManager()
)
}
Blockchain.XRP -> {
return XrpWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet
+ cardId, wallet,
+ XrpTransactionBuilder(walletPublicKey),
+ XrpNetworkManager()
)
}
Blockchain.Binance -> {
return BinanceWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet
+ cardId, wallet,
+ BinanceTransactionBuilder(walletPublicKey),
+ BinanceNetworkManager()
)
}
Blockchain.BinanceTestnet -> {
return BinanceWalletManager(
- cardId = card.cardId,
- walletPublicKey = walletPublicKey,
- wallet = wallet,
- isTestNet = true
+ cardId, wallet,
+ BinanceTransactionBuilder(walletPublicKey, true),
+ BinanceNetworkManager(true)
)
}
else -> return null
@@ -91,13 +112,6 @@ object WalletManagerFactory {
val symbol = card.cardData?.tokenSymbol ?: return null
val contractAddress = card.cardData?.tokenContractAddress ?: return null
val decimals = card.cardData?.tokenDecimal ?: return null
- return Token(symbol, contractAddress, decimals.toByte())
+ return Token(symbol, contractAddress, decimals)
}
-}
-
-
-data class Token(
- val symbol: String,
- val contractAddress: String,
- val decimals: Byte
-)
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt
deleted file mode 100644
index a301ee7e1c..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumAddress.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.tangem.blockchain.ethereum
-
-import org.kethereum.crypto.toAddress
-import org.kethereum.erc55.isValid
-import org.kethereum.model.Address
-import org.kethereum.model.PublicKey
-
-class EthereumAddressFactory {
- companion object {
- fun makeAddress(walletPublicKey: ByteArray): String =
- PublicKey(walletPublicKey.sliceArray(1..64)).toAddress().hex
- }
-}
-
-class EthereumAddressValidator {
- companion object {
- fun validate(address: String): Boolean = Address(address).isValid()
- }
-}
-
-enum class Chain(val id: Int) {
- Mainnet(1),
- Morden(2),
- Ropsten(3),
- Rinkeby(4),
- RootstockMainnet(30),
- RootstockTestnet(31),
- Kovan(42),
- EthereumClassicMainnet(61),
- EthereumClassicTestnet(62),
- Geth_private_chains(1337),
- MaticTestnet(8995);
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt
deleted file mode 100644
index 3999bdf7a3..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/EthereumWalletManager.kt
+++ /dev/null
@@ -1,157 +0,0 @@
-package com.tangem.blockchain.ethereum
-
-import android.util.Log
-import com.tangem.blockchain.common.*
-import com.tangem.blockchain.common.Token
-import com.tangem.blockchain.common.extensions.Result
-import com.tangem.blockchain.common.extensions.SimpleResult
-import com.tangem.blockchain.ethereum.network.EthereumNetworkManager
-import com.tangem.blockchain.ethereum.network.EthereumResponse
-import com.tangem.blockchain.wallets.CurrencyWallet
-import com.tangem.common.CompletionResult
-import com.tangem.common.extensions.toHexString
-import org.kethereum.DEFAULT_GAS_LIMIT
-import org.kethereum.crypto.api.ec.ECDSASignature
-import org.kethereum.crypto.determineRecId
-import org.kethereum.crypto.impl.ec.canonicalise
-import org.kethereum.extensions.transactions.encodeRLP
-import org.kethereum.keccakshortcut.keccak
-import org.kethereum.model.*
-import java.math.BigDecimal
-import java.math.BigInteger
-
-class EthereumWalletManager(
- private val cardId: String,
- private val walletPublicKey: ByteArray,
- chain: Chain,
- token: Token? = null,
- override var wallet: CurrencyWallet
-) : WalletManager,
- TransactionSender,
- FeeProvider {
-
- override val blockchain: Blockchain = Blockchain.Ethereum
- private val address = blockchain.makeAddress(walletPublicKey)
- private val builder = EthereumTransactionBuilder(chain)
- private val networkManager = EthereumNetworkManager()
- private var pendingTxCount = -1L
- private var txCount = -1L
-
- init {
- if (token != null) wallet.balances[AmountType.Token] =
- Amount(
- token.symbol,
- null,
- token.contractAddress,
- token.decimals,
- AmountType.Token)
- wallet.balances[AmountType.Coin] = Amount(null, blockchain)
- }
-
- override suspend fun update() {
- val result = networkManager.getInfo(address, wallet.balances[AmountType.Token]?.address)
- when (result) {
- is Result.Failure -> updateError(result.error)
- is Result.Success -> updateWallet(result.data)
- }
- }
-
- private fun updateWallet(data: EthereumResponse) {
- wallet.balances[AmountType.Coin]?.value = data.balance
- wallet.balances[AmountType.Token]?.value = data.tokenBalance
- txCount = data.txCount
- pendingTxCount = data.pendingTxCount
- if (txCount == pendingTxCount) {
- wallet.pendingTransactions.forEach { it.status = TransactionStatus.Confirmed }
- } else if (wallet.pendingTransactions.isEmpty()) {
- wallet.pendingTransactions.add(TransactionData(
- Amount(blockchain.currency, decimals = blockchain.decimals),
- null,
- "unknown",
- wallet.address))
- }
- }
-
- private fun updateError(error: Throwable?) {
- Log.e(this::class.java.simpleName, error?.message ?: "")
- if (error != null) throw error
- }
-
- override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
- val transactionToSign = builder.buildToSign(transactionData, txCount.toBigInteger())
- ?: return SimpleResult.Failure(Exception("Not enough data"))
- when (val signerResponse = signer.sign(transactionToSign.hashes.toTypedArray(), cardId)) {
- is CompletionResult.Success -> {
- val transactionToSend = builder.buildToSend(signerResponse.data.signature, transactionToSign, walletPublicKey)
- return networkManager.sendTransaction(String.format("0x%s", transactionToSend.toHexString()))
- }
- is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error)
- }
- }
-
- override suspend fun getFee(amount: Amount, destination: String): Result> {
- val result = networkManager.getFee(getGasLimit(amount).value)
- when (result) {
- is Result.Success -> {
- val feeValues: List = result.data
- return Result.Success(
- feeValues.map { Amount(blockchain.currency, it, address, blockchain.decimals) })
- }
- is Result.Failure -> return result
- }
- }
-}
-
-private class EthereumTransactionBuilder(private val chain: Chain) {
-
- fun buildToSign(transactionData: TransactionData, nonce: BigInteger?): TransactionToSign? {
-
- val amount: BigDecimal = transactionData.amount.value ?: return null
- val transactionFee: BigDecimal = transactionData.fee?.value ?: return null
-
- val value = amount.movePointRight(transactionData.amount.decimals.toInt()).toBigInteger()
- val fee = transactionFee.movePointRight(transactionData.fee.decimals.toInt()).toBigInteger()
-
- val transaction = createTransactionWithDefaults(
- from = Address(transactionData.sourceAddress),
- to = Address(transactionData.destinationAddress),
- value = value,
- gasPrice = fee.divide(DEFAULT_GAS_LIMIT),
- gasLimit = DEFAULT_GAS_LIMIT,
- nonce = nonce,
- chain = ChainId(chain.id.toLong())
- )
- val hash = transaction.encodeRLP(SignatureData(v = chain.id.toBigInteger())).keccak()
- return TransactionToSign(transaction, listOf(hash))
- }
-
- fun buildToSend(signature: ByteArray, transactionToSign: TransactionToSign, walletPublicKey: ByteArray): ByteArray {
- val r = BigInteger(1, signature.copyOfRange(0, 32))
- val s = BigInteger(1, signature.copyOfRange(32, 64))
-
- val ecdsaSignature = ECDSASignature(r, s).canonicalise()
-
- val recId = ecdsaSignature.determineRecId(transactionToSign.hashes[0], PublicKey(walletPublicKey.sliceArray(1..64)))
- val v = (recId + 27 + 8 + (chain.id * 2)).toBigInteger()
- val signatureData = SignatureData(ecdsaSignature.r, ecdsaSignature.s, v)
-
- return transactionToSign.transaction.encodeRLP(signatureData)
- }
-}
-
-private class TransactionToSign(val transaction: Transaction, val hashes: List)
-
-enum class GasLimit(val value: Long) {
- Default(21000),
- Token(60000),
- High(300000)
-}
-
-private fun getGasLimit(amount: Amount): GasLimit {
- return when (amount.currencySymbol) {
- Blockchain.Ethereum.currency -> GasLimit.Default
- "DGX" -> GasLimit.High
- "CGT" -> GasLimit.High
- else -> GasLimit.Token
- }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt
deleted file mode 100644
index 2a04de5825..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/ethereum/network/InfuraProvider.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.tangem.blockchain.ethereum.network
-
-class InfuraProvider(private val api: InfuraApi) {
- suspend fun getBalance(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_BALANCE, address))
- suspend fun getTokenBalance(address: String, contractAddress: String) = api.postToInfura(createInfuraBody(InfuraMethod.CALL, address, contractAddress))
- suspend fun getTxCount(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_TRANSACTION_COUNT, address))
- suspend fun getPendingTxCount(address: String) = api.postToInfura(createInfuraBody(InfuraMethod.GET_PENDING_COUNT, address))
- suspend fun getGasPrice() = api.postToInfura(createInfuraBody(InfuraMethod.GAS_PRICE))
- suspend fun sendTransaction(transaction: String) = api.postToInfura(createInfuraBody(InfuraMethod.SEND_RAW_TRANSACTION, transaction = transaction))
-}
-
-private fun createInfuraBody(
- method: InfuraMethod,
- address: String? = null,
- contractAddress: String? = null,
- transaction: String? = null): InfuraBody {
-
- return when (method) {
- InfuraMethod.GET_BALANCE ->
- InfuraBody(method = InfuraMethod.GET_BALANCE.value, params = listOf(address ?: "", "latest"))
- InfuraMethod.GET_TRANSACTION_COUNT ->
- InfuraBody(method = InfuraMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "latest"))
- InfuraMethod.GET_PENDING_COUNT ->
- InfuraBody(method = InfuraMethod.GET_TRANSACTION_COUNT.value, params = listOf(address ?: "", "pending"))
- InfuraMethod.GAS_PRICE ->
- InfuraBody(method = InfuraMethod.GAS_PRICE.value)
- InfuraMethod.SEND_RAW_TRANSACTION ->
- InfuraBody(method = InfuraMethod.SEND_RAW_TRANSACTION.value, params = listOf(transaction ?: ""))
- InfuraMethod.CALL -> {
- InfuraBody(
- method = InfuraMethod.CALL.value,
- params = listOf(EthCallParams(
- "0x70a08231000000000000000000000000" + address?.substring(2), contractAddress
- ?: ""),
- "latest"
- ))
- }
- }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Amount.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/Amount.kt
similarity index 55%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/Amount.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/Amount.kt
index 8a9f4445e1..9c76097bc5 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Amount.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/Amount.kt
@@ -1,8 +1,13 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
import com.tangem.blockchain.common.Amount
import java.math.BigInteger
fun Amount.bigIntegerValue(): BigInteger? {
return this.value?.movePointRight(this.decimals.toInt())?.toBigInteger()
+}
+
+fun Amount.isAboveZero(): Boolean {
+ val value = this.value ?: return false
+ return value.signum() == 1
}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BitInteger.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/BitInteger.kt
similarity index 83%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/BitInteger.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/BitInteger.kt
index 6ac80e1bbd..09299f4e86 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/BitInteger.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/BitInteger.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
import org.bitcoinj.core.ECKey
import java.math.BigInteger
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/ByteArray.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/ByteArray.kt
similarity index 83%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/ByteArray.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/ByteArray.kt
index 29ce488afc..8b251179ca 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/ByteArray.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/ByteArray.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
import android.util.Base64
import org.bitcoinj.core.Base58
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Coroutines.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/Coroutines.kt
similarity index 97%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/Coroutines.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/Coroutines.kt
index 8451a23b67..52e65b7046 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/Coroutines.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/Coroutines.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
import com.tangem.TangemSdk
import com.tangem.blockchain.common.TransactionSigner
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/String.kt b/blockchain/src/main/java/com/tangem/blockchain/extensions/String.kt
similarity index 83%
rename from blockchain/src/main/java/com/tangem/blockchain/common/extensions/String.kt
rename to blockchain/src/main/java/com/tangem/blockchain/extensions/String.kt
index 8f14abf5f8..149d43ab34 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/extensions/String.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/extensions/String.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.extensions
+package com.tangem.blockchain.extensions
import org.bitcoinj.core.AddressFormatException
import org.bitcoinj.core.Base58
diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
similarity index 85%
rename from blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt
rename to blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
index afcffa0bfb..94d89c0531 100644
--- a/blockchain/src/main/java/com/tangem/blockchain/common/network/RetrofitBuilder.kt
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/RetrofitBuilder.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.common.network
+package com.tangem.blockchain.network
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
@@ -40,7 +40,7 @@ const val API_INFURA = "https://mainnet.infura.io/"
const val API_SOCHAIN_V2 = "https://chain.so/"
const val API_ESTIMATEFEE = "https://estimatefee.com/"
const val API_UPDATE_VERSION = "https://raw.githubusercontent.com/"
-const val API_ROOTSTOCK = "https://public-node.rsk.co/"
+const val API_RSK = "https://public-node.rsk.co/"
const val API_BLOCKCYPHER = "https://api.blockcypher.com/"
const val API_BINANCE = "https://dex.binance.org/"
const val API_BINANCE_TESTNET = "https://testnet-dex.binance.org/"
@@ -49,7 +49,8 @@ const val API_STELLAR = "https://horizon.stellar.org/"
const val API_STELLAR_RESERVE = "https://horizon.sui.li/"
const val API_STELLAR_TESTNET = "https://horizon-testnet.stellar.org/"
const val API_BLOCKCHAIN_INFO = "https://blockchain.info/"
-const val API_ADALITE = "https://explorer2.adalite.io"
-const val API_ADALITE_RESERVE = "https://nodes.southeastasia.cloudapp.azure.com"
-const val API_RIPPLED = "https://s1.ripple.com:51234"
-const val API_RIPPLED_RESERVE = "https://s2.ripple.com:51234"
\ No newline at end of file
+const val API_ADALITE = "https://explorer3.adalite.io/"
+const val API_ADALITE_RESERVE = "https://nodes.southeastasia.cloudapp.azure.com/"
+const val API_RIPPLED = "https://s1.ripple.com:51234/"
+const val API_RIPPLED_RESERVE = "https://s2.ripple.com:51234/"
+const val API_BLOCKCHAIR = "https://api.blockchair.com/"
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt
new file mode 100644
index 0000000000..b078327847
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairApi.kt
@@ -0,0 +1,36 @@
+package com.tangem.blockchain.network.blockchair
+
+import com.squareup.moshi.JsonClass
+import retrofit2.http.*
+
+interface BlockchairApi {
+ @GET("{blockchain}/dashboards/address/{address}")
+ suspend fun getAddressData(
+ @Path("address") address: String,
+ @Path("blockchain") blockchain: String,
+ @Query("key") key: String
+ ): BlockchairAddress
+
+ @GET("{blockchain}/dashboards/transaction/{transaction}")
+ suspend fun getTransaction(
+ @Path("transaction") transactionHash: String,
+ @Path("blockchain") blockchain: String,
+ @Query("key") key: String
+ ): BlockchairTransaction
+
+ @GET("{blockchain}/stats")
+ suspend fun getBlockchainStats(
+ @Path("blockchain") blockchain: String,
+ @Query("key") key: String
+ ): BlockchairStats
+
+ @POST("{blockchain}/push/transaction")
+ suspend fun sendTransaction(
+ @Body sendBody: BlockchairBody,
+ @Path("blockchain") blockchain: String,
+ @Query("key") key: String
+ )
+}
+
+@JsonClass(generateAdapter = true)
+data class BlockchairBody(val data: String)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt
new file mode 100644
index 0000000000..a14c6b8561
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairProvider.kt
@@ -0,0 +1,96 @@
+package com.tangem.blockchain.network.blockchair
+
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinUnspentOutput
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinAddressResponse
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinFee
+import com.tangem.blockchain.blockchains.bitcoin.network.BitcoinProvider
+import com.tangem.blockchain.common.Blockchain
+import com.tangem.blockchain.extensions.Result
+import com.tangem.blockchain.extensions.SimpleResult
+import com.tangem.blockchain.extensions.retryIO
+import com.tangem.common.extensions.hexToBytes
+import java.math.BigDecimal
+import java.math.RoundingMode
+
+class BlockchairProvider(private val api: BlockchairApi, blockchain: Blockchain) : BitcoinProvider {
+ private val blockchainPath = when (blockchain) {
+ Blockchain.BitcoinCash -> "bitcoin-cash"
+ else -> throw Exception("${blockchain.fullName} blockchain is not supported by BlockchairProvider")
+ }
+ private val decimals = blockchain.decimals()
+
+ override suspend fun getInfo(address: String): Result {
+ return try {
+ val blockchairAddress = retryIO { api.getAddressData(address, blockchainPath, API_KEY) }
+
+ val addressData = blockchairAddress.data!!.getValue(address)
+ val addressInfo = addressData.addressInfo!!
+ val script = addressInfo.script!!.hexToBytes()
+
+ val hasUnconfirmed = checkHasUnconfirmed(addressData)
+
+ val unspentTransactions = addressData.unspentOutputs!!.map {
+ BitcoinUnspentOutput(
+ amount = it.amount!!.toBigDecimal().movePointLeft(decimals),
+ outputIndex = it.index!!.toLong(),
+ transactionHash = it.transactionHash!!.hexToBytes(),
+ outputScript = script
+ )
+ }
+
+ Result.Success(BitcoinAddressResponse(
+ balance = addressInfo.balance!!.toBigDecimal().movePointLeft(decimals),
+ hasUnconfirmed = hasUnconfirmed,
+ unspentOutputs = unspentTransactions
+ ))
+ } catch (error: Exception) {
+ Result.Failure(error)
+ }
+
+ }
+
+ private suspend fun checkHasUnconfirmed(addressData: BlockchairAddressData): Boolean {
+ for (utxo in addressData.unspentOutputs!!) { //check utxos first
+ if (utxo.block == -1) return true
+ }
+
+ return if (addressData.addressInfo!!.balance != 0L) { // if balance is not zero, unconfirmed tx should have unconfirmed utxo
+ false
+ } else {
+ if (addressData.transactions!!.isEmpty()) { // no transactions from this address ever
+ false
+ } else { // check last transaction in case it spent all funds
+ val lastTransactionHash = addressData.transactions[0]
+ val blockchairTransaction = retryIO {
+ api.getTransaction(lastTransactionHash, blockchainPath, API_KEY)
+ }
+ blockchairTransaction.data!!.getValue(lastTransactionHash).transaction!!.block == -1
+ }
+ }
+ }
+
+ override suspend fun getFee(): Result {
+ return try {
+ val stats = retryIO { api.getBlockchainStats(blockchainPath, API_KEY) }
+ val feePerKb = (stats.data!!.feePerByte!! * 1024).toBigDecimal().movePointLeft(decimals)
+ Result.Success(BitcoinFee(
+ minimalPerKb = (feePerKb * BigDecimal.valueOf(0.8)).setScale(decimals, RoundingMode.DOWN),
+ normalPerKb = feePerKb.setScale(decimals, RoundingMode.DOWN),
+ priorityPerKb = (feePerKb * BigDecimal.valueOf(1.2)).setScale(decimals, RoundingMode.DOWN)
+ ))
+ } catch (error: Exception) {
+ Result.Failure(error)
+ }
+ }
+
+ override suspend fun sendTransaction(transaction: String): SimpleResult {
+ return try {
+ retryIO { api.sendTransaction(BlockchairBody(transaction), blockchainPath, API_KEY) }
+ SimpleResult.Success
+ } catch (error: Exception) {
+ SimpleResult.Failure(error)
+ }
+ }
+}
+
+private const val API_KEY = "A___0Shpsu4KagE7oSabrw20DfXAqWlT"
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt
new file mode 100644
index 0000000000..8962ce7860
--- /dev/null
+++ b/blockchain/src/main/java/com/tangem/blockchain/network/blockchair/BlockchairResponse.kt
@@ -0,0 +1,75 @@
+package com.tangem.blockchain.network.blockchair
+
+import com.google.gson.annotations.SerializedName
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+@JsonClass(generateAdapter = true)
+data class BlockchairAddress(
+ @Json(name = "data")
+ val data: Map? = null
+)
+
+data class BlockchairAddressData(
+ @Json(name = "address")
+ val addressInfo: BlockchairAddressInfo? = null,
+
+ @Json(name = "utxo")
+ val unspentOutputs: List? = null,
+
+ @Json(name = "transactions")
+ val transactions: List? = null
+)
+
+data class BlockchairAddressInfo(
+ @Json(name = "balance")
+ val balance: Long? = null,
+
+ @Json(name = "script_hex")
+ val script: String? = null,
+
+ @Json(name = "output_count")
+ val outputCount: Int? = null,
+
+ @Json(name = "unspent_output_count")
+ val unspentOutputCount: Int? = null
+)
+
+data class BlockchairUnspentOutput(
+ @Json(name = "block_id")
+ val block: Int? = null,
+
+ @Json(name = "transaction_hash")
+ val transactionHash: String? = null,
+
+ @Json(name = "index")
+ val index: Int? = null,
+
+ @Json(name = "value")
+ val amount: Long? = null
+)
+
+data class BlockchairTransaction(
+ @Json(name = "data")
+ val data: Map? = null
+)
+
+data class BlockchairTransactionData(
+ @Json(name = "transaction")
+ val transaction: BlockchairTransactionInfo? = null
+)
+
+data class BlockchairTransactionInfo(
+ @Json(name = "block_id")
+ val block: Int? = null
+)
+
+data class BlockchairStats(
+ @Json(name = "data")
+ val data: BlockchairStatsData? = null
+)
+
+data class BlockchairStatsData(
+ @Json(name = "suggested_transaction_fee_per_byte_sat")
+ val feePerByte: Int? = null
+)
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt
deleted file mode 100644
index 605d8f3e2e..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/stellar/StellarAddress.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.tangem.blockchain.stellar
-
-import org.stellar.sdk.KeyPair
-
-class StellarAddressFactory {
- companion object {
- fun makeAddress(cardPublicKey: ByteArray): String {
- val kp = KeyPair.fromPublicKey(cardPublicKey)
- return kp.accountId
- }
- }
-}
-
-class StellarAddressValidator {
- companion object {
- fun validate(address: String): Boolean {
- return try {
- KeyPair.fromAccountId(address) != null
- } catch (exception: IllegalArgumentException) {
- false
- }
- }
- }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt b/blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt
deleted file mode 100644
index 7710b95439..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/wallets/CurrencyWallet.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.tangem.blockchain.wallets
-
-import com.tangem.blockchain.common.*
-import java.util.*
-
-class CurrencyWallet(
- val blockchain: Blockchain,
- address: String,
- override val config: WalletConfig
-) : Wallet, TransactionValidator {
-
- override val exploreUrl: String? = null
- override val shareUrl: String? = null
- override val address: String
- get() = balances[AmountType.Coin]!!.address!!
-
- val pendingTransactions: MutableList = mutableListOf()
- val balances: MutableMap = mutableMapOf()
-
- init {
- addAmount(Amount(null, blockchain, address))
- }
-
- override fun validateTransaction(amount: Amount, fee: Amount?): EnumSet {
- TODO("not implemented")
- }
-
- fun addAmount(amount: Amount) {
- balances[amount.type] = amount
- }
-
- fun addPendingTransaction(transaction: TransactionData) {
- pendingTransactions.add(transaction.copy(date = Calendar.getInstance()))
- }
-
- companion object {
- fun newInstance(blockchain: Blockchain, address: String, token: Token?): CurrencyWallet {
-
- return when (blockchain) {
- Blockchain.Bitcoin, Blockchain.BitcoinTestnet, Blockchain.XRP -> {
- val config = WalletConfig(true, true)
- CurrencyWallet(blockchain, address, config)
- }
- Blockchain.Cardano, Blockchain.Binance, Blockchain.BinanceTestnet -> {
- val config = WalletConfig(false, true)
- CurrencyWallet(blockchain, address, config)
- }
- Blockchain.Ethereum -> {
- val config = WalletConfig(true, token == null)
- val wallet = CurrencyWallet(blockchain, address, config)
- if (token != null) wallet.addAmount(Amount(token))
- wallet
- }
- Blockchain.Stellar -> {
- val config = WalletConfig(false, token == null)
- val wallet = CurrencyWallet(blockchain, address, config)
- if (token != null) wallet.addAmount(Amount(token))
- wallet.addAmount(Amount(null, blockchain, address, AmountType.Reserve))
- wallet
- }
- else -> throw Exception("Unsupported blockchain")
- }
-
- }
- }
-}
\ No newline at end of file
diff --git a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt
deleted file mode 100644
index 2bd702f67f..0000000000
--- a/blockchain/src/main/java/com/tangem/blockchain/xrp/XrpAddress.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.tangem.blockchain.xrp
-
-import com.ripple.encodings.addresses.Addresses
-import com.tangem.common.extensions.calculateRipemd160
-import com.tangem.common.extensions.calculateSha256
-import com.tangem.common.extensions.toCompressedPublicKey
-
-class XrpAddressFactory {
- companion object {
- fun makeAddress(walletPublicKey: ByteArray): String {
- val canonicalPublicKey = canonizePublicKey(walletPublicKey)
- val publicKeyHash = canonicalPublicKey.calculateSha256().calculateRipemd160()
- return Addresses.encodeAccountID(publicKeyHash)
- }
-
- fun canonizePublicKey(publicKey: ByteArray): ByteArray {
- val compressedPublicKey = publicKey.toCompressedPublicKey()
- return if (compressedPublicKey.size == 32) {
- byteArrayOf(0xED.toByte()) + compressedPublicKey
- } else {
- compressedPublicKey
- }
- }
- }
-}
-
-class XrpAddressValidator {
- companion object {
- fun validate(address: String): Boolean {
- return try {
- Addresses.decodeAccountID(address)
- address.startsWith("r")
- } catch (excpetion: Exception) {
- false
- }
- }
- }
-}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/binance/BinanceAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/binance/BinanceAddressTest.kt
similarity index 72%
rename from blockchain/src/test/java/com/tangem/blockchain/binance/BinanceAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/binance/BinanceAddressTest.kt
index 7501ec0105..3293a1fe37 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/binance/BinanceAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/binance/BinanceAddressTest.kt
@@ -1,23 +1,26 @@
-package com.tangem.blockchain.binance
+package com.tangem.blockchain.blockchains.binance
import com.google.common.truth.Truth
import com.tangem.common.extensions.hexToBytes
import org.junit.Test
internal class BinanceAddressTest {
+
+ private val addressService = BinanceAddressService()
+
@Test
fun makeAddressFromCorrectPublicKey() {
val walletPublicKey = "04E3F3BE3CE3D8284DB3BA073AD0291040093D83C11A277B905D5555C9EC41073E103F4D9D299EDEA8285C51C3356A8681A545618C174251B984DF841F49D2376F".hexToBytes()
val expected = "bnb1m9wu5ncxk8mqhm3nfmxa552728wkty700rzhvu"
- Truth.assertThat(BinanceAddressFactory.makeAddress(walletPublicKey))
+ Truth.assertThat(addressService.makeAddress(walletPublicKey))
.isEqualTo(expected)
}
@Test
fun validateCorrectAddress() {
val address = "bnb1m9wu5ncxk8mqhm3nfmxa552728wkty700rzhvu"
- Truth.assertThat(BinanceAddressValidator.validate(address))
+ Truth.assertThat(addressService.validate(address))
.isTrue()
}
}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/bitcoin/BitcoinAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressTest.kt
similarity index 71%
rename from blockchain/src/test/java/com/tangem/blockchain/bitcoin/BitcoinAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressTest.kt
index ea4b181980..c8b7cca7ef 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/bitcoin/BitcoinAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressTest.kt
@@ -1,25 +1,26 @@
-package com.tangem.blockchain.bitcoin
+package com.tangem.blockchain.blockchains.bitcoin
import com.google.common.truth.Truth
import com.tangem.common.extensions.hexToBytes
import org.junit.Test
-import org.junit.jupiter.api.Assertions.*
class BitcoinAddressTest {
+ private val addressService = BitcoinAddressService()
+
@Test
fun makeAddressFromCorrectPublicKey() {
val walletPublicKey = "04752A727E14BBA5BD73B6714D72500F61FFD11026AD1196D2E1C54577CBEEAC3D11FC68A64700F8D533F4E311964EA8FB3AA26C588295F2133868D69C3E628693".hexToBytes()
val expected = "1D3vYSjCvzrsVVK5bNaPTjU3NxcN7NNXMN"
- Truth.assertThat(BitcoinAddressFactory.makeAddress(walletPublicKey))
+ Truth.assertThat(addressService.makeAddress(walletPublicKey))
.isEqualTo(expected)
}
@Test
fun validateCorrectAddress() {
val address = "1D3vYSjCvzrsVVK5bNaPTjU3NxcN7NNXMN"
- Truth.assertThat(BitcoinAddressValidator.validate(address))
+ Truth.assertThat(addressService.validate(address))
.isTrue()
}
}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt
new file mode 100644
index 0000000000..ff0d1a7f95
--- /dev/null
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/bitcoincash/BitcoinCashAddressTest.kt
@@ -0,0 +1,27 @@
+package com.tangem.blockchain.blockchains.bitcoincash
+
+import com.google.common.truth.Truth
+import com.tangem.common.extensions.hexToBytes
+import com.tangem.common.extensions.toCompressedPublicKey
+import org.junit.Test
+
+class BitcoinCashAddressTest {
+
+ private val addressService = BitcoinCashAddressService()
+
+ @Test
+ fun makeAddressFromCorrectPublicKey() {
+ val walletPublicKey = "04BE37CD5251C8999EDBBFC759D800EB41E4DCB718289601EB15819404E1B2F2ED90FE50C2A481D06EC790D1EF6184974EB655ABAE4BE56A6D1C9E1A17B1EFDF02".hexToBytes()
+ val expected = "bitcoincash:qp7atyzvetwq8a0x02y2snvnns5jfwnzacf9vfa4x3"
+
+ Truth.assertThat(addressService.makeAddress(walletPublicKey.toCompressedPublicKey()))
+ .isEqualTo(expected)
+ }
+
+ @Test
+ fun validateCorrectAddress() {
+ val address = "bitcoincash:qp7atyzvetwq8a0x02y2snvnns5jfwnzacf9vfa4x3"
+ Truth.assertThat(addressService.validate(address))
+ .isTrue()
+ }
+}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/ethereum/EthereumAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
similarity index 51%
rename from blockchain/src/test/java/com/tangem/blockchain/ethereum/EthereumAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
index b1325c8493..b4892fb1d4 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/ethereum/EthereumAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressTest.kt
@@ -1,4 +1,4 @@
-package com.tangem.blockchain.ethereum
+package com.tangem.blockchain.blockchains.ethereum
import com.google.common.truth.Truth
import com.tangem.common.extensions.hexToBytes
@@ -6,19 +6,28 @@ import org.junit.Test
internal class EthereumAddressTest {
+ private val addressService = EthereumAddressService()
+
@Test
fun makeAddressFromCorrectPublicKey() {
val walletPublicKey = "04BAEC8CD3BA50FDFE1E8CF2B04B58E17041245341CD1F1C6B3A496B48956DB4C896A6848BCF8FCFC33B88341507DD25E5F4609386C68086C74CF472B86E5C3820".hexToBytes()
- val expected = "0xc63763572d45171e4c25ca0818b44e5dd7f5c15b"
+ val expected = "0xc63763572D45171e4C25cA0818b44E5Dd7F5c15B"
- Truth.assertThat(EthereumAddressFactory.makeAddress(walletPublicKey))
+ Truth.assertThat(addressService.makeAddress(walletPublicKey))
.isEqualTo(expected)
}
@Test
fun validateCorrectAddress() {
val address = "0xc63763572d45171e4c25ca0818b44e5dd7f5c15b"
- Truth.assertThat(EthereumAddressValidator.validate(address))
+ Truth.assertThat(addressService.validate(address))
+ .isTrue()
+ }
+
+ @Test
+ fun validateCorrectAddressWithChecksum() {
+ val address = "0xc63763572D45171e4C25cA0818b44E5Dd7F5c15B"
+ Truth.assertThat(addressService.validate(address))
.isTrue()
}
}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/stellar/StellarAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/stellar/StellarAddressTest.kt
similarity index 71%
rename from blockchain/src/test/java/com/tangem/blockchain/stellar/StellarAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/stellar/StellarAddressTest.kt
index 5c6f18561f..e53d557e53 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/stellar/StellarAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/stellar/StellarAddressTest.kt
@@ -1,23 +1,26 @@
-package com.tangem.blockchain.stellar
+package com.tangem.blockchain.blockchains.stellar
import com.google.common.truth.Truth
import com.tangem.common.extensions.hexToBytes
import org.junit.Test
internal class StellarAddressTest {
+
+ private val addressService = StellarAddressService()
+
@Test
fun makeAddressFromCorrectPublicKey() {
val walletPublicKey = "EC5387D8B38BD9EF80BDBC78D0D7E1C53F08E269436C99D5B3C2DF4B2CE73012".hexToBytes()
val expected = "GDWFHB6YWOF5T34AXW6HRUGX4HCT6CHCNFBWZGOVWPBN6SZM44YBFUDZ"
- Truth.assertThat(StellarAddressFactory.makeAddress(walletPublicKey))
+ Truth.assertThat(addressService.makeAddress(walletPublicKey))
.isEqualTo(expected)
}
@Test
fun validateCorrectAddress() {
val address = "GDWFHB6YWOF5T34AXW6HRUGX4HCT6CHCNFBWZGOVWPBN6SZM44YBFUDZ"
- Truth.assertThat(StellarAddressValidator.validate(address))
+ Truth.assertThat(addressService.validate(address))
.isTrue()
}
}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/xrp/XrpAddressTest.kt b/blockchain/src/test/java/com/tangem/blockchain/blockchains/xrp/XrpAddressTest.kt
similarity index 74%
rename from blockchain/src/test/java/com/tangem/blockchain/xrp/XrpAddressTest.kt
rename to blockchain/src/test/java/com/tangem/blockchain/blockchains/xrp/XrpAddressTest.kt
index 1f82c1f777..a6d2f97a91 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/xrp/XrpAddressTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/blockchains/xrp/XrpAddressTest.kt
@@ -1,16 +1,19 @@
-package com.tangem.blockchain.xrp
+package com.tangem.blockchain.blockchains.xrp
import com.google.common.truth.Truth
import com.tangem.common.extensions.hexToBytes
import org.junit.Test
internal class XrpAddressTest {
+
+ private val addressService = XrpAddressService()
+
@Test
fun makeAddressFromCorrectSecpPublicKey() {
val walletPublicKey = "04D2B9FB288540D54E5B32ECAF0381CD571F97F6F1ECD036B66BB11AA52FFE9981110D883080E2E255C6B1640586F7765E6FAA325D1340F49B56B83D9DE56BC7ED".hexToBytes()
val expected = "rNxCXgKaCMAmowENKnYa5r8Ue78rjgrM6B"
- Truth.assertThat(XrpAddressFactory.makeAddress(walletPublicKey))
+ Truth.assertThat(addressService.makeAddress(walletPublicKey))
.isEqualTo(expected)
}
@@ -19,14 +22,14 @@ internal class XrpAddressTest {
val walletPublicKey = "12CC4DE73BACF875D7423D152E46C1A665F1718CBE7CA0FEB2BA28C149E11909".hexToBytes()
val expected = "rwWMNBs2GtJwfX7YNVV1sUYaPy6DRmDHB4"
- Truth.assertThat(XrpAddressFactory.makeAddress(walletPublicKey))
+ Truth.assertThat(addressService.makeAddress(walletPublicKey))
.isEqualTo(expected)
}
@Test
fun validateCorrectAddress() {
val address = "rwWMNBs2GtJwfX7YNVV1sUYaPy6DRmDHB4"
- Truth.assertThat(XrpAddressValidator.validate(address))
+ Truth.assertThat(addressService.validate(address))
.isTrue()
}
}
\ No newline at end of file
diff --git a/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt b/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
index 32ab0256cb..ff9edbcdd1 100644
--- a/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
+++ b/blockchain/src/test/java/com/tangem/blockchain/common/WalletManagerFactoryTest.kt
@@ -2,12 +2,13 @@ package com.tangem.blockchain.common
import com.google.common.truth.Truth
import com.tangem.SessionEnvironment
-import com.tangem.blockchain.binance.BinanceWalletManager
-import com.tangem.blockchain.bitcoin.BitcoinWalletManager
-import com.tangem.blockchain.cardano.CardanoWalletManager
-import com.tangem.blockchain.ethereum.EthereumWalletManager
-import com.tangem.blockchain.stellar.StellarWalletManager
-import com.tangem.blockchain.xrp.XrpWalletManager
+import com.tangem.blockchain.blockchains.binance.BinanceWalletManager
+import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
+import com.tangem.blockchain.blockchains.bitcoincash.BitcoinCashWalletManager
+import com.tangem.blockchain.blockchains.cardano.CardanoWalletManager
+import com.tangem.blockchain.blockchains.ethereum.EthereumWalletManager
+import com.tangem.blockchain.blockchains.stellar.StellarWalletManager
+import com.tangem.blockchain.blockchains.xrp.XrpWalletManager
import com.tangem.commands.ReadCommand
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extensions.hexToBytes
@@ -80,4 +81,15 @@ internal class WalletManagerFactoryTest {
Truth.assertThat(walletManager)
.isInstanceOf(BinanceWalletManager::class.java)
}
+
+ @Test
+ fun createBitcoinCashWalletManager() {
+ val data = "0108BB00000000000049200754414E47454D00020102800A322E3432642053444B00034104766A1586D164B436E5D420AED01FDAB41B2AE7EDF0C865D7AF1DA995D70AB297E5B94B761CFBB405084C21BC97C02B4A1EA9ED4F515576EAB4D83AD3A0DFAA8A0A04041E76310C618102FFFF8A0101820407E4041B830B54414E47454D2053444B00840342434886408058F0F628C2466B09ECEB13F2A8EFDD4558F5D2DBDA9BD0628EE8C8CC99A778FF0F1AECD35704B9F3518486EA5C1D20F9DFCBAA66184F4CCCD9282E2632882C3041045F16BD1D2EAFE463E62A335A09E6B2BBCBD04452526885CB679FC4D27AF1BD22F553C7DEEFB54FD3D4F361D14E6DC3F11B7D4EA183250A60720EBDF9E110CD26050A736563703235366B31000804000186A0070100604104BE37CD5251C8999EDBBFC759D800EB41E4DCB718289601EB15819404E1B2F2ED90FE50C2A481D06EC790D1EF6184974EB655ABAE4BE56A6D1C9E1A17B1EFDF0262040001869A6304000000060F01009000"
+ val responseApdu = ResponseApdu(data.hexToBytes())
+ val card = ReadCommand().deserialize(SessionEnvironment(), responseApdu)
+ val walletManager = WalletManagerFactory.makeWalletManager(card!!)
+
+ Truth.assertThat(walletManager)
+ .isInstanceOf(BitcoinCashWalletManager::class.java)
+ }
}
\ No newline at end of file
diff --git a/dependencies.gradle b/dependencies.gradle
index 030d85bfd8..3c7aaf12d8 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -1,4 +1,4 @@
ext.versions = [
kotlin : '1.3.72',
- build_gradle: '3.6.2',
+ build_gradle: '3.6.3',
]
diff --git a/settings.gradle b/settings.gradle
index db8941d8f2..9a87107347 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-demo', ':blockchain', ':blockchain-demo'
\ No newline at end of file
+include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-devkit', ':blockchain', ':blockchain-demo'
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/CardFilter.kt b/tangem-core/src/main/java/com/tangem/CardFilter.kt
new file mode 100644
index 0000000000..d1275d1d1d
--- /dev/null
+++ b/tangem-core/src/main/java/com/tangem/CardFilter.kt
@@ -0,0 +1,14 @@
+package com.tangem
+
+import com.tangem.common.extensions.CardType
+import java.util.*
+
+/**
+ * Filter that can be used to limit cards that can be interacted with in TangemSdk.
+ *
+ * @property allowedCardTypes Type of cards that are allowed to be interacted with in TangemSdk.
+ */
+data class CardFilter(
+
+ var allowedCardTypes: EnumSet = EnumSet.allOf(CardType::class.java)
+)
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt
index 450c056997..34f243fc4f 100644
--- a/tangem-core/src/main/java/com/tangem/CardSession.kt
+++ b/tangem-core/src/main/java/com/tangem/CardSession.kt
@@ -8,6 +8,7 @@ import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extensions.calculateSha256
+import com.tangem.common.extensions.getType
import com.tangem.crypto.EncryptionHelper
import com.tangem.crypto.FastEncryptionHelper
import com.tangem.crypto.StrongEncryptionHelper
@@ -20,7 +21,7 @@ interface CardSessionRunnable {
/**
* The starting point for custom business logic.
- * Implement this interface and use [TangemSdk.startSession] to run.
+ * Implement this interface and use [TangemSdk.startSessionWithRunnable] to run.
* @param session run commands in this [CardSession].
* @param callback trigger the callback to complete the task.
*/
@@ -36,7 +37,7 @@ interface CardSessionRunnable {
* @property viewDelegate is an interface that allows interaction with users and shows relevant UI.
* @property cardId ID, Unique Tangem card ID number. If not null, the SDK will check that you the card
* with which you tapped a phone has this [cardId] and SDK will return
- * the [SessionError.WrongCard] otherwise.
+ * the [TangemSdkError.WrongCard] otherwise.
* @property initialMessage A custom description that will be shown at the beginning of the NFC session.
* If null, a default header and text body will be used.
*/
@@ -85,12 +86,12 @@ class CardSession(
/**
* Starts a card session and performs preflight [ReadCommand].
- * @param callback: callback with the card session. Can contain [SessionError] if something goes wrong.
+ * @param callback: callback with the card session. Can contain [TangemSdkError] if something goes wrong.
*/
- fun start(callback: (session: CardSession, error: SessionError?) -> Unit) {
+ fun start(callback: (session: CardSession, error: TangemSdkError?) -> Unit) {
try {
startSession()
- } catch (error: SessionError) {
+ } catch (error: TangemSdkError) {
callback(this, error)
}
@@ -108,7 +109,7 @@ class CardSession(
}
private fun startSession() {
- if (isBusy) throw SessionError.Busy()
+ if (isBusy) throw TangemSdkError.Busy()
isBusy = true
viewDelegate.onNfcSessionStarted(cardId, initialMessage)
reader.openSession()
@@ -132,8 +133,14 @@ class CardSession(
is CompletionResult.Success -> {
val receivedCardId = result.data.cardId
if (cardId != null && receivedCardId != cardId) {
- stopWithError(SessionError.WrongCard())
- callback(CompletionResult.Failure(SessionError.WrongCard()))
+ stopWithError(TangemSdkError.WrongCard())
+ callback(CompletionResult.Failure(TangemSdkError.WrongCard()))
+ return@run
+ }
+ val allowedCardTypes = environment.cardFilter.allowedCardTypes
+ if (!allowedCardTypes.contains(result.data.getType())) {
+ stopWithError(TangemSdkError.WrongCardType())
+ callback(CompletionResult.Failure(TangemSdkError.WrongCardType()))
return@run
}
environment.card = result.data
@@ -162,12 +169,12 @@ class CardSession(
reader.closeSession()
isBusy = false
- val errorMessage = if (error is SessionError) {
+ val errorMessage = if (error is TangemSdkError) {
"${error::class.simpleName}: ${error.code}"
} else {
error.localizedMessage
}
- if (error !is SessionError.UserCancelled) {
+ if (error !is TangemSdkError.UserCancelled) {
Log.e("tag", "Finishing with error: $errorMessage")
viewDelegate.onError(errorMessage)
}
@@ -178,10 +185,10 @@ class CardSession(
}
private fun tryHandleError(
- error: SessionError, callback: (result: CompletionResult) -> Unit) {
+ error: TangemSdkError, callback: (result: CompletionResult) -> Unit) {
when (error) {
- is SessionError.NeedEncryption -> {
+ is TangemSdkError.NeedEncryption -> {
Log.i(tag, "Establishing encryption")
when (environment.encryptionMode) {
EncryptionMode.NONE -> {
@@ -194,12 +201,12 @@ class CardSession(
}
EncryptionMode.STRONG -> {
Log.e(tag, "Encryption doesn't work")
- callback(CompletionResult.Failure(SessionError.NeedEncryption()))
+ callback(CompletionResult.Failure(TangemSdkError.NeedEncryption()))
}
}
return establishEncryption(callback)
}
- else -> callback(CompletionResult.Failure(SessionError.UnknownError()))
+ else -> callback(CompletionResult.Failure(TangemSdkError.UnknownError()))
}
}
diff --git a/tangem-core/src/main/java/com/tangem/Config.kt b/tangem-core/src/main/java/com/tangem/Config.kt
index d99c57fcf9..45da4b6912 100644
--- a/tangem-core/src/main/java/com/tangem/Config.kt
+++ b/tangem-core/src/main/java/com/tangem/Config.kt
@@ -18,16 +18,24 @@ class Config(
the correctness of Terminal_Transaction_Signature using previously stored Terminal_PublicKey
and, if correct, will skip security delay for the current SIGN operation.
*/
- val linkedTerminal: Boolean = true,
+ var linkedTerminal: Boolean = true,
/**
* If not null, it will be used to validate Issuer data and issuer extra data.
* If null, issuerPublicKey from current card will be used.
*/
- val issuerPublicKey: ByteArray? = null,
+ var issuerPublicKey: ByteArray? = null,
/**
* Level of encryption used in communication with a Tangem Card.
*/
- val encryptionMode: EncryptionMode = EncryptionMode.NONE
+ var encryptionMode: EncryptionMode = EncryptionMode.NONE,
+
+ /**
+ * Filter that can be used to limit cards that can be interacted with in TangemSdk.
+ */
+ val cardFilter: CardFilter = CardFilter(),
+
+ var handleErrors: Boolean = true
+
)
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
index 0dabbc74d6..e51d5e5d97 100644
--- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
+++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt
@@ -20,7 +20,9 @@ data class SessionEnvironment(
val terminalKeys: KeyPair? = null,
var encryptionMode: EncryptionMode = EncryptionMode.NONE,
var encryptionKey: ByteArray? = null,
- val cvc: ByteArray? = null
+ val cvc: ByteArray? = null,
+ var cardFilter: CardFilter = CardFilter(),
+ val handleErrors: Boolean = true
) {
fun setPin1(pin1: String) {
diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
index 145efc088e..8fc1fb4e2e 100644
--- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt
+++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt
@@ -46,10 +46,10 @@ class TangemSdk(
* it proves that the wallet owns a private key that corresponds to a public one.
*
* @param callback is triggered on the completion of the [ScanTask] and provides card response
- * in the form of [Card] if the task was performed successfully or [SessionError] in case of an error.
+ * in the form of [Card] if the task was performed successfully or [TangemSdkError] in case of an error.
*/
fun scanCard(initialMessage: Message? = null, callback: (result: CompletionResult) -> Unit) {
- startSession(ScanTask(), null, initialMessage, callback)
+ startSessionWithRunnable(ScanTask(), null, initialMessage, callback)
}
/**
@@ -68,11 +68,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number
* @param callback is triggered on the completion of the [SignCommand] and provides card response
* in the form of [SignResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun sign(hashes: Array, cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
- startSession(SignCommand(hashes), cardId, initialMessage, callback)
+ startSessionWithRunnable(SignCommand(hashes), cardId, initialMessage, callback)
}
/**
@@ -86,11 +86,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number.
* @param callback is triggered on the completion of the [ReadIssuerDataCommand] and provides
* card response in the form of [ReadIssuerDataResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun readIssuerData(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
- startSession(ReadIssuerDataCommand(config.issuerPublicKey), cardId, initialMessage, callback)
+ startSessionWithRunnable(ReadIssuerDataCommand(config.issuerPublicKey), cardId, initialMessage, callback)
}
/**
@@ -105,11 +105,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number.
* @param callback is triggered on the completion of the [ReadIssuerExtraDataCommand] and provides
* card response in the form of [ReadIssuerExtraDataResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun readIssuerExtraData(cardId: String,
callback: (result: CompletionResult) -> Unit) {
- startSession(ReadIssuerExtraDataCommand(config.issuerPublicKey), cardId, null, callback)
+ startSessionWithRunnable(ReadIssuerExtraDataCommand(config.issuerPublicKey), cardId, null, callback)
}
/**
@@ -126,7 +126,7 @@ class TangemSdk(
* @param issuerDataCounter An optional counter that protect issuer data against replay attack.
* @param callback is triggered on the completion of the [WriteIssuerDataCommand] and provides
* card response in the form of [WriteIssuerDataResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun writeIssuerData(cardId: String,
issuerData: ByteArray,
@@ -140,7 +140,7 @@ class TangemSdk(
issuerDataCounter,
config.issuerPublicKey
)
- startSession(command, cardId, initialMessage, callback)
+ startSessionWithRunnable(command, cardId, initialMessage, callback)
}
/**
@@ -164,7 +164,7 @@ class TangemSdk(
* @param issuerDataCounter An optional counter that protect issuer data against replay attack.
* @param callback is triggered on the completion of the [WriteIssuerExtraDataCommand] and provides
* card response in the form of [WriteIssuerDataResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun writeIssuerExtraData(cardId: String,
issuerData: ByteArray,
@@ -179,7 +179,7 @@ class TangemSdk(
issuerDataCounter,
config.issuerPublicKey
)
- startSession(command, cardId, initialMessage, callback)
+ startSessionWithRunnable(command, cardId, initialMessage, callback)
}
/**
@@ -206,7 +206,7 @@ class TangemSdk(
callback: (result: CompletionResult) -> Unit
) {
val command = WriteUserDataCommand(userData, userProtectedData, userCounter, userProtectedCounter)
- startSession(command, cardId, initialMessage, callback)
+ startSessionWithRunnable(command, cardId, initialMessage, callback)
}
/**
@@ -224,11 +224,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number.
* @param callback is triggered on the completion of the [ReadUserDataCommand] and provides
* card response in the form of [ReadUserDataResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun readUserData(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
- startSession(ReadUserDataCommand(), cardId, initialMessage, callback)
+ startSessionWithRunnable(ReadUserDataCommand(), cardId, initialMessage, callback)
}
/**
@@ -246,11 +246,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number.
* @param callback is triggered on the completion of the [CreateWalletTask] and provides
* card response in the form of [CreateWalletResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun createWallet(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
- startSession(CreateWalletTask(), cardId, initialMessage, callback)
+ startSessionWithRunnable(CreateWalletTask(), cardId, initialMessage, callback)
}
/**
@@ -265,11 +265,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number.
* @param callback is triggered on the completion of the [PurgeWalletCommand] and provides
* card response in the form of [PurgeWalletResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun purgeWallet(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
- startSession(PurgeWalletCommand(), cardId, initialMessage, callback)
+ startSessionWithRunnable(PurgeWalletCommand(), cardId, initialMessage, callback)
}
/**
@@ -283,11 +283,11 @@ class TangemSdk(
* @param cardId CID, Unique Tangem card ID number.
* @param callback is triggered on the completion of the [DepersonalizeCommand] and provides
* card response in the form of [DepersonalizeResponse] if the task was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
* */
fun depersonalize(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
- startSession(DepersonalizeCommand(), cardId, initialMessage, callback)
+ startSessionWithRunnable(DepersonalizeCommand(), cardId, initialMessage, callback)
}
/**
@@ -306,14 +306,14 @@ class TangemSdk(
* (non-EMV) POS terminal infrastructure and transaction processing back-end.
* @param callback is triggered on the completion of the [PersonalizeCommand] and provides
* card response in the form of [Card] if the command was performed successfully
- * or [SessionError] in case of an error.
+ * or [TangemSdkError] in case of an error.
*/
fun personalize(config: CardConfig,
issuer: Issuer, manufacturer: Manufacturer, acquirer: Acquirer? = null,
initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
val command = PersonalizeCommand(config, issuer, manufacturer, acquirer)
- startSession(command, null, initialMessage, callback)
+ startSessionWithRunnable(command, null, initialMessage, callback)
}
/**
@@ -325,12 +325,12 @@ class TangemSdk(
* @runnable: A custom task, adopting [CardSessionRunnable] protocol
* @cardId: CID, Unique Tangem card ID number. If not null, the SDK will check that you the card
* with which you tapped a phone has this [cardId] and SDK will return
- * the [SessionError.WrongCard] otherwise.
+ * the [TangemSdkError.WrongCard] otherwise.
* @initialMessage: A custom description that shows at the beginning of the NFC session.
* If null, default message will be used.
* @callback: Standard [TangemSdk] callback.
*/
- fun startSession(
+ fun startSessionWithRunnable(
runnable: CardSessionRunnable, cardId: String? = null, initialMessage: Message? = null,
callback: (result: CompletionResult) -> Unit) {
val cardSession = CardSession(buildEnvironment(), reader, viewDelegate, cardId, initialMessage)
@@ -343,15 +343,14 @@ class TangemSdk(
* @cardId: CID, Unique Tangem card ID number. If not null, the SDK will check that you the card
* with which you tapped a phone has this [cardId] and SDK will return
- * the [SessionError.WrongCard] otherwise.
+ * the [TangemSdkError.WrongCard] otherwise.
* @initialMessage: A custom description that shows at the beginning of the NFC session.
* If null, default message will be used.
- * @callback: At first, you should check that the [SessionError] is not null,
+ * @callback: At first, you should check that the [TangemSdkError] is not null,
* then you can use the [CardSession] to interact with a card.
*/
- fun startSession(
- cardId: String? = null, initialMessage: Message? = null,
- callback: (session: CardSession, error: SessionError?) -> Unit) {
+ fun startSession(cardId: String? = null, initialMessage: Message? = null,
+ callback: (session: CardSession, error: TangemSdkError?) -> Unit) {
val cardSession = CardSession(buildEnvironment(), reader, viewDelegate, cardId, initialMessage)
Thread().run { cardSession.start(callback) }
}
@@ -367,7 +366,9 @@ class TangemSdk(
private fun buildEnvironment(): SessionEnvironment {
val terminalKeys = if (config.linkedTerminal) terminalKeysService?.getKeys() else null
return SessionEnvironment(
- terminalKeys = terminalKeys
+ terminalKeys = terminalKeys,
+ cardFilter = config.cardFilter,
+ handleErrors = config.handleErrors
)
}
diff --git a/tangem-core/src/main/java/com/tangem/SessionError.kt b/tangem-core/src/main/java/com/tangem/TangemSdkError.kt
similarity index 53%
rename from tangem-core/src/main/java/com/tangem/SessionError.kt
rename to tangem-core/src/main/java/com/tangem/TangemSdkError.kt
index 07209b6a3f..4ea2612c51 100644
--- a/tangem-core/src/main/java/com/tangem/SessionError.kt
+++ b/tangem-core/src/main/java/com/tangem/TangemSdkError.kt
@@ -9,52 +9,42 @@ import com.tangem.tasks.ScanTask
* An error class that represent typical errors that may occur when performing Tangem SDK tasks.
* Errors are propagated back to the caller in callbacks.
*/
-sealed class SessionError(val code: Int) : Exception() {
+sealed class TangemSdkError(val code: Int) : Exception(code.toString()) {
- //Errors in serializing APDU
/**
- * This error is returned when there [CommandSerializer] cannot deserialize [com.tangem.common.tlv.Tlv]
- * (this error is a wrapper around internal [com.tangem.common.tlv.TlvDecoder] errors).
+ * This error is returned when Android NFC reader loses a tag
+ * (e.g. a user detaches card from the phone's NFC module) while the NFC session is in progress.
*/
- class SerializeCommandError : SessionError(1000)
+ class TagLost : TangemSdkError(10001)
- class DeserializeApduFailed : SessionError(1001)
- class EncodingFailedTypeMismatch : SessionError(1002)
- class EncodingFailed : SessionError(1003)
- class DecodingFailedMissingTag : SessionError(1004)
- class DecodingFailedTypeMismatch : SessionError(1005)
- class DecodingFailed : SessionError(1005)
+ class SerializeCommandError : TangemSdkError(20001)
+ class DeserializeApduFailed : TangemSdkError(20002)
+ class EncodingFailedTypeMismatch : TangemSdkError(20003)
+ class EncodingFailed : TangemSdkError(20004)
+ class DecodingFailedMissingTag : TangemSdkError(20005)
+ class DecodingFailedTypeMismatch : TangemSdkError(20006)
+ class DecodingFailed : TangemSdkError(20007)
/**
* This error is returned when unknown [StatusWord] is received from a card.
*/
- class UnknownStatus : SessionError(2001)
-
+ class UnknownStatus : TangemSdkError(30001)
/**
* This error is returned when a card's reply is [StatusWord.ErrorProcessingCommand].
* The card sends this status in case of internal card error.
*/
- class ErrorProcessingCommand : SessionError(2002)
-
- /**
- * This error is returned when a task (such as [ScanTask]) requires that [ReadCommand]
- * is executed before performing other commands.
- */
- class MissingPreflightRead : SessionError(2003)
-
+ class ErrorProcessingCommand : TangemSdkError(30002)
/**
* This error is returned when a card's reply is [StatusWord.InvalidState].
* The card sends this status when command can not be executed in the current state of a card.
*/
- class InvalidState : SessionError(2004)
-
+ class InvalidState : TangemSdkError(30003)
/**
* This error is returned when a card's reply is [StatusWord.InsNotSupported].
* The card sends this status when the card cannot process the [com.tangem.common.apdu.Instruction].
*/
- class InsNotSupported : SessionError(2005)
-
+ class InsNotSupported : TangemSdkError(30004)
/**
* This error is returned when a card's reply is [StatusWord.InvalidParams].
* The card sends this status when there are wrong or not sufficient parameters in TLV request,
@@ -62,78 +52,105 @@ sealed class SessionError(val code: Int) : Exception() {
* The error may be caused, for example, by wrong parameters of the [Task], [CommandSerializer],
* mapping or serialization errors.
*/
- class InvalidParams : SessionError(2006)
-
+ class InvalidParams : TangemSdkError(30005)
/**
* This error is returned when a card's reply is [StatusWord.NeedEncryption]
* and the encryption was not established by TangemSdk.
*/
- class NeedEncryption : SessionError(2007)
+ class NeedEncryption : TangemSdkError(30006)
- //Scan errors
- /**
- * This error is returned when a [Task] checks unsuccessfully either
- * a card's ability to sign with its private key, or the validity of issuer data.
- */
- class VerificationFailed : SessionError(3000)
+ //Personalization Errors
+ class AlreadyPersonalized : TangemSdkError(40101)
- /**
- * This error is returned when a [ScanTask] returns a [Card] without some of the essential fields.
- */
- class CardError : SessionError(3001)
+ //Depersonalization Errors
+ class CannotBeDepersonalized : TangemSdkError(40201)
+ //Read Errors
+ class Pin1Required : TangemSdkError(40401)
/**
* This error is returned when a [Task] expects a user to use a particular card,
- * and a user tries to use a different card.
+ * but the user tries to use a different card.
*/
- class WrongCard : SessionError(3002)
-
+ class WrongCard : TangemSdkError(40403)
/**
- * Tangem cards can sign currently up to 10 hashes during one [com.tangem.commands.SignCommand].
- * This error is returned when a [com.tangem.commands.SignCommand] receives more than 10 hashes to sign.
+ * This error is returned when a user scans a card of a [com.tangem.common.extensions.CardType]
+ * that is not specified in [Config.cardFilter].
*/
- class TooMuchHashesInOneTransaction : SessionError(3003)
+ class WrongCardType : TangemSdkError(40404)
+ //CreateWallet Errors
+ class AlreadyCreated : TangemSdkError(40501)
+
+ //PurgeWallet Errors
+ class PurgeWalletProhibited : TangemSdkError(40601)
+
+ //SetPin Errors
+ class Pin1CannotBeChanged : TangemSdkError(40801)
+ class Pin2CannotBeChanged : TangemSdkError(40802)
+ class Pin1CannotBeDefault : TangemSdkError(40803)
+
+ //Sign Errors
+ class NoRemainingSignatures : TangemSdkError(40901)
/**
* This error is returned when a [com.tangem.commands.SignCommand]
* receives only empty hashes for signature.
*/
- class EmptyHashes : SessionError(3004)
-
+ class EmptyHashes : TangemSdkError(40902)
/**
* This error is returned when a [com.tangem.commands.SignCommand]
* receives hashes of different lengths for signature.
*/
- class HashSizeMustBeEqual : SessionError(3005)
-
+ class HashSizeMustBeEqual : TangemSdkError(40903)
+ class CardIsEmpty : TangemSdkError(40904)
+ class SignHashesNotAvailable : TangemSdkError(40905)
/**
- * This error is returned when [com.tangem.TangemSdk] was called with a new [Task],
- * while a previous [Task] is still in progress.
+ * Tangem cards can sign currently up to 10 hashes during one [com.tangem.commands.SignCommand].
+ * This error is returned when a [com.tangem.commands.SignCommand] receives more than 10 hashes to sign.
*/
- class Busy : SessionError(4000)
+ class TooManyhHashesInOneTransaction : TangemSdkError(40906)
+ //General Errors
+ class NotPersonalized() : TangemSdkError(40001)
+ class NotActivated : TangemSdkError(40002)
+ class CardIsPurged : TangemSdkError(40003)
+ class Pin2OrCvcRequired : TangemSdkError(40004)
/**
- * This error is returned when a user manually closes NFC Reading Bottom Sheet Dialog.
+ * This error is returned when a [Task] checks unsuccessfully either
+ * a card's ability to sign with its private key, or the validity of issuer data.
*/
- class UserCancelled : SessionError(4001)
-
- //NFC errors
- class NfcReaderError : SessionError(5002)
-
- /**
- * This error is returned when Android NFC reader loses a tag
- * (e.g. a user detaches card from the phone's NFC module) while the NFC session is in progress.
- */
- class TagLost : SessionError(5003)
-
- class UnknownError : SessionError(6000)
-
- //Specific Command Errors
+ class VerificationFailed : TangemSdkError(40005)
+ class DataSizeTooLarge : TangemSdkError(40006)
/**
* This error is returned when [ReadIssuerDataTask] or [ReadIssuerExtraDataTask] expects a counter
* (when the card's requires it), but the counter is missing.
*/
- class MissingCounter : SessionError(7001)
+ class MissingCounter : TangemSdkError(40007)
+ class OverwritingDataIsProhibited : TangemSdkError(40008)
+ class DataCannotBeWritten : TangemSdkError(40009)
+ class MissingIssuerPubicKey : TangemSdkError(40010)
+ /**
+ * This error is returned when a [ScanTask] returns a [Card] without some of the essential fields.
+ */
+ class CardError : TangemSdkError(40011)
+
+
+ //SDK Errors
+ class UnknownError: TangemSdkError(50001)
+ /**
+ * This error is returned when a user manually closes NFC Reading Bottom Sheet Dialog.
+ */
+ class UserCancelled: TangemSdkError(50002)
+ /**
+ * This error is returned when [com.tangem.TangemSdk] was called with a new [Task],
+ * while a previous [Task] is still in progress.
+ */
+ class Busy : TangemSdkError(50003)
+ /**
+ * This error is returned when a task (such as [ScanTask]) requires that [ReadCommand]
+ * is executed before performing other commands.
+ */
+ class MissingPreflightRead : TangemSdkError(50004)
+
+
+}
- class MissingIssuerPubicKey : SessionError(7002)
-}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/commands/CheckWalletCommand.kt b/tangem-core/src/main/java/com/tangem/commands/CheckWalletCommand.kt
index 4d9c3a53ff..e3cbdf970a 100644
--- a/tangem-core/src/main/java/com/tangem/commands/CheckWalletCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/CheckWalletCommand.kt
@@ -2,7 +2,7 @@ package com.tangem.commands
import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
@@ -49,7 +49,7 @@ class CheckWalletCommand(
private val challenge = CryptoUtils.generateRandomBytes(16)
override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
- transceive(session) { result ->
+ super.run(session) { result ->
when (result) {
is CompletionResult.Failure -> {
callback(CompletionResult.Failure(result.error))
@@ -63,13 +63,28 @@ class CheckWalletCommand(
if (verified) {
callback(CompletionResult.Success(result.data))
} else {
- callback(CompletionResult.Failure(SessionError.VerificationFailed()))
+ callback(CompletionResult.Failure(TangemSdkError.VerificationFailed()))
}
}
}
}
}
+ override fun performPreCheck(
+ session: CardSession,
+ callback: (result: CompletionResult) -> Unit
+ ): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ return false
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val tlvBuilder = TlvBuilder()
tlvBuilder.append(TlvTag.Pin, environment.pin1)
@@ -83,7 +98,7 @@ class CheckWalletCommand(
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): CheckWalletResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return CheckWalletResponse(
diff --git a/tangem-core/src/main/java/com/tangem/commands/Command.kt b/tangem-core/src/main/java/com/tangem/commands/Command.kt
index 225fa97430..fad1b0d025 100644
--- a/tangem-core/src/main/java/com/tangem/commands/Command.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/Command.kt
@@ -5,7 +5,7 @@ import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.apdu.StatusWord
-import com.tangem.common.apdu.toSessionError
+import com.tangem.common.apdu.toTangemSdkError
import com.tangem.common.extensions.toInt
import com.tangem.common.tlv.TlvTag
@@ -39,7 +39,26 @@ abstract class Command : CardSessionRunnable {
override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
Log.i("Command", "Sending ${this::class.java.simpleName}")
- transceive(session, callback)
+ if (session.environment.handleErrors) {
+ if (performPreCheck(session, callback)) return
+ }
+ transceive(session) { result ->
+ if (session.environment.handleErrors) {
+ if (performAfterCheck(session, result, callback)) return@transceive
+ }
+ callback(result)
+ }
+ }
+
+ open fun performPreCheck(session: CardSession,
+ callback: (result: CompletionResult) -> Unit): Boolean {
+ return false
+ }
+
+ open fun performAfterCheck(session: CardSession,
+ result: CompletionResult,
+ callback: (result: CompletionResult) -> Unit): Boolean {
+ return false
}
fun transceive(session: CardSession, callback: (result: CompletionResult) -> Unit) {
@@ -54,7 +73,7 @@ abstract class Command : CardSessionRunnable {
}
}
}
- } catch (error: SessionError) {
+ } catch (error: TangemSdkError) {
callback(CompletionResult.Failure(error))
}
}
@@ -81,17 +100,17 @@ abstract class Command : CardSessionRunnable {
transceiveApdu(apdu, session, callback)
}
else -> {
- val error = responseApdu.statusWord.toSessionError()
+ val error = responseApdu.statusWord.toTangemSdkError()
if (error != null && !tryHandleError(error)) {
callback(CompletionResult.Failure(error))
} else {
- callback(CompletionResult.Failure(SessionError.UnknownError()))
+ callback(CompletionResult.Failure(TangemSdkError.UnknownError()))
}
}
}
}
is CompletionResult.Failure ->
- if (result.error is SessionError.TagLost) {
+ if (result.error is TangemSdkError.TagLost) {
session.viewDelegate.onTagLost()
} else {
callback(CompletionResult.Failure(result.error))
@@ -110,7 +129,7 @@ abstract class Command : CardSessionRunnable {
return tlv?.find { it.tag == TlvTag.Pause }?.value?.toInt()
}
- private fun tryHandleError(error: SessionError): Boolean {
+ private fun tryHandleError(error: TangemSdkError): Boolean {
return false
}
diff --git a/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt b/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt
index 089a134702..e0bf433c99 100644
--- a/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt
@@ -1,7 +1,9 @@
package com.tangem.commands
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -37,6 +39,41 @@ class CreateWalletResponse(
*/
class CreateWalletCommand : Command() {
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ if (session.environment.card?.status == CardStatus.Purged) {
+ callback(CompletionResult.Failure(TangemSdkError.CardIsPurged()))
+ return true
+ }
+ if (session.environment.card?.status == CardStatus.Loaded) {
+ callback(CompletionResult.Failure(TangemSdkError.AlreadyCreated()))
+ return true
+ }
+ return false
+ }
+
+ override fun performAfterCheck(session: CardSession,
+ result: CompletionResult,
+ callback: (result: CompletionResult) -> Unit): Boolean {
+ when (result) {
+ is CompletionResult.Failure -> {
+ if (result.error is TangemSdkError.InvalidParams) {
+ callback(CompletionResult.Failure(TangemSdkError.Pin2OrCvcRequired()))
+ return true
+ }
+ return false
+ }
+ else -> return false
+ }
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val tlvBuilder = TlvBuilder()
tlvBuilder.append(TlvTag.Pin, environment.pin1)
@@ -51,7 +88,7 @@ class CreateWalletCommand : Command() {
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): CreateWalletResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return CreateWalletResponse(
diff --git a/tangem-core/src/main/java/com/tangem/commands/OpenSessionCommand.kt b/tangem-core/src/main/java/com/tangem/commands/OpenSessionCommand.kt
index 7484f9d48b..891e28f3c1 100644
--- a/tangem-core/src/main/java/com/tangem/commands/OpenSessionCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/OpenSessionCommand.kt
@@ -1,7 +1,7 @@
package com.tangem.commands
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -32,7 +32,7 @@ class OpenSessionCommand(private val sessionKeyA: ByteArray) : Command() {
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ if (session.environment.card?.settingsMask?.contains(Settings.ProhibitPurgeWallet) == true) {
+ callback(CompletionResult.Failure(TangemSdkError.PurgeWalletProhibited()))
+ return true
+ }
+ return false
+ }
+
+ override fun performAfterCheck(session: CardSession,
+ result: CompletionResult,
+ callback: (result: CompletionResult) -> Unit): Boolean {
+ when (result) {
+ is CompletionResult.Failure -> {
+ if (result.error is TangemSdkError.InvalidParams) {
+ callback(CompletionResult.Failure(TangemSdkError.Pin2OrCvcRequired()))
+ return true
+ }
+ return false
+ }
+ else -> return false
+ }
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val tlvBuilder = TlvBuilder()
tlvBuilder.append(TlvTag.Pin, environment.pin1)
@@ -42,7 +75,7 @@ class PurgeWalletCommand : Command() {
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): PurgeWalletResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return PurgeWalletResponse(
diff --git a/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt b/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt
index e3b5d4ccee..c8bbda44ff 100644
--- a/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt
@@ -1,7 +1,9 @@
package com.tangem.commands
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -132,7 +134,7 @@ data class SettingsMask(val rawValue: Int) {
enum class Settings(val code: Int) {
IsReusable(0x0001),
UseActivation(0x0002),
- ForbidPurgeWallet(0x0004),
+ ProhibitPurgeWallet(0x0004),
UseBlock(0x0008),
AllowSwapPIN(0x0010),
@@ -366,6 +368,19 @@ class Card(
*/
class ReadCommand : Command() {
+ override fun performAfterCheck(session: CardSession, result: CompletionResult, callback: (result: CompletionResult) -> Unit): Boolean {
+ when (result) {
+ is CompletionResult.Failure -> {
+ if (result.error is TangemSdkError.InvalidParams) {
+ callback(CompletionResult.Failure(TangemSdkError.Pin1Required()))
+ return true
+ }
+ return false
+ }
+ else -> return false
+ }
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val tlvBuilder = TlvBuilder()
/**
@@ -384,7 +399,7 @@ class ReadCommand : Command() {
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): Card {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
diff --git a/tangem-core/src/main/java/com/tangem/commands/ReadIssuerDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/ReadIssuerDataCommand.kt
index 7055bc403f..d01a3adbe8 100644
--- a/tangem-core/src/main/java/com/tangem/commands/ReadIssuerDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/ReadIssuerDataCommand.kt
@@ -2,7 +2,7 @@ package com.tangem.commands
import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.common.DefaultIssuerDataVerifier
import com.tangem.commands.common.IssuerDataMode
import com.tangem.commands.common.IssuerDataToVerify
@@ -61,12 +61,12 @@ class ReadIssuerDataCommand(
override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
val card = session.environment.card
if (card == null) {
- callback(CompletionResult.Failure(SessionError.MissingPreflightRead()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead()))
return
}
val publicKey = issuerPublicKey ?: card.issuerPublicKey
if (publicKey == null) {
- callback(CompletionResult.Failure(SessionError.MissingIssuerPubicKey()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingIssuerPubicKey()))
return
}
super.run(session) { result ->
@@ -83,13 +83,21 @@ class ReadIssuerDataCommand(
if (verify(publicKey, result.data.issuerDataSignature, issuerDataToVerify)) {
callback(result)
} else {
- callback(CompletionResult.Failure(SessionError.VerificationFailed()))
+ callback(CompletionResult.Failure(TangemSdkError.VerificationFailed()))
}
}
}
}
}
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ return false
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val tlvBuilder = TlvBuilder()
tlvBuilder.append(TlvTag.Pin, environment.pin1)
@@ -103,7 +111,7 @@ class ReadIssuerDataCommand(
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): ReadIssuerDataResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return ReadIssuerDataResponse(
diff --git a/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt
index 4140000621..82e148a05d 100644
--- a/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/ReadIssuerExtraDataCommand.kt
@@ -2,7 +2,7 @@ package com.tangem.commands
import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.common.DefaultIssuerDataVerifier
import com.tangem.commands.common.IssuerDataMode
import com.tangem.commands.common.IssuerDataToVerify
@@ -44,7 +44,7 @@ class ReadIssuerExtraDataResponse(
val issuerDataSignature: ByteArray?,
/**
- * An optional counter that protect issuer data against replay attack.
+ * An optional counter that protects issuer data against replay attack.
* When flag [Settings.ProtectIssuerDataAgainstReplay] set in [SettingsMask]
* then this value is mandatory and must increase on each execution of [WriteIssuerDataCommand].
*/
@@ -71,12 +71,16 @@ class ReadIssuerExtraDataCommand(
override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
val card = session.environment.card
if (card == null) {
- callback(CompletionResult.Failure(SessionError.MissingPreflightRead()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead()))
return
}
val publicKey = issuerPublicKey ?: card.issuerPublicKey
if (publicKey == null) {
- callback(CompletionResult.Failure(SessionError.MissingIssuerPubicKey()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingIssuerPubicKey()))
+ return
+ }
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
return
}
@@ -138,7 +142,7 @@ class ReadIssuerExtraDataCommand(
)
callback(CompletionResult.Success(finalResult))
} else {
- callback(CompletionResult.Failure(SessionError.VerificationFailed()))
+ callback(CompletionResult.Failure(TangemSdkError.VerificationFailed()))
}
}
@@ -156,7 +160,7 @@ class ReadIssuerExtraDataCommand(
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): ReadIssuerExtraDataResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
diff --git a/tangem-core/src/main/java/com/tangem/commands/ReadUserDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/ReadUserDataCommand.kt
index 528ba98fb0..b8ee2022d6 100644
--- a/tangem-core/src/main/java/com/tangem/commands/ReadUserDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/ReadUserDataCommand.kt
@@ -1,7 +1,9 @@
package com.tangem.commands
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -10,32 +12,32 @@ import com.tangem.common.tlv.TlvDecoder
import com.tangem.common.tlv.TlvTag
class ReadUserDataResponse(
- /**
- * CID, Unique Tangem card ID number.
- */
- val cardId: String,
+ /**
+ * CID, Unique Tangem card ID number.
+ */
+ val cardId: String,
- /**
- * Data defined by user's App.
- */
- val userData: ByteArray,
+ /**
+ * Data defined by user's App.
+ */
+ val userData: ByteArray,
- /**
- * Data defined by user's App (confirmed by PIN2).
- */
- val userProtectedData: ByteArray,
+ /**
+ * Data defined by user's App (confirmed by PIN2).
+ */
+ val userProtectedData: ByteArray,
- /**
- * Counter initialized by user's App and increased on every signing of new transaction
- */
- val userCounter: Int,
+ /**
+ * Counter initialized by user's App and increased on every signing of new transaction
+ */
+ val userCounter: Int,
- /**
- * Counter initialized by user's App (confirmed by PIN2) and increased on every signing of new transaction
- */
- val userProtectedCounter: Int
+ /**
+ * Counter initialized by user's App (confirmed by PIN2) and increased on every signing of new transaction
+ */
+ val userProtectedCounter: Int
-): CommandResponse
+) : CommandResponse
/**
* This command returns two up to 512-byte User_Data, User_Protected_Data and two counters User_Counter and
@@ -47,30 +49,42 @@ class ReadUserDataResponse(
* of new transaction (on SIGN command that calculate new signatures). The App defines purpose of use.
* For example, this fields may contain blockchain nonce value.
*/
-class ReadUserDataCommand: Command() {
+class ReadUserDataCommand : Command() {
- override fun serialize(environment: SessionEnvironment): CommandApdu {
- val builder = TlvBuilder()
- builder.append(TlvTag.CardId, environment.card?.cardId)
- builder.append(TlvTag.Pin, environment.pin1)
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ return false
+ }
- return CommandApdu(
- Instruction.ReadUserData, builder.serialize(),
- environment.encryptionMode, environment.encryptionKey
- )
- }
+ override fun serialize(environment: SessionEnvironment): CommandApdu {
+ val builder = TlvBuilder()
+ builder.append(TlvTag.CardId, environment.card?.cardId)
+ builder.append(TlvTag.Pin, environment.pin1)
- override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): ReadUserDataResponse {
- val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ return CommandApdu(
+ Instruction.ReadUserData, builder.serialize(),
+ environment.encryptionMode, environment.encryptionKey
+ )
+ }
- val decoder = TlvDecoder(tlvData)
- return ReadUserDataResponse(
- cardId = decoder.decode(TlvTag.CardId),
- userData = decoder.decode(TlvTag.UserData),
- userProtectedData = decoder.decode(TlvTag.UserProtectedData),
- userCounter = decoder.decode(TlvTag.UserCounter),
- userProtectedCounter = decoder.decode(TlvTag.UserProtectedCounter)
- )
- }
+ override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): ReadUserDataResponse {
+ val tlvData = apdu.getTlvData(environment.encryptionKey)
+ ?: throw TangemSdkError.DeserializeApduFailed()
+
+ val decoder = TlvDecoder(tlvData)
+ return ReadUserDataResponse(
+ cardId = decoder.decode(TlvTag.CardId),
+ userData = decoder.decode(TlvTag.UserData),
+ userProtectedData = decoder.decode(TlvTag.UserProtectedData),
+ userCounter = decoder.decode(TlvTag.UserCounter),
+ userProtectedCounter = decoder.decode(TlvTag.UserProtectedCounter)
+ )
+ }
}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt b/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt
index 7707f82197..607ad41cd7 100644
--- a/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt
@@ -1,7 +1,9 @@
package com.tangem.commands
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -35,6 +37,57 @@ class SignCommand(private val hashes: Array)
private val hashSizes = if (hashes.isNotEmpty()) hashes.first().size else 0
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ if (session.environment.card?.status == CardStatus.Purged) {
+ callback(CompletionResult.Failure(TangemSdkError.CardIsPurged()))
+ return true
+ }
+ if (session.environment.card?.status == CardStatus.Empty) {
+ callback(CompletionResult.Failure(TangemSdkError.CardIsEmpty()))
+ return true
+ }
+ if (session.environment.card?.walletRemainingSignatures == 0) {
+ callback(CompletionResult.Failure(TangemSdkError.NoRemainingSignatures()))
+ return true
+ }
+ if (session.environment.card?.signingMethods?.contains(SigningMethod.SignHash) != true) {
+ callback(CompletionResult.Failure(TangemSdkError.SignHashesNotAvailable()))
+ return true
+ }
+ if (hashSizes == 0) {
+ callback(CompletionResult.Failure(TangemSdkError.EmptyHashes()))
+ return true
+ }
+ if (hashes.any { it.size != hashSizes }) {
+ callback(CompletionResult.Failure(TangemSdkError.HashSizeMustBeEqual()))
+ return true
+ }
+ return false
+ }
+
+ override fun performAfterCheck(session: CardSession,
+ result: CompletionResult,
+ callback: (result: CompletionResult) -> Unit): Boolean {
+ when (result) {
+ is CompletionResult.Failure -> {
+ if (result.error is TangemSdkError.InvalidParams) {
+ callback(CompletionResult.Failure(TangemSdkError.Pin2OrCvcRequired()))
+ return true
+ }
+ return false
+ }
+ else -> return false
+ }
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val dataToSign = flattenHashes()
val tlvBuilder = TlvBuilder()
@@ -58,9 +111,9 @@ class SignCommand(private val hashes: Array)
}
private fun checkForErrors() {
- if (hashes.isEmpty()) throw SessionError.EmptyHashes()
- if (hashes.size > 10) throw SessionError.TooMuchHashesInOneTransaction()
- if (hashes.any { it.size != hashSizes }) throw SessionError.HashSizeMustBeEqual()
+ if (hashes.isEmpty()) throw TangemSdkError.EmptyHashes()
+ if (hashes.size > 10) throw TangemSdkError.TooManyhHashesInOneTransaction()
+ if (hashes.any { it.size != hashSizes }) throw TangemSdkError.HashSizeMustBeEqual()
}
/**
@@ -81,7 +134,7 @@ class SignCommand(private val hashes: Array)
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): SignResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return SignResponse(
diff --git a/tangem-core/src/main/java/com/tangem/commands/WriteIssuerDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/WriteIssuerDataCommand.kt
index a425f5a740..2574a2f4a6 100644
--- a/tangem-core/src/main/java/com/tangem/commands/WriteIssuerDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/WriteIssuerDataCommand.kt
@@ -2,7 +2,7 @@ package com.tangem.commands
import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.common.DefaultIssuerDataVerifier
import com.tangem.commands.common.IssuerDataMode
import com.tangem.commands.common.IssuerDataToVerify
@@ -40,33 +40,62 @@ class WriteIssuerDataCommand(
verifier: IssuerDataVerifier = DefaultIssuerDataVerifier()
) : Command(), IssuerDataVerifier by verifier {
- override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
-
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
val card = session.environment.card
if (card == null) {
- callback(CompletionResult.Failure(SessionError.MissingPreflightRead()))
- return
+ callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead()))
+ return true
}
val publicKey = issuerPublicKey ?: card.issuerPublicKey
if (publicKey == null) {
- callback(CompletionResult.Failure(SessionError.MissingIssuerPubicKey()))
- return
+ callback(CompletionResult.Failure(TangemSdkError.MissingIssuerPubicKey()))
+ return true
+ }
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ if (issuerData.size > MAX_SIZE) {
+ callback(CompletionResult.Failure(TangemSdkError.DataSizeTooLarge()))
+ return true
}
-
if (!isCounterValid(issuerDataCounter, card)) {
- callback(CompletionResult.Failure(SessionError.MissingCounter()))
- } else if (!verifySignature(publicKey, card.cardId)) {
- callback(CompletionResult.Failure(SessionError.VerificationFailed()))
- } else {
- super.run(session, callback)
+ callback(CompletionResult.Failure(TangemSdkError.MissingCounter()))
+ return true
+ }
+ if (!verifySignature(publicKey, card.cardId)) {
+ callback(CompletionResult.Failure(TangemSdkError.VerificationFailed()))
+ return true
+ }
+ return false
+ }
+
+ override fun performAfterCheck(session: CardSession,
+ result: CompletionResult,
+ callback: (result: CompletionResult) -> Unit
+ ): Boolean {
+ when (result) {
+ is CompletionResult.Failure -> {
+ if (result.error is TangemSdkError.InvalidParams &&
+ isCounterRequired(session.environment.card)) {
+ callback(CompletionResult.Failure(TangemSdkError.DataCannotBeWritten()))
+ return true
+ }
+ return false
+ }
+ else -> return false
}
}
private fun isCounterValid(issuerDataCounter: Int?, card: Card): Boolean =
if (isCounterRequired(card)) issuerDataCounter != null else true
- private fun isCounterRequired(card: Card): Boolean =
- card.settingsMask?.contains(Settings.ProtectIssuerDataAgainstReplay) != false
+ private fun isCounterRequired(card: Card?): Boolean =
+ card?.settingsMask?.contains(Settings.ProtectIssuerDataAgainstReplay) != false
private fun verifySignature(publicKey: ByteArray, cardId: String): Boolean {
return verify(
@@ -93,11 +122,15 @@ class WriteIssuerDataCommand(
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): WriteIssuerDataResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return WriteIssuerDataResponse(
cardId = decoder.decode(TlvTag.CardId)
)
}
+
+ companion object {
+ const val MAX_SIZE = 512
+ }
}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/commands/WriteIssuerExtraDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/WriteIssuerExtraDataCommand.kt
index 4a93ebd734..8cb0dfc949 100644
--- a/tangem-core/src/main/java/com/tangem/commands/WriteIssuerExtraDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/WriteIssuerExtraDataCommand.kt
@@ -2,7 +2,7 @@ package com.tangem.commands
import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.common.DefaultIssuerDataVerifier
import com.tangem.commands.common.IssuerDataMode
import com.tangem.commands.common.IssuerDataToVerify
@@ -46,24 +46,68 @@ class WriteIssuerExtraDataCommand(
override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
val card = session.environment.card
if (card == null) {
- callback(CompletionResult.Failure(SessionError.MissingPreflightRead()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead()))
return
}
val publicKey = issuerPublicKey ?: card.issuerPublicKey
if (publicKey == null) {
- callback(CompletionResult.Failure(SessionError.MissingIssuerPubicKey()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingIssuerPubicKey()))
return
}
- if (!isCounterValid(issuerDataCounter, card)) {
- callback(CompletionResult.Failure(SessionError.MissingCounter()))
- } else if (!verifySignatures(card.cardId, publicKey)) {
- callback(CompletionResult.Failure(SessionError.VerificationFailed()))
- } else {
- writeIssuerData(session, card.cardId, publicKey, callback)
+ writeIssuerData(session, card.cardId, publicKey) { response ->
+ when (response) {
+ is CompletionResult.Success -> callback(response)
+ is CompletionResult.Failure -> {
+ if (response.error is TangemSdkError.InvalidParams && isCounterRequired(card)) {
+ callback(CompletionResult.Failure(TangemSdkError.DataCannotBeWritten()))
+ return@writeIssuerData
+ }
+ if (response.error is TangemSdkError.InvalidState &&
+ card.settingsMask?.contains(Settings.ProtectIssuerDataAgainstReplay) != false) {
+ callback(CompletionResult.Failure(TangemSdkError.OverwritingDataIsProhibited()))
+ return@writeIssuerData
+ }
+ }
+ }
}
}
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ val card = session.environment.card
+ if (card == null) {
+ callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead()))
+ return true
+ }
+ val publicKey = issuerPublicKey ?: card.issuerPublicKey
+ if (publicKey == null) {
+ callback(CompletionResult.Failure(TangemSdkError.MissingIssuerPubicKey()))
+ return true
+ }
+
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ if (issuerData.size > MAX_SIZE) {
+ callback(CompletionResult.Failure(TangemSdkError.DataSizeTooLarge()))
+ return true
+ }
+ if (!isCounterValid(issuerDataCounter, card)) {
+ callback(CompletionResult.Failure(TangemSdkError.MissingCounter()))
+ return true
+ }
+ if (!verifySignatures(card.cardId, publicKey)) {
+ callback(CompletionResult.Failure(TangemSdkError.VerificationFailed()))
+ return true
+ }
+ return false
+ }
+
private fun isCounterValid(issuerDataCounter: Int?, card: Card): Boolean =
if (isCounterRequired(card)) issuerDataCounter != null else true
@@ -156,7 +200,7 @@ class WriteIssuerExtraDataCommand(
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): WriteIssuerDataResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
return WriteIssuerDataResponse(cardId = TlvDecoder(tlvData).decode(TlvTag.CardId)
)
@@ -164,5 +208,6 @@ class WriteIssuerExtraDataCommand(
companion object {
const val SINGLE_WRITE_SIZE = 1524
+ const val MAX_SIZE = 32 * 1024
}
}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt
index e9771d0b87..fc0d0467ae 100644
--- a/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt
@@ -1,7 +1,9 @@
package com.tangem.commands
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -17,7 +19,7 @@ class WriteUserDataResponse(
) : CommandResponse
/**
- * This command write some of User_Data, User_ProtectedData, User_Counter and User_ProtectedCounter fields.
+ * This command writes to the card any of User_Data, User_ProtectedData, User_Counter and User_ProtectedCounter fields.
* User_Data and User_ProtectedData are never changed or parsed by the executable code the Tangem COS.
* The App defines purpose of use, format and it's payload. For example, this field may contain cashed information
* from blockchain to accelerate preparing new transaction.
@@ -32,6 +34,38 @@ class WriteUserDataCommand(private val userData: ByteArray? = null, private val
private val userCounter: Int? = null,
private val userProtectedCounter: Int? = null) : Command() {
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.isActivated == true) {
+ callback(CompletionResult.Failure(TangemSdkError.NotActivated()))
+ return true
+ }
+ if (userData?.size ?: 0 > MAX_SIZE || userProtectedData?.size ?: 0 > MAX_SIZE) {
+ callback(CompletionResult.Failure(TangemSdkError.DataSizeTooLarge()))
+ return true
+ }
+ return false
+ }
+
+ override fun performAfterCheck(session: CardSession,
+ result: CompletionResult,
+ callback: (result: CompletionResult) -> Unit
+ ): Boolean {
+ when (result) {
+ is CompletionResult.Failure -> {
+ if (result.error is TangemSdkError.InvalidParams) {
+ callback(CompletionResult.Failure(TangemSdkError.Pin2OrCvcRequired()))
+ return true
+ }
+ return false
+ }
+ else -> return false
+ }
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
val builder = TlvBuilder()
builder.append(TlvTag.CardId, environment.card?.cardId)
@@ -51,7 +85,11 @@ class WriteUserDataCommand(private val userData: ByteArray? = null, private val
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): WriteUserDataResponse {
val tlvData = apdu.getTlvData(environment.encryptionKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
return WriteUserDataResponse(TlvDecoder(tlvData).decode(TlvTag.CardId))
}
+
+ companion object{
+ const val MAX_SIZE = 512
+ }
}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt
index 2ed9366331..c3bb2d4de8 100644
--- a/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/personalization/DepersonalizeCommand.kt
@@ -1,8 +1,12 @@
package com.tangem.commands.personalization
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
+import com.tangem.TangemSdkError
+import com.tangem.commands.CardStatus
import com.tangem.commands.Command
import com.tangem.commands.CommandResponse
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -17,6 +21,18 @@ data class DepersonalizeResponse(val success: Boolean) : CommandResponse
*/
class DepersonalizeCommand : Command() {
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status == CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.NotPersonalized()))
+ return true
+ }
+ if (session.environment.card?.firmwareVersion?.contains("SDK") == false) {
+ callback(CompletionResult.Failure(TangemSdkError.CannotBeDepersonalized()))
+ return true
+ }
+ return false
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
return CommandApdu(
Instruction.Depersonalize, byteArrayOf()
diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/PersonalizeCommand.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/PersonalizeCommand.kt
index e4fe1a8b15..52d85278fa 100644
--- a/tangem-core/src/main/java/com/tangem/commands/personalization/PersonalizeCommand.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/personalization/PersonalizeCommand.kt
@@ -1,11 +1,14 @@
package com.tangem.commands.personalization
+import com.tangem.CardSession
import com.tangem.SessionEnvironment
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.Card
import com.tangem.commands.CardData
+import com.tangem.commands.CardStatus
import com.tangem.commands.Command
import com.tangem.commands.personalization.entities.*
+import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
@@ -36,6 +39,14 @@ class PersonalizeCommand(
private val acquirer: Acquirer? = null
) : Command() {
+ override fun performPreCheck(session: CardSession, callback: (result: CompletionResult) -> Unit): Boolean {
+ if (session.environment.card?.status != CardStatus.NotPersonalized) {
+ callback(CompletionResult.Failure(TangemSdkError.AlreadyPersonalized()))
+ return true
+ }
+ return false
+ }
+
override fun serialize(environment: SessionEnvironment): CommandApdu {
return CommandApdu(
Instruction.Personalize,
@@ -46,7 +57,7 @@ class PersonalizeCommand(
override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): Card {
val tlvData = apdu.getTlvData(devPersonalizationKey)
- ?: throw SessionError.DeserializeApduFailed()
+ ?: throw TangemSdkError.DeserializeApduFailed()
val decoder = TlvDecoder(tlvData)
return Card(
@@ -99,7 +110,7 @@ class PersonalizeCommand(
}
private fun serializePersonalizationData(config: CardConfig): ByteArray {
- val cardId = config.createCardId() ?: throw SessionError.SerializeCommandError()
+ val cardId = config.createCardId() ?: throw TangemSdkError.SerializeCommandError()
val tlvBuilder = TlvBuilder()
tlvBuilder.append(TlvTag.CardId, cardId)
diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
index 2cfd173be1..4417374a87 100644
--- a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfig.kt
@@ -12,6 +12,7 @@ data class NdefRecord(
URI, AAR, TEXT
}
+ @delegate:Transient
val valueInBytes: ByteArray by lazy { value.toByteArray() }
}
diff --git a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfigExtensions.kt b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfigExtensions.kt
index 4d7895f3c4..78e5709596 100644
--- a/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfigExtensions.kt
+++ b/tangem-core/src/main/java/com/tangem/commands/personalization/entities/CardConfigExtensions.kt
@@ -29,7 +29,7 @@ internal fun CardConfig.createSettingsMask(): SettingsMask {
if (protectIssuerDataAgainstReplay) builder.add(Settings.ProtectIssuerDataAgainstReplay)
- if (forbidPurgeWallet) builder.add(Settings.ForbidPurgeWallet)
+ if (forbidPurgeWallet) builder.add(Settings.ProhibitPurgeWallet)
if (allowSelectBlockchain) builder.add(Settings.AllowSelectBlockchain)
if (skipCheckPIN2andCVCIfValidatedByIssuer) builder.add(Settings.SkipCheckPin2andCvcIfValidatedByIssuer)
diff --git a/tangem-core/src/main/java/com/tangem/common/CompletionResult.kt b/tangem-core/src/main/java/com/tangem/common/CompletionResult.kt
index 71f460c7d7..52bf7a9351 100644
--- a/tangem-core/src/main/java/com/tangem/common/CompletionResult.kt
+++ b/tangem-core/src/main/java/com/tangem/common/CompletionResult.kt
@@ -1,6 +1,6 @@
package com.tangem.common
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.common.CompletionResult.Success
/**
@@ -9,5 +9,5 @@ import com.tangem.common.CompletionResult.Success
*/
sealed class CompletionResult {
class Success(val data: T) : CompletionResult()
- class Failure(val error: SessionError) : CompletionResult()
+ class Failure(val error: TangemSdkError) : CompletionResult()
}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/common/apdu/StatusWord.kt b/tangem-core/src/main/java/com/tangem/common/apdu/StatusWord.kt
index 3938cee65f..96daaa2826 100644
--- a/tangem-core/src/main/java/com/tangem/common/apdu/StatusWord.kt
+++ b/tangem-core/src/main/java/com/tangem/common/apdu/StatusWord.kt
@@ -1,6 +1,6 @@
package com.tangem.common.apdu
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
/**
* Part of a response from the card, shows the status of the operation
@@ -25,16 +25,16 @@ enum class StatusWord(val code: Int, val description: String) {
}
}
-fun StatusWord.toSessionError(): SessionError? {
+fun StatusWord.toTangemSdkError(): TangemSdkError? {
return when (this) {
StatusWord.ProcessCompleted, StatusWord.Pin1Changed,
StatusWord.Pin2Changed, StatusWord.PinsChanged -> null
StatusWord.NeedPause -> null
- StatusWord.InvalidParams -> SessionError.InvalidParams()
- StatusWord.ErrorProcessingCommand -> SessionError.ErrorProcessingCommand()
- StatusWord.InvalidState -> SessionError.InvalidState()
- StatusWord.InsNotSupported -> SessionError.InsNotSupported()
- StatusWord.NeedEncryption -> SessionError.NeedEncryption()
- StatusWord.Unknown -> SessionError.UnknownStatus()
+ StatusWord.InvalidParams -> TangemSdkError.InvalidParams()
+ StatusWord.ErrorProcessingCommand -> TangemSdkError.ErrorProcessingCommand()
+ StatusWord.InvalidState -> TangemSdkError.InvalidState()
+ StatusWord.InsNotSupported -> TangemSdkError.InsNotSupported()
+ StatusWord.NeedEncryption -> TangemSdkError.NeedEncryption()
+ StatusWord.Unknown -> TangemSdkError.UnknownStatus()
}
}
diff --git a/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt b/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt
new file mode 100644
index 0000000000..6d23ffee09
--- /dev/null
+++ b/tangem-core/src/main/java/com/tangem/common/extensions/BigDecimal.kt
@@ -0,0 +1,7 @@
+package com.tangem.common.extensions
+
+import java.math.BigDecimal
+
+fun BigDecimal.isZero() : Boolean {
+ return this.compareTo(BigDecimal.ZERO) == 0
+}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt b/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt
new file mode 100644
index 0000000000..97243f3655
--- /dev/null
+++ b/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt
@@ -0,0 +1,22 @@
+package com.tangem.common.extensions
+
+import com.tangem.commands.Card
+
+fun Card.getType(): CardType {
+ val firmware = this.firmwareVersion ?: return CardType.Unknown
+ return when {
+ firmware.endsWith("d SDK") -> {
+ CardType.Sdk
+ }
+ firmware.endsWith("r") -> {
+ CardType.Release
+ }
+ else -> {
+ CardType.Unknown
+ }
+ }
+}
+
+enum class CardType {
+ Sdk, Release, Unknown
+}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt
index 3e3c8557f2..3cade3e92a 100644
--- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt
+++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvBuilder.kt
@@ -14,7 +14,7 @@ class TlvBuilder {
fun serialize(): ByteArray {
Log.v("TLV",
- "List of TLV that are being sent to a card:\n${tlvs.joinToString("\n")}")
+ "List of encoded TLVs:\n${tlvs.joinToString("\n")}")
return tlvs.serialize()
}
diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt
index 4954c38c46..62c0899f2d 100644
--- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt
+++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvDecoder.kt
@@ -1,7 +1,7 @@
package com.tangem.common.tlv
import com.tangem.Log
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.*
import com.tangem.commands.common.IssuerDataMode
import com.tangem.common.extensions.toDate
@@ -20,7 +20,7 @@ class TlvDecoder(val tlvList: List) {
init {
Log.v("TLV",
- "List of TLV received from card:\n${tlvList.joinToString("\n")}")
+ "List of decoded TLVs:\n${tlvList.joinToString("\n")}")
}
/**
@@ -34,7 +34,7 @@ class TlvDecoder(val tlvList: List) {
inline fun decodeOptional(tag: TlvTag): T? =
try {
decode(tag)
- } catch (exception: SessionError.DecodingFailedMissingTag) {
+ } catch (exception: TangemSdkError.DecodingFailedMissingTag) {
null
}
@@ -55,7 +55,7 @@ class TlvDecoder(val tlvList: List) {
return false as T
} else {
Log.e(this::class.simpleName!!, "Tag $tag not found")
- throw SessionError.DecodingFailedMissingTag()
+ throw TangemSdkError.DecodingFailedMissingTag()
}
return when (tag.valueType()) {
@@ -73,7 +73,7 @@ class TlvDecoder(val tlvList: List) {
tlvValue.toInt() as T
} catch (exception: IllegalArgumentException) {
Log.e(this::class.simpleName!!, exception.message ?: "")
- throw SessionError.DecodingFailed()
+ throw TangemSdkError.DecodingFailed()
}
}
TlvValueType.BoolValue -> {
@@ -90,7 +90,7 @@ class TlvDecoder(val tlvList: List) {
EllipticCurve.byName(tlvValue.toUtf8()) as T
} catch (exception: Exception) {
logException(tag, tlvValue.toUtf8(), exception)
- throw SessionError.DecodingFailed()
+ throw TangemSdkError.DecodingFailed()
}
@@ -101,7 +101,7 @@ class TlvDecoder(val tlvList: List) {
tlvValue.toDate() as T
} catch (exception: Exception) {
logException(tag, tlvValue.toHexString(), exception)
- throw SessionError.DecodingFailed()
+ throw TangemSdkError.DecodingFailed()
}
}
TlvValueType.ProductMask -> {
@@ -118,7 +118,7 @@ class TlvDecoder(val tlvList: List) {
CardStatus.byCode(tlvValue.toInt()) as T
} catch (exception: Exception) {
logException(tag, tlvValue.toInt().toString(), exception)
- throw SessionError.DecodingFailed()
+ throw TangemSdkError.DecodingFailed()
}
}
TlvValueType.SigningMethod -> {
@@ -127,7 +127,7 @@ class TlvDecoder(val tlvList: List) {
SigningMethodMask(tlvValue.toInt()) as T
} catch (exception: Exception) {
logException(tag, tlvValue.toInt().toString(), exception)
- throw SessionError.DecodingFailed()
+ throw TangemSdkError.DecodingFailed()
}
}
TlvValueType.IssuerDataMode -> {
@@ -136,7 +136,7 @@ class TlvDecoder(val tlvList: List) {
IssuerDataMode.byCode(tlvValue.toInt().toByte()) as T
} catch (exception: Exception) {
logException(tag, tlvValue.toInt().toString(), exception)
- throw SessionError.DecodingFailed()
+ throw TangemSdkError.DecodingFailed()
}
}
}
@@ -151,7 +151,7 @@ class TlvDecoder(val tlvList: List) {
if (T::class != ExpectedT::class) {
Log.e(this::class.simpleName!!,
"Mapping error. Type for tag: $tag must be ${tag.valueType()}. It is ${T::class}")
- throw SessionError.DecodingFailedTypeMismatch()
+ throw TangemSdkError.DecodingFailedTypeMismatch()
}
}
diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt
index 057b0807e8..99589b7d40 100644
--- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt
+++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt
@@ -1,7 +1,7 @@
package com.tangem.common.tlv
import com.tangem.Log
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.*
import com.tangem.commands.common.IssuerDataMode
import com.tangem.common.extensions.calculateSha256
@@ -24,7 +24,7 @@ class TlvEncoder {
return Tlv(tag, encodeValue(tag, value))
} else {
Log.e(this::class.simpleName!!, "Encoding error. Value for tag $tag is null")
- throw SessionError.EncodingFailed()
+ throw TangemSdkError.EncodingFailed()
}
}
@@ -106,7 +106,7 @@ class TlvEncoder {
if (T::class != ExpectedT::class) {
Log.e(this::class.simpleName!!,
"Mapping error. Type for tag: $tag must be ${tag.valueType()}. It is ${T::class}")
- throw SessionError.EncodingFailedTypeMismatch()
+ throw TangemSdkError.EncodingFailedTypeMismatch()
}
}
}
\ No newline at end of file
diff --git a/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt b/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt
index 6b21be102c..c9b87b4da2 100644
--- a/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt
+++ b/tangem-core/src/main/java/com/tangem/tasks/CreateWalletTask.kt
@@ -2,7 +2,7 @@ package com.tangem.tasks
import com.tangem.CardSession
import com.tangem.CardSessionRunnable
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.CardStatus
import com.tangem.commands.CheckWalletCommand
import com.tangem.commands.CreateWalletCommand
@@ -14,7 +14,7 @@ class CreateWalletTask : CardSessionRunnable {
override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) {
val curve = session.environment.card?.curve
if (curve == null) {
- callback(CompletionResult.Failure(SessionError.CardError()))
+ callback(CompletionResult.Failure(TangemSdkError.CardError()))
return
}
@@ -24,7 +24,7 @@ class CreateWalletTask : CardSessionRunnable {
is CompletionResult.Failure -> callback(createWalletResult)
is CompletionResult.Success -> {
if (createWalletResult.data.status != CardStatus.Loaded) {
- callback(CompletionResult.Failure(SessionError.UnknownError()))
+ callback(CompletionResult.Failure(TangemSdkError.UnknownError()))
} else {
val checkWalletCommand = CheckWalletCommand(
curve, createWalletResult.data.walletPublicKey
diff --git a/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt b/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt
index 39dea59f0b..db78568806 100644
--- a/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt
+++ b/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt
@@ -2,7 +2,7 @@ package com.tangem.tasks
import com.tangem.CardSession
import com.tangem.CardSessionRunnable
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.*
import com.tangem.common.CompletionResult
@@ -18,7 +18,7 @@ internal class ScanTask : CardSessionRunnable {
val card = session.environment.card
if (card == null) {
- callback(CompletionResult.Failure(SessionError.MissingPreflightRead()))
+ callback(CompletionResult.Failure(TangemSdkError.MissingPreflightRead()))
} else if (card.cardData?.productMask?.contains(Product.Tag) != false) {
callback(CompletionResult.Success(card))
@@ -27,7 +27,7 @@ internal class ScanTask : CardSessionRunnable {
callback(CompletionResult.Success(card))
} else if (card.curve == null || card.walletPublicKey == null) {
- callback(CompletionResult.Failure(SessionError.CardError()))
+ callback(CompletionResult.Failure(TangemSdkError.CardError()))
} else {
val checkWalletCommand = CheckWalletCommand(card.curve, card.walletPublicKey)
diff --git a/tangem-core/src/test/java/com/tangem/common/tlv/TlvDecoderTest.kt b/tangem-core/src/test/java/com/tangem/common/tlv/TlvDecoderTest.kt
index fbd4514c11..8f7bd0b91e 100644
--- a/tangem-core/src/test/java/com/tangem/common/tlv/TlvDecoderTest.kt
+++ b/tangem-core/src/test/java/com/tangem/common/tlv/TlvDecoderTest.kt
@@ -1,7 +1,7 @@
package com.tangem.common.tlv
import com.google.common.truth.Truth.assertThat
-import com.tangem.SessionError
+import com.tangem.TangemSdkError
import com.tangem.commands.*
import com.tangem.common.extensions.hexToBytes
import org.junit.Test
@@ -35,21 +35,21 @@ class TlvDecoderTest {
@Test
fun `map when value is null throws MissingTagException`() {
- assertThrows {
+ assertThrows {
tlvMapper.decode(TlvTag.TokenSymbol)
}
}
@Test
fun `map optional to wrong type throws WrongTypeException`() {
- assertThrows {
+ assertThrows {
tlvMapper.decodeOptional(TlvTag.CardData)
}
}
@Test
fun `map to wrong type throws WrongTypeException`() {
- assertThrows {
+ assertThrows {
tlvMapper.decode(TlvTag.CardData)
}
}
@@ -76,7 +76,7 @@ class TlvDecoderTest {
.isTrue()
assertThat(settingsMask.contains(Settings.UseDynamicNdef))
.isTrue()
- assertThat(settingsMask.contains(Settings.ForbidPurgeWallet))
+ assertThat(settingsMask.contains(Settings.ProhibitPurgeWallet))
.isFalse()
}
@@ -134,7 +134,7 @@ class TlvDecoderTest {
@Test
fun `map Enum with unknown code throws ConversionException error`() {
val localMapper = TlvDecoder(listOf(Tlv(TlvTag.CurveId, "test".toByteArray())))
- assertThrows