diff --git a/.papi/metadata/ksmEnc.scale b/.papi/metadata/ksmEnc.scale new file mode 100644 index 0000000..ae8cded Binary files /dev/null and b/.papi/metadata/ksmEnc.scale differ diff --git a/.papi/polkadot-api.json b/.papi/polkadot-api.json index 27d4f56..c669716 100644 --- a/.papi/polkadot-api.json +++ b/.papi/polkadot-api.json @@ -41,6 +41,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 6aff8c5..bb3f171 100644 --- a/src/api/chains.ts +++ b/src/api/chains.ts @@ -29,6 +29,7 @@ export const CHAIN_NAMES: Record = { dotAh: "Polkadot AssetHub", ksm: "Kusama RelayChain", ksmAh: "Kusama AssetHub", + ksmEnc: "Kusama Encointer", wnd: "Westend RelayChain", wndAh: "Westend AssetHub", roc: "Rococo RelayChain", diff --git a/src/api/clients/index.ts b/src/api/clients/index.ts index f9272fb..6ccd8ed 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 85387f1..1bdaa7e 100644 --- a/src/api/common.ts +++ b/src/api/common.ts @@ -60,6 +60,21 @@ export const fromRelayToAssetHub = ( weight_limit: XcmV3WeightLimit.Unlimited(), }) +export const fromRelayToEncointer = ( + from: PolkadotSigner, + amount: bigint, + to?: SS58String, +) => ({ + dest: XcmVersionedLocation.V3({ + 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, @@ -81,6 +96,27 @@ export const fromAssetHubToRelay = ( weight_limit: XcmV3WeightLimit.Unlimited(), }) +export const fromEncointerToRelay = ( + from: PolkadotSigner, + amount: bigint, + to?: SS58String, +) => ({ + dest: { + type: "V3" as const, + value: { + parents: 1, + interior: { + type: "Here" as const, + value: undefined, + }, + }, + }, + beneficiary: getBeneficiary(to ?? from.publicKey), + assets: getNativeAsset(1, amount), + fee_asset_item: 0, + weight_limit: XcmV3WeightLimit.Unlimited(), +}) + export const fromAssetHubToForeign = ( network: XcmV3JunctionNetworkId, parachainId: number, @@ -101,6 +137,26 @@ export const fromAssetHubToForeign = ( weight_limit: XcmV3WeightLimit.Unlimited(), }) +export const fromEncointerToForeign = ( + network: XcmV3JunctionNetworkId, + parachainId: number, + assets: XcmVersionedAssets, + from: PolkadotSigner, + to?: SS58String, +) => ({ + dest: XcmVersionedLocation.V3({ + 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(), +}) + /* export const toAssetHub = ( from: PolkadotSigner, diff --git a/src/api/ksm/enc.ts b/src/api/ksm/enc.ts new file mode 100644 index 0000000..4d25306 --- /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.limited_teleport_assets(fromEncointerToRelay(...args)), + dotAh: (from, amount, to) => + api.tx.PolkadotXcm.limited_reserve_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 9f3271a..42fb918 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.limited_teleport_assets(fromRelayToAssetHub(...args)), + ksmEnc: (...args) => + api.tx.XcmPallet.limited_teleport_assets(fromRelayToEncointer(...args)), }, } diff --git a/src/api/types.ts b/src/api/types.ts index 474a0c3..0fa0fb4 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -8,6 +8,7 @@ export type ChainId = | "wndAh" | "ksm" | "ksmAh" + | "ksmEnc" | "roc" | "rocAh" | "pas"