diff --git a/README-es.md b/README-es.md index 9fdfa311..64b83dd0 100644 --- a/README-es.md +++ b/README-es.md @@ -253,6 +253,10 @@ Para agregar una nueva cadena, go to **Configuracion > General > Adminsitrar red ![add-network-5](./images/add-network-5.png) +## Probar Transferencias XCM +Puedes transferir ROC de Rococo a AssetHub. Ve a Ajustes > General y activa la opción "Mostrar redes de prueba", luego cambia a Rococo y ya podrás transferir a AssetHub: + +![xcm-transfer](./images/test-xcm.png) ## Registro de cambios diff --git a/README.md b/README.md index b9a15381..b6e1c0cf 100644 --- a/README.md +++ b/README.md @@ -257,6 +257,12 @@ To add a new network, go to **Settings > General > Manage networks > New network ![add-network-5](./images/add-network-5.png) +## Test XCM Transfer +You can transfer ROC from Rococo to AssetHub. Go to Settings > General and activate the "Show testnets" option, then change to Rococo, and you're able to transfer to AssetHub: + +![xcm-transfer](./images/test-xcm.png) + + ## Change Log See [Changelog](CHANGELOG.md) for more information. diff --git a/images/test-xcm.png b/images/test-xcm.png new file mode 100644 index 00000000..65d58ce9 Binary files /dev/null and b/images/test-xcm.png differ diff --git a/package.json b/package.json index 99b75270..0d2abc52 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "kuma-wallet", "displayName": "Kuma Wallet", - "version": "0.3.6", + "version": "0.3.7", "description": "Kuma a cross-chain wallet that offers seamless management and transfer of assets between EVM and WASM chains.", "author": "Blockcoders Engineering ", "license": "MIT", diff --git a/public/images/assethub.png b/public/images/assethub.png new file mode 100644 index 00000000..371e68a1 Binary files /dev/null and b/public/images/assethub.png differ diff --git a/src/constants/chains.ts b/src/constants/chains.ts index 04e472af..c3695690 100644 --- a/src/constants/chains.ts +++ b/src/constants/chains.ts @@ -17,6 +17,14 @@ export const enum PARACHAINS { ACALA = "Acala", } +export const enum RELAY_CHAIN_TESTNETS { + ROCOCO = "Rococo", +} + +export const enum PARACHAINS_TESTNETS { + ROCOCO_ASSET_HUB = "Asset Hub (Rococo)", +} + export const POLKADOT_PARACHAINS = { ACALA: { name: PARACHAINS.ACALA, @@ -43,6 +51,13 @@ export const KUSAMA_PARACHAINS = { }, }; +export const ROCOCO_PARACHAINS = { + ASSET_HUB: { + name: PARACHAINS_TESTNETS.ROCOCO_ASSET_HUB, + id: 1000, + }, +}; + // MAINNETS export const POLKADOT = { name: "Polkadot", @@ -462,6 +477,29 @@ export const ROCOCO = { }, logo: "rococo", supportedAccounts: [WASM], + xcm: [PARACHAINS_TESTNETS.ROCOCO_ASSET_HUB], +}; + +export const ROCOCO_ASSET_HUB = { + name: "Asset Hub (Rococo)", + rpc: { + wasm: "wss://rococo-asset-hub-rpc.polkadot.io", + }, + addressPrefix: 2, + nativeCurrency: { + name: "Rococo", + symbol: "ROC", + decimals: 12, + }, + explorer: { + wasm: { + name: "subscan", + url: "https://assethub-rococo.subscan.io/", + }, + }, + logo: "assethub", + supportedAccounts: [WASM], + xcm: [RELAY_CHAIN_TESTNETS.ROCOCO], }; export const WESTEND = { @@ -507,6 +545,7 @@ export const TESTNETS: Chain[] = [ SEPOLIA, MANDALA, ROCOCO, + ROCOCO_ASSET_HUB, WESTEND, ]; diff --git a/src/pages/balance/components/ConfirmChainChangeModal.tsx b/src/pages/balance/components/ConfirmChainChangeModal.tsx index ca9a4df0..a66cec27 100644 --- a/src/pages/balance/components/ConfirmChainChangeModal.tsx +++ b/src/pages/balance/components/ConfirmChainChangeModal.tsx @@ -6,7 +6,6 @@ import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { CREATE_ACCOUNT } from "@src/routes/paths"; import { Chain } from "@src/storage/entities/Chains"; -import { useThemeContext } from "@src/providers"; import { Button } from "@src/components/common"; interface ConfirmChainChangeModalProps { @@ -91,10 +90,10 @@ export const ConfirmChainChangeModal: FC = ({

{needToCreateAccount ? t("chain_selector.create_or_import_warning", { - supported_type: tCommon( - `${chainType?.toLowerCase()}_type` - ), - }) + supported_type: tCommon( + `${chainType?.toLowerCase()}_type` + ), + }) : t("chain_selector.network_change_warning")}

diff --git a/src/xcm/assets.ts b/src/xcm/assets.ts index f2bbf204..b76b5b07 100644 --- a/src/xcm/assets.ts +++ b/src/xcm/assets.ts @@ -1,9 +1,10 @@ -import { PARACHAINS } from "@src/constants/chains"; +import { PARACHAINS, PARACHAINS_TESTNETS } from "@src/constants/chains"; import { MOONBEAM_ASSETS_MAPPING, ASTAR_ASSETS_MAPPING, ACALA_ASSETS_MAPPING, SHIDEN_ASSETS_MAPPING, + ROCOCO_ASSET_HUB_ASSETS_MAPPING, } from "./chains"; interface IXCM_ASSETS_MAPPING { @@ -18,4 +19,7 @@ export const XCM_ASSETS_MAPPING: IXCM_ASSETS_MAPPING = { [PARACHAINS.ACALA]: ACALA_ASSETS_MAPPING, [PARACHAINS.MOONRIVER]: MOONBEAM_ASSETS_MAPPING, [PARACHAINS.SHIDEN]: SHIDEN_ASSETS_MAPPING, + + // testnest + [PARACHAINS_TESTNETS.ROCOCO_ASSET_HUB]: ROCOCO_ASSET_HUB_ASSETS_MAPPING, }; diff --git a/src/xcm/chains/index.ts b/src/xcm/chains/index.ts index ef8f7594..20a96817 100644 --- a/src/xcm/chains/index.ts +++ b/src/xcm/chains/index.ts @@ -5,3 +5,7 @@ export * from "./acala"; export * from "./astar"; export * from "./shiden"; export * from "./moonriver"; + +// testnests +export * from "./rococo"; +export * from "./rococo-asset-hub"; diff --git a/src/xcm/chains/rococo-asset-hub.ts b/src/xcm/chains/rococo-asset-hub.ts new file mode 100644 index 00000000..d738195b --- /dev/null +++ b/src/xcm/chains/rococo-asset-hub.ts @@ -0,0 +1,35 @@ +import { RELAY_CHAIN_TESTNETS } from "@src/constants/chains"; +import { Map } from "../interfaces"; +import { XCM, getAssets, getBeneficiary, getDest } from "../utils"; + +export const ROCOCO_ASSET_HUB_EXTRINSICS: { [key: string]: Map } = { + [RELAY_CHAIN_TESTNETS.ROCOCO]: ({ address, amount }) => ({ + pallet: XCM.pallets.POLKADOT_XCM.NAME, + method: XCM.pallets.POLKADOT_XCM.methods.LIMITED_TELEPORT_ASSETS, + extrinsicValues: { + dest: getDest({ + parents: 1, + version: "V3", + }), + beneficiary: getBeneficiary({ + address, + version: "V3", + }), + assets: getAssets({ + fungible: amount, + parents: 1, + version: "V3", + }), + feeAssetItem: 0, + destWeightLimit: "Unlimited", + }, + }), +}; + +enum ASSET_HUB_ASSETS { + ROC = "ROC", +} + +export const ROCOCO_ASSET_HUB_ASSETS_MAPPING = { + [RELAY_CHAIN_TESTNETS.ROCOCO]: [ASSET_HUB_ASSETS.ROC], +}; diff --git a/src/xcm/chains/rococo.ts b/src/xcm/chains/rococo.ts new file mode 100644 index 00000000..54732062 --- /dev/null +++ b/src/xcm/chains/rococo.ts @@ -0,0 +1,36 @@ +import { PARACHAINS_TESTNETS, ROCOCO_PARACHAINS } from "@src/constants/chains"; +import { Map } from "../interfaces"; +import { + XCM, + XCM_DEFAULT_VERSIONS, + getAssets, + getBeneficiary, + getDest, +} from "../utils"; + +export const ROCOCO_EXTRINSICS: { [key: string]: Map } = { + [PARACHAINS_TESTNETS.ROCOCO_ASSET_HUB]: ({ + address, + amount, + xcmPalletVersion, + }) => ({ + pallet: XCM.pallets.XCM_PALLET.NAME, + method: XCM.pallets.XCM_PALLET.methods.LIMITED_TELEPORT_ASSETS, + extrinsicValues: { + dest: getDest({ + parachainId: ROCOCO_PARACHAINS.ASSET_HUB.id, + version: XCM_DEFAULT_VERSIONS[xcmPalletVersion], + }), + beneficiary: getBeneficiary({ + address, + version: XCM_DEFAULT_VERSIONS[xcmPalletVersion], + }), + assets: getAssets({ + fungible: amount, + version: XCM_DEFAULT_VERSIONS[xcmPalletVersion], + }), + feeAssetItem: 0, + destWeightLimit: "Unlimited", + }, + }), +}; diff --git a/src/xcm/extrinsics.ts b/src/xcm/extrinsics.ts index 14ddf479..0625ea6d 100644 --- a/src/xcm/extrinsics.ts +++ b/src/xcm/extrinsics.ts @@ -1,4 +1,9 @@ -import { PARACHAINS, RELAY_CHAINS } from "@src/constants/chains"; +import { + PARACHAINS, + PARACHAINS_TESTNETS, + RELAY_CHAINS, + RELAY_CHAIN_TESTNETS, +} from "@src/constants/chains"; import { IXCM_MAPPING } from "./interfaces"; import { POLKADOT_EXTRINSICS, @@ -8,20 +13,20 @@ import { ASTAR_EXTRINSICS, SHIDEN_EXTRINSICS, MOONRIVER_EXTRINSICS, + ROCOCO_EXTRINSICS, + ROCOCO_ASSET_HUB_EXTRINSICS, } from "./chains"; export const XCM_MAPPING: IXCM_MAPPING = { [RELAY_CHAINS.POLKADOT]: POLKADOT_EXTRINSICS, - [RELAY_CHAINS.KUSAMA]: KUSAMA_EXTRINSICS, - [PARACHAINS.MOONBEAM]: MOONBEAM_EXTRINSICS, - [PARACHAINS.ACALA]: ACALA_EXTRINSICS, - [PARACHAINS.ASTAR]: ASTAR_EXTRINSICS, - [PARACHAINS.MOONRIVER]: MOONRIVER_EXTRINSICS, - [PARACHAINS.SHIDEN]: SHIDEN_EXTRINSICS, + + // testnest + [RELAY_CHAIN_TESTNETS.ROCOCO]: ROCOCO_EXTRINSICS, + [PARACHAINS_TESTNETS.ROCOCO_ASSET_HUB]: ROCOCO_ASSET_HUB_EXTRINSICS, }; diff --git a/src/xcm/utils.ts b/src/xcm/utils.ts index f50f48c6..fa340ec9 100644 --- a/src/xcm/utils.ts +++ b/src/xcm/utils.ts @@ -126,6 +126,7 @@ export const XCM = { methods: { RESERVE_TRANSFER_ASSETS: "reserveTransferAssets", LIMITED_RESERVE_TRANSFER_ASSETS: "limitedReserveTransferAssets", + LIMITED_TELEPORT_ASSETS: "limitedTeleportAssets", }, }, POLKADOT_XCM: { @@ -134,6 +135,7 @@ export const XCM = { RESERVE_WITHDRAW_ASSETS: "reserveWithdrawAssets", RESERVE_TRANSFER_ASSETS: "reserveTransferAssets", LIMITED_RESERVE_TRANSFER_ASSETS: "limitedReserveTransferAssets", + LIMITED_TELEPORT_ASSETS: "limitedTeleportAssets", }, }, X_TOKENS: {