12import {ApiPromise, WsProvider} from '@polkadot/api';3import {AssetsGroup, ChainHelperBase, EthereumBalanceGroup, HelperGroup, SubstrateBalanceGroup, TokensGroup, UniqueHelper, XTokensGroup, XcmGroup} from './unique';4import {ILogger, TSigner} from './types';5import {SudoHelper} from './unique.dev';6import {AcalaAssetMetadata, DemocracyStandardAccountVote, MoonbeamAssetInfo} from './types.xcm';78export class XcmChainHelper extends ChainHelperBase {9 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}105export class RelayHelper extends XcmChainHelper {106 balance: SubstrateBalanceGroup<RelayHelper>;107 xcm: XcmGroup<RelayHelper>;108109 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {110 super(logger, options.helperBase ?? RelayHelper);111112 this.balance = new SubstrateBalanceGroup(this);113 this.xcm = new XcmGroup(this, 'xcmPallet');114 }115}116117export class WestmintHelper extends XcmChainHelper {118 balance: SubstrateBalanceGroup<WestmintHelper>;119 xcm: XcmGroup<WestmintHelper>;120 assets: AssetsGroup<WestmintHelper>;121 xTokens: XTokensGroup<WestmintHelper>;122123 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {124 super(logger, options.helperBase ?? WestmintHelper);125126 this.balance = new SubstrateBalanceGroup(this);127 this.xcm = new XcmGroup(this, 'polkadotXcm');128 this.assets = new AssetsGroup(this);129 this.xTokens = new XTokensGroup(this);130 }131}132133export class MoonbeamHelper extends XcmChainHelper {134 balance: EthereumBalanceGroup<MoonbeamHelper>;135 assetManager: MoonbeamAssetManagerGroup;136 assets: AssetsGroup<MoonbeamHelper>;137 xTokens: XTokensGroup<MoonbeamHelper>;138 democracy: MoonbeamDemocracyGroup;139 collective: {140 council: MoonbeamCollectiveGroup,141 techCommittee: MoonbeamCollectiveGroup,142 };143144 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {145 super(logger, options.helperBase ?? MoonbeamHelper);146147 this.balance = new EthereumBalanceGroup(this);148 this.assetManager = new MoonbeamAssetManagerGroup(this);149 this.assets = new AssetsGroup(this);150 this.xTokens = new XTokensGroup(this);151 this.democracy = new MoonbeamDemocracyGroup(this, options);152 this.collective = {153 council: new MoonbeamCollectiveGroup(this, 'councilCollective'),154 techCommittee: new MoonbeamCollectiveGroup(this, 'techCommitteeCollective'),155 };156 }157}158159export class AstarHelper extends XcmChainHelper {160 balance: SubstrateBalanceGroup<AstarHelper>;161 assets: AssetsGroup<AstarHelper>;162 xcm: XcmGroup<AstarHelper>;163164 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {165 super(logger, options.helperBase ?? AstarHelper);166167 this.balance = new SubstrateBalanceGroup(this);168 this.assets = new AssetsGroup(this);169 this.xcm = new XcmGroup(this, 'polkadotXcm');170 }171}172173export class AcalaHelper extends XcmChainHelper {174 balance: SubstrateBalanceGroup<AcalaHelper>;175 assetRegistry: AcalaAssetRegistryGroup;176 xTokens: XTokensGroup<AcalaHelper>;177 tokens: TokensGroup<AcalaHelper>;178 xcm: XcmGroup<AcalaHelper>;179180 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {181 super(logger, options.helperBase ?? AcalaHelper);182183 this.balance = new SubstrateBalanceGroup(this);184 this.assetRegistry = new AcalaAssetRegistryGroup(this);185 this.xTokens = new XTokensGroup(this);186 this.tokens = new TokensGroup(this);187 this.xcm = new XcmGroup(this, 'polkadotXcm');188 }189}190191export class PolkadexHelper extends XcmChainHelper {192 assets: AssetsGroup<PolkadexHelper>;193 balance: SubstrateBalanceGroup<PolkadexHelper>;194 xTokens: XTokensGroup<PolkadexHelper>;195 xcm: XcmGroup<PolkadexHelper>;196 xcmHelper: PolkadexXcmHelperGroup<PolkadexHelper>;197198 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {199 super(logger, options.helperBase ?? PolkadexHelper);200201 this.assets = new AssetsGroup(this);202 this.balance = new SubstrateBalanceGroup(this);203 this.xTokens = new XTokensGroup(this);204 this.xcm = new XcmGroup(this, 'polkadotXcm');205 this.xcmHelper = new PolkadexXcmHelperGroup(this);206 }207}208