{"version":3,"sources":["../src/index.ts","../src/contracts/XcmTransactorContract/XcmTransactorContract.ts","../src/transact/transact.ts","../src/transact/transact.utils.ts"],"sourcesContent":["export * from './contracts';\nexport * from './transact';\n","import { PrecompileXcmTransactThroughSignedMultilocationParams } from '@moonbeam-network/xcm-config';\nimport { Contract, ContractTransaction, Signer } from 'ethers';\nimport ContractInterface from './XcmTransactorABI.json';\n\nexport class XcmTransactorContract {\n  readonly address: string = '0x000000000000000000000000000000000000080d';\n\n  readonly #contract: Contract;\n\n  constructor(signer: Signer) {\n    this.#contract = new Contract(this.address, ContractInterface, signer);\n  }\n\n  async transactThroughSignedMultilocation({\n    destination,\n    asset,\n    txWeight,\n    callHash,\n    overallFee,\n    overallWeight,\n  }: PrecompileXcmTransactThroughSignedMultilocationParams): Promise<ContractTransaction> {\n    return this.#contract.transactThroughSignedMultilocation(\n      destination,\n      asset,\n      txWeight,\n      callHash,\n      overallFee,\n      overallWeight,\n    );\n  }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n  AssetSymbol,\n  Chain,\n  ChainKey,\n  createBalanceBuilder,\n  moonbase,\n  MoonbaseAssets,\n  moonbeam,\n  MoonbeamAssets,\n  moonriver,\n  MoonriverAssets,\n  type MoonbaseChains,\n  type MoonbeamChains,\n  type MoonriverChains,\n  type XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport {\n  createTxEventHandler,\n  getPolkadotApi,\n  type ExtrinsicEventsCallback,\n  type Hash,\n} from '@moonbeam-network/xcm-utils';\nimport type { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport type { IKeyringPair } from '@polkadot/types/types';\nimport { isString } from '@polkadot/util';\nimport type { Signer as EthersSigner } from 'ethers';\nimport { XcmTransactorContract } from '../contracts';\nimport type {\n  TransactFromData,\n  Transactor,\n  TransactorFrom,\n  TransactorTo,\n  TransactToData,\n} from './transact.interfaces';\nimport {\n  getBalance,\n  getDerivatedAddress,\n  getTxWeight,\n  transactThroughSigned,\n} from './transact.utils';\n\nexport interface TransactInitOptions {\n  ethersSigner?: EthersSigner;\n  polkadotSigner?: PolkadotSigner;\n}\n\nexport function init(options: TransactInitOptions) {\n  return {\n    moonbase: initByChain<MoonbaseAssets, MoonbaseChains>(moonbase, options),\n    moonbeam: initByChain<MoonbeamAssets, MoonbeamChains>(moonbeam, options),\n    moonriver: initByChain<MoonriverAssets, MoonriverChains>(\n      moonriver,\n      options,\n    ),\n  };\n}\n\nfunction initByChain<Symbols extends AssetSymbol, ChainKeys extends ChainKey>(\n  configBuilder: XcmConfigBuilder<any, ChainKeys>,\n  options?: TransactInitOptions,\n): Transactor<Symbols, ChainKeys> {\n  const { moonChain, transact } = configBuilder;\n  const { chainsFrom, chainsTo, from, to } = transact();\n  const balanceBuilder = createBalanceBuilder<Symbols>();\n  const moonBalanceConfig = balanceBuilder.system();\n\n  return {\n    moonChain,\n    chainsFrom,\n    chainsTo,\n    from: (\n      keyOrChain: ChainKeys | Chain<ChainKeys>,\n    ): TransactorFrom<Symbols, ChainKeys> => {\n      const {\n        balance: balanceConfig,\n        chain,\n        config,\n        getOverallWeight,\n        getOverallFee,\n      } = from(keyOrChain);\n\n      return {\n        transact: async (\n          callHash: string,\n          sourceAccount: string | IKeyringPair,\n          polkadotSigner?: PolkadotSigner,\n        ): Promise<TransactFromData<Symbols, ChainKeys>> => {\n          const signer = polkadotSigner || options?.polkadotSigner;\n\n          if (isString(sourceAccount) && !signer) {\n            throw new Error(\n              'Polkadot Signer/KeyringPair are not provided to xcm-transact',\n            );\n          }\n\n          const sourceAddress = isString(sourceAccount)\n            ? sourceAccount\n            : sourceAccount.address;\n\n          const [sourceApi, destinationApi] = await Promise.all([\n            getPolkadotApi(chain.ws),\n            getPolkadotApi(moonChain.ws),\n          ]);\n          const [txWeight, { address20, address32 }] = await Promise.all([\n            getTxWeight(callHash, destinationApi),\n            getDerivatedAddress(\n              destinationApi,\n              config.multilocation.account.get(sourceAddress),\n            ),\n          ]);\n          const [sourceBalance, destinationBalance] = await Promise.all([\n            getBalance<Symbols>(sourceApi, sourceAddress, balanceConfig),\n            getBalance<Symbols>(destinationApi, address20, moonBalanceConfig),\n          ]);\n\n          const overallWeight = getOverallWeight(txWeight);\n          const overallFee = getOverallFee(overallWeight);\n          const params = config.transact.getParams({\n            callHash,\n            overallFee,\n            overallWeight,\n            txWeight,\n          });\n\n          return {\n            overallFee,\n            overallWeight,\n            txWeight,\n            source: {\n              address: sourceAddress,\n              balance: sourceBalance,\n              chain,\n            },\n            destination: {\n              address: address20,\n              address32,\n              balance: destinationBalance,\n              chain: moonChain,\n            },\n            send: async (cb?: ExtrinsicEventsCallback): Promise<Hash> =>\n              transactThroughSigned({\n                api: destinationApi,\n                cb,\n                params,\n                polkadotSigner,\n                sourceAccount,\n              }),\n          };\n        },\n      };\n    },\n    to: (\n      keyOrChain: ChainKeys | Chain<ChainKeys>,\n    ): TransactorTo<Symbols, ChainKeys> => {\n      const {\n        balance: balanceConfig,\n        chain,\n        config,\n        getOverallWeight,\n        getOverallFee,\n      } = to(keyOrChain);\n\n      return {\n        transact: async (\n          callHash: string,\n          ethersSigner?: EthersSigner,\n        ): Promise<TransactToData<Symbols, ChainKeys>> => {\n          const signer = ethersSigner || options?.ethersSigner;\n\n          if (!signer) {\n            throw new Error('Ethers signer is not provided to xcm-transact');\n          }\n\n          const contract = new XcmTransactorContract(signer);\n\n          const [sourceAddress, sourceApi, destinationApi] = await Promise.all([\n            signer.getAddress(),\n            getPolkadotApi(moonChain.ws),\n            getPolkadotApi(chain.ws),\n          ]);\n          const [txWeight, { address20, address32 }] = await Promise.all([\n            getTxWeight(callHash, destinationApi),\n            getDerivatedAddress(\n              destinationApi,\n              config.multilocation.account.get(sourceAddress),\n            ),\n          ]);\n          const [sourceBalance, destinationBalance] = await Promise.all([\n            getBalance<Symbols>(sourceApi, sourceAddress, moonBalanceConfig),\n            getBalance<Symbols>(destinationApi, address20, balanceConfig),\n          ]);\n          const overallWeight = getOverallWeight(txWeight);\n          const overallFee = getOverallFee(overallWeight);\n\n          return {\n            overallFee,\n            overallWeight,\n            txWeight,\n            source: {\n              address: sourceAddress,\n              balance: sourceBalance,\n              chain: moonChain,\n            },\n            destination: {\n              address: address20,\n              address32,\n              balance: destinationBalance,\n              chain,\n            },\n            send: async (cb?: ExtrinsicEventsCallback): Promise<Hash> => {\n              const tx = await contract.transactThroughSignedMultilocation(\n                config.transact.getParams({\n                  callHash,\n                  overallFee,\n                  overallWeight,\n                  txWeight,\n                }),\n              );\n\n              if (cb) {\n                createTxEventHandler(signer, tx.hash, cb);\n              }\n\n              return tx.hash;\n            },\n          };\n        },\n      };\n    },\n  };\n}\n","import type {\n  AccountMultilocationV1,\n  AssetSymbol,\n  BalanceConfig,\n  XcmTransactThroughSignedParams,\n} from '@moonbeam-network/xcm-config';\nimport {\n  createExtrinsicEventHandler,\n  type ExtrinsicEventsCallback,\n  type Hash,\n} from '@moonbeam-network/xcm-utils';\nimport type { ApiPromise } from '@polkadot/api';\nimport type { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport type { XcmV1MultiLocation } from '@polkadot/types/lookup';\nimport type { IKeyringPair } from '@polkadot/types/types';\nimport { hexToU8a, u8aToHex } from '@polkadot/util';\nimport { get } from 'lodash';\nimport type { Balance } from './transact.interfaces';\n\n// random account, I used the same as Polkadot.js is using\n// https://github.com/PureStake/apps/blob/master/packages/react-hooks/src/useWeight.ts#L36\nconst ZERO_ACCOUNT = '5CAUdnwecHGxxyr5vABevAfZ34Fi4AaraDRMwfDQXQ52PXqg';\n\nexport async function getTxWeight(\n  callHash: string,\n  api: ApiPromise,\n): Promise<bigint> {\n  const call = api.createType('Call', hexToU8a(callHash));\n  const { weight } = await api.tx(call).paymentInfo(ZERO_ACCOUNT);\n\n  return weight.toBigInt();\n}\n\nexport async function getDerivatedAddress(\n  api: ApiPromise,\n  multilocation: AccountMultilocationV1,\n): Promise<{ address20: string; address32: string }> {\n  const ml: XcmV1MultiLocation = api.createType(\n    'XcmV1MultiLocation',\n    multilocation,\n  );\n\n  const toHash = new Uint8Array([\n    ...new Uint8Array([32]),\n    ...new TextEncoder().encode('multiloc'),\n    ...ml.toU8a(),\n  ]);\n\n  const address20 = u8aToHex(api.registry.hash(toHash).slice(0, 20));\n  const address32 = u8aToHex(api.registry.hash(toHash).slice(0, 32));\n\n  return { address20, address32 };\n}\n\nexport interface TransactParams {\n  api: ApiPromise;\n  cb?: ExtrinsicEventsCallback;\n  params: XcmTransactThroughSignedParams;\n  polkadotSigner?: PolkadotSigner;\n  sourceAccount: string | IKeyringPair;\n}\n\nexport async function transactThroughSigned({\n  api,\n  cb,\n  params,\n  polkadotSigner,\n  sourceAccount,\n}: TransactParams): Promise<Hash> {\n  const hash = await api.tx.xcmTransactor\n    .transactThroughSigned(...params)\n    .signAndSend(\n      sourceAccount,\n      {\n        signer: polkadotSigner,\n      },\n\n      cb &&\n        createExtrinsicEventHandler(\n          'xcmTransactor',\n          'transactThroughSigned',\n          cb,\n        ),\n    );\n\n  return hash.toString();\n}\n\nexport async function getGenericBalance<\n  Symbols extends AssetSymbol = AssetSymbol,\n>(\n  api: ApiPromise,\n  address: string,\n  { pallet, function: fn, getParams, path, calc }: BalanceConfig<Symbols>,\n): Promise<bigint> {\n  const response = await api.query[pallet][fn](...getParams(address));\n\n  if (response.isEmpty) {\n    return 0n;\n  }\n\n  const unwrapped = (response as any).unwrap?.() || response;\n\n  return calc(path.length ? get(unwrapped, path) : unwrapped);\n}\n\nexport async function getBalance<Symbols extends AssetSymbol = AssetSymbol>(\n  api: ApiPromise,\n  address: string,\n  config: BalanceConfig<Symbols>,\n): Promise<Balance<Symbols>> {\n  const decimals = api.registry.chainDecimals.at(0) || 12;\n  const symbol = (api.registry.chainTokens.at(0) || 'UNIT') as Symbols;\n  const balance = await getGenericBalance(api, address, config);\n\n  return {\n    balance,\n    decimals,\n    symbol,\n  };\n}\n"],"mappings":"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","names":["src_exports","__export","XcmTransactorContract","init","__toCommonJS","import_ethers","import_XcmTransactorABI","XcmTransactorContract","signer","#contract","ContractInterface","destination","asset","txWeight","callHash","overallFee","overallWeight","import_xcm_config","import_xcm_utils","import_util","import_xcm_utils","import_util","import_lodash","ZERO_ACCOUNT","getTxWeight","callHash","api","call","weight","getDerivatedAddress","multilocation","ml","toHash","address20","address32","transactThroughSigned","cb","params","polkadotSigner","sourceAccount","getGenericBalance","address","pallet","fn","getParams","path","calc","_a","response","unwrapped","getBalance","config","decimals","symbol","init","options","initByChain","configBuilder","moonChain","transact","chainsFrom","chainsTo","from","to","moonBalanceConfig","keyOrChain","balanceConfig","chain","config","getOverallWeight","getOverallFee","callHash","sourceAccount","polkadotSigner","signer","sourceAddress","sourceApi","destinationApi","txWeight","address20","address32","getTxWeight","getDerivatedAddress","sourceBalance","destinationBalance","getBalance","overallWeight","overallFee","params","cb","transactThroughSigned","ethersSigner","contract","XcmTransactorContract","tx"]}