Skip to content

使用Moonbeam XCM SDK: v0

概览

Moonbeam XCM SDK使开发者能够轻松从波卡或Kusama生态系统中的中继链和其他平行链向Moonbeam或Moonriver充提资产。通过使用SDK,您无需担心定义原始或目标资产的multilocation或在哪个网络上使用extrinsics来发送XCM传输。要存入或是取出资产,您可以简单定义您希望存入或是取出的资产和原链,以及传送账户的签署者和传送数量。

XCM SDK提供简单的协助函数,如depositwithdraw,提供非常简单的接口以在波卡和Kusama生态中进行两条链之间的XCM转移。除外,XCM的配置包允许任何平行链项目以标准方法添加信息,使他们能够被XCM SDK支持。

关于Moonbeam XCM SDK中当前可用的函数和接口概览,请查看参考页面。

如果您使用的是 v1.x,请参阅v1 特定的 SDK 指南

此教程中的示例将在Moonbeam中执行,但步骤也同样适用于Moonriver和Moonbase Alpha。

开始操作

要开始操作XCM SDK,您首先需要安装相关的NPM包。接着,您需要创建签署者以签署在Moonbeam和波卡生态中其他链间转移资产的交易。最后,您需要初始化API,其将会提供您资产和链的信息以及用于存款、提现和查看余额信息的必要函数。

安装

要跟随此教程,您将需要安装两个包:XCM SDK包和XCM配置包。

XCM SDK包将使您能够轻松充提资产,还可以查看每个支持资产的余额信息。

XCM配置包将用于获取每个支持资产类型的原资产和原链信息。配置包同样包含基于Moonbeam网络的原生资产和链信息,以及一些SDK中的底层函数。

要安装XCM SDK以及XCM配置包,您可以运行以下指令:

npm install @moonbeam-network/xcm-sdk @moonbeam-network/xcm-config

您将需要安装依赖项,如Ethers.jsPolkadot.js API

您可以运行以下指令来安装它们:

npm i @polkadot/api-augment @polkadot/types @polkadot/util @polkadot/util-crypto ethers

注意事项

目前将Moonbeam XCM包与Polkadot.js与 Node.js (JavaScript)一起使用时,存在已知问题导致包冲突警告出现在控制台中。推荐您使用TypeScript。

创建签署者

在与XCM SDK中的depositwithdraw函数交互时,您将需要提供一个Ethers.jsPolkadot.js签署者,用于签署和传送交易。Ethers签署者用于在Moonbeam上签署交易,波卡签署者将用于在您存入资产的原链上签署交易。

举例而言,您可以将一个MetaMask签署者传递至Ethers或是其他兼容钱包。如同波卡,您可以使用@polkadot/extension-dapp 库传递一个兼容钱包给签署者

要为Ethers.js和Polkadot.js创建一个签署者,您可以查看以下的代码段。在本示例中,您可以使用一个Polkadot.js Keyring以在原链存款时签署交易。请注意,此方法并不被推荐用于生产应用。请勿将您的私钥或是助记词存于JavaScript或TypeScript文件中

import { ethers } from 'ethers';
import { Keyring } from '@polkadot/api';

// Set up Ethers provider and signer
const providerRPC = {
  moonbeam: {
    name: 'moonbeam',
    rpc: 'INSERT_RPC_API_ENDPOINT',
    chainId: 1284, // 0x504 in hex,
  },
};
const provider = new ethers.JsonRpcProvider(providerRPC.moonbeam.rpc, {
  chainId: providerRPC.moonbeam.chainId,
  name: providerRPC.moonbeam.name,
});
const ethersSigner = new ethers.Wallet('INSERT_PRIVATE_KEY', provider);

// Set up Polkadot keyring
const keyring = new Keyring({ type: 'sr25519' });
const polkadotKeyring = keyring.addFromUri('INSERT_MNEMONIC');
import { ethers } from 'ethers';
import { Keyring } from '@polkadot/api';

// Set up Ethers provider and signer
const providerRPC = {
  moonriver: {
    name: 'moonriver',
    rpc: 'INSERT_RPC_API_ENDPOINT',
    chainId: 1285, // 0x505 in hex,
  },
};
const provider = new ethers.JsonRpcProvider(providerRPC.moonriver.rpc, {
  chainId: providerRPC.moonriver.chainId,
  name: providerRPC.moonriver.name,
});
const ethersSigner = new ethers.Wallet('INSERT_PRIVATE_KEY', provider);

// Set up Polkadot keyring
const keyring = new Keyring({ type: 'sr25519' });
const polkadotKeyring = keyring.addFromUri('INSERT_MNEMONIC');
import { ethers } from 'ethers';
import { Keyring } from '@polkadot/api';

// Set up Ethers provider and signer
const providerRPC = {
  moonbase: {
    name: 'moonbase_alpha',
    rpc: 'https://rpc.api.moonbase.moonbeam.network',
    chainId: 1287, // 0x507 in hex,
  },
};
const provider = new ethers.JsonRpcProvider(providerRPC.moonbase.rpc, {
  chainId: providerRPC.moonbase.chainId,
  name: providerRPC.moonbase.name,
});
const ethersSigner = new ethers.Wallet('INSERT_PRIVATE_KEY', provider);

// Set up Polkadot keyring
const keyring = new Keyring({ type: 'sr25519' });
const polkadotKeyring = keyring.addFromUri('INSERT_MNEMONIC');

初始化

要能够对所有受支持的资产进行存款、提现和查看余额信息,您需要先从XCM SDK导入init函数并调用它:

import { init } from '@moonbeam-network/xcm-sdk';
const { moonbeam } = init();
import { init } from '@moonbeam-network/xcm-sdk';
const { moonriver } = init();
import { init } from '@moonbeam-network/xcm-sdk';
const { moonbase } = init();

如果您希望支持某个特定钱包,您可以直接将签署者传递至init函数。否则,您仅能在为存款或提现构建转移数据时直接传递签署者。要为Ethers波卡传递签署者,您可以使用以下代码段:

import { init } from '@moonbeam-network/xcm-sdk';
const { moonbeam } = init({
  ethersSigner: 'INSERT_ETHERS_SIGNER',
  polkadotSigner: 'INSERT_POLKADOT_SIGNER',
});
import { init } from '@moonbeam-network/xcm-sdk';
const { moonriver } = init({
  ethersSigner: 'INSERT_ETHERS_SIGNER',
  polkadotSigner: 'INSERT_POLKADOT_SIGNER',
});
import { init } from '@moonbeam-network/xcm-sdk';
const { moonbase } = init({
  ethersSigner: 'INSERT_ETHERS_SIGNER',
  polkadotSigner: 'INSERT_POLKADOT_SIGNER',
});

使用SDK接口

Moonbeam SDK提供一个包含一系列获得支持资产信息、初始化网络的链信息以及启用存款、提现和查看余额函数的接口的API。

请确保您已经事先将您希望交互的Moonbeawm网络设置初始化

资产符号

一个资产符号代表原链上资产的符号。举例来说,GLMR是Moonbeam上的原生资产。

要获得每个网络支持资产符号的列表,您可以访问symbols属性。

moonbeam.symbols
moonriver.symbols
moonbase.symbols

包含在symbols属性的数据范例如下:

[ 'ACA', 'ASTR', 'AUSD', 'DOT', 'GLMR', 'IBTC', 'INTR', 'PARA', 'PHA']

资产

要获得支持资产以及相对ID、Moonbeam上的预编译合约以及它们原资产的符号列表,您可以访问assets属性:

moonbeam.assets
moonriver.assets
moonbase.assets

包含在assets属性的数据范例如下:

assets: {
  ACA: {
    id: '224821240862170613278369189818311486111',
    erc20Id: '0xffffffffa922fef94566104a6e5a35a4fcddaa9f',
    originSymbol: 'ACA'
  },
  ASTR: {
    id: '224077081838586484055667086558292981199',
    erc20Id: '0xffffffffa893ad19e540e172c10d78d4d479b5cf',
    originSymbol: 'ASTR'
  },
  ...
}

id代表资产ID,erc20id代表资产的预编译合约地址,而originSymbol代表资产在原链上的符号。

Moonbeam原生资产数据

要获得Moonbeam网络上原生协议资产的信息,如预编译合约地址以及原符号,您可以访问moonAsset属性。

moonbeam.moonAsset
moonriver.moonAsset
moonbase.moonAsset

包含在moonAsset属性的数据范例如下:

moonAsset: {
  id: '',
  erc20Id: '0x0000000000000000000000000000000000000802',
  originSymbol: 'GLMR',
  isNative: true
}

erc20Id代表Moonbeam上的预编译合约地址,originSymbol代表原生资产的符号,而isNative布林值表示该资产是否为原生资产。

Moonbeam原生链数据

要获得Moonbeam网络上的链数据信息,如链钥、名称、WSS端点、平行链ID、协议资产符号、链ID以及单位每秒,您可以访问moonChain属性:

moonbeam.moonChain
moonriver.moonChain
moonbase.moonChain

包含在moonChain属性的数据范例如下:

moonChain: {
  key: 'Moonbeam',
  name: 'Moonbeam',
  ws: 'wss://wss.api.moonbeam.network',
  parachainId: 2004,
  decimals: 18,
  chainId: 1284,
  unitsPerSecond: 10000000000000000000n
}

此处每秒单位代表执行XCM消息每秒收费的Token单位(在本范例中为Wei)。您可以在XCM费用页面中找到更多信息。

使用SDK函数

Moonbeam SDK提供一个API,其中包含能够启用存款、提现和查看余额信息和其他功能性函数的函数

确保您已经初始化您希望交互的Moonbeam网络。您同样需要确认您已经创建签署者以签署和传送存入和取出的转移数据。

存入

要从其他网络存入资产到Moonbeam,在您传送前,您首先需要使用来自原链的信息构建转移数据。您将需要使用一系列的存入函数构建转移数据。

构建和传送存入转移数据的过程如下:

  1. 调用deposit函数并输入要存入的资产符号或是资产要件。您将会获得包含资产原网络信息以及一个将用于构建转移数据from函数的chains阵列
  2. 调用from函数并输入原网络的链钥或是链要件。您可以从deposit显现的chains阵列结果中获得链要件。您有两种方式可以获得链钥:访问链要件的密钥属性(chain.key)或是直接从XCM配置包导入ChainKey信息(如以下范例所示)
  3. 调用get并根据您的代码配置方式,输入您要存入资金的Moonbeam上的帐户地址和签署者或使用波卡地址,您也可以在Get函数部分得到更多信息。接着您需要输入Polkadot.js Keyring来签署在创建签署者部分中创建的交易。get函数将会返回一个send函数,该函数已经包含执行存入所需的所有信息,并将在下一步中使用。此外,还会返回其他信息,例如有关原链资产的信息和Moonbeam上资产的xc表达形式,这些信息可能对日志的目的很重要
  4. send用于传送构建好的存入转移数据以及传送数量。您可以根据需求提供回调函数以处理extrinsic事件

要获得一些需要用于构建存入转移数据的数据,如资产符号和原网络的链钥,您可以从@moonbeam-network/xcm-config包导入AssetSymbolChainKey

如何将DOT从波卡中继链以xcDOT形式存入Moonbeam的步骤如下所示:

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

async function deposit() {
  const dot = AssetSymbol.DOT;
  const polkadot = ChainKey.Polkadot;

  const { chains, from } = moonbeam.deposit(dot);

  console.log(
    `\nYou can deposit ${dot} from these chains: `,
    chains.map((chain) => chain.name),
  );

  const { asset, sourceBalance, source, min, send } = await from(polkadot).get(
    'INSERT_MOONBEAM_ADDRESS',
    polkadotKeyring // See the Get section for other accepted arguments
  );

  console.log(
    `Your ${asset.originSymbol} balance in ${source.name}: ${toDecimal(
      sourceBalance,
      asset.decimals
    ).toFixed()}. Minimum transferable amount is: ${toDecimal(
      min,
      asset.decimals
    ).toFixed()}`

  await send('INSERT_AMOUNT', (event) => console.log(event));
}

deposit();

Chains函数

如同先前提及的,deposit将会返回chains阵列和from函数chains阵列与您希望存入指定资产的链相关(先前被输入在deposit函数)。以下为chains阵列的范例:

chains: [
  {
    key: 'Polkadot',
    name: 'Polkadot',
    ws: 'wss://rpc.polkadot.io',
    weight: 1000000000,
    parachainId: 0
  }
]

From函数

from函数需要输入资产传送原链的链钥以获得get函数。

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

...

const dot = AssetSymbol.DOT;
const polkadot = ChainKey.Polkadot;

const { from } = moonbeam.deposit(dot);
from(polkadot);

Get函数

get需要输入在Moonbeam上的接受账户以及根据您如何设置您波卡签署者,需要输入波卡的签署者或波卡上的传送账户,并获得需要用于存入函数的数据。

如果您拥有波卡兼容的签署者,您可以在init函数中数据签署者,并在get函数中的第二个参数处输入波卡地址:

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

...

const dot = AssetSymbol.DOT;
const polkadot = ChainKey.Polkadot;

const { from } = moonbeam.deposit(dot);
const response = await from(polkadot).get(
  'INSERT_MOONBEAM_ADDRESS',
  'INSERT_POLKADOT_ADDRESS',
);

如果您拥有一个波卡兼容签署者但并未将其输入至init函数,您则可以在get函数中的第二个参数处输入波卡地址并在第三个参数处输入波卡签署者。

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

...

const dot = AssetSymbol.DOT;
const polkadot = ChainKey.Polkadot;

const { from } = moonbeam.deposit(dot);
const response = await from(polkadot).get(
  'INSERT_MOONBEAM_ADDRESS',
  'INSERT_POLKADOT_ADDRESS',
  { polkadotSigner },
);

如果您拥有先前在初始化部分设置的波卡Keyring对,您可以输入polkadotKeyring作为第二个参数:

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

...

const dot = AssetSymbol.DOT;
const polkadot = ChainKey.Polkadot;

const { from } = moonbeam.deposit(dot);
const response = await from(polkadot).get(
  'INSERT_MOONBEAM_ADDRESS',
  polkadotKeyring,
);

以下为调用get以从波卡传送DOT至Moonbeam的范例:

{
  asset: {
    id: '42259045809535163221576417993425387648',
    erc20Id: '0xffffffff1fcacbd218edc0eba20fc2308c778080',
    originSymbol: 'DOT',
    decimals: 10
  },
  existentialDeposit: 10000000000n,
  min: 33068783n,
  moonChainFee: {
    amount: 33068783n,
    decimals: 10,
    symbol: 'DOT'
  },
  native: {
    id: '42259045809535163221576417993425387648',
    erc20Id: '0xffffffff1fcacbd218edc0eba20fc2308c778080',
    originSymbol: 'DOT',
    decimals: 10
  },
  origin: {
    key: 'Polkadot',
    name: 'Polkadot',
    ws: 'wss://rpc.polkadot.io',
    weight: 1000000000,
    parachainId: 0
  },
  source: {
    key: 'Polkadot',
    name: 'Polkadot',
    ws: 'wss://rpc.polkadot.io',
    weight: 1000000000,
    parachainId: 0
  },
  sourceBalance: 0n,
  sourceFeeBalance: undefined,
  sourceMinBalance: 0n,
  getFee: [AsyncFunction: getFee],
  send: [AsyncFunction: send]
}

获得的数值如下所示:

数值 描述
asset 被转移的资产
existentialDeposit 当前存在的存款,或是一个地址需要持有 以被定义为存在的最小数量,否则将返回0n
min 最小可转移数量
moonChainFee 支付Moonbeam的XCM费用所需的资产和金额。如果与要转移的asset不同,则费用将在要转移的asset之外发送到该资产中(自v0.4.0起)
native 原链上的原生资产
origin 资产所属原链的链信息
source 被转移资产从哪里发送的链信息
sourceBalance 从原链上被转移资产的余额
sourceFeeBalance 原链原生资产中的余额,用于支付资产 转移的费用(如适用),否则将返回undefined
sourceMinBalance 在原链上资产转移的最小余额
getFee 预估转移一定数量所需费用的函数
send 用于传送存入转移数据的函数

Send函数

在调用send函数时,您实际上将传送使用depositfromget函数构建的存入转移数据。您仅需要简单输入传送的指定数量以及根据需求设定回调函数处理extrinsic事件。举例来说,输入10000000000n将从波卡传送1个DOT至Moonbeam,因DOT具有10个小数位数。

您可以查看在存入函数部分的范例以了解如何使用send函数。

Get Fee函数

getFee函数用于预估在deposit函数中转移一定数量资产所需的费用。以下为获得从波卡转移DOT至Moonbeam所需费用的范例:

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';
import { init, toDecimal } from '@moonbeam-network/xcm-sdk';

...

async function getDepositFee() {
  const dot = AssetSymbol.DOT;
  const polkadot = ChainKey.Polkadot;

  const { from } = moonbeam.deposit(dot);
  const { asset, getFee } = await from(polkadot).get(
    'INSERT_MOONBEAM_ADDRESS',
    polkadotKeyring // See the Get section for other accepted arguments
  );

  const fee = await getFee('INSERT_AMOUNT');
  console.log(
    `Fee to deposit is estimated to be: ${toDecimal(
      fee,
      asset.decimals
    ).toFixed()} ${dot}`
  );
}

getDepositFee();

取出

要从Moonbeam网络取出一项资产并传送回原本网络,在您传送前,首先您必须使用来自原链的信息构建转移数据。您可以跟随以下步骤操作:

  1. 调用withdraw函数并输入资产符号或是资产要件,这将获得包含资产原网络的信息以及一个将用于构建传送数据的to函数的chains阵列
  2. 调用to函数并输入原网络的链代号。您可以从使用withdraw函数获得的chains阵列获得链要件。您可以从两个方式获得链钥:访问链要件的钥属性(chain.key)或是直接从XCM配置包导入ChainKey(如以下范例所示)
  3. 调用get函数并输入您希望取出资金的在原网络上的账户地址,如果您尚未在初始化时输入Ethers签署者,请在此输入签署者。您将会获得关于原(目标)链的资产信息以及其资产在Moonbeam上的xc表现形式,还会获得包含所有执行取出需要信息的send函数,这将会在下个步骤使用。除外,其他如资产信息等元素,同样也会返回,对于记录的目的来说很重要
  4. send函数将会用于构建取出传送数据以及传送数量。您可以根据需求提供回调函数以处理extrinsic事件

要获得一些构建取出传送数据的部分数据,如资产符号和原网络的链钥,您可以从@moonbeam-network/xcm-config包导入AssetSymbolChainKey

以下为从Moonbeam将以xcDOT形式的DOT传送回波卡的步骤:

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

async function withdraw() {
  const dot = AssetSymbol.DOT;
  const polkadot = ChainKey.Polkadot;

  const { chains, to } = moonbeam.withdraw(dot);

  console.log(
    `\nYou can withdraw ${dot} to these chains: `,
    chains.map((chain) => chain.name)
  );

  const { asset, destination, destinationBalance, min, send } = await to(
    polkadot
  ).get('INSERT_POLKADOT_ADDRESS', {
    ethersSigner: signer, // Only required if you didn't pass the signer in on initialization
  });

  console.log(
    `Your ${asset.originSymbol} balance in ${destination.name}: ${toDecimal(
      destinationBalance,
      asset.decimals
    ).toFixed()}. Minimum transferable amount is: ${toDecimal(
      min,
      asset.decimals
    ).toFixed()}`
  );

  await send('INSERT_AMOUNT', (event) => console.log(event));
}

withdraw();

Chains函数

如同先前提及的,withdraw将会返回chains阵列和to函数。chains阵列与您希望取出指定资产的链相关(先前被输入在withdraw函数)。以下为chains阵列的范例:

chains: [
  {
    key: 'Polkadot',
    name: 'Polkadot',
    ws: 'wss://rpc.polkadot.io',
    weight: 1000000000,
    parachainId: 0
  }
]

To函数

to函数需要输入链钥,用于将资产取出的原始链并获得get函数。

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

...

const dot = AssetSymbol.DOT;
const polkadot = ChainKey.Polkadot;

const { to } = moonbeam.withdraw(dot);

to(polkadot);

Get函数

get函数需要您输入在目标链上的接收数量,以及在Moonbeam上传送账户的Ethers签署者,最后您会获得存入所要求的相关数据。

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';

...

const dot = AssetSymbol.DOT;
const polkadot = ChainKey.Polkadot;

const { to } = moonbeam.deposit(dot);
const response = await to(
    polkadot
  ).get('INSERT_POLKADOT_ADDRESS', 
  { ethersSigner: signer } // Only required if you didn't pass the signer in on initialization
)

以下为调用get函数从Moonbeam将以xcDOT形式的DOT传送回波卡的范例:

{
  asset: {
    id: '42259045809535163221576417993425387648',
    erc20Id: '0xffffffff1fcacbd218edc0eba20fc2308c778080',
    originSymbol: 'DOT',
    decimals: 10
  },
  destination: {
    key: 'Polkadot',
    name: 'Polkadot',
    ws: 'wss://rpc.polkadot.io',
    weight: 1000000000,
    parachainId: 0
  },
  destinationBalance: 0n,
  destinationFee: 520000000n,
  existentialDeposit: 10000000000n,
  min: 10520000000n,
  minXcmFeeAsset: {
    amount: 0n,
    decimals: 10,
    symbol: "DOT",
  },
  native: {
    id: '42259045809535163221576417993425387648',
    erc20Id: '0xffffffff1fcacbd218edc0eba20fc2308c778080',
    originSymbol: 'DOT',
    decimals: 10
  },
  origin: {
    key: 'Polkadot',
    name: 'Polkadot',
    ws: 'wss://rpc.polkadot.io',
    weight: 1000000000,
    parachainId: 0
  },
  originXcmFeeAssetBalance: undefined,
  getFee: [AsyncFunction: getFee],
  send: [AsyncFunction: send]
}

获得的数值如下所示:

数值 描述
asset 被转移的资产
destination 资产被转移的目标链的链信息
destinationBalance 目标链上账户中资产的余额
destinationFee 资产转移至目标链上所需的费用
existentialDeposit 当前存在的存款,或是一个地址需要持有 以被定义为存在的最小数量,否则将返回0n
min 被转让资产的最小可转移数量
minXcmFeeAsset 需要一起发送以支付费用的资产的最小可转移数量
native 原链的原生资产
origin 资产所属原链的链信息
originXcmFeeAssetBalance 与转账一起发送以支付费用(如果有)的资产的原始账户中的余额
getFee 预估存入一定数量所需费用的函数
send 用于传送取出转移数据的函数

Send函数

当在调用send函数时,您实际上将传送使用withdrawtoget等函数构建的数据的取出传送数据。您仅需要简单地传送指定的数量以及根据需求加入回调函数以处理extrinsic事件。举例来说,输入10000000000n将从Moonbeam以xcDOT形式传送1个DOT至波卡。

您可以在取出部分教程查看如何使用send函数。

Get Fee函数

getFee函数用于预估在withdraw函数中转移一定数量资产所需的费用。以下为获得从Moonbeam将以xcDOT形式的DOT转移回波卡所需费用(以GLMR为单位)的范例:

import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';
import { init } from '@moonbeam-network/xcm-sdk';
import { toDecimal } from '@moonbeam-network/xcm-utils';

...

async function getWithdrawFee() {
  const dot = AssetSymbol.DOT;
  const polkadot = ChainKey.Polkadot;

  const { to } = moonbeam.withdraw(dot);
  const { asset, getFee } = await from(polkadot).get(
    'INSERT_POLKADOT_ADDRESS',
    { ethersSigner } // Only required if you didn't pass the signer in on initialization
  );

  const fee = await getFee('INSERT_AMOUNT');
  console.log(
    `Fee to deposit is estimated to be: ${toDecimal(
      fee,
      moonbeam.moonChain.decimals
    ).toFixed()} ${moonbeam.moonAsset.originSymbol}`
  );
}

getWithdrawFee();

查看资产余额信息

要查看余额信息并获得指定账户的支持资产余额,您可以使用subscribeToAssetsBalanceInfo函数并输入您希望获取余额的地址并设置回调函数以处理数据:

moonbeam.subscribeToAssetsBalanceInfo('INSERT_ADDRESS', cb);
moonriver.subscribeToAssetsBalanceInfo('INSERT_ADDRESS', cb);
moonbase.subscribeToAssetsBalanceInfo('INSERT_ADDRESS', cb);

以下范例检索Moonbeam上给定帐户的余额信息,并将每个支持资产的余额输出到控制台:

const unsubscribe = await moonbeam.subscribeToAssetsBalanceInfo(
  'INSERT_MOONBEAM_ADDRESS',
  (balances) => {
    balances.forEach(({ asset, balance, origin }) => {
      console.log(
        `${balance.symbol}: ${toDecimal(
          balance.balance,
          balance.decimals
        ).toFixed()} (${origin.name} ${asset.originSymbol})`
      );
    });
  }
);

unsubscribe();

效用函数

XCM SDK和XCM Utilities包中都有效用函数。 XCM SDK提供以下与SDK相关的效用函数:

XCM Utilities包提供了以下通用效用函数:

查看转移数据是否用于存入

要确定一个转移数据是否是用于存入,您可以将转移数据输入isXcmSdkDeposit函数,您会获得一个布林值。如果返回true则该转移数据是用于存入,如果返回false则相反。

以下为范例:

import { init, isXcmSdkDeposit } from '@moonbeam-network/xcm-sdk';

...

const deposit = moonbeam.deposit(moonbeam.symbols[0]);
console.log(isXcmSdkDeposit(deposit)); // Returns true
import { init, isXcmSdkDeposit } from '@moonbeam-network/xcm-sdk';

...

const withdraw = moonbeam.withdraw(moonbeam.symbols[0]);
console.log(isXcmSdkDeposit(withdraw)); // Returns false

查看转移数据是否用于取出

要确定一个转移数据是否用于取出,您可以在isXcmSdkWithdraw输入转移数据,您会获得一个布林值。如果返回true则该转移数据是用于取出,如果返回false则相反。

以下为范例:

import { init, isXcmSdkWithdraw } from '@moonbeam-network/xcm-sdk';

...

const withdraw = moonbeam.withdraw(moonbeam.symbols[0]);
console.log(isXcmSdkWithdraw(withdraw)); // Returns true
import { init, isXcmSdkWithdraw } from '@moonbeam-network/xcm-sdk';

...

const deposit = moonbeam.deposit(moonbeam.symbols[0]);
console.log(isXcmSdkDeposit(deposit)); // Returns false

将余额转换为十进制或BigInt

要将余额转换为十进制格式,您可以使用toDecimal函数,根据提供的小数位数以十进制格式返回给定数字。您可以根据需求在第三个参数中输入数值以指示使用的最大小数位数,预设值为6;第四个参数指示了数字的舍入方法toDecimal函数返回一个Big数字类型,您可以使用其方法 toNumbertoFixedtoPrecisiontoExponential将其转换为数字或字符串。 我们建议将它们用作字符串,因为在使用数字类型时,大数字或有很多小数的数字可能会失去精度。

要将十进制数转换回BigInt,您可以使用toBigInt函数,该函数根据提供的小数位数返回BigInt格式的给定数字。

举例而言,您可以使用以下代码将Moonbeam上以Wei为单位的余额转换成Glimmer:

import { toDecimal, toBigInt } from '@moonbeam-network/xcm-utils';

const balance = toDecimal(3999947500000000000n, 18).toFixed();
console.log(balance); // Returns '3.999947'

const big = toBigInt('3.999947', 18);
console.log(big); // Returns 3999947000000000000n

您还可以使用hasDecimalOverflow来确保给定数字的小数位数不超过允许的位数。这对表单输入很有帮助。

Last update: January 26, 2024
| Created: October 12, 2022