diff --git a/.papi/metadata/ksmEnc.scale b/.papi/metadata/ksmEnc.scale new file mode 100644 index 0000000..a987410 Binary files /dev/null and b/.papi/metadata/ksmEnc.scale differ diff --git a/.papi/polkadot-api.json b/.papi/polkadot-api.json index b2ee490..90d4d47 100644 --- a/.papi/polkadot-api.json +++ b/.papi/polkadot-api.json @@ -33,6 +33,11 @@ "pasAh": { "chain": "paseo_asset_hub", "metadata": ".papi/metadata/pasAh.scale" + }, + "ksmEnc": { + "chain": "ksmcc3_encointer", + "wsUrl": "wss://kusama.api.encointer.org", + "metadata": ".papi/metadata/ksmEnc.scale" } } } diff --git a/src/api/chains.ts b/src/api/chains.ts index 92c4e83..1b2dd76 100644 --- a/src/api/chains.ts +++ b/src/api/chains.ts @@ -27,6 +27,7 @@ export const CHAIN_NAMES: Record = { dotAh: "Polkadot AssetHub", ksm: "Kusama RelayChain", ksmAh: "Kusama AssetHub", + ksmEnc: "Kusama Encointer", wnd: "Westend RelayChain", wndAh: "Westend AssetHub", pas: "Paseo RelayChain", diff --git a/src/api/clients/index.ts b/src/api/clients/index.ts index 053f6cd..3f245ca 100644 --- a/src/api/clients/index.ts +++ b/src/api/clients/index.ts @@ -3,6 +3,7 @@ export { dotAhClient } from "./dotAh" export { ksmClient } from "./ksm" export { ksmAhClient } from "./ksmAh" +export { ksmEncClient } from "./ksmEnc" export { wndClient } from "./wnd" export { wndAhClient } from "./wndAh" diff --git a/src/api/clients/ksmEnc.ts b/src/api/clients/ksmEnc.ts new file mode 100644 index 0000000..539d050 --- /dev/null +++ b/src/api/clients/ksmEnc.ts @@ -0,0 +1,13 @@ +import { createClient } from "polkadot-api" +import { getSmProvider } from "polkadot-api/sm-provider" +import { smoldot } from "./smoldot" +import { ksmRelayChain } from "./ksm" + +const smoldotParaChain = Promise.all([ + ksmRelayChain, + import("polkadot-api/chains/ksmcc3_encointer"), +]).then(([relayChain, { chainSpec }]) => + smoldot.addChain({ chainSpec, potentialRelayChains: [relayChain] }), +) + +export const ksmEncClient = createClient(getSmProvider(smoldotParaChain)) diff --git a/src/api/common.ts b/src/api/common.ts index c89f5eb..ee2b44a 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -53,6 +53,21 @@ export const fromRelayToAssetHub = ( weight_limit: XcmV3WeightLimit.Unlimited(), }) +export const fromRelayToEncointer = ( + from: PolkadotSigner, + amount: bigint, + to?: SS58String, +) => ({ + dest: XcmVersionedLocation.V4({ + parents: 0, + interior: XcmV3Junctions.X1(XcmV3Junction.Parachain(1001)), + }), + beneficiary: getBeneficiary(to ?? from.publicKey), + assets: getNativeAsset(0, amount), + fee_asset_item: 0, + weight_limit: XcmV3WeightLimit.Unlimited(), +}) + export const fromAssetHubToRelay = ( from: PolkadotSigner, amount: bigint, @@ -68,6 +83,21 @@ export const fromAssetHubToRelay = ( weight_limit: XcmV3WeightLimit.Unlimited(), }) +export const fromEncointerToRelay = ( + from: PolkadotSigner, + amount: bigint, + to?: SS58String, +) => ({ + dest: XcmVersionedLocation.V4({ + parents: 1, + interior: XcmV3Junctions.Here(), + }), + beneficiary: getBeneficiary(to ?? from.publicKey), + assets: getNativeAsset(1, amount), + fee_asset_item: 0, + weight_limit: XcmV3WeightLimit.Unlimited(), +}) + export const fromAssetHubToForeign = ( network: XcmV3JunctionNetworkId, parachainId: number, @@ -88,6 +118,26 @@ export const fromAssetHubToForeign = ( weight_limit: XcmV3WeightLimit.Unlimited(), }) +export const fromEncointerToForeign = ( + network: XcmV3JunctionNetworkId, + parachainId: number, + assets: XcmVersionedAssets, + from: PolkadotSigner, + to?: SS58String, +) => ({ + dest: XcmVersionedLocation.V4({ + parents: 2, + interior: XcmV3Junctions.X2([ + XcmV3Junction.GlobalConsensus(network), + XcmV3Junction.Parachain(parachainId), + ]), + }), + beneficiary: getBeneficiary(to ?? from.publicKey), + assets, + fee_asset_item: 0, + weight_limit: XcmV3WeightLimit.Unlimited(), +}) + type GenericApi = TypedApi export const watchAccoutFreeBalance = (api: { diff --git a/src/api/ksm/enc.ts b/src/api/ksm/enc.ts new file mode 100644 index 0000000..8f7d73b --- /dev/null +++ b/src/api/ksm/enc.ts @@ -0,0 +1,36 @@ +import { + XcmV3JunctionNetworkId, + ksmEnc, +} from "@polkadot-api/descriptors" +import { ksmEncClient } from "@/api/clients" +import { AssetInChain } from "../types" +import { + fromEncointerToForeign, + fromEncointerToRelay, + getNativeAsset, + watchAccoutFreeBalance, +} from "../common" + +const api = ksmEncClient.getTypedApi(ksmEnc) + +const ksm: AssetInChain = { + chain: "ksmEnc", + symbol: "KSM", + watchFreeBalance: watchAccoutFreeBalance(api), + teleport: { + ksm: (...args) => + api.tx.PolkadotXcm.transfer_assets(fromEncointerToRelay(...args)), + dotAh: (from, amount, to) => + api.tx.PolkadotXcm.transfer_assets( + fromEncointerToForeign( + XcmV3JunctionNetworkId.Polkadot(), + 1000, + getNativeAsset(1, amount), + from, + to, + ), + ), + }, +} + +export default [ksm] diff --git a/src/api/ksm/index.ts b/src/api/ksm/index.ts index 2b9dd85..9ee5fcb 100644 --- a/src/api/ksm/index.ts +++ b/src/api/ksm/index.ts @@ -1,4 +1,5 @@ import relay from "./relay" import ah from "./ah" +import enc from "./enc" -export default [...relay, ...ah] +export default [...relay, ...ah, ...enc] diff --git a/src/api/ksm/relay.ts b/src/api/ksm/relay.ts index 18aefbf..56e6b03 100644 --- a/src/api/ksm/relay.ts +++ b/src/api/ksm/relay.ts @@ -1,7 +1,7 @@ import { ksm as descriptors } from "@polkadot-api/descriptors" import { ksmClient } from "@/api/clients" import { AssetInChain } from "../types" -import { fromRelayToAssetHub, watchAccoutFreeBalance } from "../common" +import { fromRelayToAssetHub, fromRelayToEncointer, watchAccoutFreeBalance } from "../common" const api = ksmClient.getTypedApi(descriptors) @@ -12,6 +12,8 @@ const ksm: AssetInChain = { teleport: { ksmAh: (...args) => api.tx.XcmPallet.transfer_assets(fromRelayToAssetHub(...args)), + ksmEnc: (...args) => + api.tx.XcmPallet.transfer_assets(fromRelayToEncointer(...args)), }, } diff --git a/src/api/types.ts b/src/api/types.ts index 5b9ce2d..79aadb3 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -8,6 +8,7 @@ export type ChainId = | "wndAh" | "ksm" | "ksmAh" + | "ksmEnc" | "pas" | "pasAh" export type AssetId = "DOT" | "KSM" | "WND" | "PAS"