diff --git a/android/app/src/main/kotlin/com/gemwallet/android/di/DataModule.kt b/android/app/src/main/kotlin/com/gemwallet/android/di/DataModule.kt index 32d8457e30..fe44d3e79b 100644 --- a/android/app/src/main/kotlin/com/gemwallet/android/di/DataModule.kt +++ b/android/app/src/main/kotlin/com/gemwallet/android/di/DataModule.kt @@ -3,7 +3,6 @@ package com.gemwallet.android.di import com.gemwallet.android.application.fiat.coordinators.SyncFiatAssets import com.gemwallet.android.blockchain.clients.bitcoin.BitcoinSignClient import com.gemwallet.android.blockchain.clients.cardano.CardanoSignClient -import com.gemwallet.android.blockchain.clients.cosmos.CosmosSignClient import com.gemwallet.android.blockchain.clients.polkadot.PolkadotSignClient import com.gemwallet.android.blockchain.clients.solana.SolanaSignClient import com.gemwallet.android.blockchain.clients.sui.SuiSignClient @@ -59,7 +58,6 @@ object DataModule { when (it.toChainType()) { ChainType.Bitcoin -> BitcoinSignClient(it) ChainType.Solana -> SolanaSignClient(it, assetsRepository) - ChainType.Cosmos -> CosmosSignClient(it) ChainType.Tron -> TronSignClient(it) ChainType.Xrp -> XrpSignClient(it) @@ -72,6 +70,7 @@ object DataModule { ChainType.Near, ChainType.Algorand, ChainType.Stellar, + ChainType.Cosmos, ChainType.Ton -> return@mapNotNull null } } + listOf(SignService()), diff --git a/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/cosmos/TestCosmosSigner.kt b/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/cosmos/TestCosmosSigner.kt deleted file mode 100644 index 4441499929..0000000000 --- a/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/cosmos/TestCosmosSigner.kt +++ /dev/null @@ -1,319 +0,0 @@ -package com.gemwallet.android.blockchain.clients.cosmos - -import com.gemwallet.android.blockchain.includeLibs -import com.gemwallet.android.ext.asset -import com.gemwallet.android.math.toHexString -import com.gemwallet.android.model.ConfirmParams -import com.gemwallet.android.model.DestinationAddress -import com.gemwallet.android.model.Fee -import com.gemwallet.android.testkit.TEST_PHRASE -import com.wallet.core.primitives.Account -import com.wallet.core.primitives.AssetId -import com.wallet.core.primitives.Chain -import com.wallet.core.primitives.Delegation -import com.wallet.core.primitives.DelegationBase -import com.wallet.core.primitives.DelegationState -import com.wallet.core.primitives.DelegationValidator -import com.wallet.core.primitives.FeePriority -import com.wallet.core.primitives.StakeProviderType -import junit.framework.TestCase.assertEquals -import kotlinx.coroutines.runBlocking -import org.junit.Test -import wallet.core.jni.CoinType -import wallet.core.jni.HDWallet -import java.math.BigInteger - -class TestCosmosSigner { - companion object { - init { - includeLibs() - } - } - - val osmoAccount = Account(Chain.Osmosis, "osmo1kglemumu8mn658j6g4z9jzn3zef2qdyyvklwa3", "") - val signer = CosmosSignClient(Chain.Osmosis) - val privateKey = HDWallet(TEST_PHRASE, "").getKeyForCoin(CoinType.OSMOSIS).data()!! - - @Test - fun testSignNativeTransfer() { - val transfer = ConfirmParams.Builder(Chain.Osmosis.asset(), osmoAccount, BigInteger.TEN) - .transfer(DestinationAddress("osmo1rcjvzz8wzktqfz8qjf0l9q45kzxvd0z0n7l5cf")) as ConfirmParams.TransferParams.Native - val chainData = CosmosChainData( - chainId = "osmosis-1", - accountNumber = 2913388UL, - sequence = 10UL, - ) - val finalAmount = BigInteger.TEN - val result = runBlocking { - signer.signNativeTransfer( - transfer, - chainData, - finalAmount, - fee = Fee.Regular( - feeAssetId = AssetId(Chain.Osmosis), - maxGasPrice = BigInteger.valueOf(10000L), - limit = BigInteger.valueOf(200000L), - amount = BigInteger.valueOf(10000L), - priority = FeePriority.Normal, - options = emptyMap(), - ), - privateKey - ) - }.first().toHexString() - assertEquals( - "0x7b226d6f6465223a2242524f4144434153545f4d4f44455f53594e43222c2274785f6279746573223" + - "a22436f6f42436f6342436877765932397a6257397a4c6d4a68626d7375646a46695a585268" + - "4d53354e633264545a57356b456d634b4b32397a62573878613264735a57313162585534625" + - "734324e5468714e6d6330656a6c71656d347a656d566d4d6e466b65586c326132783359544d" + - "534b32397a62573878636d4e71646e70364f486436613352785a6e6f346357706d4d4777356" + - "354513161337034646d5177656a42754e3277315932596143776f466457397a62573853416a" + - "4577456d674b55417047436838765932397a6257397a4c6d4e79655842306279357a5a574e7" + - "74d6a5532617a4575554856695332563545694d4b49514d736c63596e374468506535622f38" + - "6c4d33466e50586847426a3553644331352b584931685a31675962424249454367494941526" + - "74b4568514b44676f466457397a62573853425445774d444177454d436144427041564a6b44" + - "786153355a6167686d4a365a7470433979696d374a413864754f384d774f4f44644a6548454" + - "87373483350514e2b34596c2b5356794c744e4557362b4944554b666b4731646649594f7670" + - "5269466c4f79673d3d227d", - result - ) - } - - @Test - fun testSignStake() { - val transfer = ConfirmParams.Builder(Chain.Osmosis.asset(), osmoAccount, BigInteger.TEN) - .delegate(DelegationValidator(Chain.Osmosis, id = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm", name = "", isActive = true, commission = 1.0, apr = 9.0, providerType = StakeProviderType.Stake)) - val chainData = CosmosChainData( - chainId = "osmosis-1", - accountNumber = 2913388UL, - sequence = 10UL, - ) - val finalAmount = BigInteger.TEN - val result = runBlocking { - signer.signDelegate( - transfer, - chainData, - finalAmount, - fee = Fee.Regular( - feeAssetId = AssetId(Chain.Osmosis), - maxGasPrice = BigInteger.valueOf(10000L), - limit = BigInteger.valueOf(200000L), - amount = BigInteger.valueOf(10000L), - priority = FeePriority.Normal, - options = emptyMap(), - ), - privateKey - ) - }.first().toHexString() - assertEquals( - "0x7b226d6f6465223a2242524f4144434153545f4d4f44455f53594e43222c2274785f6279746573223" + - "a22437134424370554243694d765932397a6257397a4c6e4e3059577470626d6375646a4669" + - "5a5852684d53354e633264455a57786c5a3246305a524a7543697476633231764d57746e624" + - "75674645731314f4731754e6a5534616a5a6e4e486f35616e70754d33706c5a6a4a785a486c" + - "35646d74736432457a456a4a7663323176646d46736233426c636a46776548426f64475a6f6" + - "35735344f5735354d6a646b4e544e364e4441314d6d557a636a63325a546478635451354e57" + - "566f62526f4c4367563162334e74627849434d54415346464e305957746c49485a705953424" + - "85a5730675632467362475630456d674b55417047436838765932397a6257397a4c6d4e7965" + - "5842306279357a5a574e774d6a5532617a4575554856695332563545694d4b49514d736c635" + - "96e374468506535622f386c4d33466e50586847426a3553644331352b584931685a31675962" + - "42424945436749494152674b4568514b44676f466457397a62573853425445774d444177454" + - "d43614442704178683975774e5a76716c32664f444345417034586875634f3163785859727a" + - "326f4d456b61742b77764a45503156446c6169345a6e4c7a2b6e396d5262676a46313433456" + - "673616f6e6f4568333675514b594f5775513d3d227d", - result - ) - } - - @Test - fun testSignUndelegate() { - val transfer = ConfirmParams.Builder(Chain.Osmosis.asset(), osmoAccount, BigInteger.TEN) - .undelegate( - Delegation( - base = DelegationBase( - assetId = AssetId(Chain.Osmosis), - state = DelegationState.Active, - balance = "10", - shares = "", - rewards = "", - completionDate = null, - delegationId = "25053096", - validatorId = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm" - ), - validator = DelegationValidator( - chain = Chain.Osmosis, - id = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm", - name = "", - isActive = true, - commission = 0.05, - apr = 5.11, - providerType = StakeProviderType.Stake, - ) - ) - ) - val chainData = CosmosChainData( - chainId = "osmosis-1", - accountNumber = 2913388UL, - sequence = 10UL, - ) - val finalAmount = BigInteger.TEN - val result = runBlocking { - signer.signUndelegate( - transfer, - chainData, - finalAmount, - fee = Fee.Regular( - feeAssetId = AssetId(Chain.Osmosis), - maxGasPrice = BigInteger.valueOf(10000L), - limit = BigInteger.valueOf(200000L), - amount = BigInteger.valueOf(10000L), - priority = FeePriority.Normal, - options = emptyMap(), - ), - privateKey - ) - }.first().toHexString() - assertEquals( - "0x7b226d6f6465223a2242524f4144434153545f4d4f44455f53594e43222c2274785f6279746573223" + - "a224372414243706342436955765932397a6257397a4c6e4e3059577470626d6375646a4669" + - "5a5852684d53354e63326456626d526c6247566e5958526c456d344b4b32397a62573878613" + - "264735a57313162585534625734324e5468714e6d6330656a6c71656d347a656d566d4d6e46" + - "6b65586c326132783359544d534d6d397a6257393259577876634756794d584234634768305" + - "a6d6878626e6735626e6b794e3251314d336f304d4455795a544e794e7a5a6c4e3346784e44" + - "6b315a5768744767734b4258567663323176456749784d4249555533526861325567646d6c6" + - "84945646c62534258595778735a58515361417051436b594b4879396a62334e7462334d7559" + - "334a35634852764c6e4e6c593341794e545a724d53355164574a4c5a586b5349776f6841797" + - "956786966734f4539376c762f79557a6357633965455947506c4a304c586e35636a57466e57" + - "426873454567514b4167674247416f5346416f4f4367563162334e74627849464d5441774d4" + - "44151774a6f4d476b436871792f4d33706248772f51766839796563536675706d3559525477" + - "654a513541706b433767384361383249626a2b574f7a59654858444f6276566d6f3144634d3" + - "27050652b2b6d4b426f3073686c424f43707869227d", - result - ) - } - - - @Test - fun testSignRedelegate() { - val transfer = ConfirmParams.Builder(Chain.Osmosis.asset(), osmoAccount, BigInteger.TEN) - .redelegate( - destinationValidator = DelegationValidator(Chain.Osmosis, id = "osmovaloper1z0sh4s80u99l6y9d3vfy582p8jejeeu6tcucs2", name = "", isActive = true, commission = 1.0, apr = 9.0, providerType = StakeProviderType.Stake), - delegation = Delegation( - base = DelegationBase( - assetId = AssetId(Chain.Osmosis), - state = DelegationState.Active, - balance = "10", - shares = "", - rewards = "", - completionDate = null, - delegationId = "25053096", - validatorId = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm" - ), - validator = DelegationValidator( - chain = Chain.Osmosis, - id = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm", - name = "", - isActive = true, - commission = 0.05, - apr = 5.11, - providerType = StakeProviderType.Stake, - ) - ) - ) - val chainData = CosmosChainData( - chainId = "osmosis-1", - accountNumber = 2913388UL, - sequence = 10UL, - ) - val finalAmount = BigInteger.TEN - val result = runBlocking { - signer.signRedelegate( - transfer, - chainData, - finalAmount, - fee = Fee.Regular( - feeAssetId = AssetId(Chain.Osmosis), - maxGasPrice = BigInteger.valueOf(10000L), - limit = BigInteger.valueOf(200000L), - amount = BigInteger.valueOf(10000L), - priority = FeePriority.Normal, - options = emptyMap(), - ), - privateKey - ) - }.first().toHexString() - assertEquals( - "0x7b226d6f6465223a2242524f4144434153545f4d4f44455f53594e43222c2274785f6279746573223" + - "a2243756f424374454243696f765932397a6257397a4c6e4e3059577470626d6375646a4669" + - "5a5852684d53354e633264435a576470626c4a6c5a4756735a576468644755536f67454b4b3" + - "2397a62573878613264735a57313162585534625734324e5468714e6d6330656a6c71656d34" + - "7a656d566d4d6e466b65586c326132783359544d534d6d397a6257393259577876634756794" + - "d584234634768305a6d6878626e6735626e6b794e3251314d336f304d4455795a544e794e7a" + - "5a6c4e3346784e446b315a576874476a4a7663323176646d46736233426c636a46364d484e6" + - "f4e484d344d4855354f57773265546c6b4d335a6d655455344d6e4134616d56715a5756314e" + - "6e526a64574e7a4d69494c4367563162334e74627849434d54415346464e305957746c49485" + - "a70595342485a5730675632467362475630456d674b55417047436838765932397a6257397a" + - "4c6d4e79655842306279357a5a574e774d6a5532617a4575554856695332563545694d4b495" + - "14d736c63596e374468506535622f386c4d33466e50586847426a3553644331352b58493168" + - "5a3167596242424945436749494152674b4568514b44676f466457397a62573853425445774" + - "d444177454d436144427041625637384c536c433373734c2f507a373335594d6b6c52614a4a" + - "4f54684a57645139324e33767a6730566c346f6e55513661666e7177312b70353937756d467" + - "837674a76364752414c566874722b4b6162395a3231673d3d227d", - result - ) - } - - @Test - fun testSignRewards() { - val transfer = ConfirmParams.Builder(Chain.Osmosis.asset(), osmoAccount, BigInteger.TEN) - .rewards( - listOf( - DelegationValidator(Chain.Osmosis, id = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm", name = "", isActive = true, commission = 1.0, apr = 9.0, providerType = StakeProviderType.Stake), - DelegationValidator(Chain.Osmosis, id = "osmovaloper1pxphtfhqnx9ny27d53z4052e3r76e7qq495ehm", name = "", isActive = true, commission = 1.0, apr = 9.0, providerType = StakeProviderType.Stake), - ), - ) - val chainData = CosmosChainData( - chainId = "osmosis-1", - accountNumber = 2913388UL, - sequence = 10UL, - ) - val finalAmount = BigInteger.TEN - val result = runBlocking { - signer.signRewards( - transfer, - chainData, - finalAmount, - fee = Fee.Regular( - feeAssetId = AssetId(Chain.Osmosis), - maxGasPrice = BigInteger.valueOf(10000L), - limit = BigInteger.valueOf(200000L), - amount = BigInteger.valueOf(10000L), - priority = FeePriority.Normal, - options = emptyMap(), - ), - privateKey - ) - }.first().toHexString() - assertEquals( - "0x7b226d6f6465223a2242524f4144434153545f4d4f44455f53594e43222c2274785f6279746573223" + - "a224374514343707742436a63765932397a6257397a4c6d52706333527961574a3164476c76" + - "626935324d574a6c644745784c6b317a5a3164706447686b636d4633524756735a576468644" + - "73979556d563359584a6b456d454b4b32397a62573878613264735a57313162585534625734" + - "324e5468714e6d6330656a6c71656d347a656d566d4d6e466b65586c326132783359544d534" + - "d6d397a6257393259577876634756794d584234634768305a6d6878626e6735626e6b794e32" + - "51314d336f304d4455795a544e794e7a5a6c4e3346784e446b315a57687443707742436a637" + - "65932397a6257397a4c6d52706333527961574a3164476c76626935324d574a6c644745784c" + - "6b317a5a3164706447686b636d4633524756735a57646864473979556d563359584a6b456d4" + - "54b4b32397a62573878613264735a57313162585534625734324e5468714e6d6330656a6c71" + - "656d347a656d566d4d6e466b65586c326132783359544d534d6d397a6257393259577876634" + - "756794d584234634768305a6d6878626e6735626e6b794e3251314d336f304d4455795a544e" + - "794e7a5a6c4e3346784e446b315a57687445685254644746725a53423261574567523256744" + - "94664686247786c64424a6f436c414b52676f664c324e76633231766379356a636e6c776447" + - "38756332566a634449314e6d73784c6c4231596b746c6552496a436945444c4a58474a2b773" + - "4543375572f2f4a544e785a7a31345267592b556e517465666c794e59576459474777515342" + - "416f4343414559436849554367344b4258567663323176456755784d4441774d42434174526" + - "76151482f553930754348307a78394164592b414c49484d35615a316372425377597a655a5a" + - "656a623572576a454d56585253636a4f66766e67333358466e464864493445707039796b4e4" + - "e745156557739424a6e5a7368553d227d", - result - ) - } -} diff --git a/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/tron/TestTronSigner.kt b/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/tron/TestTronSigner.kt index 82121ce51b..2eb3c2ad64 100644 --- a/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/tron/TestTronSigner.kt +++ b/android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/clients/tron/TestTronSigner.kt @@ -7,6 +7,7 @@ import com.gemwallet.android.model.ConfirmParams import com.gemwallet.android.model.DestinationAddress import com.gemwallet.android.model.Fee import com.gemwallet.android.testkit.TEST_PHRASE +import com.gemwallet.android.testkit.TEST_STAKE_MEMO import com.wallet.core.primitives.Account import com.wallet.core.primitives.Asset import com.wallet.core.primitives.AssetId @@ -167,6 +168,7 @@ class TestTronSigner { apr = 0.9, providerType = StakeProviderType.Stake, ), + memo = TEST_STAKE_MEMO, ), chainData = TronChainData( blockNumber = 69501435UL, diff --git a/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/cosmos/CosmosDenom.kt b/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/cosmos/CosmosDenom.kt deleted file mode 100644 index f9e22173c3..0000000000 --- a/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/cosmos/CosmosDenom.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.gemwallet.android.blockchain.clients.cosmos - -import com.wallet.core.primitives.Chain -import com.wallet.core.primitives.CosmosDenom - -fun CosmosDenom.Companion.from(chain: Chain): String = when (chain) { - Chain.Cosmos -> CosmosDenom.Uatom.string - Chain.Osmosis -> CosmosDenom.Uosmo.string - Chain.Thorchain -> CosmosDenom.Rune.string - Chain.Celestia -> CosmosDenom.Utia.string - Chain.Injective -> CosmosDenom.Inj.string - Chain.Sei -> CosmosDenom.Usei.string - Chain.Noble -> CosmosDenom.Uusdc.string - else -> throw IllegalArgumentException("Coin is not supported") -} \ No newline at end of file diff --git a/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/cosmos/CosmosSignClient.kt b/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/cosmos/CosmosSignClient.kt deleted file mode 100644 index b2e204a48a..0000000000 --- a/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/clients/cosmos/CosmosSignClient.kt +++ /dev/null @@ -1,276 +0,0 @@ -package com.gemwallet.android.blockchain.clients.cosmos - -import com.gemwallet.android.blockchain.clients.SignClient -import com.gemwallet.android.blockchain.operators.walletcore.WCChainTypeProxy -import com.gemwallet.android.model.ChainSignData -import com.gemwallet.android.model.ConfirmParams -import com.gemwallet.android.model.Fee -import com.google.protobuf.ByteString -import com.wallet.core.primitives.Chain -import com.wallet.core.primitives.CosmosDenom -import com.wallet.core.primitives.DelegationValidator -import wallet.core.java.AnySigner -import wallet.core.jni.AnyAddress -import wallet.core.jni.CoinType -import wallet.core.jni.proto.Cosmos -import wallet.core.jni.proto.Cosmos.Amount -import wallet.core.jni.proto.Cosmos.Message -import wallet.core.jni.proto.Cosmos.Message.Delegate -import wallet.core.jni.proto.Cosmos.Message.Undelegate -import wallet.core.jni.proto.Cosmos.Message.WithdrawDelegationReward -import java.math.BigInteger - -class CosmosSignClient( - private val chain: Chain, -) : SignClient { - - val coin = WCChainTypeProxy().invoke(chain) - - override suspend fun signNativeTransfer( - params: ConfirmParams.TransferParams.Native, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - val denom = CosmosDenom.from(chain) - val message = getTransferMessage( - from = params.from.address, - recipient = params.destination().address, - coin = coin, - amount = getAmount(finalAmount, denom = denom) - ) - return sign(chainData, fee, message, params.memo() ?: "", privateKey) - } - - override suspend fun signTokenTransfer( - params: ConfirmParams.TransferParams.Token, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - val denom = params.asset.id.tokenId!! - - val message = getTransferMessage( - from = params.from.address, - recipient = params.destination().address, - coin = coin, - amount = getAmount(finalAmount, denom = denom) - ) - return sign(chainData, fee, message, params.memo() ?: "", privateKey) - } - - override suspend fun signTokenApproval( - params: ConfirmParams.TokenApprovalParams, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - throw IllegalArgumentException() - } - - override suspend fun signDelegate( - params: ConfirmParams.Stake.DelegateParams, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - val denom = CosmosDenom.from(chain) - val message = getStakeMessage(params.from.address, params.validator.id, getAmount(finalAmount, denom)) - return sign(chainData, fee, message, "Stake via Gem Wallet", privateKey) - } - - override suspend fun signRedelegate( - params: ConfirmParams.Stake.RedelegateParams, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - val denom = CosmosDenom.from(chain) - val message = getRedelegateMessage( - delegatorAddress = params.from.address, - validatorSrcAddress = params.delegation.validator.id, - validatorDstAddress = params.destinationValidator.id, - amount = getAmount(params.amount, denom), - ) - return sign(chainData, fee, message, "Stake via Gem Wallet", privateKey) - } - - override suspend fun signRewards( - params: ConfirmParams.Stake.RewardsParams, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - val message = getRewardsMessage(params.from.address, params.validators) - return sign(chainData, fee, message, "Stake via Gem Wallet", privateKey) - } - - override suspend fun signUndelegate( - params: ConfirmParams.Stake.UndelegateParams, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - val denom = CosmosDenom.from(chain) - val message = getUnstakeMessage(params.from.address, params.delegation.validator.id, getAmount(params.amount, denom)) - return sign(chainData, fee, message, "Stake via Gem Wallet", privateKey) - } - - override suspend fun signWithdraw( - params: ConfirmParams.Stake.WithdrawParams, - chainData: ChainSignData, - finalAmount: BigInteger, - fee: Fee, - privateKey: ByteArray - ): List { - throw IllegalArgumentException() - } - - private fun getThorChainSwapMessage(params: ConfirmParams.SwapParams, finalAmount: BigInteger, coinType: CoinType): Message { - val message = Message.newBuilder().apply { - this.setThorchainDepositMessage( - Message.THORChainDeposit.newBuilder().apply { - addCoins( - Cosmos.THORChainCoin.newBuilder().apply { - this.amount = finalAmount.toString() - this.asset = Cosmos.THORChainAsset.newBuilder().apply { - this.chain = "THOR" - this.symbol = "RUNE" - this.ticker = "RUNE" - }.build() - } - ) - this.memo = params.swapData - this.signer = ByteString.copyFrom(AnyAddress(params.from.address, coinType).data()) - } - ) - }.build() - return message - } - - private fun getTransferMessage( - from: String, - recipient: String, - coin: CoinType, - amount: Amount, - ): List { - val message = Message.newBuilder() - message.setSendCoinsMessage( - Message.Send.newBuilder().apply { - fromAddress = from - toAddress = recipient - addAmounts(amount) - } - ) - return listOf(message.build()) - } - - private fun getStakeMessage(delegatorAddress: String, validatorAddress: String, amount: Amount): List { - val message = Message.newBuilder().apply { - stakeMessage = Delegate.newBuilder().apply { - this.amount = amount - this.delegatorAddress = delegatorAddress - this.validatorAddress = validatorAddress - }.build() - }.build() - return listOf(message) - } - - fun getRewardsMessage(delegatorAddress: String, validators: List): List { - return validators.map { validator -> - Message.newBuilder().apply { - withdrawStakeRewardMessage = WithdrawDelegationReward.newBuilder().apply { - this.delegatorAddress = delegatorAddress - this.validatorAddress = validator.id - }.build() - }.build() - } - } - - fun getUnstakeMessage(delegatorAddress: String, validatorAddress: String, amount: Amount): List { - val message = Message.newBuilder().apply { - unstakeMessage = Undelegate.newBuilder().apply { - this.amount = amount - this.delegatorAddress = delegatorAddress - this.validatorAddress = validatorAddress - }.build() - }.build() - return listOf(message) - } - - fun getRedelegateMessage( - delegatorAddress: String, - validatorSrcAddress: String, - validatorDstAddress: String, - amount: Amount, - ): List { - val message = Message.newBuilder().apply { - restakeMessage = Message.BeginRedelegate.newBuilder().apply { - this.amount = amount - this.delegatorAddress = delegatorAddress - this.validatorSrcAddress = validatorSrcAddress - this.validatorDstAddress = validatorDstAddress - }.build() - }.build() - return listOf(message) - } - - private fun getAmount(amount: BigInteger, denom: String): Amount { - return Amount.newBuilder().apply { - this.amount = amount.toString() - this.denom = denom - }.build() - } - - private fun sign( - chainData: ChainSignData, - fee: Fee, - messages: List, - memo: String, - privateKey: ByteArray - ): List { - val meta = chainData as CosmosChainData - val fee = fee as Fee.Regular - val feeAmount = fee.amount - val gas = fee.limit.toLong() * messages.size - val coin = WCChainTypeProxy().invoke(chain) - - val cosmosFee = Cosmos.Fee.newBuilder().apply { - this.gas = gas - when (chain) { - Chain.Cosmos, - Chain.Osmosis, - Chain.Celestia, - Chain.Injective, - Chain.Sei, - Chain.Noble -> addAmounts(getAmount(feeAmount, CosmosDenom.from(chain))) - else -> {} - } - - }.build() - val signInput = Cosmos.SigningInput.newBuilder().apply { - this.mode = Cosmos.BroadcastMode.SYNC - this.signingMode = Cosmos.SigningMode.Protobuf - this.chainId = meta.chainId - this.accountNumber = meta.accountNumber.toLong() - this.sequence = meta.sequence.toLong() - this.fee = cosmosFee - this.memo = memo - this.privateKey = ByteString.copyFrom(privateKey) - messages.forEach { - this.addMessages(it) - } - } - val sign = AnySigner.sign(signInput.build(), coin, Cosmos.SigningOutput.parser()) - return listOf(sign.serialized.toByteArray()) - } - - override fun supported(chain: Chain): Boolean = this.chain == chain -} \ No newline at end of file diff --git a/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/services/SignService.kt b/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/services/SignService.kt index 6d8d0886dd..1464a3e88a 100644 --- a/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/services/SignService.kt +++ b/android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/services/SignService.kt @@ -316,6 +316,7 @@ class SignService : SignClient { ChainType.Near, ChainType.Algorand, ChainType.Stellar, + ChainType.Cosmos, ChainType.Ton -> true else -> false } diff --git a/android/data/repositories/src/test/kotlin/com/gemwallet/android/data/repositories/transactions/TransactionBalanceServiceTest.kt b/android/data/repositories/src/test/kotlin/com/gemwallet/android/data/repositories/transactions/TransactionBalanceServiceTest.kt index d1ec9c4b9f..b161a04313 100644 --- a/android/data/repositories/src/test/kotlin/com/gemwallet/android/data/repositories/transactions/TransactionBalanceServiceTest.kt +++ b/android/data/repositories/src/test/kotlin/com/gemwallet/android/data/repositories/transactions/TransactionBalanceServiceTest.kt @@ -5,11 +5,12 @@ import com.gemwallet.android.data.repositories.stake.StakeRepository import com.gemwallet.android.model.AmountParams import com.gemwallet.android.model.AssetBalance import com.gemwallet.android.model.ConfirmParams +import com.gemwallet.android.testkit.TEST_STAKE_MEMO import com.gemwallet.android.testkit.mockAssetCosmos import com.gemwallet.android.testkit.mockAssetInfo +import com.gemwallet.android.testkit.mockAssetMonad import com.gemwallet.android.testkit.mockDelegation import com.gemwallet.android.testkit.mockDelegationValidator -import com.gemwallet.android.testkit.mockAssetMonad import com.wallet.core.primitives.TransactionType import io.mockk.coEvery import io.mockk.every @@ -49,6 +50,7 @@ class TransactionBalanceServiceTest { from = requireNotNull(assetInfo.owner), ).rewards( validators = listOf(mockDelegationValidator(chain = asset.id.chain)), + memo = TEST_STAKE_MEMO, ) assertEquals( @@ -126,6 +128,7 @@ class TransactionBalanceServiceTest { ).redelegate( destinationValidator = mockDelegationValidator(chain = asset.id.chain, id = "validator-2"), delegation = delegation, + memo = TEST_STAKE_MEMO, ) assertEquals( diff --git a/android/features/earn/delegation/viewmodels/src/main/kotlin/com/gemwallet/android/features/earn/delegation/viewmodels/DelegationViewModel.kt b/android/features/earn/delegation/viewmodels/src/main/kotlin/com/gemwallet/android/features/earn/delegation/viewmodels/DelegationViewModel.kt index a3ef8a4e44..00b163ae63 100644 --- a/android/features/earn/delegation/viewmodels/src/main/kotlin/com/gemwallet/android/features/earn/delegation/viewmodels/DelegationViewModel.kt +++ b/android/features/earn/delegation/viewmodels/src/main/kotlin/com/gemwallet/android/features/earn/delegation/viewmodels/DelegationViewModel.kt @@ -1,5 +1,6 @@ package com.gemwallet.android.features.earn.delegation.viewmodels +import android.content.Context import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -17,6 +18,7 @@ import com.gemwallet.android.ext.redelegated import com.gemwallet.android.model.AmountParams import com.gemwallet.android.model.ConfirmParams import com.gemwallet.android.model.Crypto +import com.gemwallet.android.ui.R import com.gemwallet.android.ui.components.list_item.availableIn import com.gemwallet.android.ui.models.RewardsInfoUIModel import com.gemwallet.android.ui.models.actions.AmountTransactionAction @@ -30,6 +32,7 @@ import com.wallet.core.primitives.StakeChain import com.wallet.core.primitives.TransactionType import com.wallet.core.primitives.WalletType import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import uniffi.gemstone.Explorer import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow @@ -44,6 +47,7 @@ import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltViewModel class DelegationViewModel @Inject constructor( + @ApplicationContext private val context: Context, private val assetsRepository: AssetsRepository, private val stakeRepository: StakeRepository, private val getCurrentBlockExplorer: GetCurrentBlockExplorer, @@ -186,7 +190,7 @@ class DelegationViewModel @Inject constructor( val from = assetInfo.owner ?: return val balance = Crypto(delegation.base.balance.toBigIntegerOrNull() ?: BigInteger.ZERO) val params = ConfirmParams.Builder(assetInfo.asset, from, balance.atomicValue, false) - .undelegate(delegation) + .undelegate(delegation, context.getString(R.string.stake_viagem)) confirmCall(params) } @@ -214,6 +218,7 @@ class DelegationViewModel @Inject constructor( from = from, validators = listOf(delegation.validator), amount = delegation.rewardsBalance(), + memo = context.getString(R.string.stake_viagem), ) ) } diff --git a/android/features/earn/stake/viewmodels/src/main/kotlin/com/gemwallet/android/features/stake/viewmodels/StakeViewModel.kt b/android/features/earn/stake/viewmodels/src/main/kotlin/com/gemwallet/android/features/stake/viewmodels/StakeViewModel.kt index 9ab113c2ab..47ff5455ad 100644 --- a/android/features/earn/stake/viewmodels/src/main/kotlin/com/gemwallet/android/features/stake/viewmodels/StakeViewModel.kt +++ b/android/features/earn/stake/viewmodels/src/main/kotlin/com/gemwallet/android/features/stake/viewmodels/StakeViewModel.kt @@ -1,5 +1,6 @@ package com.gemwallet.android.features.stake.viewmodels +import android.content.Context import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -23,6 +24,7 @@ import com.gemwallet.android.model.AmountParams import com.gemwallet.android.model.ConfirmParams import com.gemwallet.android.model.Crypto import com.gemwallet.android.model.format +import com.gemwallet.android.ui.R import com.gemwallet.android.ui.models.actions.AmountTransactionAction import com.gemwallet.android.ui.models.actions.ConfirmTransactionAction import com.gemwallet.android.ui.models.navigation.RouteArgument @@ -33,6 +35,7 @@ import com.wallet.core.primitives.TransactionType import com.wallet.core.primitives.WalletType import com.gemwallet.android.ext.isViewOnly import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow @@ -54,6 +57,7 @@ import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltViewModel class StakeViewModel @Inject constructor( + @ApplicationContext private val context: Context, private val assetsRepository: AssetsRepository, private val stakeRepository: StakeRepository, sessionRepository: SessionRepository, @@ -182,6 +186,7 @@ class StakeViewModel @Inject constructor( from = account, validators = withRewards.map { it.validator }, amount = withRewards.sumOf { it.rewardsBalance() }, + memo = context.getString(R.string.stake_viagem), ) ) } else { diff --git a/android/features/transfer_amount/viewmodels/src/main/kotlin/com/gemwallet/android/features/transfer_amount/viewmodels/AmountViewModel.kt b/android/features/transfer_amount/viewmodels/src/main/kotlin/com/gemwallet/android/features/transfer_amount/viewmodels/AmountViewModel.kt index 17f290cd82..ef81493b8e 100644 --- a/android/features/transfer_amount/viewmodels/src/main/kotlin/com/gemwallet/android/features/transfer_amount/viewmodels/AmountViewModel.kt +++ b/android/features/transfer_amount/viewmodels/src/main/kotlin/com/gemwallet/android/features/transfer_amount/viewmodels/AmountViewModel.kt @@ -1,5 +1,6 @@ package com.gemwallet.android.features.transfer_amount.viewmodels +import android.content.Context import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -31,8 +32,10 @@ import com.wallet.core.primitives.Chain import com.wallet.core.primitives.Currency import com.wallet.core.primitives.Delegation import com.wallet.core.primitives.Resource +import com.gemwallet.android.ui.R import com.wallet.core.primitives.TransactionType import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow @@ -59,6 +62,7 @@ import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltViewModel class AmountViewModel @Inject constructor( + @ApplicationContext private val context: Context, private val assetsRepository: AssetsRepository, private val stakeRepository: StakeRepository, private val transactionBalanceService: TransactionBalanceService, @@ -340,13 +344,14 @@ class AmountViewModel @Inject constructor( val isMax = maxAmount.value || amount.atomicValue == balance val builder = ConfirmParams.Builder(asset, owner, amount.atomicValue, isMax) + val stakeMemo = context.getString(R.string.stake_viagem) val nextParams = when (params.txType) { TransactionType.Transfer -> builder.transfer(destination!!, memo) TransactionType.EarnDeposit, - TransactionType.StakeDelegate -> builder.delegate(validator ?: return) - TransactionType.StakeUndelegate -> builder.undelegate(delegation ?: return) - TransactionType.StakeRewards -> builder.rewards(listOfNotNull(validator)) - TransactionType.StakeRedelegate -> builder.redelegate(validator!!, delegation!!) + TransactionType.StakeDelegate -> builder.delegate(validator ?: return, stakeMemo) + TransactionType.StakeUndelegate -> builder.undelegate(delegation ?: return, stakeMemo) + TransactionType.StakeRewards -> builder.rewards(listOfNotNull(validator), stakeMemo) + TransactionType.StakeRedelegate -> builder.redelegate(validator!!, delegation!!, stakeMemo) TransactionType.EarnWithdraw, TransactionType.StakeWithdraw -> builder.withdraw(delegation!!) TransactionType.AssetActivation -> builder.activate() diff --git a/android/gemcore/src/main/kotlin/com/gemwallet/android/model/ConfirmParams.kt b/android/gemcore/src/main/kotlin/com/gemwallet/android/model/ConfirmParams.kt index e33959857b..2ea8e84419 100644 --- a/android/gemcore/src/main/kotlin/com/gemwallet/android/model/ConfirmParams.kt +++ b/android/gemcore/src/main/kotlin/com/gemwallet/android/model/ConfirmParams.kt @@ -106,9 +106,9 @@ sealed class ConfirmParams() { return TokenApprovalParams(asset, from, approvalData, provider, contract) } - fun delegate(validator: DelegationValidator) = Stake.DelegateParams(asset, from, amount, validator, useMaxAmount) + fun delegate(validator: DelegationValidator, memo: String) = Stake.DelegateParams(asset, from, amount, validator, useMaxAmount, memo) - fun rewards(validators: List) = Stake.RewardsParams(asset, from, validators, amount) + fun rewards(validators: List, memo: String) = Stake.RewardsParams(asset, from, validators, amount, memo) fun withdraw(delegation: Delegation) = Stake.WithdrawParams( asset = asset, @@ -117,16 +117,17 @@ sealed class ConfirmParams() { delegation = delegation, ) - fun undelegate(delegation: Delegation): Stake.UndelegateParams { + fun undelegate(delegation: Delegation, memo: String): Stake.UndelegateParams { return Stake.UndelegateParams( asset, from, amount, delegation, + memo, ) } - fun redelegate(destinationValidator: DelegationValidator, delegation: Delegation): Stake.RedelegateParams { + fun redelegate(destinationValidator: DelegationValidator, delegation: Delegation, memo: String): Stake.RedelegateParams { return Stake.RedelegateParams( asset, from = from, @@ -135,6 +136,7 @@ sealed class ConfirmParams() { destinationValidator, delegation.base.shares, delegation.base.balance, + memo, ) } @@ -452,7 +454,11 @@ sealed class ConfirmParams() { @Serializable(BigIntegerSerializer::class) override val amount: BigInteger, val validator: DelegationValidator, override val useMaxAmount: Boolean = false, + val memo: String, ) : Stake() { + + override fun memo(): String = memo + override val shouldIgnoreValueCheck: Boolean get() = false @@ -495,6 +501,7 @@ sealed class ConfirmParams() { override val from: Account, @Serializable(BigIntegerSerializer::class) override val amount: BigInteger, val delegation: Delegation, + val memo: String, ) : Stake() { override val useMaxAmount: Boolean get() = false @@ -512,6 +519,8 @@ sealed class ConfirmParams() { override fun destination(): DestinationAddress { return DestinationAddress(delegation.validator.id) } + + override fun memo(): String = memo } @Serializable @@ -523,6 +532,7 @@ sealed class ConfirmParams() { val destinationValidator: DelegationValidator, val share: String?, val balance: String?, + val memo: String, ) : Stake() { override val useMaxAmount: Boolean get() = false @@ -541,6 +551,8 @@ sealed class ConfirmParams() { override fun destination(): DestinationAddress { return DestinationAddress("") } + + override fun memo(): String = memo } @Serializable @@ -549,6 +561,7 @@ sealed class ConfirmParams() { override val from: Account, val validators: List, @Serializable(BigIntegerSerializer::class) override val amount: BigInteger, + val memo: String, ) : Stake() { override val useMaxAmount: Boolean get() = false @@ -566,6 +579,8 @@ sealed class ConfirmParams() { override fun destination(): DestinationAddress { return DestinationAddress("") } + + override fun memo(): String = memo } @Serializable diff --git a/android/gemcore/src/testFixtures/kotlin/com/gemwallet/android/testkit/StakeMemoMock.kt b/android/gemcore/src/testFixtures/kotlin/com/gemwallet/android/testkit/StakeMemoMock.kt new file mode 100644 index 0000000000..36e5e49700 --- /dev/null +++ b/android/gemcore/src/testFixtures/kotlin/com/gemwallet/android/testkit/StakeMemoMock.kt @@ -0,0 +1,3 @@ +package com.gemwallet.android.testkit + +const val TEST_STAKE_MEMO = "Test stake memo" diff --git a/core b/core index 4bb5d13f21..27999c0ef9 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 4bb5d13f210b4f78345108e92b9a77ce10ca39de +Subproject commit 27999c0ef9f36b402fc2f2ecc71f1af51c8c1a4d diff --git a/ios/Packages/Signer/Sources/Chains/CosmosSigner.swift b/ios/Packages/Signer/Sources/Chains/CosmosSigner.swift deleted file mode 100644 index 8c2feb2bdf..0000000000 --- a/ios/Packages/Signer/Sources/Chains/CosmosSigner.swift +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright (c). Gem Wallet. All rights reserved. - -import Foundation -import Primitives -import WalletCore - -/// https://github.com/trustwallet/wallet-core/blob/master/swift/Tests/Blockchains/THORChainTests.swift#L27 -struct CosmosSigner: Signable { - func signTransfer(input: SignerInput, privateKey: Data) throws -> String { - let chain = try CosmosChain.from(string: input.asset.chain.rawValue) - let message = getTransferMessage(input: input, denom: chain.denom.rawValue) - return try sign(input: input, messages: [message], chain: chain, memo: input.memo, privateKey: privateKey) - } - - func signTokenTransfer(input: SignerInput, privateKey: Data) throws -> String { - let chain = try CosmosChain.from(string: input.asset.chain.rawValue) - let denom = try input.asset.getTokenId() - let message = getTransferMessage(input: input, denom: denom) - return try sign(input: input, messages: [message], chain: chain, memo: input.memo, privateKey: privateKey) - } - - private func sign(input: SignerInput, messages: [CosmosMessage], chain: CosmosChain, memo: String?, privateKey: Data) throws -> String { - let fee = switch chain { - case .cosmos, - .osmosis, - .celestia, - .injective, - .sei, - .noble: - CosmosFee.with { - $0.gas = UInt64(messages.count * input.fee.gasLimit.asInt) - $0.amounts = [CosmosAmount.with { - $0.amount = input.fee.fee.description - $0.denom = chain.denom.rawValue - }] - } - case .thorchain: - CosmosFee.with { - $0.gas = UInt64(messages.count * input.fee.gasLimit.asInt) - } - } - - let signerInput = try CosmosSigningInput.with { - $0.mode = .sync - $0.accountNumber = try UInt64(input.metadata.getAccountNumber()) - $0.chainID = try input.metadata.getChainId() - $0.memo = memo.valueOrEmpty - $0.sequence = try input.metadata.getSequence() - $0.messages = messages - $0.fee = fee - $0.privateKey = privateKey - $0.signingMode = .protobuf - } - - let output: CosmosSigningOutput = AnySigner.sign(input: signerInput, coin: input.coinType) - - if !output.errorMessage.isEmpty { - throw AnyError(output.errorMessage) - } - - return output.serialized - } - - func signSwap(input: SignerInput, privateKey: Data) throws -> [String] { - try ChainSigner(chain: input.asset.chain).signSwap(input: input, privateKey: privateKey) - } - - func signData(input _: Primitives.SignerInput, privateKey _: Data) throws -> String { - fatalError() - } - - func signStake(input: SignerInput, privateKey: Data) throws -> [String] { - guard case let .stake(_, type) = input.type else { - throw AnyError("invalid type") - } - let messages: [CosmosMessage] - let chain = try CosmosChain.from(string: input.asset.chain.rawValue) - let denom = chain.denom.rawValue - switch type { - case let .stake(validator): - let amount = getAmount(input: input, denom: denom) - messages = [ - getStakeMessage(delegatorAddress: input.senderAddress, validatorAddress: validator.id, amount: amount), - ] - case let .unstake(delegation): - let amount = getAmount(input: input, denom: denom) - messages = getRewardMessage(delegatorAddress: input.senderAddress, validators: [delegation.validator]) + [ - getUnstakeMessage(delegatorAddress: input.senderAddress, validatorAddress: delegation.validator.id, amount: amount), - ] - case let .redelegate(data): - let amount = getAmount(input: input, denom: denom) - messages = getRewardMessage(delegatorAddress: input.senderAddress, validators: [data.delegation.validator]) + [ - getRedelegateMessage( - delegatorAddress: input.senderAddress, - validatorSourceAddress: data.delegation.validator.id, - validatorDestinationAddress: data.toValidator.id, - amount: amount, - ), - ] - case let .rewards(validators): - messages = getRewardMessage(delegatorAddress: input.senderAddress, validators: validators) - case .withdraw: - fatalError() - case .freeze, .unfreeze: - throw AnyError("Cosmos does not support freeze operations") - } - - return try [ - sign(input: input, messages: messages, chain: chain, memo: input.memo, privateKey: privateKey), - ] - } - - func getUnstakeMessage(delegatorAddress: String, validatorAddress: String, amount: CosmosAmount) -> CosmosMessage { - .with { - $0.unstakeMessage = .with { - $0.amount = amount - $0.delegatorAddress = delegatorAddress - $0.validatorAddress = validatorAddress - } - } - } - - func getRedelegateMessage(delegatorAddress: String, validatorSourceAddress: String, validatorDestinationAddress: String, amount: CosmosAmount) -> CosmosMessage { - .with { - $0.restakeMessage = .with { - $0.amount = amount - $0.delegatorAddress = delegatorAddress - $0.validatorSrcAddress = validatorSourceAddress - $0.validatorDstAddress = validatorDestinationAddress - } - } - } - - func getStakeMessage(delegatorAddress: String, validatorAddress: String, amount: CosmosAmount) -> CosmosMessage { - .with { - $0.stakeMessage = .with { - $0.amount = amount - $0.delegatorAddress = delegatorAddress - $0.validatorAddress = validatorAddress - } - } - } - - func getRewardMessage(delegatorAddress: String, validators: [DelegationValidator]) -> [CosmosMessage] { - validators.map { validator in - .with { - $0.withdrawStakeRewardMessage = .with { - $0.delegatorAddress = delegatorAddress - $0.validatorAddress = validator.id - } - } - } - } - - func getAmount(input: SignerInput, denom: String) -> CosmosAmount { - CosmosAmount.with { - $0.amount = input.value.description - $0.denom = denom - } - } - - func getTransferMessage(input: SignerInput, denom: String) -> CosmosMessage { - let amounts = [getAmount(input: input, denom: denom)] - - return CosmosMessage.with { - $0.sendCoinsMessage = CosmosMessage.Send.with { - $0.fromAddress = input.senderAddress - $0.toAddress = input.destinationAddress - $0.amounts = amounts - } - } - } -} diff --git a/ios/Packages/Signer/Sources/Signer.swift b/ios/Packages/Signer/Sources/Signer.swift index afe4c95b99..f4bde66fdd 100644 --- a/ios/Packages/Signer/Sources/Signer.swift +++ b/ios/Packages/Signer/Sources/Signer.swift @@ -75,8 +75,7 @@ public struct Signer: Sendable { func signer(for chain: Chain) -> Signable { switch chain.type { case .solana: SolanaSigner() - case .ethereum, .sui, .hyperCore, .aptos, .near, .stellar, .algorand, .ton: ChainSigner(chain: chain) - case .cosmos: CosmosSigner() + case .ethereum, .sui, .hyperCore, .aptos, .near, .stellar, .algorand, .ton, .cosmos: ChainSigner(chain: chain) case .tron: TronSigner() case .bitcoin: BitcoinSigner() case .xrp: XrpSigner()