XCM SDK es una herramienta que proporciona una interfaz para enviar mensajes XCM para cadenas de bloques basadas en Substrate. Esta biblioteca está escrita en Typescript, por lo que se puede importar en un conjunto completamente nuevo de aplicaciones o dApps que usan motores Javascript/Typescript como Node.js.
npm i xcm-sdk
// JavaScript
const { Provider } = require("xcm-sdk");
// TypeScript
import { Provider } from "xcm-sdk";
const provider = new Provider(rpc, sender);
Parametro | Descripcion |
---|---|
rpc | rpc URL |
sender | firmante de la transacción |
Si quieres firmar con Alice en un nodo local:
import { Keyring } from '@polkadot/keyring'
import { cryptoWaitReady } from '@polkadot/util-crypto'
const rpc = "ws://127.0.0.1:37345"; // ws del nodo local
await cryptoWaitReady();
const keyring = new Keyring({ type: "sr25519" });
const sender = keyring.addFromUri("//Alice");
const provider = new Provider(rpc, sender);
Si quieres firmar con una semilla mnemotécnica
import { Keyring } from '@polkadot/keyring'
const sender = keyring.addFromMnemonic("<your mnemonic seed here>");
Si quieres firmar con la extensión de polkadotjs
import { web3FromAddress, web3Accounts, web3Enable } from "@polkadot/extension-dapp";
const extensions = await web3Enable("<your app name>");
const accounts = await web3Accounts();
const accountId = accounts[0].address;
const injector = await web3FromAddress(accountId);
const provider = new Provider(rpc, accountId);
provider.setInjectorSigner(injector.signer);
Reserve Asset Transfer con los metodos reserveTransferAsset y LimitedReserveTransferAsset y Asset teleportation con los metodos teleportAsset y LimitedTeleportAsset.
provider.limitedReserveTransferAssets(params);
provider.reserveTransferAssets(params);
provider.limitedReserveTransferAssets(params);
provider.reserveTransferAssets(params);
Parametro | Descripcion |
---|---|
destination | El destino para transferir el activo. Si desea transferir activos de la cadena 'relay/principal' a una cadena 'parachain', configure 'Parachain'. Predeterminado 'Here'. |
destinationParents | 0 es el valor predeterminado, 1 cuando desea transferir de parachain a relaychain o de parachain a parachain |
destinationValue | El valor de destino, por ejemplo, una identificación de parachain |
beneficiary | objetivo del beneficiario, una accountId32 |
beneficiaryParents | 0 por defecto |
beneficiaryValue | El valor del beneficiario, la dirección de la cuenta para enviar el activo |
amount | cantidad de tokens a transferir |
assetId | El identificador del asset para transferir desde una parachain, asegúrese de que la parachain admita el activo y que la cuenta del remitente tenga suficientes activos para transferir |
weightLimit | Opcional, solo para métodos limitados. Establece el peso máximo para la transaccion |
Depende de la configuración de la parachain o la relay chain, debe usar la teletransportación de activos o la transferencia de activos de reserva. Asegúrese de saber qué método usar antes de ejecutar cualquier transferencia. Puedes buscar en cualquier escaneo para saber, por ejemplo rococo scan
Si quieres hacer pruebas en Testnet, tienes Rococo.
Consigue algunos activos: Rococo faucet
Los ejemplos están en ./examples/rococo/, puede poner tu configuración en ./examples/rococo/rococo-examples-util.ts. Luego puedes ejecutar un comando por cada ejemplo. Si quieres ejecutarlos de forma manual, debes crear tu propio script (.js o .ts) e importar las dependencias.
export const rococoExampleUtils = {
rococoRpc: 'wss://rococo-rpc.polkadot.io',
rockMineRpc: 'wss://rococo-rockmine-rpc.polkadot.io',
rockMineParachainId: 1000,
mangataParachainId: 2110,
daliParachainId: 2087,
senderMnemonic: '<your account mnemonic>',
rockmineDestinationAccount: '<rockmine address account>',
daliDestinationAccount: '<dali destination account>',
rococoDestinationAccount: '<rococo address account>',
mangataDestinationAccount: '<mangata address account>',
rocAmount: <amount to transfer>,
}
comando:
npx ts-node src/examples/rococo/rococo-to-rockmine.ts
manual:
const destination = "Parachain";
const destinationValue = 2000; // Rockmine parchain id
const beneficiary = "AccountId32";
const beneficiaryValue = "<rockmine account address>"; // account address
const amount = 1000000000000000;
const res = await provider.limitedTeleportAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
o
comando:
npx ts-node src/examples/rococo/rococo-to-rockmine-no-limited.ts
manual:
const destination = "Parachain"
const destinationValue = 2000 // Rockmine parchain id
const beneficiary = "AccountId32"
const beneficiaryValue = "<rockmine account address>" // account address
const amount = 1000000000000000
const res = await provider.teleportAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
comando:
npx ts-node src/examples/rococo/rockmine-to-rococo.ts
manual:
const destinationParents = 1; // Destination to Rococo
const beneficiary = "AccountId32";
const beneficiaryValue = "<rococo account address>"; // account address
const amount = 1000000000000000;
const res = await provider.limitedTeleportAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
El activo ROC en Mangata es el activo con id 4. Puedes chequear aquí, en "SELECTED STATE QUERY" selecciona tokens, luego en el campo u128 input pon 4.
comando:
npx ts-node src/examples/rococo/rococo-to-mangata-no-limited.ts
manual:
const destination = "Parachain"
const destinationValue = 2110 // Mangata parchain id
const beneficiary = "AccountId32"
const beneficiaryValue = "<mangata account address>" // account address
const amount = 1000000000000000
const res = await provider.reserveTransferAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
El sdk también tiene un método para hacer extrinsics personalizados definidos por el usuario. Puedes llamar a cualquier paleta y método y pasar un cuerpo personalizado a ese método por tu cuenta.
provider.customExtrinsic(params)
Parámetro | Descripción |
---|---|
asSudo | pase true si desea ejecutar el extrinsic como sudo, por defecto es false |
pallet | La paleta a llamar, por ejemplo "polkadotXcm", "xcmPallet" |
method | El método a llamar en la paleta, por ejemplo: "reserveTransferAssets" |
body | Los argumentos para el método, pueden ser un arreglo o un objeto |
Desde Rococo a Rockmine utilizando el cuerpo como objeto:
comando:
npx ts-node src/examples/custom-extrinsic/teleport-relaychain-to-parachain.ts
manual:
const pallet = "xcmPallet"
const method = "limitedTeleportAssets"
const body = {
dest: {
V1: {
parents: 0,
interior: {
X1: {
Parachain: 1000,
},
},
},
},
beneficiary: {
V1: {
parents: 0,
interior: {
X1: {
AccountId32: {
network: 'Any',
id: u8aToHex(decodeAddress("<rockmine address account>")),
},
},
},
},
},
assets: {
V1: [
{
id: {
Concrete: {
parents: 0,
interior: 'Here',
},
},
fun: {
Fungible: 100000000000,
},
},
],
},
feeAssetItem: 0,
weightLimit: 'Unlimited',
}
const res = await provider.customExtrinsic({
pallet,
method,
body,
})
De Rococo a Rockmine utilizando el cuerpo como un arreglo:
const pallet = "xcmPallet"
const method = "limitedTeleportAssets"
const body = [
// dest
{
V1: {
parents: 0,
interior: {
X1: {
Parachain: 1000,
},
},
},
},
// beneficiary
{
V1: {
parents: 0,
interior: {
X1: {
AccountId32: {
network: 'Any',
id: u8aToHex(decodeAddress("<rockmine address account>")),
},
},
},
},
},
// assets
{
V1: [
{
id: {
Concrete: {
parents: 0,
interior: 'Here',
},
},
fun: {
Fungible: 100000000000,
},
},
],
},
// feeAssetItem
0,
// weigthLimit
'Unlimited',
]
const res = await provider.customExtrinsic({
pallet,
method,
body,
})
De Rockmine a Rococo:
comando:
npx ts-node src/examples/custom-extrinsic/teleport-parachain-to-relay.ts
manual:
const pallet = 'xcmPallet'
const method = 'limitedTeleportAssets'
const body = {
dest: {
V1: {
parents: 1,
interior: 'Here',
},
},
beneficiary: {
V1: {
parents: 0,
interior: {
X1: {
AccountId32: {
network: 'Any',
id: u8aToHex(decodeAddress('<rococo address account>')),
},
},
},
},
},
assets: {
V1: [
{
id: {
Concrete: {
parents: 1,
interior: 'Here',
},
},
fun: {
Fungible: 100000000000,
},
},
],
},
feeAssetItem: 0,
weightLimit: 'Unlimited',
}
const res = await provider.customExtrinsic({
pallet,
method,
body,
})
De este ejemplo de red local, para marcar un activo en trappist como multilocalización:
comando:
npx ts-node src/examples/custom-extrinsic/mark-asset-as-multilocation.ts
manual:
const pallet = "assetRegistry"
const method = "registerReserveAsset"
const body = {
assetId: 1, // local asset id
assetMultiLocation: {
parents: 1,
interior: {
X3: [
{
Parachain: 1000,
},
{
PalletInstance: 50,
},
{
GeneralIndex: 1,
},
],
},
},
}
const res = await provider.customExtrinsic({
asSudo: true,
pallet,
method,
body,
})
xcm sdk es también una herramienta de interfaz de línea de comandos que te ayuda a transferir y teletransportar activos entre cadenas.
instalar:
npm i -g xcm-sdk
Hay 4 comandos disponibles:
xcm-sdk limitedReserveTransferAssets [..args]
xcm-sdk reserveTransferAssets [..args]
xcm-sdk teleportAssets [...args]
xcm-sdk limitedTeleportAssets [..args]
comandos:
argumentos:
Arg | Significado | Descripción |
---|---|---|
--dest | destination | El destino para transferir el activo. Si desea transferir el activo de la relaychain a una parachain, establezca "Parachain". Valor por defecto 'Here'. |
--destP | Destination Parents | 0 es por defecto, 1 cuando se quiere transferir de una parachain a relaychain |
--destV | Destination Value | El valor de destino, por ejemplo un parachain id |
--ben | Beneficiary | objetivo beneficiario, un accountId32 |
--benV | Beneficiary Value | Valor del beneficiario, dirección de la cuenta para enviar el activo |
--a | Amount | Beneficiary value, account address to send the asset to |
--assetId | Asset Id | AssetId para transferir desde parachain, asegúrese de que la parchain soporta el activo y la cuenta del remitente tiene suficiente activo para transferir |
--wl | Weight Limit | Opcional, sólo para métodos limitados. Establece el peso máximo del extrinsic |
Ejecución de las pruebas unitarias.
npm run test
Ejecución de la cobertura de pruebas.
npm run test:cov
Consulte Changelog para más información.
¡Las contribuciones son bienvenidas! Consulte Contributing.
Con licencia MIT - consulte el archivo LICENSE para obtener más información.