UNPKG

@moonbeam-network/xcm-sdk

Version:

The Moonbeam XCM SDK enables developers to easily deposit and withdraw assets to Moonbeam/Moonriver from the relay chain and other parachains in the Polkadot/Kusama ecosystem

1 lines 45.9 kB
{"version":3,"sources":["../src/services/polkadot/PolkadotService.ts","../src/getTransferData/getTransferData.utils.ts","../src/services/evm/EvmService.ts","../src/getTransferData/getSourceData.ts","../src/getTransferData/getDestinationData.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts"],"sourcesContent":["import '@polkadot/api-augment';\n\nimport type {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { type AnyParachain, AssetAmount } from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport type { ApiPromise } from '@polkadot/api';\nimport type {\n Signer as PolkadotSigner,\n SubmittableExtrinsic,\n} from '@polkadot/api/types';\nimport type { u128 } from '@polkadot/types';\nimport type { RuntimeDispatchInfo } from '@polkadot/types/interfaces';\nimport type { IKeyringPair, ISubmittableResult } from '@polkadot/types/types';\nimport type { HexString } from '@polkadot/util/types';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n constructor(api: ApiPromise, chain: AnyParachain) {\n this.api = api;\n this.chain = chain;\n }\n\n static async create(chain: AnyParachain): Promise<PolkadotService> {\n return new PolkadotService(await getPolkadotApi(chain.ws), chain);\n }\n\n static async createMulti(chains: AnyParachain[]): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) => PolkadotService.create(chain)),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get existentialDeposit(): AssetAmount {\n const existentialDeposit = this.api.consts.balances?.existentialDeposit;\n const eqExistentialDeposit = this.api.consts.eqBalances\n ?.existentialDeposit as unknown as u128 | undefined;\n const amount =\n existentialDeposit?.toBigInt() || eqExistentialDeposit?.toBigInt() || 0n;\n\n return AssetAmount.fromChainAsset(this.chain.nativeAsset, { amount });\n }\n\n async query(config: SubstrateQueryConfig): Promise<bigint> {\n const response = await this.api.query[config.module][config.func](\n ...config.args,\n );\n\n return config.transform(response);\n }\n\n getExtrinsic(\n config: ExtrinsicConfig,\n ): SubmittableExtrinsic<'promise', ISubmittableResult> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n return fn(...args);\n }\n\n getExtrinsicCallHash(config: ExtrinsicConfig): HexString {\n return this.getExtrinsic(config).method.toHex();\n }\n\n async getPaymentInfo(\n account: string,\n config: ExtrinsicConfig,\n ): Promise<RuntimeDispatchInfo> {\n const extrinsic = this.getExtrinsic(config);\n\n return extrinsic.paymentInfo(account, { nonce: -1 });\n }\n\n async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const info = await this.getPaymentInfo(account, config);\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n statusCallback?: (params: ISubmittableResult) => void,\n ): Promise<string> {\n const extrinsic = this.getExtrinsic(config);\n\n const isSigner = this.#isSigner(signer);\n const signOptions = {\n nonce: -1,\n signer: isSigner ? signer : undefined,\n withSignedTransaction: true,\n };\n\n const hash = await new Promise<string>((resolve, reject) => {\n extrinsic\n .signAndSend(isSigner ? account : signer, signOptions, (result) => {\n if (result.isError || result.dispatchError) {\n reject(\n new Error(\n result.dispatchError?.toString() || 'Transaction failed',\n ),\n );\n }\n if (result.txHash) {\n resolve(result.txHash.toString());\n }\n statusCallback?.(result);\n })\n .catch(reject);\n });\n\n return hash;\n }\n\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","import {\n type AssetMinConfigBuilder,\n type BalanceConfigBuilder,\n ContractConfig,\n EvmQueryConfig,\n type ExtrinsicConfig,\n type FeeConfigBuilder,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute, FeeConfig } from '@moonbeam-network/xcm-config';\nimport {\n type AnyChain,\n type AnyParachain,\n type Asset,\n AssetAmount,\n type ChainAsset,\n EvmChain,\n EvmParachain,\n Parachain,\n} from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type {\n DestinationChainTransferData,\n SourceChainTransferData,\n} from '../sdk.interfaces';\nimport { EvmService } from '../services/evm/EvmService';\nimport { PolkadotService } from '../services/polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset: ChainAsset;\n builder: BalanceConfigBuilder;\n chain: AnyChain;\n}\nexport async function getBalance({\n address,\n asset,\n builder,\n chain,\n}: GetBalancesParams): Promise<AssetAmount> {\n const config = builder.build({\n address,\n asset,\n });\n const amount = AssetAmount.fromChainAsset(asset, { amount: 0n });\n\n if (SubstrateQueryConfig.is(config) && EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n const balance = await polkadot.query(config);\n const converted = chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, asset.decimals)\n : balance;\n\n return amount.copyWith({ amount: converted });\n }\n\n if (EvmChain.is(chain) || EvmParachain.is(chain)) {\n const evm = EvmService.create(chain);\n\n if (ContractConfig.is(config)) {\n const balance = await evm.getBalance(address, config);\n\n return amount.copyWith({ amount: balance });\n }\n\n if (EvmQueryConfig.is(config)) {\n const balance = await evm.query(config);\n\n return amount.copyWith({ amount: balance });\n }\n }\n\n throw new Error(\n `Can't get balance for ${address} on chain ${chain.name} and asset ${asset.symbol}`,\n );\n}\n\nexport interface GetMinParams {\n asset: Asset;\n builder?: AssetMinConfigBuilder;\n chain: AnyChain;\n}\n\nexport async function getAssetMin({\n asset,\n builder,\n chain,\n}: GetMinParams): Promise<AssetAmount> {\n const zero = AssetAmount.fromChainAsset(chain.getChainAsset(asset), {\n amount: 0n,\n });\n\n if (builder && EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n const min = await polkadot.query(\n builder.build({ asset: zero.getMinAssetId(), address: zero.address }),\n );\n\n return zero.copyWith({ amount: min });\n }\n\n if (zero.min) {\n return zero.copyWith({ amount: zero.min });\n }\n\n return zero;\n}\n\nexport function getMin({\n balance,\n existentialDeposit,\n fee,\n min,\n}: DestinationChainTransferData) {\n const result = Big(0)\n .plus(balance.isSame(fee) ? fee.toBig() : Big(0))\n .plus(\n existentialDeposit &&\n balance.isSame(existentialDeposit) &&\n balance.toBig().lt(existentialDeposit.toBig())\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .plus(balance.toBig().lt(min.toBig()) ? min.toBig() : Big(0));\n\n return balance.copyWith({\n amount: BigInt(result.toFixed()),\n });\n}\n\nexport interface GetMaxParams {\n balance: AssetAmount;\n existentialDeposit?: AssetAmount;\n fee: AssetAmount;\n min: AssetAmount;\n}\n\nexport function getMax({\n balance,\n existentialDeposit,\n fee,\n min,\n}: GetMaxParams): AssetAmount {\n const result = balance\n .toBig()\n .minus(min.toBig())\n .minus(\n existentialDeposit && balance.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balance.isSame(fee) ? fee.toBig() : Big(0));\n\n return balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetDestinationFeeParams {\n address: string;\n asset: Asset;\n feeAsset: Asset;\n destination: AnyChain;\n fee: number | FeeConfigBuilder;\n source: AnyChain;\n}\n\nexport async function getDestinationFee({\n address,\n asset,\n destination,\n fee,\n feeAsset,\n source,\n}: GetDestinationFeeParams): Promise<AssetAmount> {\n const zero = AssetAmount.fromChainAsset(destination.getChainAsset(feeAsset), {\n amount: 0n,\n });\n\n if (typeof fee === 'number') {\n return zero.copyWith({\n amount: fee,\n });\n }\n\n if (EvmParachain.isAnyParachain(destination)) {\n const polkadot = await PolkadotService.create(destination);\n const cfg = fee.build({\n address,\n api: polkadot.api,\n asset: destination.getChainAsset(asset),\n destination,\n feeAsset: destination.getChainAsset(feeAsset),\n source,\n });\n\n return zero.copyWith({\n amount: await cfg.call(),\n });\n }\n\n return zero;\n}\n\nexport interface ConvertToChainDecimalsParams {\n asset: AssetAmount;\n target: ChainAsset;\n}\n\nexport function convertToChainDecimals({\n asset,\n target,\n}: ConvertToChainDecimalsParams): AssetAmount {\n return AssetAmount.fromChainAsset(target, {\n amount: asset.convertDecimals(target.decimals).amount,\n });\n}\n\nexport async function getExistentialDeposit(\n chain: AnyChain,\n): Promise<AssetAmount | undefined> {\n if (EvmParachain.isAnyParachain(chain)) {\n const polkadot = await PolkadotService.create(chain);\n\n return polkadot.existentialDeposit;\n }\n\n return undefined;\n}\n\nexport interface GetDestinationFeeBalanceParams {\n balance: AssetAmount;\n feeBalance: AssetAmount;\n route: AssetRoute;\n sourceAddress: string;\n}\n\nexport async function getDestinationFeeBalance({\n balance,\n feeBalance,\n route,\n sourceAddress,\n}: GetDestinationFeeBalanceParams): Promise<AssetAmount> {\n if (route.destination.fee.asset.isEqual(balance)) {\n return balance;\n }\n\n if (route.destination.fee.asset.isEqual(feeBalance)) {\n return feeBalance;\n }\n\n if (!route.source.destinationFee?.balance) {\n throw new Error(\n 'BalanceBuilder must be defined for source.destinationFee.balance for AssetRoute',\n );\n }\n\n return getBalance({\n address: sourceAddress,\n asset: route.getDestinationFeeAssetOnSource(),\n builder: route.source.destinationFee?.balance,\n chain: route.source.chain,\n });\n}\n\nexport interface GetExtrinsicFeeParams {\n address: string;\n balance: AssetAmount;\n chain: AnyParachain;\n extrinsic: ExtrinsicConfig;\n feeBalance: AssetAmount;\n feeConfig?: FeeConfig;\n}\n\nexport async function getExtrinsicFee({\n address,\n balance,\n chain,\n extrinsic,\n feeBalance,\n feeConfig,\n}: GetExtrinsicFeeParams): Promise<AssetAmount> {\n /**\n * If account has no balance (account doesn't exist),\n * we can't get the fee from some chains.\n * Example: Phala - PHA\n */\n try {\n const polkadot = await PolkadotService.create(chain);\n const fee = await polkadot.getFee(address, extrinsic);\n const extra = feeConfig?.extra\n ? toBigInt(feeConfig.extra, feeBalance.decimals)\n : 0n;\n const totalFee = fee + extra;\n\n const converted = chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, feeBalance.decimals)\n : totalFee;\n\n return feeBalance.copyWith({ amount: converted });\n } catch (error) {\n if (balance.amount) {\n throw error;\n }\n\n return feeBalance.copyWith({ amount: 0n });\n }\n}\n\nexport interface GetContractFeeParams {\n address: string;\n balance: AssetAmount;\n chain: EvmChain | EvmParachain;\n contract: ContractConfig;\n destinationFee: AssetAmount;\n feeBalance: AssetAmount;\n feeConfig?: FeeConfig;\n}\n\nexport async function getContractFee({\n address,\n balance,\n chain,\n contract,\n destinationFee,\n feeBalance,\n feeConfig,\n}: GetContractFeeParams): Promise<AssetAmount> {\n try {\n if (balance.amount === 0n) {\n return feeBalance.copyWith({ amount: 0n });\n }\n const evm = EvmService.create(chain);\n const fee = await evm.getFee(address, contract);\n const extra = feeConfig?.extra\n ? toBigInt(feeConfig.extra, feeBalance.decimals)\n : 0n;\n\n return feeBalance.copyWith({ amount: fee + extra });\n } catch (error) {\n /**\n * Contract can throw an error if user balance is smaller than fee.\n * Or if you try to send 0 as amount.\n */\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFee.toDecimal()} ${destinationFee.getSymbol()} in your source balance, needed for destination fees`,\n { cause: error },\n );\n }\n}\n\ninterface ValidateSovereignAccountBalancesProps {\n amount: bigint;\n destinationData: DestinationChainTransferData;\n sourceData: SourceChainTransferData;\n}\n\nexport function validateSovereignAccountBalances({\n amount,\n sourceData,\n destinationData,\n}: ValidateSovereignAccountBalancesProps): void {\n if (\n !Parachain.is(destinationData.chain) ||\n !destinationData.chain.checkSovereignAccountBalances ||\n !destinationData.sovereignAccountBalances\n ) {\n return;\n }\n const { feeAssetBalance, transferAssetBalance } =\n destinationData.sovereignAccountBalances;\n\n if (amount > transferAssetBalance) {\n throw new Error(\n `${sourceData.chain.name} Sovereign account in ${destinationData.chain.name} does not have enough balance for this transaction`,\n );\n }\n if (feeAssetBalance && sourceData.destinationFee.amount > feeAssetBalance) {\n throw new Error(\n `${sourceData.chain.name} Sovereign account in ${destinationData.chain.name} does not have enough balance to pay for fees for this transaction`,\n );\n }\n}\n","import type {\n ContractConfig,\n EvmQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { EvmChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport {\n http,\n type Address,\n type Hash,\n type HttpTransport,\n type PublicClient,\n createPublicClient,\n} from 'viem';\nimport type { EvmSigner } from '../../sdk.interfaces';\n\nexport class EvmService {\n readonly chain: EvmChain | EvmParachain;\n\n readonly client: PublicClient<HttpTransport>;\n\n static create(chain: EvmChain | EvmParachain): EvmService {\n return new EvmService(chain);\n }\n\n constructor(chain: EvmChain | EvmParachain) {\n this.chain = chain;\n this.client = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async query(query: EvmQueryConfig) {\n return this.client[query.func](...query.args);\n }\n\n async getFee(address: string, contract: ContractConfig): Promise<bigint> {\n const gas = await this.client.estimateContractGas({\n abi: contract.abi,\n account: address as Address,\n address: contract.address as Address,\n args: contract.args,\n functionName: contract.func,\n });\n const gasPrice = await this.client.getGasPrice();\n\n return gas * gasPrice;\n }\n\n async getBalance(address: string, contract: ContractConfig): Promise<bigint> {\n const balance = await this.client.readContract({\n abi: contract.abi,\n address: contract.address as Address,\n args: [address],\n functionName: 'balanceOf',\n });\n\n if (typeof balance !== 'bigint') {\n throw new Error(\n `Could not get balance on ${this.chain.name} for ${address} from contract ${contract.address}`,\n );\n }\n\n return balance;\n }\n\n async transfer(signer: EvmSigner, contract: ContractConfig): Promise<Hash> {\n const { request } = await this.client.simulateContract({\n abi: contract.abi,\n account: signer.account,\n address: contract.address as Address,\n args: contract.args,\n functionName: contract.func,\n });\n const hash = await signer.writeContract(request);\n\n return hash;\n }\n}\n","import type {\n ContractConfig,\n ExtrinsicConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { AssetRoute, FeeConfig } from '@moonbeam-network/xcm-config';\nimport type {\n AnyParachain,\n AssetAmount,\n EvmChain,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport type { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport { PolkadotService } from '../services/polkadot';\nimport {\n getAssetMin,\n getBalance,\n getContractFee,\n getDestinationFeeBalance,\n getExistentialDeposit,\n getExtrinsicFee,\n getMax,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n route: AssetRoute;\n destinationAddress: string;\n destinationFee: AssetAmount;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n route,\n destinationAddress,\n destinationFee,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const source = route.source.chain as AnyParachain;\n const destination = route.destination.chain as AnyParachain;\n const [sourcePolkadot, destinationPolkadot] =\n await PolkadotService.createMulti([source, destination]);\n const asset = source.getChainAsset(route.source.asset);\n const feeAsset = route.source.fee\n ? source.getChainAsset(route.source.fee.asset)\n : asset;\n\n const balance = await getBalance({\n address: sourceAddress,\n asset,\n builder: route.source.balance,\n chain: source,\n });\n const feeBalance = route.source.fee\n ? await getBalance({\n address: sourceAddress,\n asset: feeAsset,\n builder: route.source.fee.balance,\n chain: source,\n })\n : balance;\n const destinationFeeBalance = await getDestinationFeeBalance({\n balance,\n feeBalance,\n route,\n sourceAddress,\n });\n\n const existentialDeposit = await getExistentialDeposit(source);\n const min = await getAssetMin({\n asset,\n builder: route.source.min,\n chain: source,\n });\n\n const extrinsic = route.extrinsic?.build({\n asset: balance,\n destination: route.destination.chain as AnyParachain,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const contract = route.contract?.build({\n asset: balance,\n destination: route.destination.chain as AnyParachain,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n const fee = await getFee({\n balance,\n chain: source,\n contract,\n destinationFee,\n extrinsic,\n feeBalance,\n feeConfig: route.source.fee,\n sourceAddress,\n });\n\n const max = getMax({\n balance,\n existentialDeposit,\n fee,\n min,\n });\n\n return {\n balance,\n chain: source,\n destinationFee,\n destinationFeeBalance,\n existentialDeposit,\n fee,\n feeBalance,\n max,\n min,\n };\n}\n\nexport interface GetFeeParams {\n balance: AssetAmount;\n feeBalance: AssetAmount;\n contract?: ContractConfig;\n chain: AnyParachain;\n destinationFee: AssetAmount;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeConfig;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n feeBalance,\n chain,\n contract,\n destinationFee,\n extrinsic,\n feeConfig,\n sourceAddress,\n}: GetFeeParams): Promise<AssetAmount> {\n if (!contract && !extrinsic) {\n throw new Error('Either contract or extrinsic must be provided');\n }\n\n if (contract) {\n return getContractFee({\n address: sourceAddress,\n balance,\n chain: chain as EvmChain | EvmParachain,\n contract,\n destinationFee,\n feeBalance,\n feeConfig,\n });\n }\n\n return getExtrinsicFee({\n address: sourceAddress,\n balance,\n chain,\n extrinsic: extrinsic as ExtrinsicConfig,\n feeBalance,\n feeConfig,\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyParachain;\n routes: AssetRoute[];\n evmSigner?: EvmSigner;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n routes,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueRoutes = routes.reduce((acc: AssetRoute[], route: AssetRoute) => {\n if (\n !acc.some((a: AssetRoute) => a.source.asset.isEqual(route.source.asset))\n ) {\n // biome-ignore lint/performance/noAccumulatingSpread: I think this is fine here\n return [route, ...acc];\n }\n\n return acc;\n }, []);\n\n const balances = await Promise.all(\n uniqueRoutes.map(async (route: AssetRoute) =>\n getBalance({\n address,\n asset: chain.getChainAsset(route.source.asset),\n builder: route.source.balance,\n chain,\n }),\n ),\n );\n\n return balances;\n}\n","import type {\n AssetRoute,\n DestinationConfig,\n SourceConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Parachain } from '@moonbeam-network/xcm-types';\nimport { getSovereignAccountAddresses } from '@moonbeam-network/xcm-utils';\nimport type { DestinationChainTransferData } from '../sdk.interfaces';\nimport {\n getAssetMin,\n getBalance,\n getDestinationFee,\n getExistentialDeposit,\n} from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n route: AssetRoute;\n destinationAddress: string;\n}\n\nexport async function getDestinationData({\n route,\n destinationAddress,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const destination = route.destination.chain;\n const asset = destination.getChainAsset(route.destination.asset);\n const balance = await getBalance({\n address: destinationAddress,\n asset,\n builder: route.destination.balance,\n chain: destination,\n });\n const min = await getAssetMin({\n asset,\n builder: route.destination.min,\n chain: destination,\n });\n const fee = await getDestinationFee({\n address: destinationAddress,\n feeAsset: route.destination.fee.asset,\n destination,\n fee: route.destination.fee.amount,\n source: route.source.chain,\n asset: route.source.asset,\n });\n const existentialDeposit = await getExistentialDeposit(destination);\n\n return {\n chain: destination,\n balance,\n existentialDeposit,\n fee,\n min,\n sovereignAccountBalances: await getSovereignAccountBalances({\n source: route.source,\n destination: route.destination,\n }),\n };\n}\n\ninterface GetSovereignAccountBalancesProps {\n source: SourceConfig;\n destination: DestinationConfig;\n}\n\nasync function getSovereignAccountBalances({\n destination,\n source,\n}: GetSovereignAccountBalancesProps) {\n if (\n !Parachain.is(source.chain) ||\n !Parachain.is(destination.chain) ||\n !destination.chain.checkSovereignAccountBalances\n ) {\n return undefined;\n }\n\n const sovereignAccountAddresses = getSovereignAccountAddresses(\n source.chain.parachainId,\n );\n\n const destinationFeeAssetBalance = destination.fee.balance;\n\n const sovereignAccountAddress = destination.chain.isRelay\n ? sovereignAccountAddresses.relay\n : sovereignAccountAddresses.generic;\n\n const sovereignAccountBalance = await getBalance({\n address: sovereignAccountAddress,\n asset: destination.chain.getChainAsset(destination.asset),\n builder: destination.balance,\n chain: destination.chain,\n });\n\n const sovereignAccountFeeAssetBalance = destinationFeeAssetBalance\n ? await getBalance({\n address: sovereignAccountAddress,\n asset: destination.chain.getChainAsset(destination.fee.asset),\n builder: destinationFeeAssetBalance,\n chain: destination.chain,\n })\n : undefined;\n return {\n feeAssetBalance: sovereignAccountFeeAssetBalance?.amount,\n transferAssetBalance: sovereignAccountBalance.amount,\n };\n}\n","import { ConfigService, xcmRoutesMap } from '@moonbeam-network/xcm-config';\nimport {\n type AnyAsset,\n type AnyChain,\n type AnyParachain,\n type AssetAmount,\n type Ecosystem,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData } from './getTransferData/getTransferData';\nimport type { TransferData } from './sdk.interfaces';\n\nconst DEFAULT_SERVICE = new ConfigService({ routes: xcmRoutesMap });\n\nexport interface SdkOptions {\n configService?: ConfigService;\n ecosystem?: Ecosystem;\n}\n\nexport function Sdk({ configService, ecosystem }: SdkOptions = {}) {\n const service = configService ?? DEFAULT_SERVICE;\n const assets = service.getEcosystemAssets(ecosystem);\n\n return {\n assets,\n setAsset(asset: string | AnyAsset) {\n const sources = service.getSourceChains({ asset, ecosystem });\n\n return {\n sources,\n setSource(source: string | AnyChain) {\n const destinations = service.getDestinationChains({\n asset,\n source,\n });\n\n return {\n destinations,\n setDestination(destination: string | AnyChain) {\n const route = service.getAssetRoute({\n asset,\n source,\n destination,\n });\n\n return {\n setAddresses({\n sourceAddress,\n destinationAddress,\n }: {\n sourceAddress: string;\n destinationAddress: string;\n }): Promise<TransferData> {\n const sourceChain = service.getChain(source);\n\n if (!EvmParachain.isAnyParachain(sourceChain)) {\n throw new Error(\n 'Source chain should be a Parachain or EvmParachain',\n );\n }\n\n if (!EvmParachain.isAnyParachain(route.destination.chain)) {\n throw new Error(\n 'Destination chain should be a Parachain or EvmParachain',\n );\n }\n\n return getTransferData({\n route,\n sourceAddress,\n destinationAddress,\n });\n },\n };\n },\n };\n },\n };\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyParachain,\n address: string,\n service: ConfigService = DEFAULT_SERVICE,\n): Promise<AssetAmount[]> {\n const routes = service.getChainRoutes(chain).getRoutes();\n const balances = await getAssetsBalances({\n chain,\n routes,\n address,\n });\n\n return balances;\n}\n","import type { AssetRoute } from '@moonbeam-network/xcm-config';\nimport {\n type AnyParachain,\n AssetAmount,\n type EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type { Signers, TransferData } from '../sdk.interfaces';\nimport { EvmService } from '../services/evm/EvmService';\nimport { PolkadotService } from '../services/polkadot';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\nimport {\n convertToChainDecimals,\n getMin,\n validateSovereignAccountBalances,\n} from './getTransferData.utils';\n\ninterface GetTransferDataParams {\n route: AssetRoute;\n sourceAddress: string;\n destinationAddress: string;\n}\n\nexport async function getTransferData({\n route,\n sourceAddress,\n destinationAddress,\n}: GetTransferDataParams): Promise<TransferData> {\n const destinationData = await getDestinationData({\n route,\n destinationAddress,\n });\n\n // NOTE: Here we need to convert the fee on the destination chain\n // to an asset on source chain.\n const destinationFee = convertToChainDecimals({\n asset: destinationData.fee,\n target: route.getDestinationFeeAssetOnSource(),\n });\n\n const sourceData = await getSourceData({\n route,\n destinationAddress,\n destinationFee,\n sourceAddress,\n });\n\n return {\n destination: destinationData,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, sourceData.balance.decimals).toString(),\n );\n\n const result = bigAmount.minus(\n sourceData.balance.isSame(destinationFee)\n ? destinationFee.toBig()\n : Big(0),\n );\n\n return sourceData.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n max: sourceData.max,\n min: getMin(destinationData),\n source: sourceData,\n async transfer(\n amount,\n { evmSigner, polkadotSigner }: Partial<Signers>,\n ): Promise<string> {\n const source = route.source.chain as AnyParachain;\n const destination = route.destination.chain as AnyParachain;\n const bigintAmount = toBigInt(amount, sourceData.balance.decimals);\n validateSovereignAccountBalances({\n amount: bigintAmount,\n destinationData,\n sourceData,\n });\n const asset = AssetAmount.fromChainAsset(\n route.source.chain.getChainAsset(route.source.asset),\n { amount: bigintAmount },\n );\n const [sourcePolkadot, destinationPolkadot] =\n await PolkadotService.createMulti([source, destination]);\n\n const contract = route.contract?.build({\n asset,\n destination,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n const extrinsic = route.extrinsic?.build({\n asset,\n destination,\n destinationAddress,\n destinationApi: destinationPolkadot.api,\n fee: destinationFee,\n source,\n sourceAddress,\n sourceApi: sourcePolkadot.api,\n });\n\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n const evm = EvmService.create(source as EvmParachain);\n\n return evm.transfer(evmSigner, contract);\n }\n\n if (extrinsic) {\n if (!polkadotSigner) {\n throw new Error('Polkadot signer must be provided');\n }\n\n return sourcePolkadot.transfer(\n sourceAddress,\n extrinsic,\n polkadotSigner,\n );\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n"],"mappings":";AAAA,OAAO;AAMP,SAA4B,mBAAmB;AAC/C,SAAS,sBAAsB;AAWxB,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB;AAAA,EAEA;AAAA,EAET,YAAY,KAAiB,OAAqB;AAChD,SAAK,MAAM;AACX,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAa,OAAO,OAA+C;AACjE,WAAO,IAAI,iBAAgB,MAAM,eAAe,MAAM,EAAE,GAAG,KAAK;AAAA,EAClE;AAAA,EAEA,aAAa,YAAY,QAAoD;AAC3E,WAAO,QAAQ;AAAA,MACb,OAAO,IAAI,CAAC,UAAwB,iBAAgB,OAAO,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,IAAI,SAAS,cAAc,GAAG,CAAC,KAAK;AAAA,EAClD;AAAA,EAEA,IAAI,qBAAkC;AACpC,UAAM,qBAAqB,KAAK,IAAI,OAAO,UAAU;AACrD,UAAM,uBAAuB,KAAK,IAAI,OAAO,YACzC;AACJ,UAAM,SACJ,oBAAoB,SAAS,KAAK,sBAAsB,SAAS,KAAK;AAExE,WAAO,YAAY,eAAe,KAAK,MAAM,aAAa,EAAE,OAAO,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,MAAM,QAA+C;AACzD,UAAM,WAAW,MAAM,KAAK,IAAI,MAAM,OAAO,MAAM,EAAE,OAAO,IAAI;AAAA,MAC9D,GAAG,OAAO;AAAA,IACZ;AAEA,WAAO,OAAO,UAAU,QAAQ;AAAA,EAClC;AAAA,EAEA,aACE,QACqD;AACrD,UAAM,KAAK,KAAK,IAAI,GAAG,OAAO,MAAM,EAAE,OAAO,IAAI;AACjD,UAAM,OAAO,OAAO,QAAQ,EAAE;AAE9B,WAAO,GAAG,GAAG,IAAI;AAAA,EACnB;AAAA,EAEA,qBAAqB,QAAoC;AACvD,WAAO,KAAK,aAAa,MAAM,EAAE,OAAO,MAAM;AAAA,EAChD;AAAA,EAEA,MAAM,eACJ,SACA,QAC8B;AAC9B,UAAM,YAAY,KAAK,aAAa,MAAM;AAE1C,WAAO,UAAU,YAAY,SAAS,EAAE,OAAO,GAAG,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,OAAO,SAAiB,QAA0C;AACtE,UAAM,OAAO,MAAM,KAAK,eAAe,SAAS,MAAM;AAEtD,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA,EAEA,MAAM,SACJ,SACA,QACA,QACA,gBACiB;AACjB,UAAM,YAAY,KAAK,aAAa,MAAM;AAE1C,UAAM,WAAW,KAAK,UAAU,MAAM;AACtC,UAAM,cAAc;AAAA,MAClB,OAAO;AAAA,MACP,QAAQ,WAAW,SAAS;AAAA,MAC5B,uBAAuB;AAAA,IACzB;AAEA,UAAM,OAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC1D,gBACG,YAAY,WAAW,UAAU,QAAQ,aAAa,CAAC,WAAW;AACjE,YAAI,OAAO,WAAW,OAAO,eAAe;AAC1C;AAAA,YACE,IAAI;AAAA,cACF,OAAO,eAAe,SAAS,KAAK;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,QAAQ;AACjB,kBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,QAClC;AACA,yBAAiB,MAAM;AAAA,MACzB,CAAC,EACA,MAAM,MAAM;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAAiE;AACzE,WAAO,iBAAiB;AAAA,EAC1B;AACF;;;AC/HA;AAAA,EAGE;AAAA,EACA;AAAA,EAGA;AAAA,OACK;AAEP;AAAA,EAIE,eAAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,gBAAgB;AAC1C,OAAO,SAAS;;;AChBhB;AAAA,EACE;AAAA,EAKA;AAAA,OACK;AAGA,IAAM,aAAN,MAAM,YAAW;AAAA,EACb;AAAA,EAEA;AAAA,EAET,OAAO,OAAO,OAA4C;AACxD,WAAO,IAAI,YAAW,KAAK;AAAA,EAC7B;AAAA,EAEA,YAAY,OAAgC;AAC1C,SAAK,QAAQ;AACb,SAAK,SAAS,mBAAmB;AAAA,MAC/B,OAAO,MAAM,aAAa;AAAA,MAC1B,WAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,OAAuB;AACjC,WAAO,KAAK,OAAO,MAAM,IAAI,EAAE,GAAG,MAAM,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO,SAAiB,UAA2C;AACvE,UAAM,MAAM,MAAM,KAAK,OAAO,oBAAoB;AAAA,MAChD,KAAK,SAAS;AAAA,MACd,SAAS;AAAA,MACT,SAAS,SAAS;AAAA,MAClB,MAAM,SAAS;AAAA,MACf,cAAc,SAAS;AAAA,IACzB,CAAC;AACD,UAAM,WAAW,MAAM,KAAK,OAAO,YAAY;AAE/C,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,WAAW,SAAiB,UAA2C;AAC3E,UAAM,UAAU,MAAM,KAAK,OAAO,aAAa;AAAA,MAC7C,KAAK,SAAS;AAAA,MACd,SAAS,SAAS;AAAA,MAClB,MAAM,CAAC,OAAO;AAAA,MACd,cAAc;AAAA,IAChB,CAAC;AAED,QAAI,OAAO,YAAY,UAAU;AAC/B,YAAM,IAAI;AAAA,QACR,4BAA4B,KAAK,MAAM,IAAI,QAAQ,OAAO,kBAAkB,SAAS,OAAO;AAAA,MAC9F;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,QAAmB,UAAyC;AACzE,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,OAAO,iBAAiB;AAAA,MACrD,KAAK,SAAS;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,SAAS,SAAS;AAAA,MAClB,MAAM,SAAS;AAAA,MACf,cAAc,SAAS;AAAA,IACzB,CAAC;AACD,UAAM,OAAO,MAAM,OAAO,cAAc,OAAO;AAE/C,WAAO;AAAA,EACT;AACF;;;AD3CA,eAAsB,WAAW;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,SAAS,QAAQ,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,SAASC,aAAY,eAAe,OAAO,EAAE,QAAQ,GAAG,CAAC;AAE/D,MAAI,qBAAqB,GAAG,MAAM,KAAK,aAAa,eAAe,KAAK,GAAG;AACzE,UAAM,WAAW,MAAM,gBAAgB,OAAO,KAAK;AACnD,UAAM,UAAU,MAAM,SAAS,MAAM,MAAM;AAC3C,UAAM,YAAY,MAAM,oBACpB,gBAAgB,SAAS,SAAS,UAAU,MAAM,QAAQ,IAC1D;AAEJ,WAAO,OAAO,SAAS,EAAE,QAAQ,UAAU,CAAC;AAAA,EAC9C;AAEA,MAAI,SAAS,GAAG,KAAK,KAAK,aAAa,GAAG,KAAK,GAAG;AAChD,UAAM,MAAM,WAAW,OAAO,KAAK;AAEnC,QAAI,eAAe,GAAG,MAAM,GAAG;AAC7B,YAAM,UAAU,MAAM,IAAI,WAAW,SAAS,MAAM;AAEpD,aAAO,OAAO,SAAS,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAC5C;AAEA,QAAI,eAAe,GAAG,MAAM,GAAG;AAC7B,YAAM,UAAU,MAAM,IAAI,MAAM,MAAM;AAEtC,aAAO,OAAO,SAAS,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,yBAAyB,OAAO,aAAa,MAAM,IAAI,cAAc,MAAM,MAAM;AAAA,EACnF;AACF;AAQA,eAAsB,YAAY;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,OAAOA,aAAY,eAAe,MAAM,cAAc,KAAK,GAAG;AAAA,IAClE,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,WAAW,aAAa,eAAe,KAAK,GAAG;AACjD,UAAM,WAAW,MAAM,gBAAgB,OAAO,KAAK;AACnD,UAAM,MAAM,MAAM,SAAS;AAAA,MACzB,QAAQ,MAAM,EAAE,OAAO,KAAK,cAAc,GAAG,SAAS,KAAK,QAAQ,CAAC;AAAA,IACtE;AAEA,WAAO,KAAK,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,EACtC;AAEA,MAAI,KAAK,KAAK;AACZ,WAAO,KAAK,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC3C;AAEA,SAAO;AACT;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,SAAS,IAAI,CAAC,EACjB,KAAK,QAAQ,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,EAC/C;AAAA,IACC,sBACE,QAAQ,OAAO,kBAAkB,KACjC,QAAQ,MAAM,EAAE,GAAG,mBAAmB,MAAM,CAAC,IAC3C,mBAAmB,MAAM,IACzB,IAAI,CAAC;AAAA,EACX,EACC,KAAK,QAAQ,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC;AAE9D,SAAO,QAAQ,SAAS;AAAA,IACtB,QAAQ,OAAO,OAAO,QAAQ,CAAC;AAAA,EACjC,CAAC;AACH;AASO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,SAAS,QACZ,MAAM,EACN,MAAM,IAAI,MAAM,CAAC,EACjB;AAAA,IACC,sBAAsB,QAAQ,OAAO,kBAAkB,IACnD,mBAAmB,MAAM,IACzB,IAAI,CAAC;AAAA,EACX,EACC,MAAM,QAAQ,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC;AAEnD,SAAO,QAAQ,SAAS;AAAA,IACtB,QAAQ,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,OAAO,QAAQ,CAAC;AAAA,EACrD,CAAC;AACH;AAWA,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkD;AAChD,QAAM,OAAOA,aAAY,eAAe,YAAY,cAAc,QAAQ,GAAG;AAAA,IAC3E,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,KAAK,SAAS;AAAA,MACnB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,eAAe,WAAW,GAAG;AAC5C,UAAM,WAAW,MAAM,gBAAgB,OAAO,WAAW;AACzD,UAAM,MAAM,IAAI,MAAM;AAAA,MACpB;AAAA,MACA,KAAK,SAAS;AAAA,MACd,OAAO,YAAY,cAAc,KAAK;AAAA,MACtC;AAAA,MACA,UAAU,YAAY,cAAc,QAAQ;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,WAAO,KAAK,SAAS;AAAA,MACnB,QAAQ,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAOO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AACF,GAA8C;AAC5C,SAAOA,aAAY,eAAe,QAAQ;AAAA,IACxC,QAAQ,MAAM,gBAAgB,OAAO,QAAQ,EAAE;AAAA,EACjD,CAAC;AACH;AAEA,eAAsB,sBACpB,OACkC;AAClC,MAAI,aAAa,eAAe,KAAK,GAAG;AACtC,UAAM,WAAW,MAAM,gBAAgB,OAAO,KAAK;AAEnD,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO;AACT;AASA,eAAsB,yBAAyB;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyD;AACvD,MAAI,MAAM,YAAY,IAAI,MAAM,QAAQ,OAAO,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,YAAY,IAAI,MAAM,QAAQ,UAAU,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,OAAO,gBAAgB,SAAS;AACzC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW;AAAA,IAChB,SAAS;AAAA,IACT,OAAO,MAAM,+BAA+B;AAAA,IAC5C,SAAS,MAAM,OAAO,gBAAgB;AAAA,IACtC,OAAO,MAAM,OAAO;AAAA,EACtB,CAAC;AACH;AAWA,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAM9C,MAAI;AACF,UAAM,WAAW,MAAM,gBAAgB,OAAO,KAAK;AACnD,UAAM,MAAM,MAAM,SAAS,OAAO,SAAS,SAAS;AACpD,UAAM,QAAQ,WAAW,QACrB,SAAS,UAAU,OAAO,WAAW,QAAQ,IAC7C;AACJ,UAAM,WAAW,MAAM;AAEvB,UAAM,YAAY,MAAM,oBACpB,gBAAgB,UAAU,SAAS,UAAU,WAAW,QAAQ,IAChE;AAEJ,WAAO,WAAW,SAAS,EAAE,QAAQ,UAAU,CAAC;AAAA,EAClD,SAAS,OAAO;AACd,QAAI,QAAQ,QAAQ;AAClB,YAAM;AAAA,IACR;AAEA,WAAO,WAAW,SAAS,EAAE,QAAQ,GAAG,CAAC;AAAA,EAC3C;AACF;AAYA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,MAAI;AACF,QAAI,QAAQ,WAAW,IAAI;AACzB,aAAO,WAAW,SAAS,EAAE,QAAQ,GAAG,CAAC;AAAA,IAC3C;AACA,UAAM,MAAM,WAAW,OAAO,KAAK;AACnC,UAAM,MAAM,MAAM,IAAI,OAAO,SAAS,QAAQ;AAC9C,UAAM,QAAQ,WAAW,QACrB,SAAS,UAAU,OAAO,WAAW,QAAQ,IAC7C;AAEJ,WAAO,WAAW,SAAS,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,EACpD,SAAS,OAAO;AAKd,UAAM,IAAI;AAAA,MACR,uCAAuC,eAAe,UAAU,CAAC,IAAI,eAAe,UAAU,CAAC;AAAA,MAC/F,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAQO,SAAS,iCAAiC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,MACE,CAAC,UAAU,GAAG,gBAAgB,KAAK,KACnC,CAAC,gBAAgB,MAAM,iCACvB,CAAC,gBAAgB,0BACjB;AACA;AAAA,EACF;AACA,QAAM,EAAE,iBAAiB,qBAAqB,IAC5C,gBAAgB;AAElB,MAAI,SAAS,sBAAsB;AACjC,UAAM,IAAI;AAAA,MACR,GAAG,WAAW,MAAM,IAAI,yBAAyB,gBAAgB,MAAM,IAAI;AAAA,IAC7E;AAAA,EACF;AACA,MAAI,mBAAmB,WAAW,eAAe,SAAS,iBAAiB;AACzE,UAAM,IAAI;AAAA,MACR,GAAG,WAAW,MAAM,IAAI,yBAAyB,gBAAgB,MAAM,IAAI;AAAA,IAC7E;AAAA,EACF;AACF;;;AEjWA,eAAsB,cAAc;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0D;AACxD,QAAM,SAAS,MAAM,OAAO;AAC5B,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,CAAC,gBAAgB,mBAAmB,IACxC,MAAM,gBAAgB,YAAY,CAAC,QAAQ,WAAW,CAAC;AACzD,QAAM,QAAQ,OAAO,cAAc,MAAM,OAAO,KAAK;AACrD,QAAM,WAAW,MAAM,OAAO,MAC1B,OAAO,cAAc,MAAM,OAAO,IAAI,KAAK,IAC3C;AAEJ,QAAM,UAAU,MAAM,WAAW;AAAA,IAC/B,SAAS;AAAA,IACT;AAAA,IACA,SAAS,MAAM,OAAO;AAAA,IACtB,OAAO;AAAA,EACT,CAAC;AACD,QAAM,aAAa,MAAM,OAAO,MAC5B,MAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS,MAAM,OAAO,IAAI;AAAA,IAC1B,OAAO;AAAA,EACT,CAAC,IACD;AACJ,QAAM,wBAAwB,MAAM,yBAAyB;AAAA,IAC3D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,qBAAqB,MAAM,sBAAsB,MAAM;AAC7D,QAAM,MAAM,MAAM,YAAY;AAAA,IAC5B;AAAA,IACA,SAAS,MAAM,OAAO;AAAA,IACtB,OAAO;AAAA,EACT,CAAC;AAED,QAAM,YAAY,MAAM,WAAW,MAAM;AAAA,IACvC,OAAO;AAAA,IACP,aAAa,MAAM,YAAY;AAAA,IAC/B;AAAA,IACA,gBAAgB,oBAAoB;AAAA,IACpC,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,eAAe;AAAA,EAC5B,CAAC;AAED,QAAM,WAAW,MAAM,UAAU,MAAM;AAAA,IACrC,OAAO;AAAA,IACP,aAAa,MAAM,YAAY;AAAA,IAC/B;AAAA,IACA,gBAAgB,oBAAoB;AAAA,IACpC,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,eAAe;AAAA,EAC5B,CAAC;AAED,QAAM,MAAM,MAAM,OAAO;AAAA,IACvB;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AAED,QAAM,MAAM,OAAO;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAaA,eAAsB,OAAO;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,MAAI,CAAC,YAAY,CAAC,WAAW;AAC3B,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,MAAI,UAAU;AACZ,WAAO,eAAe;AAAA,MACpB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,gBAAgB;AAAA,IACrB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AASA,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAAoD;AAClD,QAAM,eAAe,OAAO,OAAO,CAAC,KAAmB,UAAsB;AAC3E,QACE,CAAC,IAAI,KAAK,CAAC,MAAkB,EAAE,OAAO,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,GACvE;AAEA,aAAO,CAAC,OAAO,GAAG,GAAG;AAAA,IACvB;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,aAAa;AAAA,MAAI,OAAO,UACtB,WAAW;AAAA,QACT;AAAA,QACA,OAAO,MAAM,cAAc,MAAM,OAAO,KAAK;AAAA,QAC7C,SAAS,MAAM,OAAO;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC3MA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,oCAAoC;AAc7C,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AACF,GAAoE;AAClE,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,QAAQ,YAAY,cAAc,MAAM,YAAY,KAAK;AAC/D,QAAM,UAAU,MAAM,WAAW;AAAA,IAC/B,SAAS;AAAA,IACT;AAAA,IACA,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM,MAAM,YAAY;AAAA,IAC5B;AAAA,IACA,SAAS,MAAM,YAAY;AAAA,IAC3B,OAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM,MAAM,kBAAkB;AAAA,IAClC,SAAS;AAAA,IACT,UAAU,MAAM,YAAY,IAAI;AAAA,IAChC;AAAA,IACA,KAAK,MAAM,YAAY,IAAI;AAAA,IAC3B,QAAQ,MAAM,OAAO;AAAA,IACrB,OAAO,MAAM,OAAO;AAAA,EACtB,CAAC;AACD,QAAM,qBAAqB,MAAM,sBAAsB,WAAW;AAElE,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,0BAA0B,MAAM,4BAA4B;AAAA,MAC1D,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAOA,eAAe,4BAA4B;AAAA,EACzC;AAAA,EACA;AACF,GAAqC;AACnC,MACE,CAACC,WAAU,GAAG,OAAO,KAAK,KAC1B,CAACA,WAAU,GAAG,YAAY,KAAK,KAC/B,CAAC,YAAY,MAAM,+BACnB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,4BAA4B;AAAA,IAChC,OAAO,MAAM;AAAA,EACf;AAEA,QAAM,6BAA6B,YAAY,IAAI;AAEnD,QAAM,0BAA0B,YAAY,MAAM,UAC9C,0BAA0B,QAC1B,0BAA0B;AAE9B,QAAM,0BAA0B,MAAM,WAAW;AAAA,IAC/C,SAAS;AAAA,IACT,OAAO,YAAY,MAAM,cAAc,YAAY,KAAK;AAAA,IACxD,SAAS,YAAY;AAAA,IACrB,OAAO,YAAY;AAAA,EACrB,CAAC;AAED,QAAM,kCAAkC,6BACpC,MAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,OAAO,YAAY,MAAM,cAAc,YAAY,IAAI,KAAK;AAAA,IAC5D,SAAS;AAAA,IACT,OAAO,YAAY;AAAA,EACrB,CAAC,IACD;AACJ,SAAO;AAAA,IACL,iBAAiB,iCAAiC;AAAA,IAClD,sBAAsB,wBAAwB;AAAA,EAChD;AACF;;;AC1GA,SAAS,eAAe,oBAAoB;AAC5C;AAAA,EAME,gBAAAC;AAAA,OACK;;;ACPP;AAAA,EAEE,eAAAC;AAAA,OAEK;AACP,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,UAAS;AAkBhB,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,kBAAkB,MAAM,mBAAmB;AAAA,IAC/C;AAAA,IACA;AAAA,EACF,CAAC;AAID,QAAM,iBAAiB,uBAAuB;AAAA,IAC5C,OAAO,gBAAgB;AAAA,IACvB,QAAQ,MAAM,+BAA+B;AAAA,EAC/C,CAAC;AAED,QAAM,aAAa,MAAM,cAAc;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,aAAa;AAAA,IACb,YAAY,QAAyB;AACnC,YAAM,YAAYC;AAAA,QAChBC,UAAS,QAAQ,WAAW,QAAQ,QAAQ,EAAE,SAAS;AAAA,MACzD;AAEA,YAAM,SAAS,UAAU;AAAA,QACvB,WAAW,QAAQ,OAAO,cAAc,IACpC,eAAe,MAAM,IACrBD,KAAI,CAAC;AAAA,MACX;AAEA,aAAO,WAAW,QAAQ,SAAS;AAAA,QACjC,QAAQ,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,OAAO,QAAQ,CAAC;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,KAAK,OAAO,eAAe;AAAA,IAC3B,QAAQ;AAAA,IACR,MAAM,SACJ,QACA,EAAE,WAAW,eAAe,GACX;AACjB,YAAM,SAAS,MAAM,OAAO;AAC5B,YAAM,cAAc,MAAM,YAAY;AACtC,YAAM,eAAeC,UAAS,QAAQ,WAAW,QAAQ,QAAQ;AACjE,uCAAiC;AAAA,QAC/B,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,QAAQC,aAAY;AAAA,QACxB,MAAM,OAAO,MAAM,cAAc,MAAM,OAAO,KAAK;AAAA,QACnD,EAAE,QAAQ,aAAa;AAAA,MACzB;AACA,YAAM,CAAC,gBAAgB,mBAAmB,IACxC,MAAM,gBAAgB,YAAY,CAAC,QAAQ,WAAW,CAAC;AAEzD,YAAM,WAAW,MAAM,UAAU,MAAM;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,oBAAoB;AAAA,QACpC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,WAAW,eAAe;AAAA,MAC5B,CAAC;AACD,YAAM,YAAY,MAAM,WAAW,MAAM;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,oBAAoB;AAAA,QACpC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,WAAW,eAAe;AAAA,MAC5B,CAAC;AAED,UAAI,UAAU;AACZ,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AAEA,cAAM,MAAM,WAAW,OAAO,MAAsB;AAEpD,eAAO,IAAI,SAAS,WAAW,QAAQ;AAAA,MACzC;AAEA,UAAI,WAAW;AACb,YAAI,CAAC,gBAAgB;AACnB,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QACpD;AAEA,eAAO,eAAe;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AACF;;;ADzHA,IAAM,kBAAkB,IAAI,cAAc,EAAE,QAAQ,aAAa,CAAC;AAO3D,SAAS,IAAI,EAAE,eAAe,UAAU,IAAgB,CAAC,GAAG;AACjE,QAAM,UAAU,iBAAiB;AACjC,QAAM,SAAS,QAAQ,mBAAmB,SAAS;AAEnD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAA0B;AACjC,YAAM,UAAU,QAAQ,gBAAgB,EAAE,OAAO,UAAU,CAAC;AAE5D,aAAO;AAAA,QACL;AAAA,QACA,UAAU,QAA2B;AACnC,gBAAM,eAAe,QAAQ,qBAAqB;AAAA,YAChD;AAAA,YACA;AAAA,UACF,CAAC;AAED,iBAAO;AAAA,YACL;AAAA,YACA,eAAe,aAAgC;AAC7C,oBAAM,QAAQ,QAAQ,cAAc;AAAA,gBAClC;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AAED,qBAAO;AAAA,gBACL,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF,GAG0B;AACxB,wBAAM,cAAc,QAAQ,SAAS,MAAM;AAE3C,sBAAI,CAACC,cAAa,eAAe,WAAW,GAAG;AAC7C,0BAAM,IAAI;AAAA,sBACR;AAAA,oBACF;AAAA,kBACF;AAEA,sBAAI,CAACA,cAAa,eAAe,MAAM,YAAY,KAAK,GAAG;AACzD,0BAAM,IAAI;AAAA,sBACR;AAAA,oBACF;AAAA,kBACF;AAEA,yBAAO,gBAAgB;AAAA,oBACrB;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,OACA,SACA,UAAyB,iBACD;AACxB,QAAM,SAAS,QAAQ,eAAe,KAAK,EAAE,UAAU;AACvD,QAAM,WAAW,MAAM,kBAAkB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":["AssetAmount","AssetAmount","Parachain","Parachain","EvmParachain","AssetAmount","toBigInt","Big","Big","toBigInt","AssetAmount","EvmParachain"]}