Skip to content

Latest commit

 

History

History
669 lines (542 loc) · 15.3 KB

README-es.md

File metadata and controls

669 lines (542 loc) · 15.3 KB

XCM SDK

CircleCI Coverage Status CodeQL npm npm vulnerabilities License

Acerca

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.

Introduccion

Instalar

npm i xcm-sdk

Importar

// JavaScript
const { Provider } = require("xcm-sdk");

// TypeScript
import { Provider } from "xcm-sdk";

Proveedor

const provider = new Provider(rpc, sender);
Parametro Descripcion
rpc rpc URL
sender firmante de la transacción

Ejemplos

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);

Metodos soportados

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);

Parametros de los metodos

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

Descargo de responsabilidad

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

Ejemplos en Rococo

Si quieres hacer pruebas en Testnet, tienes Rococo.
Consigue algunos activos: Rococo faucet

Config

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>,
}

Enviar activos de Rococo a Rockmine

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,
  });

Enviar activos de RockMine a Rococo

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,
});

Enviar Activo de Rococo a Mangata

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,
  });

ver token transferido:

Otros ejemplos

ejemplos en un red local

Soporte para otras paletas y métodos

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

Ejemplos

Teletransportar activos

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,
  })

Multilocalización de asset

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,
})

Uso de CLI

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

Ejemplos del CLI

Ver ejemplos del cli

Probar

Ejecución de las pruebas unitarias.

npm run test

Ejecución de la cobertura de pruebas.

npm run test:cov

Registro de cambios

Consulte Changelog para más información.

Contribuye

¡Las contribuciones son bienvenidas! Consulte Contributing.

Colaboradores

Licencia

Con licencia MIT - consulte el archivo LICENSE para obtener más información.