From 894e601444dc586c713521281254a0b6735483d6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 23 Apr 2020 11:47:09 +0300 Subject: [PATCH] Updated on 2026-08-14 --- ...anceAddress.kt => BinanceAddressService.kt} | 0 .../binance/BinanceTransactionBuilder.kt | 18 ++++++++++++------ .../binance/BinanceWalletManager.kt | 18 +++++++++++------- .../binance/network/BinanceNetworkManager.kt | 15 ++++++++++----- ...coinAddress.kt => BitcoinAddressService.kt} | 0 .../bitcoin/BitcoinWalletManager.kt | 2 +- ...danoAddress.kt => CardanoAddressService.kt} | 0 ...eumAddress.kt => EthereumAddressService.kt} | 0 .../ethereum/network/EthereumNetworkManager.kt | 3 +-- ...llarAddress.kt => StellarAddressService.kt} | 0 .../{XrpAddress.kt => XrpAddressService.kt} | 0 .../com/tangem/blockchain/common/Amount.kt | 4 +++- .../java/com/tangem/blockchain/common/Token.kt | 7 +++++++ .../com/tangem/blockchain/common/Wallet.kt | 9 --------- .../blockchain/common/WalletManagerFactory.kt | 18 +++++------------- 15 files changed, 50 insertions(+), 44 deletions(-) rename blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/{BinanceAddress.kt => BinanceAddressService.kt} (100%) rename blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/{BitcoinAddress.kt => BitcoinAddressService.kt} (100%) rename blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/{CardanoAddress.kt => CardanoAddressService.kt} (100%) rename blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/{EthereumAddress.kt => EthereumAddressService.kt} (100%) rename blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/{StellarAddress.kt => StellarAddressService.kt} (100%) rename blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/{XrpAddress.kt => XrpAddressService.kt} (100%) create mode 100644 blockchain/src/main/java/com/tangem/blockchain/common/Token.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt similarity index 100% rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddress.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceAddressService.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt index 9de779d162..49c7c20368 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceTransactionBuilder.kt @@ -1,6 +1,5 @@ package com.tangem.blockchain.blockchains.binance -import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiRestClient import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.TransactionOption import com.tangem.blockchain.blockchains.binance.client.domain.broadcast.Transfer import com.tangem.blockchain.blockchains.binance.client.encoding.message.MessageType @@ -8,6 +7,8 @@ import com.tangem.blockchain.blockchains.binance.client.encoding.message.Transac import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransferMessage import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.TransactionData +import com.tangem.blockchain.extensions.Result +import com.tangem.blockchain.extensions.isAboveZero import com.tangem.common.extensions.calculateSha256 import com.tangem.common.extensions.toCompressedPublicKey import org.bitcoinj.core.ECKey @@ -15,7 +16,7 @@ import org.bitcoinj.core.Utils import java.math.BigInteger class BinanceTransactionBuilder( - publicKey: ByteArray, private val client: BinanceDexApiRestClient, isTestNet: Boolean = false + publicKey: ByteArray, isTestNet: Boolean = false ) { var accountNumber: Long? = null var sequence: Long? = null @@ -26,7 +27,12 @@ class BinanceTransactionBuilder( private var transactionAssembler: TransactionRequestAssemblerExtSign? = null private var transferMessage: TransferMessage? = null - fun buildToSign(transactionData: TransactionData): ByteArray { + fun buildToSign(transactionData: TransactionData): Result { + + if (!transactionData.amount.isAboveZero()) return Result.Failure(Exception("Transaction amount is not defined")) + val accountNumber = accountNumber ?: return Result.Failure(Exception("No account number")) + val sequence = sequence ?: return Result.Failure(Exception("No sequence")) + val transfer = Transfer() transfer.coin = transactionData.amount.currencySymbol transfer.fromAddress = transactionData.sourceAddress @@ -36,12 +42,12 @@ class BinanceTransactionBuilder( val options = TransactionOption.DEFAULT_INSTANCE - val accountData = BinanceAccountData(chainId, accountNumber!!, sequence!!) + val accountData = BinanceAccountData(chainId, accountNumber, sequence) - transactionAssembler = client.prepareTransfer(transfer, accountData, prefixedPubKey, options, true) + transactionAssembler = TransactionRequestAssemblerExtSign(accountData, prefixedPubKey, options) transferMessage = transactionAssembler!!.createTransferMessage(transfer) - return transactionAssembler!!.prepareForSign(transferMessage).calculateSha256() + return Result.Success(transactionAssembler!!.prepareForSign(transferMessage).calculateSha256()) } fun buildToSend(signature: ByteArray): ByteArray { diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt index 956c22f537..e8d2b759eb 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/BinanceWalletManager.kt @@ -39,14 +39,18 @@ class BinanceWalletManager( } override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult { - val transactionHash = transactionBuilder.buildToSign(transactionData) - - when (val signerResponse = signer.sign(arrayOf(transactionHash), cardId)) { - is CompletionResult.Success -> { - val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature) - return networkManager.sendTransaction(transactionToSend) + val buildTransactionResult = transactionBuilder.buildToSign(transactionData) + when (buildTransactionResult) { + is Result.Failure -> return SimpleResult.Failure(buildTransactionResult.error) + is Result.Success -> { + when (val signerResponse = signer.sign(arrayOf(buildTransactionResult.data), cardId)) { + is CompletionResult.Success -> { + val transactionToSend = transactionBuilder.buildToSend(signerResponse.data.signature) + return networkManager.sendTransaction(transactionToSend) + } + is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error) + } } - is CompletionResult.Failure -> return SimpleResult.Failure(signerResponse.error) } } diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt index f843695726..92532a3ceb 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/binance/network/BinanceNetworkManager.kt @@ -1,6 +1,7 @@ package com.tangem.blockchain.blockchains.binance.network import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiClientFactory +import com.tangem.blockchain.blockchains.binance.client.BinanceDexApiRestClient import com.tangem.blockchain.blockchains.binance.client.BinanceDexEnvironment import com.tangem.blockchain.blockchains.binance.client.encoding.message.TransactionRequestAssemblerExtSign import com.tangem.blockchain.common.Blockchain @@ -14,11 +15,15 @@ import okhttp3.RequestBody import java.math.BigDecimal class BinanceNetworkManager(isTestNet: Boolean = false) { - val api = createRetrofitInstance(if (!isTestNet) API_BINANCE else API_BINANCE_TESTNET) - .create(BinanceApi::class.java) - val client = BinanceDexApiClientFactory.newInstance().newRestClient( - if (!isTestNet) BinanceDexEnvironment.PROD.baseUrl else BinanceDexEnvironment.TEST_NET.baseUrl - ) + val api: BinanceApi by lazy { + createRetrofitInstance(if (!isTestNet) API_BINANCE else API_BINANCE_TESTNET) + .create(BinanceApi::class.java) + } + val client: BinanceDexApiRestClient by lazy { + BinanceDexApiClientFactory.newInstance().newRestClient( + if (!isTestNet) BinanceDexEnvironment.PROD.baseUrl else BinanceDexEnvironment.TEST_NET.baseUrl + ) + } suspend fun getInfo(address: String): Result { return try { diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt similarity index 100% rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddress.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinAddressService.kt 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 index 0812b70c17..8d38566e23 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/bitcoin/BitcoinWalletManager.kt @@ -89,6 +89,6 @@ class BitcoinWalletManager( private fun BigDecimal.calculateFee(transactionSize: BigDecimal): BigDecimal { val bytesInKb = BigDecimal(1024) return this.divide(bytesInKb).multiply(transactionSize) - .setScale(8, blockchain.roundingMode()) + .setScale(8, BigDecimal.ROUND_DOWN) } } \ No newline at end of file diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt similarity index 100% rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddress.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/cardano/CardanoAddressService.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt similarity index 100% rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddress.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/EthereumAddressService.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt index 77ab787568..257dd29787 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/blockchains/ethereum/network/EthereumNetworkManager.kt @@ -1,6 +1,5 @@ package com.tangem.blockchain.blockchains.ethereum.network -import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.extensions.Result import com.tangem.blockchain.extensions.SimpleResult import com.tangem.blockchain.extensions.retryIO @@ -87,7 +86,7 @@ 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() } } diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt similarity index 100% rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddress.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/stellar/StellarAddressService.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.kt b/blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt similarity index 100% rename from blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddress.kt rename to blockchain/src/main/java/com/tangem/blockchain/blockchains/xrp/XrpAddressService.kt diff --git a/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt index ad6faa8d6e..bf30907a9e 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/common/Amount.kt @@ -21,4 +21,6 @@ data class Amount( constructor(amount: Amount, value: BigDecimal) : this(amount.currencySymbol, value, amount.address, amount.decimals, amount.type) -} \ No newline at end of file +} + +enum class AmountType { Coin, Token, Reserve } \ No newline at end of file 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/Wallet.kt b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt index 6f03468733..9273763196 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/common/Wallet.kt @@ -58,13 +58,4 @@ class Wallet( return amounts[amountType]?.value ?: BigDecimal.ZERO } -// fun validateTransaction(amount: Amount, fee: Amount?): EnumSet { -// TODO("not implemented") -// } -} - -enum class AmountType { Coin, Token, Reserve } - -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/WalletManagerFactory.kt b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt index e0a28e9678..b5bf3032f2 100644 --- a/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt +++ b/blockchain/src/main/java/com/tangem/blockchain/common/WalletManagerFactory.kt @@ -82,19 +82,17 @@ object WalletManagerFactory { ) } Blockchain.Binance -> { - val networkManager = BinanceNetworkManager() return BinanceWalletManager( cardId, wallet, - BinanceTransactionBuilder(walletPublicKey, networkManager.client), - networkManager + BinanceTransactionBuilder(walletPublicKey), + BinanceNetworkManager() ) } Blockchain.BinanceTestnet -> { - val networkManager = BinanceNetworkManager(true) return BinanceWalletManager( cardId, wallet, - BinanceTransactionBuilder(walletPublicKey, networkManager.client, true), - networkManager + BinanceTransactionBuilder(walletPublicKey, true), + BinanceNetworkManager(true) ) } else -> return null @@ -107,10 +105,4 @@ object WalletManagerFactory { val decimals = card.cardData?.tokenDecimal ?: return null return Token(symbol, contractAddress, decimals) } -} - -data class Token( - val symbol: String, - val contractAddress: String, - val decimals: Int -) \ No newline at end of file +} \ No newline at end of file