Skip to content

Commit 33912f1

Browse files
0xh3rmangemcoder21
andauthored
Refactor thorchain and add mayachain swap (#450)
* refactor thorchain and add mayachain swap * Add Mayachain support across platforms Introduce Mayachain (maya) as a supported chain across Android, iOS and core Rust crates. Add chain enums, denom (cacao), native asset (CACAO), chain config, node and settings entries, and block explorer integration. Update signer, transaction encoding, fee/base fee and fee-rate logic to include Mayachain where it follows Thorchain behavior. Wire up swapper/THORChain mappings, provider factory, address conversion, tests and UI assets (SVG/xcassets) for Android and iOS. Also include minor Swift/formatting/test fixes unrelated to chain addition. --------- Co-authored-by: gemcoder21 <104884878+gemcoder21@users.noreply.github.com>
1 parent 93222e8 commit 33912f1

63 files changed

Lines changed: 512 additions & 154 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 12 additions & 0 deletions
Loading

android/blockchain/src/androidTest/kotlin/com/gemwallet/android/blockchain/operators/TestCreateAccountOperator.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.gemwallet.android.blockchain.operators
22

33
import com.gemwallet.android.blockchain.includeLibs
44
import com.gemwallet.android.blockchain.operators.walletcore.WCCreateAccountOperator
5+
import com.gemwallet.android.ext.available
56
import com.gemwallet.android.testkit.LOCAL_KEYSTORE_TEST_PHRASE
67
import com.gemwallet.android.testkit.TEST_PHRASE
78
import com.wallet.core.primitives.Chain
@@ -48,7 +49,7 @@ class TestCreateAccountOperator {
4849
fun testCreate_account_derive_address_matches_ios_local_keystore() {
4950
val operator = WCCreateAccountOperator()
5051

51-
Chain.entries.forEach { chain ->
52+
Chain.available().forEach { chain ->
5253
val account = operator(
5354
walletType = WalletType.Multicoin,
5455
data = LOCAL_KEYSTORE_TEST_PHRASE,
@@ -94,6 +95,7 @@ class TestCreateAccountOperator {
9495
Chain.Stable -> "0x8f348F300873Fd5DA36950B2aC75a26584584feE"
9596
Chain.Solana -> "57mwmnV2rFuVDmhiJEjonD7cfuFtcaP9QvYNGfDEWK71"
9697
Chain.Thorchain -> "thor1c8jd7ad9pcw4k3wkuqlkz4auv95mldr2kyhc65"
98+
Chain.Mayachain -> error("Mayachain accounts are not derived")
9799
Chain.Cosmos -> "cosmos142j9u5eaduzd7faumygud6ruhdwme98qsy2ekn"
98100
Chain.Osmosis -> "osmo142j9u5eaduzd7faumygud6ruhdwme98qclefqp"
99101
Chain.Ton -> "UQDgEMqToTacHic7SnvnPFmvceG5auFkCcAw0mSCvzvKUaT4"

android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/gemstone/GemSwapProviderMapper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ internal fun SwapProvider.toGem(): SwapperProvider = when (this) {
2525
SwapProvider.Hyperliquid -> SwapperProvider.HYPERLIQUID
2626
SwapProvider.Orca -> SwapperProvider.ORCA
2727
SwapProvider.Squid -> SwapperProvider.SQUID
28+
SwapProvider.Mayachain -> SwapperProvider.MAYACHAIN
2829
}

android/blockchain/src/main/kotlin/com/gemwallet/android/blockchain/operators/walletcore/WCChainTypeProxy.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class WCChainTypeProxy : ChainTypeProxy<CoinType> {
2929
Chain.Solana -> CoinType.SOLANA
3030
Chain.Polygon -> CoinType.POLYGON
3131
Chain.Thorchain -> CoinType.THORCHAIN
32+
Chain.Mayachain -> CoinType.THORCHAIN
3233
Chain.Cosmos -> CoinType.COSMOS
3334
Chain.Osmosis -> CoinType.OSMOSIS
3435
Chain.Arbitrum -> CoinType.ARBITRUM

android/data/repositories/src/main/kotlin/com/gemwallet/android/data/repositories/wallets/WalletsRepositoryImpl.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.gemwallet.android.data.service.store.database.entities.toDTO
1212
import com.gemwallet.android.data.service.store.database.entities.toRecord
1313
import com.gemwallet.android.domains.asset.defaultBasic
1414
import com.gemwallet.android.ext.asset
15+
import com.gemwallet.android.ext.available
1516
import com.wallet.core.primitives.Account
1617
import com.wallet.core.primitives.Chain
1718
import com.wallet.core.primitives.Wallet
@@ -79,10 +80,11 @@ class WalletsRepositoryImpl @Inject constructor(
7980
source: WalletSource
8081
): Wallet {
8182
val accounts = mutableListOf<Account>()
83+
val availableChains = Chain.available()
8284
val chains =
8385
if ((type == WalletType.Single || type == WalletType.PrivateKey) && chain != null) listOf(
8486
chain
85-
) else Chain.entries
87+
) else Chain.entries.filter(availableChains::contains)
8688
for (item in chains) {
8789
accounts.add(createAccount(type, data, item))
8890
}

android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/IconUrlGeneration.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ fun SwapperProvider.getSwapProviderIcon(): String {
9696
SwapperProvider.UNISWAP_V3 -> "uniswap"
9797
SwapperProvider.PANCAKESWAP_V3 -> "pancakeswap"
9898
SwapperProvider.THORCHAIN -> "thorchain"
99+
SwapperProvider.MAYACHAIN -> return Chain.Mayachain.getIconUrl()
99100
SwapperProvider.JUPITER -> "jupiter"
100101
SwapperProvider.ACROSS -> "across"
101102
SwapperProvider.OKU -> "oku"

android/gemcore/src/main/kotlin/com/gemwallet/android/ext/Chain.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ fun Chain.assetType(): AssetType? {
7272
Chain.Polkadot,
7373
Chain.Cardano,
7474
Chain.Zcash,
75-
Chain.Near
75+
Chain.Near,
76+
Chain.Mayachain
7677
-> null
7778
}
7879
}
@@ -130,7 +131,7 @@ fun Chain.Companion.findByString(value: String): Chain? {
130131
return Chain.entries.firstOrNull{ it.string == value}
131132
}
132133

133-
fun Chain.Companion.available() = Chain.entries.toSet()
134+
fun Chain.Companion.available() = Chain.entries.filterNot { it == Chain.Mayachain }.toSet()
134135

135136
fun List<Chain>.filter(query: String): List<Chain> {
136137
return filter {
@@ -161,6 +162,7 @@ fun Chain.toChainType(): ChainType {
161162
Chain.Zcash,
162163
Chain.Litecoin -> ChainType.Bitcoin
163164
Chain.Thorchain,
165+
Chain.Mayachain,
164166
Chain.Osmosis,
165167
Chain.Celestia,
166168
Chain.Injective,

android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/Chain.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ enum class Chain(val string: String) {
2525
Polygon("polygon"),
2626
@SerialName("thorchain")
2727
Thorchain("thorchain"),
28+
@SerialName("mayachain")
29+
Mayachain("mayachain"),
2830
@SerialName("cosmos")
2931
Cosmos("cosmos"),
3032
@SerialName("osmosis")

android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/ChainCosmos.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ enum class CosmosChain(val string: String) {
1717
Celestia("celestia"),
1818
@SerialName("thorchain")
1919
Thorchain("thorchain"),
20+
@SerialName("mayachain")
21+
Mayachain("mayachain"),
2022
@SerialName("injective")
2123
Injective("injective"),
2224
@SerialName("sei")
@@ -29,6 +31,8 @@ enum class CosmosChain(val string: String) {
2931
enum class CosmosDenom(val string: String) {
3032
@SerialName("rune")
3133
Rune("rune"),
34+
@SerialName("cacao")
35+
Cacao("cacao"),
3236
@SerialName("uatom")
3337
Uatom("uatom"),
3438
@SerialName("uosmo")

android/gemcore/src/main/kotlin/com/wallet/core/primitives/generated/SwapProvider.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,7 @@ enum class SwapProvider(val string: String) {
5151
Orca("orca"),
5252
@SerialName("squid")
5353
Squid("squid"),
54+
@SerialName("mayachain")
55+
Mayachain("mayachain"),
5456
}
5557

0 commit comments

Comments
 (0)