https://github.com/blockcoders/xcm-sdk
XCM SDK is a tool that provides an interface to send XCM messages for Substrate based blockchains.
https://github.com/blockcoders/xcm-sdk
asset blockchain kusama multi-asset polkadot polkadot-js substrate token vmp xcm xcm-format xcmp
Last synced: 9 months ago
JSON representation
XCM SDK is a tool that provides an interface to send XCM messages for Substrate based blockchains.
- Host: GitHub
- URL: https://github.com/blockcoders/xcm-sdk
- Owner: blockcoders
- License: mit
- Created: 2022-10-03T15:08:57.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2023-02-27T12:35:21.000Z (about 3 years ago)
- Last Synced: 2025-04-02T02:22:27.451Z (about 1 year ago)
- Topics: asset, blockchain, kusama, multi-asset, polkadot, polkadot-js, substrate, token, vmp, xcm, xcm-format, xcmp
- Language: TypeScript
- Homepage:
- Size: 2.35 MB
- Stars: 5
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README-es.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Codeowners: CODEOWNERS
Awesome Lists containing this project
README
XCM SDK
=======
[](https://circleci.com/gh/blockcoders/xcm-sdk/tree/main)
[](https://coveralls.io/github/blockcoders/xcm-sdk?branch=main)
[](https://github.com/blockcoders/xcm-sdk/actions/workflows/codeql-analysis.yml)
[](https://www.npmjs.com/package/xcm-sdk)
[](https://www.npmjs.com/package/xcm-sdk?activeTab=versions)
[](https://snyk.io/test/github/blockcoders/xcm-sdk)
[](https://opensource.org/licenses/MIT)
## 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
```sh
npm i xcm-sdk
```
### Importar
```ts
// JavaScript
const { Provider } = require("xcm-sdk");
// TypeScript
import { Provider } from "xcm-sdk";
```
### Proveedor
```ts
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:
```ts
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
```ts
import { Keyring } from '@polkadot/keyring'
const sender = keyring.addFromMnemonic("");
```
Si quieres firmar con la extensión de polkadotjs
```ts
import { web3FromAddress, web3Accounts, web3Enable } from "@polkadot/extension-dapp";
const extensions = await web3Enable("");
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.
```ts
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.
```ts
export const rococoExampleUtils = {
rococoRpc: 'wss://rococo-rpc.polkadot.io',
rockMineRpc: 'wss://rococo-rockmine-rpc.polkadot.io',
rockMineParachainId: 1000,
mangataParachainId: 2110,
daliParachainId: 2087,
senderMnemonic: '',
rockmineDestinationAccount: '',
daliDestinationAccount: '',
rococoDestinationAccount: '',
mangataDestinationAccount: '',
rocAmount: ,
}
```
### Enviar activos de Rococo a Rockmine
comando:
```ts
npx ts-node src/examples/rococo/rococo-to-rockmine.ts
```
manual:
```ts
const destination = "Parachain";
const destinationValue = 2000; // Rockmine parchain id
const beneficiary = "AccountId32";
const beneficiaryValue = ""; // account address
const amount = 1000000000000000;
const res = await provider.limitedTeleportAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
```
o
comando:
```ts
npx ts-node src/examples/rococo/rococo-to-rockmine-no-limited.ts
```
manual:
```ts
const destination = "Parachain"
const destinationValue = 2000 // Rockmine parchain id
const beneficiary = "AccountId32"
const beneficiaryValue = "" // account address
const amount = 1000000000000000
const res = await provider.teleportAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
```
### Enviar activos de RockMine a Rococo
comando:
```ts
npx ts-node src/examples/rococo/rockmine-to-rococo.ts
```
manual:
```ts
const destinationParents = 1; // Destination to Rococo
const beneficiary = "AccountId32";
const beneficiaryValue = ""; // 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:
```ts
npx ts-node src/examples/rococo/rococo-to-mangata-no-limited.ts
```
manual:
```ts
const destination = "Parachain"
const destinationValue = 2110 // Mangata parchain id
const beneficiary = "AccountId32"
const beneficiaryValue = "" // account address
const amount = 1000000000000000
const res = await provider.reserveTransferAssets({
destination,
destinationValue,
beneficiary,
beneficiaryValue,
amount,
});
```
ver token transferido:

## Otros ejemplos
## 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.
```ts
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:
```sh
npx ts-node src/examples/custom-extrinsic/teleport-relaychain-to-parachain.ts
```
manual:
```ts
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("")),
},
},
},
},
},
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:
```ts
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("")),
},
},
},
},
},
// 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:
```sh
npx ts-node src/examples/custom-extrinsic/teleport-parachain-to-relay.ts
```
manual:
```ts
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('')),
},
},
},
},
},
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:
```sh
npx ts-node src/examples/custom-extrinsic/mark-asset-as-multilocation.ts
```
manual:
```ts
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:
```sh
npm i -g xcm-sdk
```
Hay 4 comandos disponibles:
```sh
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
## Probar
Ejecución de las pruebas unitarias.
```sh
npm run test
```
Ejecución de la cobertura de pruebas.
```sh
npm run test:cov
```
## Registro de cambios
Consulte [Changelog](CHANGELOG.md) para más información.
## Contribuye
¡Las contribuciones son bienvenidas! Consulte [Contributing](CONTRIBUTING.md).
## Colaboradores
- [**Jose Ramirez**](https://github.com/0xslipk)
- [**Fernando Sirni**](https://github.com/fersirni)
- [**Ruben Gutierrez**](https://github.com/RubenGutierrezC)
## Licencia
Con licencia MIT - consulte el archivo [LICENSE](LICENSE) para obtener más información.