difftreelog
refactor(playgorunds) code structure regroup
in: master
6 files changed
.envrcdiffbeforeafterboth30 fi30 fi313132 echo -e "${GREEN}Baedeker env updated${RESET}"32 echo -e "${GREEN}Baedeker env updated${RESET}"33 nginx_id=$(docker compose -f .baedeker/.bdk-env/docker-compose.yml ps --format=json | jq -r '.[] | select(.Service == "nginx") | .ID' -e)33 nginx_id=$(docker compose -f .baedeker/.bdk-env/docker-compose.yml ps --format=json | jq -s 'flatten' | jq -r '.[] | select(.Service == "nginx") | .ID' -e)34 if ! [ $? -eq 0 ]; then34 if ! [ $? -eq 0 ]; then35 echo -e "${RED}Nginx container not found${RESET}"35 echo -e "${RED}Nginx container not found${RESET}"36 exit 036 exit 0tests/src/util/playgrounds/types.tsdiffbeforeafterboth223 minimalBalance?: bigint,223 minimalBalance?: bigint,224}224}225226export interface MoonbeamAssetInfo {227 location: any,228 metadata: {229 name: string,230 symbol: string,231 decimals: number,232 isFrozen: boolean,233 minimalBalance: bigint,234 },235 existentialDeposit: bigint,236 isSufficient: boolean,237 unitsPerSecond: bigint,238 numAssetsWeightHint: number,239}240241export interface AcalaAssetMetadata {242 name: string,243 symbol: string,244 decimals: number,245 minimalBalance: bigint,246}247248export interface DemocracyStandardAccountVote {249 balance: bigint,250 vote: {251 aye: boolean,252 conviction: number,253 },254}255225256export interface DemocracySplitAccount {226export interface DemocracySplitAccount {257 aye: bigint,227 aye: bigint,tests/src/util/playgrounds/types.xcm.tsdiffbeforeafterbothno changes
tests/src/util/playgrounds/unique.dev.tsdiffbeforeafterboth334import {stringToU8a} from '@polkadot/util';4import {stringToU8a} from '@polkadot/util';5import {blake2AsHex, encodeAddress, mnemonicGenerate} from '@polkadot/util-crypto';5import {blake2AsHex, encodeAddress, mnemonicGenerate} from '@polkadot/util-crypto';6import {UniqueHelper, MoonbeamHelper, ChainHelperBase, AcalaHelper, RelayHelper, WestmintHelper, AstarHelper, PolkadexHelper} from './unique';6import {UniqueHelper, ChainHelperBase, ChainHelperBaseConstructor} from './unique';7import {ApiPromise, Keyring, WsProvider} from '@polkadot/api';7import {ApiPromise, Keyring, WsProvider} from '@polkadot/api';8import * as defs from '../../interfaces/definitions';8import * as defs from '../../interfaces/definitions';9import {IKeyringPair} from '@polkadot/types/types';9import {IKeyringPair} from '@polkadot/types/types';10import {EventRecord} from '@polkadot/types/interfaces';10import {EventRecord} from '@polkadot/types/interfaces';11import {ICrossAccountId, IPovInfo, ITransactionResult, TSigner} from './types';11import {ICrossAccountId, IPovInfo, ITransactionResult, TSigner} from './types';12import {FrameSystemEventRecord, XcmV2TraitsError} from '@polkadot/types/lookup';12import {FrameSystemEventRecord, XcmV2TraitsError} from '@polkadot/types/lookup';13import {VoidFn} from '@polkadot/api/types';13import {SignerOptions, VoidFn} from '@polkadot/api/types';14import {Pallets} from '..';14import {Pallets} from '..';15import {spawnSync} from 'child_process';15import {spawnSync} from 'child_process';16import {AcalaHelper, AstarHelper, MoonbeamHelper, PolkadexHelper, RelayHelper, WestmintHelper} from './unique.xcm';161717export class SilentLogger {18export class SilentLogger {18 log(_msg: any, _level: any): void { }19 log(_msg: any, _level: any): void { }260 };261 };261}262}263264// eslint-disable-next-line @typescript-eslint/naming-convention265export function SudoHelper<T extends ChainHelperBaseConstructor>(Base: T) {266 return class extends Base {267 constructor(...args: any[]) {268 super(...args);269 }270271 async executeExtrinsic(272 sender: IKeyringPair,273 extrinsic: string,274 params: any[],275 expectSuccess?: boolean,276 options: Partial<SignerOptions> | null = null,277 ): Promise<ITransactionResult> {278 const call = this.constructApiCall(extrinsic, params);279 const result = await super.executeExtrinsic(280 sender,281 'api.tx.sudo.sudo',282 [call],283 expectSuccess,284 options,285 );286287 if(result.status === 'Fail') return result;288289 const data = (result.result.events.find(x => x.event.section == 'sudo' && x.event.method == 'Sudid')?.event.data as any).sudoResult;290 if(data.isErr) {291 if(data.asErr.isModule) {292 const error = (result.result.events[1].event.data as any).sudoResult.asErr.asModule;293 const metaError = super.getApi()?.registry.findMetaError(error);294 throw new Error(`${metaError.section}.${metaError.name}`);295 } else if(data.asErr.isToken) {296 throw new Error(`Token: ${data.asErr.asToken}`);297 }298 // May be [object Object] in case of unhandled non-unit enum299 throw new Error(`Misc: ${data.asErr.toHuman()}`);300 }301 return result;302 }303 async executeExtrinsicUncheckedWeight(304 sender: IKeyringPair,305 extrinsic: string,306 params: any[],307 expectSuccess?: boolean,308 options: Partial<SignerOptions> | null = null,309 ): Promise<ITransactionResult> {310 const call = this.constructApiCall(extrinsic, params);311 const result = await super.executeExtrinsic(312 sender,313 'api.tx.sudo.sudoUncheckedWeight',314 [call, {refTime: 0, proofSize: 0}],315 expectSuccess,316 options,317 );318319 if(result.status === 'Fail') return result;320321 const data = (result.result.events.find(x => x.event.section == 'sudo' && x.event.method == 'Sudid')?.event.data as any).sudoResult;322 if(data.isErr) {323 if(data.asErr.isModule) {324 const error = (result.result.events[1].event.data as any).sudoResult.asErr.asModule;325 const metaError = super.getApi()?.registry.findMetaError(error);326 throw new Error(`${metaError.section}.${metaError.name}`);327 } else if(data.asErr.isToken) {328 throw new Error(`Token: ${data.asErr.asToken}`);329 }330 // May be [object Object] in case of unhandled non-unit enum331 throw new Error(`Misc: ${data.asErr.toHuman()}`);332 }333 return result;334 }335 };336}262337263export class DevUniqueHelper extends UniqueHelper {338export class DevUniqueHelper extends UniqueHelper {264 /**339 /**326 this.network = await UniqueHelper.detectNetwork(this.api);401 this.network = await UniqueHelper.detectNetwork(this.api);327 this.wsEndpoint = wsEndpoint;402 this.wsEndpoint = wsEndpoint;328 }403 }404 getSudo<T extends UniqueHelper>() {405 // eslint-disable-next-line @typescript-eslint/naming-convention406 const SudoHelperType = SudoHelper(this.helperBase);407 return this.clone(SudoHelperType) as T;408 }329}409}330410331export class DevRelayHelper extends RelayHelper {411export class DevRelayHelper extends RelayHelper {387 this.wait = new WaitGroup(this);467 this.wait = new WaitGroup(this);388 }468 }469470 getSudo<T extends UniqueHelper>() {471 // eslint-disable-next-line @typescript-eslint/naming-convention472 const SudoHelperType = SudoHelper(this.helperBase);473 return this.clone(SudoHelperType) as T;474 }389}475}390476391export class DevShidenHelper extends AstarHelper {477export class DevShidenHelper extends AstarHelper {408 super(logger, options);494 super(logger, options);409 this.wait = new WaitGroup(this);495 this.wait = new WaitGroup(this);410 }496 }497 getSudo<T extends UniqueHelper>() {498 // eslint-disable-next-line @typescript-eslint/naming-convention499 const SudoHelperType = SudoHelper(this.helperBase);500 return this.clone(SudoHelperType) as T;501 }411}502}412503413export class DevPolkadexHelper extends PolkadexHelper {504export class DevPolkadexHelper extends PolkadexHelper {419 this.wait = new WaitGroup(this);510 this.wait = new WaitGroup(this);420 }511 }512513 getSudo<T extends PolkadexHelper>() {514 // eslint-disable-next-line @typescript-eslint/naming-convention515 const SudoHelperType = SudoHelper(this.helperBase);516 return this.clone(SudoHelperType) as T;517 }421}518}422519423export class DevKaruraHelper extends DevAcalaHelper {}520export class DevKaruraHelper extends DevAcalaHelper {}tests/src/util/playgrounds/unique.tsdiffbeforeafterboth40 TSubstrateAccount,40 TSubstrateAccount,41 TNetworks,41 TNetworks,42 IForeignAssetMetadata,42 IForeignAssetMetadata,43 AcalaAssetMetadata,44 MoonbeamAssetInfo,45 DemocracyStandardAccountVote,46 IEthCrossAccountId,43 IEthCrossAccountId,47 IPhasicEvent,44 IPhasicEvent,48} from './types';45} from './types';818}815}819816820817821class HelperGroup<T extends ChainHelperBase> {818export class HelperGroup<T extends ChainHelperBase> {822 helper: T;819 helper: T;823820824 constructor(uniqueHelper: T) {821 constructor(uniqueHelper: T) {2373 }2370 }2374}2371}237523722376class SubstrateBalanceGroup<T extends ChainHelperBase> extends HelperGroup<T> {2373export class SubstrateBalanceGroup<T extends ChainHelperBase> extends HelperGroup<T> {2377 /**2374 /**2378 * Get substrate address balance2375 * Get substrate address balance2379 * @param address substrate address2376 * @param address substrate address2440 }2437 }2441}2438}244224392443class EthereumBalanceGroup<T extends ChainHelperBase> extends HelperGroup<T> {2440export class EthereumBalanceGroup<T extends ChainHelperBase> extends HelperGroup<T> {2444 /**2441 /**2445 * Get ethereum address balance2442 * Get ethereum address balance2446 * @param address ethereum address2443 * @param address ethereum address3595 }3592 }3596}3593}359735943598class XcmGroup<T extends ChainHelperBase> extends HelperGroup<T> {3595export class XcmGroup<T extends ChainHelperBase> extends HelperGroup<T> {3599 palletName: string;3596 palletName: string;360035973601 constructor(helper: T, palletName: string) {3598 constructor(helper: T, palletName: string) {3688 }3685 }3689}3686}369036873691class XTokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {3688export class XTokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {3692 async transfer(signer: TSigner, currencyId: any, amount: bigint, destination: any, destWeight: any) {3689 async transfer(signer: TSigner, currencyId: any, amount: bigint, destination: any, destWeight: any) {3693 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transfer', [currencyId, amount, destination, destWeight], true);3690 await this.helper.executeExtrinsic(signer, 'api.tx.xTokens.transfer', [currencyId, amount, destination, destWeight], true);3694 }3691 }3702 }3699 }3703}3700}370437013705class PolkadexXcmHelperGroup<T extends ChainHelperBase> extends HelperGroup<T> {37023706 async whitelistToken(signer: TSigner, assetId: any) {3707 await this.helper.executeExtrinsic(signer, 'api.tx.xcmHelper.whitelistToken', [assetId], true);3708 }3709}371037033711class TokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {3704export class TokensGroup<T extends ChainHelperBase> extends HelperGroup<T> {3712 async accounts(address: string, currencyId: any) {3705 async accounts(address: string, currencyId: any) {3713 const {free} = (await this.helper.callRpc('api.query.tokens.accounts', [address, currencyId])).toJSON() as any;3706 const {free} = (await this.helper.callRpc('api.query.tokens.accounts', [address, currencyId])).toJSON() as any;3714 return BigInt(free);3707 return BigInt(free);3715 }3708 }3716}3709}371737103718class AssetsGroup<T extends ChainHelperBase> extends HelperGroup<T> {3711export class AssetsGroup<T extends ChainHelperBase> extends HelperGroup<T> {3719 async create(signer: TSigner, assetId: number, admin: string, minimalBalance: bigint) {3712 async create(signer: TSigner, assetId: number, admin: string, minimalBalance: bigint) {3720 await this.helper.executeExtrinsic(signer, 'api.tx.assets.create', [assetId, admin, minimalBalance], true);3713 await this.helper.executeExtrinsic(signer, 'api.tx.assets.create', [assetId, admin, minimalBalance], true);3721 }3714 }3755 }3748 }3756}3749}375737503758class AcalaAssetRegistryGroup extends HelperGroup<AcalaHelper> {37513759 async registerForeignAsset(signer: TSigner, destination: any, metadata: AcalaAssetMetadata) {3760 await this.helper.executeExtrinsic(signer, 'api.tx.assetRegistry.registerForeignAsset', [destination, metadata], true);3761 }3762}37633764class MoonbeamAssetManagerGroup extends HelperGroup<MoonbeamHelper> {3765 makeRegisterForeignAssetProposal(assetInfo: MoonbeamAssetInfo) {3766 const apiPrefix = 'api.tx.assetManager.';37673768 const registerTx = this.helper.constructApiCall(3769 apiPrefix + 'registerForeignAsset',3770 [assetInfo.location, assetInfo.metadata, assetInfo.existentialDeposit, assetInfo.isSufficient],3771 );37723773 const setUnitsTx = this.helper.constructApiCall(3774 apiPrefix + 'setAssetUnitsPerSecond',3775 [assetInfo.location, assetInfo.unitsPerSecond, assetInfo.numAssetsWeightHint],3776 );37773778 const batchCall = this.helper.getApi().tx.utility.batchAll([registerTx, setUnitsTx]);3779 const encodedProposal = batchCall?.method.toHex() || '';3780 return encodedProposal;3781 }37823783 async assetTypeId(location: any) {3784 return await this.helper.callRpc('api.query.assetManager.assetTypeId', [location]);3785 }3786}37873788class MoonbeamDemocracyGroup extends HelperGroup<MoonbeamHelper> {3789 notePreimagePallet: string;37903791 constructor(helper: MoonbeamHelper, options: { [key: string]: any } = {}) {3792 super(helper);3793 this.notePreimagePallet = options.notePreimagePallet;3794 }37953796 async notePreimage(signer: TSigner, encodedProposal: string) {3797 await this.helper.executeExtrinsic(signer, `api.tx.${this.notePreimagePallet}.notePreimage`, [encodedProposal], true);3798 }37993800 externalProposeMajority(proposal: any) {3801 return this.helper.constructApiCall('api.tx.democracy.externalProposeMajority', [proposal]);3802 }38033804 fastTrack(proposalHash: string, votingPeriod: number, delayPeriod: number) {3805 return this.helper.constructApiCall('api.tx.democracy.fastTrack', [proposalHash, votingPeriod, delayPeriod]);3806 }38073808 async referendumVote(signer: TSigner, referendumIndex: number, accountVote: DemocracyStandardAccountVote) {3809 await this.helper.executeExtrinsic(signer, 'api.tx.democracy.vote', [referendumIndex, {Standard: accountVote}], true);3810 }3811}38123813class MoonbeamCollectiveGroup extends HelperGroup<MoonbeamHelper> {3814 collective: string;38153816 constructor(helper: MoonbeamHelper, collective: string) {3817 super(helper);38183819 this.collective = collective;3820 }38213822 async propose(signer: TSigner, threshold: number, proposalHash: string, lengthBound: number) {3823 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.propose`, [threshold, proposalHash, lengthBound], true);3824 }38253826 async vote(signer: TSigner, proposalHash: string, proposalIndex: number, approve: boolean) {3827 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.vote`, [proposalHash, proposalIndex, approve], true);3828 }38293830 async close(signer: TSigner, proposalHash: string, proposalIndex: number, weightBound: any, lengthBound: number) {3831 await this.helper.executeExtrinsic(signer, `api.tx.${this.collective}.close`, [proposalHash, proposalIndex, weightBound, lengthBound], true);3832 }38333834 async proposalCount() {3835 return Number(await this.helper.callRpc(`api.query.${this.collective}.proposalCount`, []));3836 }3837}383837523839export type ChainHelperBaseConstructor = new (...args: any[]) => ChainHelperBase;3753export type ChainHelperBaseConstructor = new (...args: any[]) => ChainHelperBase;3840export type UniqueHelperConstructor = new (...args: any[]) => UniqueHelper;3754export type UniqueHelperConstructor = new (...args: any[]) => UniqueHelper;3891 this.utility = new UtilityGroup(this);3805 this.utility = new UtilityGroup(this);3892 }3806 }38933894 getSudo<T extends UniqueHelper>() {3895 // eslint-disable-next-line @typescript-eslint/naming-convention3896 const SudoHelperType = SudoHelper(this.helperBase);3897 return this.clone(SudoHelperType) as T;3898 }3899}3807}39003901export class XcmChainHelper extends ChainHelperBase {3902 async connect(wsEndpoint: string, _listeners?: any): Promise<void> {3903 const wsProvider = new WsProvider(wsEndpoint);3904 this.api = new ApiPromise({3905 provider: wsProvider,3906 });3907 await this.api.isReadyOrError;3908 this.network = await UniqueHelper.detectNetwork(this.api);3909 }3910}39113912export class RelayHelper extends XcmChainHelper {3913 balance: SubstrateBalanceGroup<RelayHelper>;3914 xcm: XcmGroup<RelayHelper>;39153916 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {3917 super(logger, options.helperBase ?? RelayHelper);39183919 this.balance = new SubstrateBalanceGroup(this);3920 this.xcm = new XcmGroup(this, 'xcmPallet');3921 }3922}39233924export class WestmintHelper extends XcmChainHelper {3925 balance: SubstrateBalanceGroup<WestmintHelper>;3926 xcm: XcmGroup<WestmintHelper>;3927 assets: AssetsGroup<WestmintHelper>;3928 xTokens: XTokensGroup<WestmintHelper>;39293930 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {3931 super(logger, options.helperBase ?? WestmintHelper);39323933 this.balance = new SubstrateBalanceGroup(this);3934 this.xcm = new XcmGroup(this, 'polkadotXcm');3935 this.assets = new AssetsGroup(this);3936 this.xTokens = new XTokensGroup(this);3937 }3938}39393940export class MoonbeamHelper extends XcmChainHelper {3941 balance: EthereumBalanceGroup<MoonbeamHelper>;3942 assetManager: MoonbeamAssetManagerGroup;3943 assets: AssetsGroup<MoonbeamHelper>;3944 xTokens: XTokensGroup<MoonbeamHelper>;3945 democracy: MoonbeamDemocracyGroup;3946 collective: {3947 council: MoonbeamCollectiveGroup,3948 techCommittee: MoonbeamCollectiveGroup,3949 };39503951 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {3952 super(logger, options.helperBase ?? MoonbeamHelper);39533954 this.balance = new EthereumBalanceGroup(this);3955 this.assetManager = new MoonbeamAssetManagerGroup(this);3956 this.assets = new AssetsGroup(this);3957 this.xTokens = new XTokensGroup(this);3958 this.democracy = new MoonbeamDemocracyGroup(this, options);3959 this.collective = {3960 council: new MoonbeamCollectiveGroup(this, 'councilCollective'),3961 techCommittee: new MoonbeamCollectiveGroup(this, 'techCommitteeCollective'),3962 };3963 }3964}39653966export class AstarHelper extends XcmChainHelper {3967 balance: SubstrateBalanceGroup<AstarHelper>;3968 assets: AssetsGroup<AstarHelper>;3969 xcm: XcmGroup<AstarHelper>;39703971 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {3972 super(logger, options.helperBase ?? AstarHelper);39733974 this.balance = new SubstrateBalanceGroup(this);3975 this.assets = new AssetsGroup(this);3976 this.xcm = new XcmGroup(this, 'polkadotXcm');3977 }39783979 getSudo<T extends UniqueHelper>() {3980 // eslint-disable-next-line @typescript-eslint/naming-convention3981 const SudoHelperType = SudoHelper(this.helperBase);3982 return this.clone(SudoHelperType) as T;3983 }3984}39853986export class AcalaHelper extends XcmChainHelper {3987 balance: SubstrateBalanceGroup<AcalaHelper>;3988 assetRegistry: AcalaAssetRegistryGroup;3989 xTokens: XTokensGroup<AcalaHelper>;3990 tokens: TokensGroup<AcalaHelper>;3991 xcm: XcmGroup<AcalaHelper>;39923993 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {3994 super(logger, options.helperBase ?? AcalaHelper);39953996 this.balance = new SubstrateBalanceGroup(this);3997 this.assetRegistry = new AcalaAssetRegistryGroup(this);3998 this.xTokens = new XTokensGroup(this);3999 this.tokens = new TokensGroup(this);4000 this.xcm = new XcmGroup(this, 'polkadotXcm');4001 }40024003 getSudo<T extends AcalaHelper>() {4004 // eslint-disable-next-line @typescript-eslint/naming-convention4005 const SudoHelperType = SudoHelper(this.helperBase);4006 return this.clone(SudoHelperType) as T;4007 }4008}40094010export class PolkadexHelper extends XcmChainHelper {4011 assets: AssetsGroup<PolkadexHelper>;4012 balance: SubstrateBalanceGroup<PolkadexHelper>;4013 xTokens: XTokensGroup<PolkadexHelper>;4014 xcm: XcmGroup<PolkadexHelper>;4015 xcmHelper: PolkadexXcmHelperGroup<PolkadexHelper>;40164017 constructor(logger?: ILogger, options: { [key: string]: any } = {}) {4018 super(logger, options.helperBase ?? PolkadexHelper);40194020 this.assets = new AssetsGroup(this);4021 this.balance = new SubstrateBalanceGroup(this);4022 this.xTokens = new XTokensGroup(this);4023 this.xcm = new XcmGroup(this, 'polkadotXcm');4024 this.xcmHelper = new PolkadexXcmHelperGroup(this);4025 }40264027 getSudo<T extends PolkadexHelper>() {4028 // eslint-disable-next-line @typescript-eslint/naming-convention4029 const SudoHelperType = SudoHelper(this.helperBase);4030 return this.clone(SudoHelperType) as T;4031 }4032}403338084034// eslint-disable-next-line @typescript-eslint/naming-convention3809// eslint-disable-next-line @typescript-eslint/naming-convention4035function ScheduledUniqueHelper<T extends UniqueHelperConstructor>(Base: T) {3810function ScheduledUniqueHelper<T extends UniqueHelperConstructor>(Base: T) {4091 };3866 };4092}3867}40934094// eslint-disable-next-line @typescript-eslint/naming-convention4095function SudoHelper<T extends ChainHelperBaseConstructor>(Base: T) {4096 return class extends Base {4097 constructor(...args: any[]) {4098 super(...args);4099 }41004101 async executeExtrinsic(4102 sender: IKeyringPair,4103 extrinsic: string,4104 params: any[],4105 expectSuccess?: boolean,4106 options: Partial<SignerOptions> | null = null,4107 ): Promise<ITransactionResult> {4108 const call = this.constructApiCall(extrinsic, params);4109 const result = await super.executeExtrinsic(4110 sender,4111 'api.tx.sudo.sudo',4112 [call],4113 expectSuccess,4114 options,4115 );41164117 if(result.status === 'Fail') return result;41184119 const data = (result.result.events.find(x => x.event.section == 'sudo' && x.event.method == 'Sudid')?.event.data as any).sudoResult;4120 if(data.isErr) {4121 if(data.asErr.isModule) {4122 const error = (result.result.events[1].event.data as any).sudoResult.asErr.asModule;4123 const metaError = super.getApi()?.registry.findMetaError(error);4124 throw new Error(`${metaError.section}.${metaError.name}`);4125 } else if(data.asErr.isToken) {4126 throw new Error(`Token: ${data.asErr.asToken}`);4127 }4128 // May be [object Object] in case of unhandled non-unit enum4129 throw new Error(`Misc: ${data.asErr.toHuman()}`);4130 }4131 return result;4132 }4133 async executeExtrinsicUncheckedWeight(4134 sender: IKeyringPair,4135 extrinsic: string,4136 params: any[],4137 expectSuccess?: boolean,4138 options: Partial<SignerOptions> | null = null,4139 ): Promise<ITransactionResult> {4140 const call = this.constructApiCall(extrinsic, params);4141 const result = await super.executeExtrinsic(4142 sender,4143 'api.tx.sudo.sudoUncheckedWeight',4144 [call, {refTime: 0, proofSize: 0}],4145 expectSuccess,4146 options,4147 );41484149 if(result.status === 'Fail') return result;41504151 const data = (result.result.events.find(x => x.event.section == 'sudo' && x.event.method == 'Sudid')?.event.data as any).sudoResult;4152 if(data.isErr) {4153 if(data.asErr.isModule) {4154 const error = (result.result.events[1].event.data as any).sudoResult.asErr.asModule;4155 const metaError = super.getApi()?.registry.findMetaError(error);4156 throw new Error(`${metaError.section}.${metaError.name}`);4157 } else if(data.asErr.isToken) {4158 throw new Error(`Token: ${data.asErr.asToken}`);4159 }4160 // May be [object Object] in case of unhandled non-unit enum4161 throw new Error(`Misc: ${data.asErr.toHuman()}`);4162 }4163 return result;4164 }4165 };4166}416738684168export class UniqueBaseCollection {3869export class UniqueBaseCollection {4169 helper: UniqueHelper;3870 helper: UniqueHelper;4290 return new UniqueBaseCollection(this.collectionId, scheduledHelper);3991 return new UniqueBaseCollection(this.collectionId, scheduledHelper);4291 }3992 }42924293 getSudo<T extends UniqueHelper>() {4294 return new UniqueBaseCollection(this.collectionId, this.helper.getSudo<T>());4295 }4296}3993}4297429839944404 return new UniqueNFTCollection(this.collectionId, scheduledHelper);4100 return new UniqueNFTCollection(this.collectionId, scheduledHelper);4405 }4101 }44064407 getSudo<T extends UniqueHelper>() {4408 return new UniqueNFTCollection(this.collectionId, this.helper.getSudo<T>());4409 }4410}4102}4411441241034530 return new UniqueRFTCollection(this.collectionId, scheduledHelper);4221 return new UniqueRFTCollection(this.collectionId, scheduledHelper);4531 }4222 }45324533 getSudo<T extends UniqueHelper>() {4534 return new UniqueRFTCollection(this.collectionId, this.helper.getSudo<T>());4535 }4536}4223}4537453842244597 return new UniqueFTCollection(this.collectionId, scheduledHelper);4283 return new UniqueFTCollection(this.collectionId, scheduledHelper);4598 }4284 }45994600 getSudo<T extends UniqueHelper>() {4601 return new UniqueFTCollection(this.collectionId, this.helper.getSudo<T>());4602 }4603}4285}4604460542864658 return new UniqueBaseToken(this.tokenId, scheduledCollection);4339 return new UniqueBaseToken(this.tokenId, scheduledCollection);4659 }4340 }46604661 getSudo<T extends UniqueHelper>() {4662 return new UniqueBaseToken(this.tokenId, this.collection.getSudo<T>());4663 }4664}4341}4665466643424736 return new UniqueNFToken(this.tokenId, scheduledCollection);4412 return new UniqueNFToken(this.tokenId, scheduledCollection);4737 }4413 }47384739 getSudo<T extends UniqueHelper>() {4740 return new UniqueNFToken(this.tokenId, this.collection.getSudo<T>());4741 }4742}4414}474344154744export class UniqueRFToken extends UniqueBaseToken {4416export class UniqueRFToken extends UniqueBaseToken {4825 return new UniqueRFToken(this.tokenId, scheduledCollection);4497 return new UniqueRFToken(this.tokenId, scheduledCollection);4826 }4498 }48274828 getSudo<T extends UniqueHelper>() {4829 return new UniqueRFToken(this.tokenId, this.collection.getSudo<T>());4830 }4831}4499}48324500tests/src/util/playgrounds/unique.xcm.tsdiffbeforeafterbothno changes