git.delta.rocks / unique-network / refs/commits / b9bb94b32dcd

difftreelog

source

js-packages/playgrounds/unique.xcm.ts13.2 KiBsourcehistory
1import {ApiPromise, WsProvider} from '@polkadot/api';2import type {IKeyringPair} from '@polkadot/types/types';3import {ChainHelperBase, EthereumBalanceGroup, HelperGroup, SubstrateBalanceGroup, UniqueHelper} from './unique.js';4import type {ILogger, TSigner, TSubstrateAccount} from './types.js';5import type {AcalaAssetMetadata, DemocracyStandardAccountVote, MoonbeamAssetInfo} from './types.xcm.js';678export class XcmChainHelper extends ChainHelperBase {9  override async connect(wsEndpoint: string, _listeners?: any): Promise<void> {10    const wsProvider = new WsProvider(wsEndpoint);11    this.api = new ApiPromise({12      provider: wsProvider,13    });14    await this.api.isReadyOrError;15    this.network = await UniqueHelper.detectNetwork(this.api);16  }17}1819class AcalaAssetRegistryGroup extends HelperGroup<AcalaHelper> {20  async registerForeignAsset(signer: TSigner, destination: any, metadata: AcalaAssetMetadata) {21    await this.helper.executeExtrinsic(signer, 'api.tx.assetRegistry.registerForeignAsset', [destination, metadata], true);22  }23}2425class MoonbeamAssetManagerGroup extends HelperGroup<MoonbeamHelper> {26  makeRegisterForeignAssetProposal(assetInfo: MoonbeamAssetInfo) {27    const apiPrefix = 'api.tx.assetManager.';2829    const registerTx = this.helper.constructApiCall(30      apiPrefix + 'registerForeignAsset',31      [assetInfo.location, assetInfo.metadata, assetInfo.existentialDeposit, assetInfo.isSufficient],32    );3334    const setUnitsTx = this.helper.constructApiCall(35      apiPrefix + 'setAssetUnitsPerSecond',36      [assetInfo.location, assetInfo.unitsPerSecond, assetInfo.numAssetsWeightHint],37    );3839    const batchCall = this.helper.getApi().tx.utility.batchAll([registerTx, setUnitsTx]);40    const encodedProposal = batchCall?.method.toHex() || '';41    return encodedProposal;42  }4344  async assetTypeId(location: any) {45    return await this.helper.callRpc('api.query.assetManager.assetTypeId', [location]);46  }47}4849class MoonbeamDemocracyGroup extends HelperGroup<MoonbeamHelper> {50  notePreimagePallet: string;5152  constructor(helper: MoonbeamHelper, options: { [key: string]: any } = {}) {53    super(helper);54    this.notePreimagePallet = options.notePreimagePallet;55  }5657  async notePreimage(signer: TSigner, encodedProposal: string) {58    await this.helper.executeExtrinsic(signer, `api.tx.${this.notePreimagePallet}.notePreimage`, [encodedProposal], true);59  }6061  externalProposeMajority(proposal: any) {62    return this.helper.constructApiCall('api.tx.democracy.externalProposeMajority', [proposal]);63  }6465  fastTrack(proposalHash: string, votingPeriod: number, delayPeriod: number) {66    return this.helper.constructApiCall('api.tx.democracy.fastTrack', [proposalHash, votingPeriod, delayPeriod]);67  }6869  async referendumVote(signer: TSigner, referendumIndex: number, accountVote: DemocracyStandardAccountVote) {70    await this.helper.executeExtrinsic(signer, 'api.tx.democracy.vote', [referendumIndex, {Standard: accountVote}], true);71  }72}7374class MoonbeamCollectiveGroup extends HelperGroup<MoonbeamHelper> {75  collective: string;7677  constructor(helper: MoonbeamHelper, collective: string) {78    super(helper);7980    this.collective = collective;81  }8283  async propose(signer: TSigner, threshold: number, proposalHash: string, lengthBound: number) {84    await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.propose`, [threshold, proposalHash, lengthBound], true);85  }8687  async vote(signer: TSigner, proposalHash: string, proposalIndex: number, approve: boolean) {88    await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.vote`, [proposalHash, proposalIndex, approve], true);89  }9091  async close(signer: TSigner, proposalHash: string, proposalIndex: number, weightBound: any, lengthBound: number) {92    await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.close`, [proposalHash, proposalIndex, weightBound, lengthBound], true);93  }9495  async proposalCount() {96    return Number(await this.helper.callRpc(`api.query.${this.collective}.proposalCount`, []));97  }98}99100class PolkadexXcmHelperGroup<T extends ChainHelperBase> extends HelperGroup<T> {101  async whitelistToken(signer: TSigner, assetId: any) {102    await this.helper.executeExtrinsic(signer, 'api.tx.xcmHelper.whitelistToken', [assetId], true);103  }104}105106export class ForeignAssetsGroup extends HelperGroup<UniqueHelper> {107  async register(signer: TSigner, location: any, name: string, tokenPrefix: string, mode: 'NFT' | { Fungible: number }) {108    await this.helper.executeExtrinsic(109      signer,110      'api.tx.foreignAssets.forceRegisterForeignAsset',111      [location, this.helper.util.str2vec(name), tokenPrefix, mode],112      true,113    );114  }115116  async foreignCollectionId(location: any) {117    return (await this.helper.callRpc('api.query.foreignAssets.foreignReserveLocationToCollection', [location])).toJSON();118  }119}120121export class XcmGroup<T extends ChainHelperBase> extends HelperGroup<T> {122  palletName: string;123124  constructor(helper: T, palletName: string) {125    super(helper);126127    this.palletName = palletName;128  }129130  async limitedReserveTransferAssets(signer: TSigner, destination: any, beneficiary: any, assets: any, feeAssetItem: number, weightLimit: any) {131    await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.limitedReserveTransferAssets`, [destination, beneficiary, assets, feeAssetItem, weightLimit], true);132  }133134  async setSafeXcmVersion(signer: TSigner, version: number) {135    await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.forceDefaultXcmVersion`, [version], true);136  }137138  async teleportAssets(signer: TSigner, destination: any, beneficiary: any, assets: any, feeAssetItem: number) {139    await this.helper.executeExtrinsic(signer, `api.tx.${this.palletName}.teleportAssets`, [destination, beneficiary, assets, feeAssetItem], true);140  }141142  async teleportNativeAsset(signer: TSigner, destinationParaId: number, targetAccount: Uint8Array, amount: bigint, xcmVersion = 3) {143    const destinationContent = {144      parents: 0,145      interior: {146        X1: {147          Parachain: destinationParaId,148        },149      },150    };151152    const beneficiaryContent = {153      parents: 0,154      interior: {155        X1: {156          AccountId32: {157            network: 'Any',158            id: targetAccount,159          },160        },161      },162    };163164    const assetsContent = [165      {166        id: {167          Concrete: {168            parents: 0,169            interior: 'Here',170          },171        },172        fun: {173          Fungible: amount,174        },175      },176    ];177178    let destination;179    let beneficiary;180    let assets;181182    if(xcmVersion == 2) {183      destination = {V1: destinationContent};184      beneficiary = {V1: beneficiaryContent};185      assets = {V1: assetsContent};186187    } else if(xcmVersion == 3) {188      destination = {V2: destinationContent};189      beneficiary = {V2: beneficiaryContent};190      assets = {V2: assetsContent};191192    } else {193      throw Error('Unknown XCM version: ' + xcmVersion);194    }195196    const feeAssetItem = 0;197198    await this.teleportAssets(signer, destination, beneficiary, assets, feeAssetItem);199  }200201  async send(signer: IKeyringPair, destination: any, message: any) {202    await this.helper.executeExtrinsic(203      signer,204      `api.tx.${this.palletName}.send`,205      [206        destination,207        message,208      ],209      true,210    );211  }212}213214export class XTokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {215  async transfer(signer: TSigner, currencyId: any, amount: bigint, destination: any, destWeight: any) {216    await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transfer', [currencyId, amount, destination, destWeight], true);217  }218219  async transferMultiasset(signer: TSigner, asset: any, destination: any, destWeight: any) {220    await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transferMultiasset', [asset, destination, destWeight], true);221  }222223  async transferMulticurrencies(signer: TSigner, currencies: any[], feeItem: number, destLocation: any, destWeight: any) {224    await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transferMulticurrencies', [currencies, feeItem, destLocation, destWeight], true);225  }226}227228229230export class TokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {231  async accounts(address: string, currencyId: any) {232    const {free} = (await this.helper.callRpc('api.query.tokens.accounts', [address, currencyId])).toJSON() as any;233    return BigInt(free);234  }235}236237export class AssetsGroup<T extends ChainHelperBase> extends HelperGroup<T> {238  async create(signer: TSigner, assetId: number | bigint, admin: string, minimalBalance: bigint) {239    await this.helper.executeExtrinsic(signer, 'api.tx.assets.create', [assetId, admin, minimalBalance], true);240  }241242  async forceCreate(signer: TSigner, assetId: number | bigint, admin: string, minimalBalance: bigint, isSufficient = true) {243    await this.helper.executeExtrinsic(signer, 'api.tx.assets.forceCreate', [assetId, admin, isSufficient, minimalBalance], true);244  }245246  async setMetadata(signer: TSigner, assetId: number | bigint, name: string, symbol: string, decimals: number) {247    await this.helper.executeExtrinsic(signer, 'api.tx.assets.setMetadata', [assetId, name, symbol, decimals], true);248  }249250  async mint(signer: TSigner, assetId: number | bigint, beneficiary: string, amount: bigint) {251    await this.helper.executeExtrinsic(signer, 'api.tx.assets.mint', [assetId, beneficiary, amount], true);252  }253254  async assetInfo(assetId: number | bigint) {255    return (await this.helper.callRpc('api.query.assets.asset', [assetId])).toJSON();256  }257258  async account(assetId: string | number | bigint, address: string) {259    const accountAsset = (260      await this.helper.callRpc('api.query.assets.account', [assetId, address])261    ).toJSON()! as any;262263    if(accountAsset !== null) {264      return BigInt(accountAsset['balance']);265    } else {266      return null;267    }268  }269}270271export class RelayHelper extends XcmChainHelper {272  balance: SubstrateBalanceGroup<RelayHelper>;273  xcm: XcmGroup<RelayHelper>;274275  constructor(logger?: ILogger, options: { [key: string]: any } = {}) {276    super(logger, options.helperBase ?? RelayHelper);277278    this.balance = new SubstrateBalanceGroup(this);279    this.xcm = new XcmGroup(this, 'xcmPallet');280  }281}282283export class WestmintHelper extends XcmChainHelper {284  balance: SubstrateBalanceGroup<WestmintHelper>;285  xcm: XcmGroup<WestmintHelper>;286  assets: AssetsGroup<WestmintHelper>;287  xTokens: XTokensGroup<WestmintHelper>;288289  constructor(logger?: ILogger, options: { [key: string]: any } = {}) {290    super(logger, options.helperBase ?? WestmintHelper);291292    this.balance = new SubstrateBalanceGroup(this);293    this.xcm = new XcmGroup(this, 'polkadotXcm');294    this.assets = new AssetsGroup(this);295    this.xTokens = new XTokensGroup(this);296  }297}298299export class MoonbeamHelper extends XcmChainHelper {300  balance: EthereumBalanceGroup<MoonbeamHelper>;301  assetManager: MoonbeamAssetManagerGroup;302  assets: AssetsGroup<MoonbeamHelper>;303  xTokens: XTokensGroup<MoonbeamHelper>;304  democracy: MoonbeamDemocracyGroup;305  collective: {306    council: MoonbeamCollectiveGroup,307    techCommittee: MoonbeamCollectiveGroup,308  };309310  constructor(logger?: ILogger, options: { [key: string]: any } = {}) {311    super(logger, options.helperBase ?? MoonbeamHelper);312313    this.balance = new EthereumBalanceGroup(this);314    this.assetManager = new MoonbeamAssetManagerGroup(this);315    this.assets = new AssetsGroup(this);316    this.xTokens = new XTokensGroup(this);317    this.democracy = new MoonbeamDemocracyGroup(this, options);318    this.collective = {319      council: new MoonbeamCollectiveGroup(this, 'councilCollective'),320      techCommittee: new MoonbeamCollectiveGroup(this, 'techCommitteeCollective'),321    };322  }323}324325export class AstarHelper extends XcmChainHelper {326  balance: SubstrateBalanceGroup<AstarHelper>;327  assets: AssetsGroup<AstarHelper>;328  xcm: XcmGroup<AstarHelper>;329330  constructor(logger?: ILogger, options: { [key: string]: any } = {}) {331    super(logger, options.helperBase ?? AstarHelper);332333    this.balance = new SubstrateBalanceGroup(this);334    this.assets = new AssetsGroup(this);335    this.xcm = new XcmGroup(this, 'polkadotXcm');336  }337}338339export class AcalaHelper extends XcmChainHelper {340  balance: SubstrateBalanceGroup<AcalaHelper>;341  assetRegistry: AcalaAssetRegistryGroup;342  xTokens: XTokensGroup<AcalaHelper>;343  tokens: TokensGroup<AcalaHelper>;344  xcm: XcmGroup<AcalaHelper>;345346  constructor(logger?: ILogger, options: { [key: string]: any } = {}) {347    super(logger, options.helperBase ?? AcalaHelper);348349    this.balance = new SubstrateBalanceGroup(this);350    this.assetRegistry = new AcalaAssetRegistryGroup(this);351    this.xTokens = new XTokensGroup(this);352    this.tokens = new TokensGroup(this);353    this.xcm = new XcmGroup(this, 'polkadotXcm');354  }355}356357export class PolkadexHelper extends XcmChainHelper {358  assets: AssetsGroup<PolkadexHelper>;359  balance: SubstrateBalanceGroup<PolkadexHelper>;360  xTokens: XTokensGroup<PolkadexHelper>;361  xcm: XcmGroup<PolkadexHelper>;362  xcmHelper: PolkadexXcmHelperGroup<PolkadexHelper>;363364  constructor(logger?: ILogger, options: { [key: string]: any } = {}) {365    super(logger, options.helperBase ?? PolkadexHelper);366367    this.assets = new AssetsGroup(this);368    this.balance = new SubstrateBalanceGroup(this);369    this.xTokens = new XTokensGroup(this);370    this.xcm = new XcmGroup(this, 'polkadotXcm');371    this.xcmHelper = new PolkadexXcmHelperGroup(this);372  }373}374