@moonbeam-network/xcm-sdk 1.0.0-dev.101 → 1.0.0-dev.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var Ct=Object.create;var F=Object.defineProperty;var bt=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var wt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var St=(n,t)=>{for(var e in t)F(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Pt(t))!xt.call(n,s)&&s!==e&&F(n,s,{get:()=>t[s],enumerable:!(a=bt(t,s))||a.enumerable});return n};var it=(n,t,e)=>(e=n!=null?Ct(wt(n)):{},rt(t||!n||!n.__esModule?F(e,"default",{value:n,enumerable:!0}):e,n)),vt=n=>rt(F({},"__esModule",{value:!0}),n);var Ft={};St(Ft,{Sdk:()=>Et,getAssetsBalances:()=>H,getBalance:()=>P,getContractFee:()=>mt,getDecimals:()=>h,getExtrinsicFee:()=>ut,getFee:()=>ct,getFeeBalance:()=>$,getMax:()=>ft,getMin:()=>S,getParachainBalances:()=>Mt,getSourceData:()=>z});module.exports=vt(Ft);var ot=require("@moonbeam-network/xcm-builder"),v=require("@moonbeam-network/xcm-types"),g=require("@moonbeam-network/xcm-utils"),K=it(require("big.js"),1);var G=require("viem");var Q=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}];var k=class{address;#t;#e;constructor(t,e){if(!t.address)throw new Error("Contract address is required");this.address=t.address,this.#t=t,this.#e=(0,G.createPublicClient)({chain:e.getViemChain(),transport:(0,G.http)()})}async getBalance(){let t=this.#t.args[0];return this.#e.readContract({abi:Q,address:this.address,args:[t],functionName:"balanceOf"})}async getDecimals(){return this.#e.readContract({abi:Q,address:this.address,functionName:"decimals"})}};var O=require("viem");var R=[{inputs:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transfer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],internalType:"struct Xtokens.Currency[]",name:"currencies",type:"tuple[]"},{internalType:"uint32",name:"feeItem",type:"uint32"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transferMultiCurrencies",outputs:[],stateMutability:"nonpayable",type:"function"}];var q=class{defaultMoonChainAddress="0x0000000000000000000000000000000000000804";address;#t;#e;constructor(t,e,a){this.#t=t,this.address=a??this.defaultMoonChainAddress,this.#e=(0,O.createPublicClient)({chain:e.getViemChain(),transport:(0,O.http)()})}async transfer(t){let{request:e}=await this.#e.simulateContract({abi:R,account:t.account,address:this.address,args:this.#t.args,functionName:this.#t.func});return await t.writeContract(e)}async getFee(t,e){if(t===0n)return 0n;try{let a=await this.#e.estimateContractGas({abi:R,account:e,address:this.address,args:this.#t.args,functionName:this.#t.func}),s=await this.getGasPrice();return a*s}catch(a){throw console.error(a),new Error("Can't get a fee. Make sure that you have enough balance!")}}async getGasPrice(){return this.#e.getGasPrice()}};function A(n,t){var e;if(!n.isEvmParachain())throw new Error("Chain is not an EVM parachain");if(t.module==="Erc20")return new k(t,n);if(t.module==="Xtokens"){let a="contracts"in n?(e=n==null?void 0:n.contracts)==null?void 0:e.Xtokens:void 0;return new q(t,n,a)}throw new Error(`Contract ${t.module} not found`)}var X=require("@moonbeam-network/xcm-builder"),W=require("@moonbeam-network/xcm-utils");async function P({address:n,chain:t,config:e,decimals:a,polkadot:s}){let i=e.balance.build({address:n,asset:s.chain.getBalanceAssetId(e.asset)});if(i.type===X.CallType.Substrate){let r=await s.query(i);return t.usesChainDecimals?(0,W.convertDecimals)(r,s.decimals,a):r}return await A(t,i).getBalance()}async function h({address:n,asset:t,config:e,polkadot:a,chain:s,assetBuiltConfig:i}){let o=i||e.balance.build({address:n,asset:a.chain.getBalanceAssetId(t||e.asset)});return o.type===X.CallType.Substrate?a.getAssetDecimals(t||e.asset):A(s,o).getDecimals()}async function S(n,t){if(n.min)return t.query(n.min.build({asset:t.chain.getMinAssetId(n.asset)}));let e=t.chain.getAssetMin(n.asset);if(e){let a=await t.getAssetDecimals(n.asset);return(0,W.toBigInt)(e,a)}return 0n}async function z({transferConfig:n,destinationAddress:t,destinationFee:e,polkadot:a,sourceAddress:s}){var Y,Z,tt,et,at,nt,st;let{asset:i,destination:o,source:{chain:c,config:r}}=n,m=v.AssetAmount.fromAsset(i,{amount:0n,decimals:await h({address:t,chain:c,config:r,polkadot:a})}),u=a.chain.getBalanceAssetId(((Y=r==null?void 0:r.fee)==null?void 0:Y.asset)||r.asset),l=(Z=r.fee)==null?void 0:Z.balance.build({address:t,asset:u}),d=(tt=r.fee)!=null&&tt.asset?await h({address:t,asset:r.fee.asset,assetBuiltConfig:l,chain:c,config:r,polkadot:a}):void 0,p=(et=r.fee)!=null&&et.asset?v.AssetAmount.fromAsset(r.fee.asset,{amount:0n,decimals:d||0}):m,b=(at=r.destinationFee)!=null&&at.asset?v.AssetAmount.fromAsset(r.destinationFee.asset,{amount:0n,decimals:await h({address:t,asset:r.destinationFee.asset,chain:c,config:r,polkadot:a})}):m,f=await P({address:s,chain:c,config:r,decimals:m.decimals,polkadot:a}),B=await $({address:s,balance:f,chain:c,decimals:p.decimals,feeConfig:r.fee,polkadot:a}),I=r.asset.isEqual(r.destinationFee.asset)?f:await $({address:s,balance:f,chain:c,decimals:b.decimals,feeConfig:r.destinationFee,polkadot:a}),T=await S(r,a),E=(nt=r.extrinsic)==null?void 0:nt.build({address:t,amount:f,asset:c.getAssetId(i),destination:o.chain,fee:e.amount,feeAsset:c.getAssetId(e),palletInstance:c.getAssetPalletInstance(i),source:c}),M=(st=r.contract)==null?void 0:st.build({address:t,amount:f,asset:c.getAssetId(i),destination:o.chain,fee:e.amount,feeAsset:c.getAssetId(e)}),y=b.copyWith({amount:I}),yt=await ct({balance:f,chain:c,contract:M,decimals:p.decimals,destinationFeeBalanceAmount:y,destinationFeeConfig:r.destinationFee,extrinsic:E,feeConfig:r.fee,polkadot:a,sourceAddress:s}),L=m.copyWith({amount:f}),{existentialDeposit:j}=a,J=p.copyWith({amount:yt}),At=p.copyWith({amount:B}),U=m.copyWith({amount:T}),ht=ft({balanceAmount:L,existentialDeposit:j,feeAmount:J,minAmount:U});return{balance:L,chain:c,destinationFeeBalance:y,existentialDeposit:j,fee:J,feeBalance:At,max:ht,min:U}}async function $({address:n,balance:t,chain:e,decimals:a,feeConfig:s,polkadot:i}){if(!s)return t;let o=s.balance.build({address:n,asset:i.chain.getBalanceAssetId(s.asset)});if(o.type===ot.CallType.Evm){let r=A(e,o),m=await r.getDecimals(),u=await r.getBalance();return e.usesChainDecimals?(0,g.convertDecimals)(u,i.decimals,m):u}let c=await i.query(o);return e.usesChainDecimals?(0,g.convertDecimals)(c,i.decimals,a):c}async function ct({balance:n,chain:t,contract:e,decimals:a,destinationFeeConfig:s,destinationFeeBalanceAmount:i,extrinsic:o,feeConfig:c,polkadot:r,sourceAddress:m}){if(e){if(s&&i&&typeof s.amount=="number"){let u=Number((0,g.toDecimal)(i.amount,i.decimals));if(u&&s.amount>u)throw new Error(`Can't get a fee, make sure you have ${s==null?void 0:s.amount} ${s==null?void 0:s.asset.originSymbol} in your source balance, needed for destination fees`)}return mt({address:m,balance:n,chain:t,config:e,decimals:a})}if(o){let u=await ut(n,o,r,m),l=Dt(a,c),d=u+l;return t.usesChainDecimals?(0,g.convertDecimals)(d,r.decimals,a):d}throw new Error("Either contract or extrinsic must be provided")}async function mt({address:n,balance:t,config:e,decimals:a,chain:s}){let o=await A(s,e).getFee(t,n);return(0,g.convertDecimals)(o,18,a)}async function ut(n,t,e,a){try{return await e.getFee(a,t)}catch(s){if(n)throw s;return 0n}}function Dt(n,t){return t!=null&&t.xcmDeliveryFeeAmount?(0,g.toBigInt)(t.xcmDeliveryFeeAmount,n):0n}function ft({balanceAmount:n,existentialDeposit:t,feeAmount:e,minAmount:a}){let s=n.toBig().minus(a.toBig()).minus(n.isSame(t)?t.toBig():(0,K.default)(0)).minus(n.isSame(e)?e.toBig():(0,K.default)(0));return n.copyWith({amount:s.lt(0)?0n:BigInt(s.toFixed())})}async function H({address:n,chain:t,assets:e,polkadot:a}){let s=e.reduce((o,c)=>o.some(r=>r.asset.isEqual(c.asset))?o:[c,...o],[]);return await Promise.all(s.map(async o=>{let c=await h({address:n,asset:o.asset,chain:t,config:o,polkadot:a}),r=await P({address:n,chain:t,config:o,decimals:c,polkadot:a});return v.AssetAmount.fromAsset(o.asset,{amount:r,decimals:c})}))}var x=require("@moonbeam-network/xcm-config");var D=require("@moonbeam-network/xcm-utils"),C=it(require("big.js"),1);var Pe=require("@polkadot/api-augment"),N=require("@moonbeam-network/xcm-config"),lt=require("@moonbeam-network/xcm-types"),dt=require("@moonbeam-network/xcm-utils"),w=class n{api;chain;configService;constructor(t,e,a){this.api=t,this.chain=e,this.configService=a}static async create(t,e){return new n(await(0,dt.getPolkadotApi)(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(a=>n.create(a,e)))}get decimals(){return this.api.registry.chainDecimals.at(0)||12}get asset(){let t=this.api.registry.chainTokens.at(0),e=t==null?void 0:t.toString().toLowerCase();if(e==="token"&&[N.equilibrium.key].includes(this.chain.key))return N.eq;if(!e)throw new Error("No native symbol key found");let a=this.configService.getAsset(e);if(!a)throw new Error(`No asset found for key "${e}" and symbol "${t}"`);return a}get existentialDeposit(){var s,i;let t=(s=this.api.consts.balances)==null?void 0:s.existentialDeposit,e=(i=this.api.consts.eqBalances)==null?void 0:i.existentialDeposit,a=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return lt.AssetAmount.fromAsset(this.asset,{amount:a,decimals:this.decimals})}async getAssetMeta(t){var o,c,r,m,u,l;let e=((o=this.api.query.assets)==null?void 0:o.metadata)||((c=this.api.query.assetRegistry)==null?void 0:c.assets)||((r=this.api.query.assetRegistry)==null?void 0:r.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.currencyMetadatas)||((u=this.api.query.assetRegistry)==null?void 0:u.assetMetadatas)||((l=this.api.query.assetRegistry)==null?void 0:l.assetMetadataMap);if(!e)return;let a=await e(t),s="unwrapOrDefault"in a?a.unwrapOrDefault():a;return{decimals:("unwrapOrDefault"in s.decimals?s.decimals.unwrapOrDefault():s.decimals).toNumber(),symbol:s.symbol.toString()}}async getAssetDecimalsFromQuery(t){var s;let e=(s=this.api.query.assetsRegistry)==null?void 0:s.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var s;let e=this.chain.getMetadataAssetId(t),a=this.chain.getAssetDecimals(t)||await this.getAssetDecimalsFromQuery(e)||((s=await this.getAssetMeta(e))==null?void 0:s.decimals)||this.decimals;if(!a)throw new Error(`No decimals found for asset ${t.originSymbol}`);return a}async query(t){let e=await this.api.query[t.module][t.func](...t.args);return t.transform(e)}async getFee(t,e){let a=this.api.tx[e.module][e.func],s=e.getArgs(a);return(await a(...s).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,a){let s=this.api.tx[e.module][e.func],i=e.getArgs(s);return(await s(...i).signAndSend(this.#t(a)?t:a,{nonce:-1,signer:this.#t(a)?a:void 0})).toString()}#t(t){return"signPayload"in t}};var V=require("@moonbeam-network/xcm-types"),pt=require("@moonbeam-network/xcm-utils");async function gt({transferConfig:n,destinationAddress:t,polkadot:e}){let{asset:a,destination:{chain:s,config:i}}=n,o=V.AssetAmount.fromAsset(a,{amount:0n,decimals:await h({address:t,chain:s,config:i,polkadot:e})}),c=await P({address:t,chain:s,config:i,decimals:o.decimals,polkadot:e}),r=await S(i,e),m=o.copyWith({amount:c}),{existentialDeposit:u}=e,l=await Bt({address:t,config:n,polkadot:e}),d=o.copyWith({amount:r});return{balance:m,chain:s,existentialDeposit:u,fee:l,min:d}}async function Bt({config:n,polkadot:t}){let{amount:e,asset:a}=n.source.config.destinationFee,s=await t.getAssetDecimals(a),i=V.AssetAmount.fromAsset(a,{amount:0n,decimals:s});if(Number.isFinite(e))return i.copyWith({amount:(0,pt.toBigInt)(e,s)});let o=e.build({api:t.api,asset:t.chain.getAssetId(a)});return i.copyWith({amount:await o.call()})}async function _({configService:n,destinationAddress:t,evmSigner:e,polkadotSigner:a,sourceAddress:s,transferConfig:i}){let[o,c]=await w.createMulti([i.destination.chain,i.source.chain],n),r=await gt({destinationAddress:t,polkadot:o,transferConfig:i}),m=await Tt(c,r.fee),u=await z({destinationAddress:t,destinationFee:m,polkadot:c,sourceAddress:s,transferConfig:i});return{destination:r,getEstimate(l){let p=(0,C.default)((0,D.toBigInt)(l,u.balance.decimals).toString()).minus(u.balance.isSame(m)?m.toBig():(0,C.default)(0));return u.balance.copyWith({amount:p.lt(0)?0n:BigInt(p.toFixed())})},isSwapPossible:!0,max:u.max,min:It(r),source:u,async swap(){return _({configService:n,destinationAddress:s,evmSigner:e,polkadotSigner:a,sourceAddress:t,transferConfig:{...i,destination:i.source,source:i.destination}})},async transfer(l,d){var E,M;let p=(0,D.toBigInt)(l,u.balance.decimals),{asset:b,source:{chain:f,config:B}}=i,I=(E=B.contract)==null?void 0:E.build({address:t,amount:p,asset:f.getAssetId(b),destination:r.chain,fee:m.amount,feeAsset:f.getAssetId(m)}),T=(M=B.extrinsic)==null?void 0:M.build({address:t,amount:p,asset:f.getAssetId(b),destination:r.chain,fee:m.amount,feeAsset:f.getAssetId(m),palletInstance:f.getAssetPalletInstance(b),source:f});if(I){let y=e||d.evmSigner;if(!y)throw new Error("EVM Signer must be provided");return A(f,I).transfer(y)}if(T){let y=a||d.polkadotSigner;if(!y)throw new Error("Polkadot signer must be provided");return c.transfer(s,T,y)}throw new Error("Either contract or extrinsic must be provided")}}}function It({balance:n,existentialDeposit:t,fee:e,min:a}){let s=(0,C.default)(0).plus(n.isSame(e)?e.toBig():(0,C.default)(0)).plus(n.isSame(t)&&n.toBig().lt(t.toBig())?t.toBig():(0,C.default)(0)).plus(n.toBig().lt(a.toBig())?a.toBig():(0,C.default)(0));return n.copyWith({amount:BigInt(s.toFixed())})}async function Tt(n,t){let e=await n.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:(0,D.convertDecimals)(t.amount,t.decimals,e),decimals:e})}function Et(n){let t=(n==null?void 0:n.configService)??new x.ConfigService;return{assets(e){let{assets:a,asset:s}=(0,x.ConfigBuilder)(t).assets(e);return{assets:a,asset(i){let{sourceChains:o,source:c}=s(i);return{sourceChains:o,source(r){let{destinationChains:m,destination:u}=c(r);return{destinationChains:m,destination(l){return{async accounts(d,p){return _({...n,configService:t,destinationAddress:p,sourceAddress:d,transferConfig:u(l).build()})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:a,evmSigner:s,keyOrAsset:i,polkadotSigner:o,sourceAddress:c,sourceKeyOrChain:r}){return _({configService:t,destinationAddress:e,evmSigner:s,polkadotSigner:o,sourceAddress:c,transferConfig:(0,x.ConfigBuilder)(t).assets().asset(i).source(r).destination(a).build()})}}}async function Mt(n,t){let e=new x.ConfigService,s=e.getChainConfig(n).getAssetsConfigs(),i=await w.create(n,e);return await H({chain:n,assets:s,address:t,polkadot:i})}0&&(module.exports={Sdk,getAssetsBalances,getBalance,getContractFee,getDecimals,getExtrinsicFee,getFee,getFeeBalance,getMax,getMin,getParachainBalances,getSourceData});
1
+ "use strict";var Bt=Object.create;var O=Object.defineProperty;var Et=Object.getOwnPropertyDescriptor;var It=Object.getOwnPropertyNames;var Tt=Object.getPrototypeOf,Ft=Object.prototype.hasOwnProperty;var Mt=(a,t)=>{for(var e in t)O(a,e,{get:t[e],enumerable:!0})},ut=(a,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of It(t))!Ft.call(a,s)&&s!==e&&O(a,s,{get:()=>t[s],enumerable:!(n=Et(t,s))||n.enumerable});return a};var ft=(a,t,e)=>(e=a!=null?Bt(Tt(a)):{},ut(t||!a||!a.__esModule?O(e,"default",{value:a,enumerable:!0}):e,a)),Gt=a=>ut(O({},"__esModule",{value:!0}),a);var _t={};Mt(_t,{Sdk:()=>Qt,getAssetsBalances:()=>J,getBalance:()=>v,getContractFee:()=>yt,getDecimals:()=>C,getExtrinsicFee:()=>ht,getFee:()=>gt,getFeeBalance:()=>L,getMax:()=>Ct,getMin:()=>F,getParachainBalances:()=>Xt,getSourceData:()=>H});module.exports=Gt(_t);var dt=require("@moonbeam-network/xcm-builder"),M=require("@moonbeam-network/xcm-types"),y=require("@moonbeam-network/xcm-utils"),j=ft(require("big.js"),1);var lt=require("ethers"),w=require("viem");function I(a){return"provider"in a}function b(a){return"signer"in a}var P=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}];var R=class{address;#t;#e;constructor(t,e){if(!t.address)throw new Error("Contract address is required");this.address=t.address,this.#t=t,this.#e=I(e)?new lt.Contract(this.address,P,e):(0,w.getContract)({abi:P,address:this.address,client:{public:(0,w.createPublicClient)({chain:e.chain,transport:(0,w.http)()}),wallet:e}})}async getBalance(){return b(this.#e)?(await this.#e.balanceOf(...this.#t.args)).toBigInt():this.#e.read.balanceOf(this.#t.args)}async getDecimals(){return b(this.#e)?await this.#e.decimals():this.#e.read.decimals()}};var pt=require("ethers"),h=require("viem");var K=[{inputs:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transfer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],internalType:"struct Xtokens.Currency[]",name:"currencies",type:"tuple[]"},{internalType:"uint32",name:"feeItem",type:"uint32"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transferMultiCurrencies",outputs:[],stateMutability:"nonpayable",type:"function"}];var T=class{defaultMoonChainAddress="0x0000000000000000000000000000000000000804";address;#t;#e;#a;constructor(t,e,n){this.#t=t,this.#a=e,this.address=n??this.defaultMoonChainAddress,this.#e=I(e)?new pt.Contract(this.address,K,e):(0,h.getContract)({abi:K,address:this.address,client:{public:(0,h.createPublicClient)({chain:e.chain,transport:(0,h.http)()}),wallet:e}})}async transfer(){return b(this.#e)?this.#e[this.#t.func](...this.#t.args):this.#e.write[this.#t.func](this.#t.args)}async getEthersContractEstimatedGas(t){return t[this.#t.func].estimateGas(...this.#t.args)}async getViemContractEstimatedGas(t){return t?t.estimateGas[this.#t.func](this.#t.args):0n}async getFee(t){if(t===0n)return 0n;try{let e=b(this.#e)?await this.getEthersContractEstimatedGas(this.#e):await this.getViemContractEstimatedGas(this.#e),n=await this.getGasPrice();return e*n}catch(e){throw console.error(e),new Error("Can't get a fee. Make sure that you have enough balance!")}}async getGasPrice(){if(I(this.#a)){if(!this.#a.provider)return 0n;let{gasPrice:e,maxPriorityFeePerGas:n}=await this.#a.provider.getFeeData();return(e||0n)+(n||0n)}return(0,h.createPublicClient)({chain:this.#a.chain,transport:(0,h.http)()}).getGasPrice()}};var N=require("viem");var $=class{address;#t;#e;constructor(t,e){if(!t.address)throw new Error("Contract address is required");this.address=t.address,this.#t=t,this.#e=(0,N.createPublicClient)({chain:e,transport:(0,N.http)()})}async getBalance(){return await this.#e.readContract({abi:P,address:this.#t.address,args:this.#t.args,functionName:"balanceOf"})}async getDecimals(){return await this.#e.readContract({abi:P,address:this.#t.address,functionName:"decimals"})}};function qt(a,t,e){var n;if(a.module==="Erc20")return new R(a,t);if(a.module==="Xtokens"){if(e&&"contracts"in e){let s=(n=e==null?void 0:e.contracts)==null?void 0:n.Xtokens;return new T(a,t,s)}return new T(a,t)}throw new Error(`Contract ${a.module} not found`)}function S(a,t){if(a.module==="Erc20")return new $(a,t.getViemChain());throw new Error(`Public Contract ${a.module} not found`)}function Q(a,t,e){return t?qt(a,t,e):S(a,e)}var V=require("@moonbeam-network/xcm-builder"),X=require("@moonbeam-network/xcm-utils");async function v({address:a,chain:t,config:e,decimals:n,polkadot:s}){let i=e.balance.build({address:a,asset:s.chain.getBalanceAssetId(e.asset)});if(i.type===V.CallType.Substrate){let c=await s.query(i);return t.usesChainDecimals?(0,X.convertDecimals)(c,s.decimals,n):c}return await S(i,t).getBalance()}async function C({address:a,asset:t,config:e,polkadot:n,chain:s,assetBuiltConfig:i}){let o=i||e.balance.build({address:a,asset:n.chain.getBalanceAssetId(t||e.asset)});return o.type===V.CallType.Substrate?n.getAssetDecimals(t||e.asset):S(o,s).getDecimals()}async function F(a,t){if(a.min)return t.query(a.min.build({asset:t.chain.getMinAssetId(a.asset)}));let e=t.chain.getAssetMin(a.asset);if(e){let n=await t.getAssetDecimals(a.asset);return(0,X.toBigInt)(e,n)}return 0n}async function H({transferConfig:a,destinationAddress:t,destinationFee:e,polkadot:n,sourceAddress:s,evmSigner:i}){var nt,st,rt,it,ot,ct,mt;let{asset:o,destination:m,source:{chain:c,config:r}}=a,u=M.AssetAmount.fromAsset(o,{amount:0n,decimals:await C({address:t,chain:c,config:r,polkadot:n})}),l=n.chain.getBalanceAssetId(((nt=r==null?void 0:r.fee)==null?void 0:nt.asset)||r.asset),d=(st=r.fee)==null?void 0:st.balance.build({address:t,asset:l}),p=(rt=r.fee)!=null&&rt.asset?await C({address:t,asset:r.fee.asset,assetBuiltConfig:d,chain:c,config:r,polkadot:n}):void 0,f=(it=r.fee)!=null&&it.asset?M.AssetAmount.fromAsset(r.fee.asset,{amount:0n,decimals:p||0}):u,B=(ot=r.destinationFee)!=null&&ot.asset?M.AssetAmount.fromAsset(r.destinationFee.asset,{amount:0n,decimals:await C({address:t,asset:r.destinationFee.asset,chain:c,config:r,polkadot:n})}):u,g=await v({address:s,chain:c,config:r,decimals:u.decimals,polkadot:n}),k=await L({address:s,balance:g,chain:c,decimals:f.decimals,feeConfig:r.fee,polkadot:n}),W=r.asset.isEqual(r.destinationFee.asset)?g:await L({address:s,balance:g,chain:c,decimals:B.decimals,feeConfig:r.destinationFee,polkadot:n}),q=await F(r,n),E=(ct=r.extrinsic)==null?void 0:ct.build({address:t,amount:g,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e),palletInstance:c.getAssetPalletInstance(o),source:c}),St=(mt=r.contract)==null?void 0:mt.build({address:t,amount:g,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e)}),Y=B.copyWith({amount:W}),vt=await gt({balance:g,chain:c,contract:St,decimals:f.decimals,destinationFeeBalanceAmount:Y,destinationFeeConfig:r.destinationFee,evmSigner:i,extrinsic:E,feeConfig:r.fee,polkadot:n,sourceAddress:s}),Z=u.copyWith({amount:g}),{existentialDeposit:tt}=n,et=f.copyWith({amount:vt}),xt=f.copyWith({amount:k}),at=u.copyWith({amount:q}),Dt=Ct({balanceAmount:Z,existentialDeposit:tt,feeAmount:et,minAmount:at});return{balance:Z,chain:c,destinationFeeBalance:Y,existentialDeposit:tt,fee:et,feeBalance:xt,max:Dt,min:at}}async function L({address:a,balance:t,chain:e,decimals:n,feeConfig:s,polkadot:i}){if(!s)return t;let o=s.balance.build({address:a,asset:i.chain.getBalanceAssetId(s.asset)});if(o.type===dt.CallType.Evm){let c=S(o,e),r=await c.getDecimals(),u=await c.getBalance();return e.usesChainDecimals?(0,y.convertDecimals)(u,i.decimals,r):u}let m=await i.query(o);return e.usesChainDecimals?(0,y.convertDecimals)(m,i.decimals,n):m}async function gt({balance:a,chain:t,contract:e,decimals:n,destinationFeeConfig:s,destinationFeeBalanceAmount:i,evmSigner:o,extrinsic:m,feeConfig:c,polkadot:r,sourceAddress:u}){if(e){if(!o)throw new Error("EVM Signer must be provided");if(s&&i&&typeof s.amount=="number"){let l=Number((0,y.toDecimal)(i.amount,i.decimals));if(l&&s.amount>l)throw new Error(`Can't get a fee, make sure you have ${s==null?void 0:s.amount} ${s==null?void 0:s.asset.originSymbol} in your source balance, needed for destination fees`)}return yt({balance:a,chain:t,config:e,decimals:n,evmSigner:o})}if(m){let l=await ht(a,m,r,u),d=Ot(n,c),p=l+d;return t.usesChainDecimals?(0,y.convertDecimals)(p,r.decimals,n):p}throw new Error("Either contract or extrinsic must be provided")}async function yt({balance:a,config:t,decimals:e,evmSigner:n,chain:s}){let o=await Q(t,n,s).getFee(a);return(0,y.convertDecimals)(o,18,e)}async function ht(a,t,e,n){try{return await e.getFee(n,t)}catch(s){if(a)throw s;return 0n}}function Ot(a,t){return t!=null&&t.xcmDeliveryFeeAmount?(0,y.toBigInt)(t.xcmDeliveryFeeAmount,a):0n}function Ct({balanceAmount:a,existentialDeposit:t,feeAmount:e,minAmount:n}){let s=a.toBig().minus(n.toBig()).minus(a.isSame(t)?t.toBig():(0,j.default)(0)).minus(a.isSame(e)?e.toBig():(0,j.default)(0));return a.copyWith({amount:s.lt(0)?0n:BigInt(s.toFixed())})}async function J({address:a,chain:t,assets:e,polkadot:n}){let s=e.reduce((o,m)=>o.some(c=>c.asset.isEqual(m.asset))?o:[m,...o],[]);return await Promise.all(s.map(async o=>{let m=await C({address:a,asset:o.asset,chain:t,config:o,polkadot:n}),c=await v({address:a,chain:t,config:o,decimals:m,polkadot:n});return M.AssetAmount.fromAsset(o.asset,{amount:c,decimals:m})}))}var D=require("@moonbeam-network/xcm-config");var G=require("@moonbeam-network/xcm-utils"),A=ft(require("big.js"),1);var Qe=require("@polkadot/api-augment"),_=require("@moonbeam-network/xcm-config"),At=require("@moonbeam-network/xcm-types"),bt=require("@moonbeam-network/xcm-utils"),x=class a{api;chain;configService;constructor(t,e,n){this.api=t,this.chain=e,this.configService=n}static async create(t,e){return new a(await(0,bt.getPolkadotApi)(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(n=>a.create(n,e)))}get decimals(){return this.api.registry.chainDecimals.at(0)||12}get asset(){let t=this.api.registry.chainTokens.at(0),e=t==null?void 0:t.toString().toLowerCase();if(e==="token"&&[_.equilibrium.key].includes(this.chain.key))return _.eq;if(!e)throw new Error("No native symbol key found");let n=this.configService.getAsset(e);if(!n)throw new Error(`No asset found for key "${e}" and symbol "${t}"`);return n}get existentialDeposit(){var s,i;let t=(s=this.api.consts.balances)==null?void 0:s.existentialDeposit,e=(i=this.api.consts.eqBalances)==null?void 0:i.existentialDeposit,n=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return At.AssetAmount.fromAsset(this.asset,{amount:n,decimals:this.decimals})}async getAssetMeta(t){var o,m,c,r,u,l;let e=((o=this.api.query.assets)==null?void 0:o.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.assets)||((c=this.api.query.assetRegistry)==null?void 0:c.metadata)||((r=this.api.query.assetRegistry)==null?void 0:r.currencyMetadatas)||((u=this.api.query.assetRegistry)==null?void 0:u.assetMetadatas)||((l=this.api.query.assetRegistry)==null?void 0:l.assetMetadataMap);if(!e)return;let n=await e(t),s="unwrapOrDefault"in n?n.unwrapOrDefault():n;return{decimals:("unwrapOrDefault"in s.decimals?s.decimals.unwrapOrDefault():s.decimals).toNumber(),symbol:s.symbol.toString()}}async getAssetDecimalsFromQuery(t){var s;let e=(s=this.api.query.assetsRegistry)==null?void 0:s.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var s;let e=this.chain.getMetadataAssetId(t),n=this.chain.getAssetDecimals(t)||await this.getAssetDecimalsFromQuery(e)||((s=await this.getAssetMeta(e))==null?void 0:s.decimals)||this.decimals;if(!n)throw new Error(`No decimals found for asset ${t.originSymbol}`);return n}async query(t){let e=await this.api.query[t.module][t.func](...t.args);return t.transform(e)}async getFee(t,e){let n=this.api.tx[e.module][e.func],s=e.getArgs(n);return(await n(...s).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,n){let s=this.api.tx[e.module][e.func],i=e.getArgs(s);return(await s(...i).signAndSend(this.#t(n)?t:n,{nonce:-1,signer:this.#t(n)?n:void 0})).toString()}#t(t){return"signPayload"in t}};var U=require("@moonbeam-network/xcm-types"),Pt=require("@moonbeam-network/xcm-utils");async function wt({transferConfig:a,destinationAddress:t,polkadot:e}){let{asset:n,destination:{chain:s,config:i}}=a,o=U.AssetAmount.fromAsset(n,{amount:0n,decimals:await C({address:t,chain:s,config:i,polkadot:e})}),m=await v({address:t,chain:s,config:i,decimals:o.decimals,polkadot:e}),c=await F(i,e),r=o.copyWith({amount:m}),{existentialDeposit:u}=e,l=await Rt({address:t,config:a,polkadot:e}),d=o.copyWith({amount:c});return{balance:r,chain:s,existentialDeposit:u,fee:l,min:d}}async function Rt({config:a,polkadot:t}){let{amount:e,asset:n}=a.source.config.destinationFee,s=await t.getAssetDecimals(n),i=U.AssetAmount.fromAsset(n,{amount:0n,decimals:s});if(Number.isFinite(e))return i.copyWith({amount:(0,Pt.toBigInt)(e,s)});let o=e.build({api:t.api,asset:t.chain.getAssetId(n)});return i.copyWith({amount:await o.call()})}async function z({configService:a,destinationAddress:t,evmSigner:e,polkadotSigner:n,sourceAddress:s,transferConfig:i}){let[o,m]=await x.createMulti([i.destination.chain,i.source.chain],a),c=await wt({destinationAddress:t,polkadot:o,transferConfig:i}),r=await Nt(m,c.fee),u=await H({destinationAddress:t,destinationFee:r,evmSigner:e,polkadot:m,sourceAddress:s,transferConfig:i});return{destination:c,getEstimate(l){let p=(0,A.default)((0,G.toBigInt)(l,u.balance.decimals).toString()).minus(u.balance.isSame(r)?r.toBig():(0,A.default)(0));return u.balance.copyWith({amount:p.lt(0)?0n:BigInt(p.toFixed())})},isSwapPossible:!0,max:u.max,min:$t(c),source:u,async swap(){return z({configService:a,destinationAddress:s,evmSigner:e,polkadotSigner:n,sourceAddress:t,transferConfig:{...i,destination:i.source,source:i.destination}})},async transfer(l){var W,q;let d=(0,G.toBigInt)(l,u.balance.decimals),{asset:p,source:{chain:f,config:B}}=i,g=(W=B.contract)==null?void 0:W.build({address:t,amount:d,asset:f.getAssetId(p),destination:c.chain,fee:r.amount,feeAsset:f.getAssetId(r)}),k=(q=B.extrinsic)==null?void 0:q.build({address:t,amount:d,asset:f.getAssetId(p),destination:c.chain,fee:r.amount,feeAsset:f.getAssetId(r),palletInstance:f.getAssetPalletInstance(p),source:f});if(g){if(!e)throw new Error("EVM Signer must be provided");return Q(g,e,f).transfer().then(E=>typeof E=="object"?E.hash:E)}if(k){if(!n)throw new Error("Polkadot signer must be provided");return m.transfer(s,k,n)}throw new Error("Either contract or extrinsic must be provided")}}}function $t({balance:a,existentialDeposit:t,fee:e,min:n}){let s=(0,A.default)(0).plus(a.isSame(e)?e.toBig():(0,A.default)(0)).plus(a.isSame(t)&&a.toBig().lt(t.toBig())?t.toBig():(0,A.default)(0)).plus(a.toBig().lt(n.toBig())?n.toBig():(0,A.default)(0));return a.copyWith({amount:BigInt(s.toFixed())})}async function Nt(a,t){let e=await a.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:(0,G.convertDecimals)(t.amount,t.decimals,e),decimals:e})}function Qt(a){let t=(a==null?void 0:a.configService)??new D.ConfigService;return{assets(e){let{assets:n,asset:s}=(0,D.ConfigBuilder)(t).assets(e);return{assets:n,asset(i){let{sourceChains:o,source:m}=s(i);return{sourceChains:o,source(c){let{destinationChains:r,destination:u}=m(c);return{destinationChains:r,destination(l){return{async accounts(d,p,f){return z({...a,configService:t,destinationAddress:p,evmSigner:(f==null?void 0:f.evmSigner)??(f==null?void 0:f.ethersSigner),sourceAddress:d,transferConfig:u(l).build(),polkadotSigner:f==null?void 0:f.polkadotSigner})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:n,ethersSigner:s,evmSigner:i,keyOrAsset:o,polkadotSigner:m,sourceAddress:c,sourceKeyOrChain:r}){return z({configService:t,destinationAddress:e,evmSigner:i??s,polkadotSigner:m,sourceAddress:c,transferConfig:(0,D.ConfigBuilder)(t).assets().asset(o).source(r).destination(n).build()})}}}async function Xt(a,t){let e=new D.ConfigService,s=e.getChainConfig(a).getAssetsConfigs(),i=await x.create(a,e);return await J({chain:a,assets:s,address:t,polkadot:i})}0&&(module.exports={Sdk,getAssetsBalances,getBalance,getContractFee,getDecimals,getExtrinsicFee,getFee,getFeeBalance,getMax,getMin,getParachainBalances,getSourceData});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/getTransferData/getSourceData.ts","../src/contract/contracts/Erc20/Erc20.ts","../src/contract/contracts/Erc20/Erc20ABI.ts","../src/contract/contracts/Xtokens/Xtokens.ts","../src/contract/contracts/Xtokens/XtokensABI.ts","../src/contract/contract.factory.ts","../src/getTransferData/getTransferData.utils.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts","../src/polkadot/PolkadotService.ts","../src/getTransferData/getDestinationData.ts"],"sourcesContent":["export * from './getTransferData/getSourceData';\nexport * from './getTransferData/getTransferData.utils';\nexport * from './sdk';\nexport * from './sdk.interfaces';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n CallType,\n ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport {\n AssetConfig,\n DestinationFeeConfig,\n FeeAssetConfig,\n TransferConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n AssetAmount,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport {\n convertDecimals,\n toBigInt,\n toDecimal,\n} from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n createContract,\n} from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport {\n GetBalancesParams,\n getBalance,\n getDecimals,\n getMin,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n destinationFee: AssetAmount;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n transferConfig,\n destinationAddress,\n destinationFee,\n polkadot,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const feeAsset = polkadot.chain.getBalanceAssetId(\n config?.fee?.asset || config.asset,\n );\n\n const feeCfg = config.fee?.balance.build({\n address: destinationAddress,\n asset: feeAsset,\n });\n\n const feeDecimals = config.fee?.asset\n ? await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n assetBuiltConfig: feeCfg,\n chain,\n config,\n polkadot,\n })\n : undefined;\n\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: feeDecimals || 0,\n })\n : zeroAmount;\n\n const zeroDestinationFeeAmount = config.destinationFee?.asset\n ? AssetAmount.fromAsset(config.destinationFee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.destinationFee.asset,\n chain,\n config,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n\n const feeBalance = await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroFeeAmount.decimals,\n feeConfig: config.fee,\n polkadot,\n });\n\n const destinationFeeBalance = config.asset.isEqual(\n config.destinationFee.asset,\n )\n ? balance\n : await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroDestinationFeeAmount.decimals,\n feeConfig: config.destinationFee,\n polkadot,\n });\n\n const min = await getMin(config, polkadot);\n\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n\n const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\n });\n\n const fee = await getFee({\n balance,\n chain,\n contract,\n decimals: zeroFeeAmount.decimals,\n destinationFeeBalanceAmount,\n destinationFeeConfig: config.destinationFee,\n extrinsic,\n feeConfig: config.fee,\n polkadot,\n sourceAddress,\n });\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n const feeAmount = zeroFeeAmount.copyWith({ amount: fee });\n const feeBalanceAmount = zeroFeeAmount.copyWith({ amount: feeBalance });\n\n const minAmount = zeroAmount.copyWith({ amount: min });\n\n const maxAmount = getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n });\n\n return {\n balance: balanceAmount,\n chain,\n destinationFeeBalance: destinationFeeBalanceAmount,\n existentialDeposit,\n fee: feeAmount,\n feeBalance: feeBalanceAmount,\n max: maxAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeBalanceParams\n extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {\n balance: bigint;\n feeConfig: FeeAssetConfig | undefined;\n}\n\nexport async function getFeeBalance({\n address,\n balance,\n chain,\n decimals,\n feeConfig,\n polkadot,\n}: GetFeeBalanceParams) {\n if (!feeConfig) {\n return balance;\n }\n\n const cfg = feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig;\n\n if (cfg.type === CallType.Evm) {\n const contract = createContract(chain, cfg) as BalanceContractInterface;\n\n const decimalsFromContract = await contract.getDecimals();\n const balanceFromContract = await contract.getBalance();\n\n return chain.usesChainDecimals\n ? convertDecimals(\n balanceFromContract,\n polkadot.decimals,\n decimalsFromContract,\n )\n : balanceFromContract;\n }\n\n const feeBalance = await polkadot.query(cfg);\n\n return chain.usesChainDecimals\n ? convertDecimals(feeBalance, polkadot.decimals, decimals)\n : feeBalance;\n}\n\nexport interface GetFeeParams {\n balance: bigint;\n contract?: ContractConfig;\n chain: AnyChain;\n decimals: number;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeAssetConfig;\n destinationFeeConfig?: DestinationFeeConfig;\n destinationFeeBalanceAmount?: AssetAmount;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n chain,\n contract,\n decimals,\n destinationFeeConfig,\n destinationFeeBalanceAmount,\n extrinsic,\n feeConfig,\n polkadot,\n sourceAddress,\n}: GetFeeParams): Promise<bigint> {\n if (contract) {\n if (\n destinationFeeConfig &&\n destinationFeeBalanceAmount &&\n typeof destinationFeeConfig.amount === 'number'\n ) {\n const destinationFeeBalance = Number(\n toDecimal(\n destinationFeeBalanceAmount.amount,\n destinationFeeBalanceAmount.decimals,\n ),\n );\n if (\n destinationFeeBalance &&\n destinationFeeConfig.amount > destinationFeeBalance\n ) {\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFeeConfig?.amount} ${destinationFeeConfig?.asset.originSymbol} in your source balance, needed for destination fees`,\n );\n }\n }\n\n return getContractFee({\n address: sourceAddress,\n balance,\n chain: chain as EvmParachain,\n config: contract,\n decimals,\n });\n }\n\n if (extrinsic) {\n const extrinsicFee = await getExtrinsicFee(\n balance,\n extrinsic,\n polkadot,\n sourceAddress,\n );\n\n const xcmDeliveryFee = getXcmDeliveryFee(decimals, feeConfig);\n\n const totalFee = extrinsicFee + xcmDeliveryFee;\n\n return chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, decimals)\n : totalFee;\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n}\n\nexport async function getContractFee({\n address,\n balance,\n config,\n decimals,\n chain,\n}: {\n address: string;\n balance: bigint;\n config: ContractConfig;\n decimals: number;\n chain: EvmParachain;\n}): Promise<bigint> {\n const contract = createContract(chain, config) as TransferContractInterface;\n const fee = await contract.getFee(balance, address);\n\n return convertDecimals(fee, 18, decimals);\n}\n\nexport async function getExtrinsicFee(\n balance: bigint,\n extrinsic: ExtrinsicConfig,\n polkadot: PolkadotService,\n sourceAddress: string,\n): Promise<bigint> {\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 return await polkadot.getFee(sourceAddress, extrinsic);\n } catch (error) {\n if (balance) {\n throw error;\n }\n\n return 0n;\n }\n}\n\nfunction getXcmDeliveryFee(\n decimals: number,\n feeConfig?: FeeAssetConfig,\n): bigint {\n return feeConfig?.xcmDeliveryFeeAmount\n ? toBigInt(feeConfig.xcmDeliveryFeeAmount, decimals)\n : 0n;\n}\n\nexport interface GetMaxParams {\n balanceAmount: AssetAmount;\n existentialDeposit: AssetAmount;\n feeAmount: AssetAmount;\n minAmount: AssetAmount;\n}\n\nexport function getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n}: GetMaxParams): AssetAmount {\n const result = balanceAmount\n .toBig()\n .minus(minAmount.toBig())\n .minus(\n balanceAmount.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balanceAmount.isSame(feeAmount) ? feeAmount.toBig() : Big(0));\n\n return balanceAmount.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyChain;\n assets: AssetConfig[];\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n assets,\n polkadot,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueAssets = assets.reduce(\n (acc: AssetConfig[], asset: AssetConfig) => {\n if (!acc.some((a: AssetConfig) => a.asset.isEqual(asset.asset))) {\n return [asset, ...acc];\n }\n\n return acc;\n },\n [],\n );\n\n const balances = await Promise.all(\n uniqueAssets.map(async (asset: AssetConfig) => {\n const decimals = await getDecimals({\n address,\n asset: asset.asset,\n chain,\n config: asset,\n polkadot,\n });\n\n // eslint-disable-next-line no-await-in-loop\n const balance = await getBalance({\n address,\n chain,\n config: asset,\n decimals,\n polkadot,\n });\n\n const assetAmount = AssetAmount.fromAsset(asset.asset, {\n amount: balance,\n decimals,\n });\n\n return assetAmount;\n }),\n );\n\n return balances;\n}\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport {\n Address,\n HttpTransport,\n PublicClient,\n createPublicClient,\n http,\n} from 'viem';\nimport { EvmParachain } from '@moonbeam-network/xcm-types';\nimport { BalanceContractInterface } from '../../contract.interfaces';\nimport { ERC20_ABI } from './Erc20ABI';\n\nexport class Erc20 implements BalanceContractInterface {\n readonly address: Address;\n\n readonly #config: ContractConfig;\n\n readonly #client: PublicClient<HttpTransport>;\n\n constructor(config: ContractConfig, chain: EvmParachain) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n\n this.address = config.address as Address;\n this.#config = config;\n this.#client = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async getBalance(): Promise<bigint> {\n const address = this.#config.args[0] as Address;\n\n return this.#client.readContract({\n abi: ERC20_ABI,\n address: this.address,\n args: [address],\n functionName: 'balanceOf',\n });\n }\n\n async getDecimals(): Promise<number> {\n return this.#client.readContract({\n abi: ERC20_ABI,\n address: this.address,\n functionName: 'decimals',\n });\n }\n}\n","export const ERC20_ABI = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [\n {\n name: '',\n type: 'string',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n {\n name: '_spender',\n type: 'address',\n },\n {\n name: '_value',\n type: 'uint256',\n },\n ],\n name: 'approve',\n outputs: [\n {\n name: '',\n type: 'bool',\n },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n name: '',\n type: 'uint256',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n {\n name: '_from',\n type: 'address',\n },\n {\n name: '_to',\n type: 'address',\n },\n {\n name: '_value',\n type: 'uint256',\n },\n ],\n name: 'transferFrom',\n outputs: [\n {\n name: '',\n type: 'bool',\n },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [\n {\n name: '',\n type: 'uint8',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n name: 'balance',\n type: 'uint256',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n name: '',\n type: 'string',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n {\n name: '_to',\n type: 'address',\n },\n {\n name: '_value',\n type: 'uint256',\n },\n ],\n name: 'transfer',\n outputs: [\n {\n name: '',\n type: 'bool',\n },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address',\n },\n {\n name: '_spender',\n type: 'address',\n },\n ],\n name: 'allowance',\n outputs: [\n {\n name: '',\n type: 'uint256',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n payable: true,\n stateMutability: 'payable',\n type: 'fallback',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n] as const;\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Address, Hash, PublicClient, createPublicClient, http } from 'viem';\nimport { EvmParachain } from '@moonbeam-network/xcm-types';\nimport { EvmSigner } from '../../../sdk.interfaces';\nimport { TransferContractInterface } from '../../contract.interfaces';\nimport { XTOKENS_ABI } from './XtokensABI';\n\nexport class Xtokens implements TransferContractInterface {\n readonly defaultMoonChainAddress =\n '0x0000000000000000000000000000000000000804';\n\n readonly address: string;\n\n readonly #config: ContractConfig;\n\n readonly #publicClient: PublicClient;\n\n constructor(config: ContractConfig, chain: EvmParachain, address?: string) {\n this.#config = config;\n this.address = address ?? this.defaultMoonChainAddress;\n this.#publicClient = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async transfer(signer: EvmSigner): Promise<Hash> {\n const { request } = await this.#publicClient.simulateContract({\n abi: XTOKENS_ABI,\n account: signer.account,\n address: this.address as Address,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: this.#config.args as any,\n functionName: this.#config.func as 'transfer',\n });\n const hash = await signer.writeContract(request);\n\n return hash;\n }\n\n async getFee(amount: bigint, address: string): Promise<bigint> {\n if (amount === 0n) {\n return 0n;\n }\n\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 try {\n const gas = await this.#publicClient.estimateContractGas({\n abi: XTOKENS_ABI,\n account: address as Address,\n address: this.address as Address,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: this.#config.args as any,\n functionName: this.#config.func as 'transfer',\n });\n\n const gasPrice = await this.getGasPrice();\n\n return gas * gasPrice;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n throw new Error(\n \"Can't get a fee. Make sure that you have enough balance!\",\n );\n }\n }\n\n private async getGasPrice() {\n return this.#publicClient.getGasPrice();\n }\n}\n","export const XTOKENS_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'currencyAddress',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n components: [\n {\n internalType: 'uint8',\n name: 'parents',\n type: 'uint8',\n },\n {\n internalType: 'bytes[]',\n name: 'interior',\n type: 'bytes[]',\n },\n ],\n internalType: 'struct Xtokens.Multilocation',\n name: 'destination',\n type: 'tuple',\n },\n {\n internalType: 'uint64',\n name: 'weight',\n type: 'uint64',\n },\n ],\n name: 'transfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: 'address',\n name: 'currencyAddress',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n internalType: 'struct Xtokens.Currency[]',\n name: 'currencies',\n type: 'tuple[]',\n },\n {\n internalType: 'uint32',\n name: 'feeItem',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'uint8',\n name: 'parents',\n type: 'uint8',\n },\n {\n internalType: 'bytes[]',\n name: 'interior',\n type: 'bytes[]',\n },\n ],\n internalType: 'struct Xtokens.Multilocation',\n name: 'destination',\n type: 'tuple',\n },\n {\n internalType: 'uint64',\n name: 'weight',\n type: 'uint64',\n },\n ],\n name: 'transferMultiCurrencies',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { AnyChain } from '@moonbeam-network/xcm-types';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\n\nexport function createContract(\n chain: AnyChain,\n config: ContractConfig,\n): TransferContractInterface | BalanceContractInterface {\n if (!chain.isEvmParachain()) {\n throw new Error('Chain is not an EVM parachain');\n }\n\n if (config.module === 'Erc20') {\n return new Erc20(config, chain);\n }\n\n if (config.module === 'Xtokens') {\n const address =\n 'contracts' in chain ? chain?.contracts?.Xtokens : undefined;\n\n return new Xtokens(config, chain, address);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n","import {\n CallType,\n ContractConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { AssetConfig } from '@moonbeam-network/xcm-config';\nimport { AnyChain, Asset } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport { BalanceContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset?: Asset;\n chain: AnyChain;\n config: AssetConfig;\n decimals: number;\n polkadot: PolkadotService;\n}\n\nexport type GetDecimalsParams = Omit<GetBalancesParams, 'decimals'> & {\n assetBuiltConfig?: SubstrateQueryConfig | ContractConfig;\n};\n\nexport async function getBalance({\n address,\n chain,\n config,\n decimals,\n polkadot,\n}: GetBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\n if (cfg.type === CallType.Substrate) {\n const balance = await polkadot.query(cfg as SubstrateQueryConfig);\n return chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, decimals)\n : balance;\n }\n\n const contract = createContract(chain, cfg) as BalanceContractInterface;\n const balance = await contract.getBalance();\n\n return balance;\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n polkadot,\n chain,\n assetBuiltConfig,\n}: GetDecimalsParams) {\n const cfg =\n assetBuiltConfig ||\n config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(asset || config.asset),\n });\n\n if (cfg.type === CallType.Substrate) {\n return polkadot.getAssetDecimals(asset || config.asset);\n }\n\n const contract = createContract(chain, cfg) as BalanceContractInterface;\n\n return contract.getDecimals();\n}\n\nexport async function getMin(config: AssetConfig, polkadot: PolkadotService) {\n if (config.min) {\n return polkadot.query(\n config.min.build({ asset: polkadot.chain.getMinAssetId(config.asset) }),\n );\n }\n\n const min = polkadot.chain.getAssetMin(config.asset);\n\n if (min) {\n const decimals = await polkadot.getAssetDecimals(config.asset);\n\n return toBigInt(min, decimals);\n }\n\n return 0n;\n}\n","/* eslint-disable sort-keys */\nimport {\n ConfigBuilder,\n ConfigService,\n IConfigService,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n Asset,\n AssetAmount,\n Ecosystem,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\nimport { PolkadotService } from './polkadot';\nimport { Signers, TransferData } from './sdk.interfaces';\n\nexport interface SdkOptions extends Partial<Signers> {\n configService?: IConfigService;\n}\n\nexport function Sdk(options?: SdkOptions) {\n const configService = options?.configService ?? new ConfigService();\n\n return {\n assets(ecosystem?: Ecosystem) {\n const { assets, asset } = ConfigBuilder(configService).assets(ecosystem);\n\n return {\n assets,\n asset(keyOrAsset: string | Asset) {\n const { sourceChains, source } = asset(keyOrAsset);\n\n return {\n sourceChains,\n source(keyOrChain: string | AnyChain) {\n const { destinationChains, destination } = source(keyOrChain);\n\n return {\n destinationChains,\n destination(destKeyOrChain: string | AnyChain) {\n return {\n async accounts(\n sourceAddress: string,\n destinationAddress: string,\n ): Promise<TransferData> {\n return gtd({\n ...options,\n configService,\n destinationAddress,\n sourceAddress,\n transferConfig: destination(destKeyOrChain).build(),\n });\n },\n };\n },\n };\n },\n };\n },\n };\n },\n async getTransferData({\n destinationAddress,\n destinationKeyOrChain,\n evmSigner,\n keyOrAsset,\n polkadotSigner,\n sourceAddress,\n sourceKeyOrChain,\n }: SdkTransferParams): Promise<TransferData> {\n return gtd({\n configService,\n destinationAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig: ConfigBuilder(configService)\n .assets()\n .asset(keyOrAsset)\n .source(sourceKeyOrChain)\n .destination(destinationKeyOrChain)\n .build(),\n });\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyChain,\n address: string,\n): Promise<AssetAmount[]> {\n const configService = new ConfigService();\n const chainsConfig = configService.getChainConfig(chain);\n const assets = chainsConfig.getAssetsConfigs();\n\n const polkadot = await PolkadotService.create(chain, configService);\n\n const balances = await getAssetsBalances({\n chain,\n assets,\n address,\n polkadot,\n });\n\n return balances;\n}\n\nexport interface SdkTransferParams extends Partial<Signers> {\n destinationAddress: string;\n destinationKeyOrChain: string | AnyChain;\n keyOrAsset: string | Asset;\n sourceAddress: string;\n sourceKeyOrChain: string | AnyChain;\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { IConfigService, TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport { TransferContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport {\n DestinationChainTransferData,\n Signers,\n TransferData,\n} from '../sdk.interfaces';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\n\nexport interface GetTransferDataParams extends Partial<Signers> {\n configService: IConfigService;\n destinationAddress: string;\n sourceAddress: string;\n transferConfig: TransferConfig;\n}\n\nexport async function getTransferData({\n configService,\n destinationAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig,\n}: GetTransferDataParams): Promise<TransferData> {\n const [destPolkadot, srcPolkadot] = await PolkadotService.createMulti(\n [transferConfig.destination.chain, transferConfig.source.chain],\n configService,\n );\n\n const destination = await getDestinationData({\n destinationAddress,\n polkadot: destPolkadot,\n transferConfig,\n });\n\n const destinationFee = await getDestinationFeeWithSourceDecimals(\n srcPolkadot,\n destination.fee,\n );\n\n const source = await getSourceData({\n destinationAddress,\n destinationFee,\n polkadot: srcPolkadot,\n sourceAddress,\n transferConfig,\n });\n\n return {\n destination,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, source.balance.decimals).toString(),\n );\n const result = bigAmount.minus(\n source.balance.isSame(destinationFee) ? destinationFee.toBig() : Big(0),\n );\n\n return source.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n /**\n * Right now it will be always true\n * because all current asset can be sent both directions\n * and our configuration need destination config.\n */\n isSwapPossible: true,\n max: source.max,\n min: getMin(destination),\n source,\n async swap() {\n return getTransferData({\n configService,\n destinationAddress: sourceAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress: destinationAddress,\n transferConfig: {\n ...transferConfig,\n destination: transferConfig.source,\n source: transferConfig.destination,\n },\n });\n },\n async transfer(amount, signers: Partial<Signers>): Promise<string> {\n const bigintAmount = toBigInt(amount, source.balance.decimals);\n const {\n asset,\n source: { chain, config },\n } = transferConfig;\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n if (contract) {\n const signer = evmSigner || signers.evmSigner;\n\n if (!signer) {\n throw new Error('EVM Signer must be provided');\n }\n\n return (\n createContract(chain, contract) as TransferContractInterface\n ).transfer(signer);\n }\n\n if (extrinsic) {\n const signer = polkadotSigner || signers.polkadotSigner;\n\n if (!signer) {\n throw new Error('Polkadot signer must be provided');\n }\n\n return srcPolkadot.transfer(sourceAddress, extrinsic, signer);\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n\nfunction 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 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 async function getDestinationFeeWithSourceDecimals(\n sourcePolkadot: PolkadotService,\n destinationFee: AssetAmount,\n): Promise<AssetAmount> {\n const destinationFeeDecimals =\n await sourcePolkadot.getAssetDecimals(destinationFee);\n const destinationFeeAsset =\n destinationFee.decimals === destinationFeeDecimals\n ? destinationFee\n : destinationFee.copyWith({\n amount: convertDecimals(\n destinationFee.amount,\n destinationFee.decimals,\n destinationFeeDecimals,\n ),\n decimals: destinationFeeDecimals,\n });\n\n return destinationFeeAsset;\n}\n","import '@polkadot/api-augment';\n\nimport {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { IConfigService, eq, equilibrium } from '@moonbeam-network/xcm-config';\nimport {\n AnyParachain,\n Asset,\n AssetAmount,\n ChainAssetId,\n} from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport { ApiPromise } from '@polkadot/api';\nimport type { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { Option, u128, u8 } from '@polkadot/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { AssetMetadata } from './PolkadotService.interfaces';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n readonly configService: IConfigService;\n\n constructor(\n api: ApiPromise,\n chain: AnyParachain,\n configService: IConfigService,\n ) {\n this.api = api;\n this.chain = chain;\n this.configService = configService;\n }\n\n static async create(\n chain: AnyParachain,\n configService: IConfigService,\n ): Promise<PolkadotService> {\n return new PolkadotService(\n await getPolkadotApi(chain.ws),\n chain,\n configService,\n );\n }\n\n static async createMulti(\n chains: AnyParachain[],\n configService: IConfigService,\n ): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) =>\n PolkadotService.create(chain, configService),\n ),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get asset(): Asset {\n const symbol = this.api.registry.chainTokens.at(0);\n const key = symbol?.toString().toLowerCase();\n\n // TODO: Remove this once Equilibrium is updated\n // or find better way if issue appears on other chains\n if (key === 'token' && [equilibrium.key].includes(this.chain.key)) {\n return eq;\n }\n\n if (!key) {\n throw new Error('No native symbol key found');\n }\n\n const asset = this.configService.getAsset(key);\n\n if (!asset) {\n throw new Error(`No asset found for key \"${key}\" and symbol \"${symbol}\"`);\n }\n\n return asset;\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.fromAsset(this.asset, {\n amount,\n decimals: this.decimals,\n });\n }\n\n async getAssetMeta(\n asset: ChainAssetId,\n ): Promise<{ symbol: string; decimals: number } | undefined> {\n const fn =\n this.api.query.assets?.metadata ||\n this.api.query.assetRegistry?.assets ||\n this.api.query.assetRegistry?.metadata ||\n this.api.query.assetRegistry?.currencyMetadatas ||\n this.api.query.assetRegistry?.assetMetadatas ||\n this.api.query.assetRegistry?.assetMetadataMap;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as AssetMetadata | Option<AssetMetadata>;\n const unwrapped = 'unwrapOrDefault' in data ? data.unwrapOrDefault() : data;\n const decimals =\n 'unwrapOrDefault' in unwrapped.decimals\n ? unwrapped.decimals.unwrapOrDefault()\n : unwrapped.decimals;\n\n return {\n decimals: decimals.toNumber(),\n symbol: unwrapped.symbol.toString(),\n };\n }\n\n async getAssetDecimalsFromQuery(\n asset: ChainAssetId,\n ): Promise<number | undefined> {\n const fn = this.api.query.assetsRegistry?.assetDecimals;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as Option<u8>;\n\n return data.unwrapOrDefault().toNumber();\n }\n\n async getAssetDecimals(asset: Asset): Promise<number> {\n const metaId = this.chain.getMetadataAssetId(asset);\n\n const decimals =\n this.chain.getAssetDecimals(asset) ||\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.decimals; // TODO remove this and handle it separately only for native assets\n\n if (!decimals) {\n throw new Error(`No decimals found for asset ${asset.originSymbol}`);\n }\n\n return decimals;\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 async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const info = await extrinsic.paymentInfo(account, { nonce: -1 });\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n ): Promise<string> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const hash = await extrinsic.signAndSend(\n this.#isSigner(signer) ? account : signer,\n {\n nonce: -1,\n signer: this.#isSigner(signer) ? signer : undefined,\n },\n );\n\n return hash.toString();\n }\n\n // eslint-disable-next-line class-methods-use-this\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { FeeConfigBuilder } from '@moonbeam-network/xcm-builder';\nimport { TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport { PolkadotService } from '../polkadot';\nimport { DestinationChainTransferData } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n polkadot,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const {\n asset,\n destination: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n const min = await getMin(config, polkadot);\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n\n const feeAmount = await getFee({\n address: destinationAddress,\n config: transferConfig,\n polkadot,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\n return {\n balance: balanceAmount,\n chain,\n existentialDeposit,\n fee: feeAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeParams {\n address: string;\n config: TransferConfig;\n polkadot: PolkadotService;\n}\n\nexport async function getFee({\n config,\n polkadot,\n}: GetFeeParams): Promise<AssetAmount> {\n const { amount, asset } = config.source.config.destinationFee;\n // TODO we have to consider correctly here when an asset is ERC20 to get it from contract\n const decimals = await polkadot.getAssetDecimals(asset);\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals,\n });\n\n if (Number.isFinite(amount)) {\n return zeroAmount.copyWith({\n amount: toBigInt(amount as number, decimals),\n });\n }\n\n const cfg = (amount as FeeConfigBuilder).build({\n api: polkadot.api,\n asset: polkadot.chain.getAssetId(asset),\n });\n\n return zeroAmount.copyWith({\n amount: await cfg.call(),\n });\n}\n"],"mappings":"0kBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,SAAAE,GAAA,sBAAAC,EAAA,eAAAC,EAAA,mBAAAC,GAAA,gBAAAC,EAAA,oBAAAC,GAAA,WAAAC,GAAA,kBAAAC,EAAA,WAAAC,GAAA,WAAAC,EAAA,yBAAAC,GAAA,kBAAAC,IAAA,eAAAC,GAAAd,ICCA,IAAAe,GAKO,yCAOPC,EAIO,uCACPC,EAIO,uCACPC,EAAgB,wBCtBhB,IAAAC,EAMO,gBCPA,IAAMC,EAAY,CACvB,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,QACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,WACN,KAAM,SACR,EACA,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,MACR,CACF,EACA,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,QACN,KAAM,SACR,EACA,CACE,KAAM,MACN,KAAM,SACR,EACA,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,MACR,CACF,EACA,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,KAAM,UACN,KAAM,SACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,QACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,MACN,KAAM,SACR,EACA,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,MACR,CACF,EACA,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACR,EACA,CACE,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,QAAS,GACT,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,KAAM,KACN,KAAM,SACR,EACA,CACE,QAAS,GACT,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,CACF,EDjNO,IAAMC,EAAN,KAAgD,CAC5C,QAEAC,GAEAC,GAET,YAAYC,EAAwBC,EAAqB,CACvD,GAAI,CAACD,EAAO,QACV,MAAM,IAAI,MAAM,8BAA8B,EAGhD,KAAK,QAAUA,EAAO,QACtB,KAAKF,GAAUE,EACf,KAAKD,MAAU,sBAAmB,CAChC,MAAOE,EAAM,aAAa,EAC1B,aAAW,QAAK,CAClB,CAAC,CACH,CAEA,MAAM,YAA8B,CAClC,IAAMC,EAAU,KAAKJ,GAAQ,KAAK,CAAC,EAEnC,OAAO,KAAKC,GAAQ,aAAa,CAC/B,IAAKI,EACL,QAAS,KAAK,QACd,KAAM,CAACD,CAAO,EACd,aAAc,WAChB,CAAC,CACH,CAEA,MAAM,aAA+B,CACnC,OAAO,KAAKH,GAAQ,aAAa,CAC/B,IAAKI,EACL,QAAS,KAAK,QACd,aAAc,UAChB,CAAC,CACH,CACF,EEjDA,IAAAC,EAAsE,gBCD/D,IAAMC,EAAc,CACzB,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,WAAY,CACV,CACE,aAAc,QACd,KAAM,UACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,aAAc,+BACd,KAAM,cACN,KAAM,OACR,EACA,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,WACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,aAAc,4BACd,KAAM,aACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,UACN,KAAM,QACR,EACA,CACE,WAAY,CACV,CACE,aAAc,QACd,KAAM,UACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,aAAc,+BACd,KAAM,cACN,KAAM,OACR,EACA,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,0BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,CACF,EDtFO,IAAMC,EAAN,KAAmD,CAC/C,wBACP,6CAEO,QAEAC,GAEAC,GAET,YAAYC,EAAwBC,EAAqBC,EAAkB,CACzE,KAAKJ,GAAUE,EACf,KAAK,QAAUE,GAAW,KAAK,wBAC/B,KAAKH,MAAgB,sBAAmB,CACtC,MAAOE,EAAM,aAAa,EAC1B,aAAW,QAAK,CAClB,CAAC,CACH,CAEA,MAAM,SAASE,EAAkC,CAC/C,GAAM,CAAE,QAAAC,CAAQ,EAAI,MAAM,KAAKL,GAAc,iBAAiB,CAC5D,IAAKM,EACL,QAASF,EAAO,QAChB,QAAS,KAAK,QAEd,KAAM,KAAKL,GAAQ,KACnB,aAAc,KAAKA,GAAQ,IAC7B,CAAC,EAGD,OAFa,MAAMK,EAAO,cAAcC,CAAO,CAGjD,CAEA,MAAM,OAAOE,EAAgBJ,EAAkC,CAC7D,GAAII,IAAW,GACb,OAAO,GAOT,GAAI,CACF,IAAMC,EAAM,MAAM,KAAKR,GAAc,oBAAoB,CACvD,IAAKM,EACL,QAASH,EACT,QAAS,KAAK,QAEd,KAAM,KAAKJ,GAAQ,KACnB,aAAc,KAAKA,GAAQ,IAC7B,CAAC,EAEKU,EAAW,MAAM,KAAK,YAAY,EAExC,OAAOD,EAAMC,CACf,OAASC,EAAO,CAEd,cAAQ,MAAMA,CAAK,EACb,IAAI,MACR,0DACF,CACF,CACF,CAEA,MAAc,aAAc,CAC1B,OAAO,KAAKV,GAAc,YAAY,CACxC,CACF,EElEO,SAASW,EACdC,EACAC,EACsD,CAXxD,IAAAC,EAYE,GAAI,CAACF,EAAM,eAAe,EACxB,MAAM,IAAI,MAAM,+BAA+B,EAGjD,GAAIC,EAAO,SAAW,QACpB,OAAO,IAAIE,EAAMF,EAAQD,CAAK,EAGhC,GAAIC,EAAO,SAAW,UAAW,CAC/B,IAAMG,EACJ,cAAeJ,GAAQE,EAAAF,GAAA,YAAAA,EAAO,YAAP,YAAAE,EAAkB,QAAU,OAErD,OAAO,IAAIG,EAAQJ,EAAQD,EAAOI,CAAO,CAC3C,CAEA,MAAM,IAAI,MAAM,YAAYH,EAAO,MAAM,YAAY,CACvD,CC5BA,IAAAK,EAIO,yCAGPC,EAA0C,uCAiB1C,eAAsBC,EAAW,CAC/B,QAAAC,EACA,MAAAC,EACA,OAAAC,EACA,SAAAC,EACA,SAAAC,CACF,EAAsB,CACpB,IAAMC,EAAMH,EAAO,QAAQ,MAAM,CAC/B,QAAAF,EACA,MAAOI,EAAS,MAAM,kBAAkBF,EAAO,KAAK,CACtD,CAAC,EACD,GAAIG,EAAI,OAAS,WAAS,UAAW,CACnC,IAAMC,EAAU,MAAMF,EAAS,MAAMC,CAA2B,EAChE,OAAOJ,EAAM,qBACT,mBAAgBK,EAASF,EAAS,SAAUD,CAAQ,EACpDG,CACN,CAKA,OAFgB,MADCC,EAAeN,EAAOI,CAAG,EACX,WAAW,CAG5C,CAEA,eAAsBG,EAAY,CAChC,QAAAR,EACA,MAAAS,EACA,OAAAP,EACA,SAAAE,EACA,MAAAH,EACA,iBAAAS,CACF,EAAsB,CACpB,IAAML,EACJK,GACAR,EAAO,QAAQ,MAAM,CACnB,QAAAF,EACA,MAAOI,EAAS,MAAM,kBAAkBK,GAASP,EAAO,KAAK,CAC/D,CAAC,EAEH,OAAIG,EAAI,OAAS,WAAS,UACjBD,EAAS,iBAAiBK,GAASP,EAAO,KAAK,EAGvCK,EAAeN,EAAOI,CAAG,EAE1B,YAAY,CAC9B,CAEA,eAAsBM,EAAOT,EAAqBE,EAA2B,CAC3E,GAAIF,EAAO,IACT,OAAOE,EAAS,MACdF,EAAO,IAAI,MAAM,CAAE,MAAOE,EAAS,MAAM,cAAcF,EAAO,KAAK,CAAE,CAAC,CACxE,EAGF,IAAMU,EAAMR,EAAS,MAAM,YAAYF,EAAO,KAAK,EAEnD,GAAIU,EAAK,CACP,IAAMT,EAAW,MAAMC,EAAS,iBAAiBF,EAAO,KAAK,EAE7D,SAAO,YAASU,EAAKT,CAAQ,CAC/B,CAEA,OAAO,EACT,CN1CA,eAAsBU,EAAc,CAClC,eAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,SAAAC,EACA,cAAAC,CACF,EAA0D,CApD1D,IAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAqDE,GAAM,CACJ,MAAAC,EACA,YAAAC,EACA,OAAQ,CAAE,MAAAC,EAAO,OAAAC,CAAO,CAC1B,EAAIf,EAEEgB,EAAa,cAAY,UAAUJ,EAAO,CAC9C,OAAQ,GACR,SAAU,MAAMK,EAAY,CAC1B,QAAShB,EACT,MAAAa,EACA,OAAAC,EACA,SAAAZ,CACF,CAAC,CACH,CAAC,EAEKe,EAAWf,EAAS,MAAM,oBAC9BE,EAAAU,GAAA,YAAAA,EAAQ,MAAR,YAAAV,EAAa,QAASU,EAAO,KAC/B,EAEMI,GAASb,EAAAS,EAAO,MAAP,YAAAT,EAAY,QAAQ,MAAM,CACvC,QAASL,EACT,MAAOiB,CACT,GAEME,GAAcb,GAAAQ,EAAO,MAAP,MAAAR,GAAY,MAC5B,MAAMU,EAAY,CAChB,QAAShB,EACT,MAAOc,EAAO,IAAI,MAClB,iBAAkBI,EAClB,MAAAL,EACA,OAAAC,EACA,SAAAZ,CACF,CAAC,EACD,OAEEkB,GAAgBb,GAAAO,EAAO,MAAP,MAAAP,GAAY,MAC9B,cAAY,UAAUO,EAAO,IAAI,MAAO,CACtC,OAAQ,GACR,SAAUK,GAAe,CAC3B,CAAC,EACDJ,EAEEM,GAA2Bb,GAAAM,EAAO,iBAAP,MAAAN,GAAuB,MACpD,cAAY,UAAUM,EAAO,eAAe,MAAO,CACjD,OAAQ,GACR,SAAU,MAAME,EAAY,CAC1B,QAAShB,EACT,MAAOc,EAAO,eAAe,MAC7B,MAAAD,EACA,OAAAC,EACA,SAAAZ,CACF,CAAC,CACH,CAAC,EACDa,EAEEO,EAAU,MAAMC,EAAW,CAC/B,QAASpB,EACT,MAAAU,EACA,OAAAC,EACA,SAAUC,EAAW,SACrB,SAAAb,CACF,CAAC,EAEKsB,EAAa,MAAMC,EAAc,CACrC,QAAStB,EACT,QAAAmB,EACA,MAAAT,EACA,SAAUO,EAAc,SACxB,UAAWN,EAAO,IAClB,SAAAZ,CACF,CAAC,EAEKwB,EAAwBZ,EAAO,MAAM,QACzCA,EAAO,eAAe,KACxB,EACIQ,EACA,MAAMG,EAAc,CAClB,QAAStB,EACT,QAAAmB,EACA,MAAAT,EACA,SAAUQ,EAAyB,SACnC,UAAWP,EAAO,eAClB,SAAAZ,CACF,CAAC,EAECyB,EAAM,MAAMC,EAAOd,EAAQZ,CAAQ,EAEnC2B,GAAYpB,GAAAK,EAAO,YAAP,YAAAL,GAAkB,MAAM,CACxC,QAAST,EACT,OAAQsB,EACR,MAAOT,EAAM,WAAWF,CAAK,EAC7B,YAAaC,EAAY,MACzB,IAAKX,EAAe,OACpB,SAAUY,EAAM,WAAWZ,CAAc,EACzC,eAAgBY,EAAM,uBAAuBF,CAAK,EAClD,OAAQE,CACV,GAEMiB,GAAWpB,GAAAI,EAAO,WAAP,YAAAJ,GAAiB,MAAM,CACtC,QAASV,EACT,OAAQsB,EACR,MAAOT,EAAM,WAAWF,CAAK,EAC7B,YAAaC,EAAY,MACzB,IAAKX,EAAe,OACpB,SAAUY,EAAM,WAAWZ,CAAc,CAC3C,GAEM8B,EAA8BV,EAAyB,SAAS,CACpE,OAAQK,CACV,CAAC,EAEKM,GAAM,MAAMC,GAAO,CACvB,QAAAX,EACA,MAAAT,EACA,SAAAiB,EACA,SAAUV,EAAc,SACxB,4BAAAW,EACA,qBAAsBjB,EAAO,eAC7B,UAAAe,EACA,UAAWf,EAAO,IAClB,SAAAZ,EACA,cAAAC,CACF,CAAC,EAEK+B,EAAgBnB,EAAW,SAAS,CAAE,OAAQO,CAAQ,CAAC,EACvD,CAAE,mBAAAa,CAAmB,EAAIjC,EACzBkC,EAAYhB,EAAc,SAAS,CAAE,OAAQY,EAAI,CAAC,EAClDK,GAAmBjB,EAAc,SAAS,CAAE,OAAQI,CAAW,CAAC,EAEhEc,EAAYvB,EAAW,SAAS,CAAE,OAAQY,CAAI,CAAC,EAE/CY,GAAYC,GAAO,CACvB,cAAAN,EACA,mBAAAC,EACA,UAAAC,EACA,UAAAE,CACF,CAAC,EAED,MAAO,CACL,QAASJ,EACT,MAAArB,EACA,sBAAuBkB,EACvB,mBAAAI,EACA,IAAKC,EACL,WAAYC,GACZ,IAAKE,GACL,IAAKD,CACP,CACF,CAQA,eAAsBb,EAAc,CAClC,QAAAgB,EACA,QAAAnB,EACA,MAAAT,EACA,SAAA6B,EACA,UAAAC,EACA,SAAAzC,CACF,EAAwB,CACtB,GAAI,CAACyC,EACH,OAAOrB,EAGT,IAAMsB,EAAMD,EAAU,QAAQ,MAAM,CAClC,QAAAF,EACA,MAAOvC,EAAS,MAAM,kBAAkByC,EAAU,KAAK,CACzD,CAAC,EAED,GAAIC,EAAI,OAAS,YAAS,IAAK,CAC7B,IAAMd,EAAWe,EAAehC,EAAO+B,CAAG,EAEpCE,EAAuB,MAAMhB,EAAS,YAAY,EAClDiB,EAAsB,MAAMjB,EAAS,WAAW,EAEtD,OAAOjB,EAAM,qBACT,mBACEkC,EACA7C,EAAS,SACT4C,CACF,EACAC,CACN,CAEA,IAAMvB,EAAa,MAAMtB,EAAS,MAAM0C,CAAG,EAE3C,OAAO/B,EAAM,qBACT,mBAAgBW,EAAYtB,EAAS,SAAUwC,CAAQ,EACvDlB,CACN,CAeA,eAAsBS,GAAO,CAC3B,QAAAX,EACA,MAAAT,EACA,SAAAiB,EACA,SAAAY,EACA,qBAAAM,EACA,4BAAAjB,EACA,UAAAF,EACA,UAAAc,EACA,SAAAzC,EACA,cAAAC,CACF,EAAkC,CAChC,GAAI2B,EAAU,CACZ,GACEkB,GACAjB,GACA,OAAOiB,EAAqB,QAAW,SACvC,CACA,IAAMtB,EAAwB,UAC5B,aACEK,EAA4B,OAC5BA,EAA4B,QAC9B,CACF,EACA,GACEL,GACAsB,EAAqB,OAAStB,EAE9B,MAAM,IAAI,MACR,uCAAuCsB,GAAA,YAAAA,EAAsB,MAAM,IAAIA,GAAA,YAAAA,EAAsB,MAAM,YAAY,sDACjH,CAEJ,CAEA,OAAOC,GAAe,CACpB,QAAS9C,EACT,QAAAmB,EACA,MAAOT,EACP,OAAQiB,EACR,SAAAY,CACF,CAAC,CACH,CAEA,GAAIb,EAAW,CACb,IAAMqB,EAAe,MAAMC,GACzB7B,EACAO,EACA3B,EACAC,CACF,EAEMiD,EAAiBC,GAAkBX,EAAUC,CAAS,EAEtDW,EAAWJ,EAAeE,EAEhC,OAAOvC,EAAM,qBACT,mBAAgByC,EAAUpD,EAAS,SAAUwC,CAAQ,EACrDY,CACN,CAEA,MAAM,IAAI,MAAM,+CAA+C,CACjE,CAEA,eAAsBL,GAAe,CACnC,QAAAR,EACA,QAAAnB,EACA,OAAAR,EACA,SAAA4B,EACA,MAAA7B,CACF,EAMoB,CAElB,IAAMmB,EAAM,MADKa,EAAehC,EAAOC,CAAM,EAClB,OAAOQ,EAASmB,CAAO,EAElD,SAAO,mBAAgBT,EAAK,GAAIU,CAAQ,CAC1C,CAEA,eAAsBS,GACpB7B,EACAO,EACA3B,EACAC,EACiB,CAMjB,GAAI,CACF,OAAO,MAAMD,EAAS,OAAOC,EAAe0B,CAAS,CACvD,OAAS0B,EAAO,CACd,GAAIjC,EACF,MAAMiC,EAGR,OAAO,EACT,CACF,CAEA,SAASF,GACPX,EACAC,EACQ,CACR,OAAOA,GAAA,MAAAA,EAAW,wBACd,YAASA,EAAU,qBAAsBD,CAAQ,EACjD,EACN,CASO,SAASF,GAAO,CACrB,cAAAN,EACA,mBAAAC,EACA,UAAAC,EACA,UAAAE,CACF,EAA8B,CAC5B,IAAMkB,EAAStB,EACZ,MAAM,EACN,MAAMI,EAAU,MAAM,CAAC,EACvB,MACCJ,EAAc,OAAOC,CAAkB,EACnCA,EAAmB,MAAM,KACzB,EAAAsB,SAAI,CAAC,CACX,EACC,MAAMvB,EAAc,OAAOE,CAAS,EAAIA,EAAU,MAAM,KAAI,EAAAqB,SAAI,CAAC,CAAC,EAErE,OAAOvB,EAAc,SAAS,CAC5B,OAAQsB,EAAO,GAAG,CAAC,EAAI,GAAK,OAAOA,EAAO,QAAQ,CAAC,CACrD,CAAC,CACH,CAUA,eAAsBE,EAAkB,CACtC,QAAAjB,EACA,MAAA5B,EACA,OAAA8C,EACA,SAAAzD,CACF,EAAoD,CAClD,IAAM0D,EAAeD,EAAO,OAC1B,CAACE,EAAoBlD,IACdkD,EAAI,KAAMC,GAAmBA,EAAE,MAAM,QAAQnD,EAAM,KAAK,CAAC,EAIvDkD,EAHE,CAAClD,EAAO,GAAGkD,CAAG,EAKzB,CAAC,CACH,EA8BA,OA5BiB,MAAM,QAAQ,IAC7BD,EAAa,IAAI,MAAOjD,GAAuB,CAC7C,IAAM+B,EAAW,MAAM1B,EAAY,CACjC,QAAAyB,EACA,MAAO9B,EAAM,MACb,MAAAE,EACA,OAAQF,EACR,SAAAT,CACF,CAAC,EAGKoB,EAAU,MAAMC,EAAW,CAC/B,QAAAkB,EACA,MAAA5B,EACA,OAAQF,EACR,SAAA+B,EACA,SAAAxC,CACF,CAAC,EAOD,OALoB,cAAY,UAAUS,EAAM,MAAO,CACrD,OAAQW,EACR,SAAAoB,CACF,CAAC,CAGH,CAAC,CACH,CAGF,COxcA,IAAAqB,EAIO,wCCFP,IAAAC,EAA0C,uCAC1CC,EAAgB,wBCJhB,IAAAC,GAAO,iCAMPC,EAAgD,wCAChDC,GAKO,uCACPC,GAA+B,uCAOlBC,EAAN,MAAMC,CAAgB,CAClB,IAEA,MAEA,cAET,YACEC,EACAC,EACAC,EACA,CACA,KAAK,IAAMF,EACX,KAAK,MAAQC,EACb,KAAK,cAAgBC,CACvB,CAEA,aAAa,OACXD,EACAC,EAC0B,CAC1B,OAAO,IAAIH,EACT,QAAM,mBAAeE,EAAM,EAAE,EAC7BA,EACAC,CACF,CACF,CAEA,aAAa,YACXC,EACAD,EAC4B,CAC5B,OAAO,QAAQ,IACbC,EAAO,IAAKF,GACVF,EAAgB,OAAOE,EAAOC,CAAa,CAC7C,CACF,CACF,CAEA,IAAI,UAAmB,CACrB,OAAO,KAAK,IAAI,SAAS,cAAc,GAAG,CAAC,GAAK,EAClD,CAEA,IAAI,OAAe,CACjB,IAAME,EAAS,KAAK,IAAI,SAAS,YAAY,GAAG,CAAC,EAC3CC,EAAMD,GAAA,YAAAA,EAAQ,WAAW,cAI/B,GAAIC,IAAQ,SAAW,CAAC,cAAY,GAAG,EAAE,SAAS,KAAK,MAAM,GAAG,EAC9D,OAAO,KAGT,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,4BAA4B,EAG9C,IAAMC,EAAQ,KAAK,cAAc,SAASD,CAAG,EAE7C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,2BAA2BD,CAAG,iBAAiBD,CAAM,GAAG,EAG1E,OAAOE,CACT,CAEA,IAAI,oBAAkC,CAtFxC,IAAAC,EAAAC,EAuFI,IAAMC,GAAqBF,EAAA,KAAK,IAAI,OAAO,WAAhB,YAAAA,EAA0B,mBAC/CG,GAAuBF,EAAA,KAAK,IAAI,OAAO,aAAhB,YAAAA,EACzB,mBACEG,GACJF,GAAA,YAAAA,EAAoB,cAAcC,GAAA,YAAAA,EAAsB,aAAc,GAExE,OAAO,eAAY,UAAU,KAAK,MAAO,CACvC,OAAAC,EACA,SAAU,KAAK,QACjB,CAAC,CACH,CAEA,MAAM,aACJL,EAC2D,CArG/D,IAAAC,EAAAC,EAAAI,EAAAC,EAAAC,EAAAC,EAsGI,IAAMC,IACJT,EAAA,KAAK,IAAI,MAAM,SAAf,YAAAA,EAAuB,aACvBC,EAAA,KAAK,IAAI,MAAM,gBAAf,YAAAA,EAA8B,WAC9BI,EAAA,KAAK,IAAI,MAAM,gBAAf,YAAAA,EAA8B,aAC9BC,EAAA,KAAK,IAAI,MAAM,gBAAf,YAAAA,EAA8B,sBAC9BC,EAAA,KAAK,IAAI,MAAM,gBAAf,YAAAA,EAA8B,mBAC9BC,EAAA,KAAK,IAAI,MAAM,gBAAf,YAAAA,EAA8B,kBAEhC,GAAI,CAACC,EACH,OAGF,IAAMC,EAAQ,MAAMD,EAAGV,CAAK,EACtBY,EAAY,oBAAqBD,EAAOA,EAAK,gBAAgB,EAAIA,EAMvE,MAAO,CACL,UALA,oBAAqBC,EAAU,SAC3BA,EAAU,SAAS,gBAAgB,EACnCA,EAAU,UAGK,SAAS,EAC5B,OAAQA,EAAU,OAAO,SAAS,CACpC,CACF,CAEA,MAAM,0BACJZ,EAC6B,CAjIjC,IAAAC,EAkII,IAAMS,GAAKT,EAAA,KAAK,IAAI,MAAM,iBAAf,YAAAA,EAA+B,cAE1C,OAAKS,GAIS,MAAMA,EAAGV,CAAK,GAEhB,gBAAgB,EAAE,SAAS,EALrC,MAMJ,CAEA,MAAM,iBAAiBA,EAA+B,CA7IxD,IAAAC,EA8II,IAAMY,EAAS,KAAK,MAAM,mBAAmBb,CAAK,EAE5Cc,EACJ,KAAK,MAAM,iBAAiBd,CAAK,GAChC,MAAM,KAAK,0BAA0Ba,CAAM,KAC3CZ,EAAA,MAAM,KAAK,aAAaY,CAAM,IAA9B,YAAAZ,EAAkC,WACnC,KAAK,SAEP,GAAI,CAACa,EACH,MAAM,IAAI,MAAM,+BAA+Bd,EAAM,YAAY,EAAE,EAGrE,OAAOc,CACT,CAEA,MAAM,MAAMC,EAA+C,CACzD,IAAMC,EAAW,MAAM,KAAK,IAAI,MAAMD,EAAO,MAAM,EAAEA,EAAO,IAAI,EAC9D,GAAGA,EAAO,IACZ,EAEA,OAAOA,EAAO,UAAUC,CAAQ,CAClC,CAEA,MAAM,OAAOC,EAAiBF,EAA0C,CACtE,IAAML,EAAK,KAAK,IAAI,GAAGK,EAAO,MAAM,EAAEA,EAAO,IAAI,EAC3CG,EAAOH,EAAO,QAAQL,CAAE,EAK9B,OAFa,MADKA,EAAG,GAAGQ,CAAI,EACC,YAAYD,EAAS,CAAE,MAAO,EAAG,CAAC,GAEnD,WAAW,SAAS,CAClC,CAEA,MAAM,SACJA,EACAF,EACAI,EACiB,CACjB,IAAMT,EAAK,KAAK,IAAI,GAAGK,EAAO,MAAM,EAAEA,EAAO,IAAI,EAC3CG,EAAOH,EAAO,QAAQL,CAAE,EAW9B,OARa,MADKA,EAAG,GAAGQ,CAAI,EACC,YAC3B,KAAKE,GAAUD,CAAM,EAAIF,EAAUE,EACnC,CACE,MAAO,GACP,OAAQ,KAAKC,GAAUD,CAAM,EAAIA,EAAS,MAC5C,CACF,GAEY,SAAS,CACvB,CAGAC,GAAUD,EAAiE,CACzE,MAAO,gBAAiBA,CAC1B,CACF,ECpMA,IAAAE,EAA4B,uCAC5BC,GAAyB,uCAWzB,eAAsBC,GAAmB,CACvC,eAAAC,EACA,mBAAAC,EACA,SAAAC,CACF,EAAoE,CAClE,GAAM,CACJ,MAAAC,EACA,YAAa,CAAE,MAAAC,EAAO,OAAAC,CAAO,CAC/B,EAAIL,EAEEM,EAAa,cAAY,UAAUH,EAAO,CAC9C,OAAQ,GACR,SAAU,MAAMI,EAAY,CAC1B,QAASN,EACT,MAAAG,EACA,OAAAC,EACA,SAAAH,CACF,CAAC,CACH,CAAC,EAEKM,EAAU,MAAMC,EAAW,CAC/B,QAASR,EACT,MAAAG,EACA,OAAAC,EACA,SAAUC,EAAW,SACrB,SAAAJ,CACF,CAAC,EACKQ,EAAM,MAAMC,EAAON,EAAQH,CAAQ,EAEnCU,EAAgBN,EAAW,SAAS,CAAE,OAAQE,CAAQ,CAAC,EACvD,CAAE,mBAAAK,CAAmB,EAAIX,EAEzBY,EAAY,MAAMC,GAAO,CAC7B,QAASd,EACT,OAAQD,EACR,SAAAE,CACF,CAAC,EACKc,EAAYV,EAAW,SAAS,CAAE,OAAQI,CAAI,CAAC,EACrD,MAAO,CACL,QAASE,EACT,MAAAR,EACA,mBAAAS,EACA,IAAKC,EACL,IAAKE,CACP,CACF,CAQA,eAAsBD,GAAO,CAC3B,OAAAV,EACA,SAAAH,CACF,EAAuC,CACrC,GAAM,CAAE,OAAAe,EAAQ,MAAAd,CAAM,EAAIE,EAAO,OAAO,OAAO,eAEzCa,EAAW,MAAMhB,EAAS,iBAAiBC,CAAK,EAChDG,EAAa,cAAY,UAAUH,EAAO,CAC9C,OAAQ,GACR,SAAAe,CACF,CAAC,EAED,GAAI,OAAO,SAASD,CAAM,EACxB,OAAOX,EAAW,SAAS,CACzB,UAAQ,aAASW,EAAkBC,CAAQ,CAC7C,CAAC,EAGH,IAAMC,EAAOF,EAA4B,MAAM,CAC7C,IAAKf,EAAS,IACd,MAAOA,EAAS,MAAM,WAAWC,CAAK,CACxC,CAAC,EAED,OAAOG,EAAW,SAAS,CACzB,OAAQ,MAAMa,EAAI,KAAK,CACzB,CAAC,CACH,CFxEA,eAAsBC,EAAgB,CACpC,cAAAC,EACA,mBAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,eAAAC,CACF,EAAiD,CAC/C,GAAM,CAACC,EAAcC,CAAW,EAAI,MAAMC,EAAgB,YACxD,CAACH,EAAe,YAAY,MAAOA,EAAe,OAAO,KAAK,EAC9DL,CACF,EAEMS,EAAc,MAAMC,GAAmB,CAC3C,mBAAAT,EACA,SAAUK,EACV,eAAAD,CACF,CAAC,EAEKM,EAAiB,MAAMC,GAC3BL,EACAE,EAAY,GACd,EAEMI,EAAS,MAAMC,EAAc,CACjC,mBAAAb,EACA,eAAAU,EACA,SAAUJ,EACV,cAAAH,EACA,eAAAC,CACF,CAAC,EAED,MAAO,CACL,YAAAI,EACA,YAAYM,EAAyB,CAInC,IAAMC,KAHY,EAAAC,YAChB,YAASF,EAAQF,EAAO,QAAQ,QAAQ,EAAE,SAAS,CACrD,EACyB,MACvBA,EAAO,QAAQ,OAAOF,CAAc,EAAIA,EAAe,MAAM,KAAI,EAAAM,SAAI,CAAC,CACxE,EAEA,OAAOJ,EAAO,QAAQ,SAAS,CAC7B,OAAQG,EAAO,GAAG,CAAC,EAAI,GAAK,OAAOA,EAAO,QAAQ,CAAC,CACrD,CAAC,CACH,EAMA,eAAgB,GAChB,IAAKH,EAAO,IACZ,IAAKK,GAAOT,CAAW,EACvB,OAAAI,EACA,MAAM,MAAO,CACX,OAAOd,EAAgB,CACrB,cAAAC,EACA,mBAAoBI,EACpB,UAAAF,EACA,eAAAC,EACA,cAAeF,EACf,eAAgB,CACd,GAAGI,EACH,YAAaA,EAAe,OAC5B,OAAQA,EAAe,WACzB,CACF,CAAC,CACH,EACA,MAAM,SAASU,EAAQI,EAA4C,CA3FvE,IAAAC,EAAAC,EA4FM,IAAMC,KAAe,YAASP,EAAQF,EAAO,QAAQ,QAAQ,EACvD,CACJ,MAAAU,EACA,OAAQ,CAAE,MAAAC,EAAO,OAAAC,CAAO,CAC1B,EAAIpB,EAEEqB,GAAWN,EAAAK,EAAO,WAAP,YAAAL,EAAiB,MAAM,CACtC,QAASnB,EACT,OAAQqB,EACR,MAAOE,EAAM,WAAWD,CAAK,EAC7B,YAAad,EAAY,MACzB,IAAKE,EAAe,OACpB,SAAUa,EAAM,WAAWb,CAAc,CAC3C,GACMgB,GAAYN,EAAAI,EAAO,YAAP,YAAAJ,EAAkB,MAAM,CACxC,QAASpB,EACT,OAAQqB,EACR,MAAOE,EAAM,WAAWD,CAAK,EAC7B,YAAad,EAAY,MACzB,IAAKE,EAAe,OACpB,SAAUa,EAAM,WAAWb,CAAc,EACzC,eAAgBa,EAAM,uBAAuBD,CAAK,EAClD,OAAQC,CACV,GAEA,GAAIE,EAAU,CACZ,IAAME,EAAS1B,GAAaiB,EAAQ,UAEpC,GAAI,CAACS,EACH,MAAM,IAAI,MAAM,6BAA6B,EAG/C,OACEC,EAAeL,EAAOE,CAAQ,EAC9B,SAASE,CAAM,CACnB,CAEA,GAAID,EAAW,CACb,IAAMC,EAASzB,GAAkBgB,EAAQ,eAEzC,GAAI,CAACS,EACH,MAAM,IAAI,MAAM,kCAAkC,EAGpD,OAAOrB,EAAY,SAASH,EAAeuB,EAAWC,CAAM,CAC9D,CAEA,MAAM,IAAI,MAAM,+CAA+C,CACjE,CACF,CACF,CAEA,SAASV,GAAO,CACd,QAAAY,EACA,mBAAAC,EACA,IAAAC,EACA,IAAAC,CACF,EAAiC,CAC/B,IAAMjB,KAAS,EAAAC,SAAI,CAAC,EACjB,KAAKa,EAAQ,OAAOE,CAAG,EAAIA,EAAI,MAAM,KAAI,EAAAf,SAAI,CAAC,CAAC,EAC/C,KACCa,EAAQ,OAAOC,CAAkB,GAC/BD,EAAQ,MAAM,EAAE,GAAGC,EAAmB,MAAM,CAAC,EAC3CA,EAAmB,MAAM,KACzB,EAAAd,SAAI,CAAC,CACX,EACC,KAAKa,EAAQ,MAAM,EAAE,GAAGG,EAAI,MAAM,CAAC,EAAIA,EAAI,MAAM,KAAI,EAAAhB,SAAI,CAAC,CAAC,EAE9D,OAAOa,EAAQ,SAAS,CACtB,OAAQ,OAAOd,EAAO,QAAQ,CAAC,CACjC,CAAC,CACH,CAEA,eAAsBJ,GACpBsB,EACAvB,EACsB,CACtB,IAAMwB,EACJ,MAAMD,EAAe,iBAAiBvB,CAAc,EAatD,OAXEA,EAAe,WAAawB,EACxBxB,EACAA,EAAe,SAAS,CACtB,UAAQ,mBACNA,EAAe,OACfA,EAAe,SACfwB,CACF,EACA,SAAUA,CACZ,CAAC,CAGT,CDnKO,SAASC,GAAIC,EAAsB,CACxC,IAAMC,GAAgBD,GAAA,YAAAA,EAAS,gBAAiB,IAAI,gBAEpD,MAAO,CACL,OAAOE,EAAuB,CAC5B,GAAM,CAAE,OAAAC,EAAQ,MAAAC,CAAM,KAAI,iBAAcH,CAAa,EAAE,OAAOC,CAAS,EAEvE,MAAO,CACL,OAAAC,EACA,MAAME,EAA4B,CAChC,GAAM,CAAE,aAAAC,EAAc,OAAAC,CAAO,EAAIH,EAAMC,CAAU,EAEjD,MAAO,CACL,aAAAC,EACA,OAAOE,EAA+B,CACpC,GAAM,CAAE,kBAAAC,EAAmB,YAAAC,CAAY,EAAIH,EAAOC,CAAU,EAE5D,MAAO,CACL,kBAAAC,EACA,YAAYE,EAAmC,CAC7C,MAAO,CACL,MAAM,SACJC,EACAC,EACuB,CACvB,OAAOC,EAAI,CACT,GAAGd,EACH,cAAAC,EACA,mBAAAY,EACA,cAAAD,EACA,eAAgBF,EAAYC,CAAc,EAAE,MAAM,CACpD,CAAC,CACH,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CACF,EACA,MAAM,gBAAgB,CACpB,mBAAAE,EACA,sBAAAE,EACA,UAAAC,EACA,WAAAX,EACA,eAAAY,EACA,cAAAL,EACA,iBAAAM,CACF,EAA6C,CAC3C,OAAOJ,EAAI,CACT,cAAAb,EACA,mBAAAY,EACA,UAAAG,EACA,eAAAC,EACA,cAAAL,EACA,kBAAgB,iBAAcX,CAAa,EACxC,OAAO,EACP,MAAMI,CAAU,EAChB,OAAOa,CAAgB,EACvB,YAAYH,CAAqB,EACjC,MAAM,CACX,CAAC,CACH,CACF,CACF,CAEA,eAAsBI,GACpBC,EACAC,EACwB,CACxB,IAAMpB,EAAgB,IAAI,gBAEpBE,EADeF,EAAc,eAAemB,CAAK,EAC3B,iBAAiB,EAEvCE,EAAW,MAAMC,EAAgB,OAAOH,EAAOnB,CAAa,EASlE,OAPiB,MAAMuB,EAAkB,CACvC,MAAAJ,EACA,OAAAjB,EACA,QAAAkB,EACA,SAAAC,CACF,CAAC,CAGH","names":["src_exports","__export","Sdk","getAssetsBalances","getBalance","getContractFee","getDecimals","getExtrinsicFee","getFee","getFeeBalance","getMax","getMin","getParachainBalances","getSourceData","__toCommonJS","import_xcm_builder","import_xcm_types","import_xcm_utils","import_big","import_viem","ERC20_ABI","Erc20","#config","#client","config","chain","address","ERC20_ABI","import_viem","XTOKENS_ABI","Xtokens","#config","#publicClient","config","chain","address","signer","request","XTOKENS_ABI","amount","gas","gasPrice","error","createContract","chain","config","_a","Erc20","address","Xtokens","import_xcm_builder","import_xcm_utils","getBalance","address","chain","config","decimals","polkadot","cfg","balance","createContract","getDecimals","asset","assetBuiltConfig","getMin","min","getSourceData","transferConfig","destinationAddress","destinationFee","polkadot","sourceAddress","_a","_b","_c","_d","_e","_f","_g","asset","destination","chain","config","zeroAmount","getDecimals","feeAsset","feeCfg","feeDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalance","destinationFeeBalance","min","getMin","extrinsic","contract","destinationFeeBalanceAmount","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","minAmount","maxAmount","getMax","address","decimals","feeConfig","cfg","createContract","decimalsFromContract","balanceFromContract","destinationFeeConfig","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","totalFee","error","result","Big","getAssetsBalances","assets","uniqueAssets","acc","a","import_xcm_config","import_xcm_utils","import_big","import_api_augment","import_xcm_config","import_xcm_types","import_xcm_utils","PolkadotService","_PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","_f","fn","data","unwrapped","metaId","decimals","config","response","account","args","signer","#isSigner","import_xcm_types","import_xcm_utils","getDestinationData","transferConfig","destinationAddress","polkadot","asset","chain","config","zeroAmount","getDecimals","balance","getBalance","min","getMin","balanceAmount","existentialDeposit","feeAmount","getFee","minAmount","amount","decimals","cfg","getTransferData","configService","destinationAddress","evmSigner","polkadotSigner","sourceAddress","transferConfig","destPolkadot","srcPolkadot","PolkadotService","destination","getDestinationData","destinationFee","getDestinationFeeWithSourceDecimals","source","getSourceData","amount","result","Big","getMin","signers","_a","_b","bigintAmount","asset","chain","config","contract","extrinsic","signer","createContract","balance","existentialDeposit","fee","min","sourcePolkadot","destinationFeeDecimals","Sdk","options","configService","ecosystem","assets","asset","keyOrAsset","sourceChains","source","keyOrChain","destinationChains","destination","destKeyOrChain","sourceAddress","destinationAddress","getTransferData","destinationKeyOrChain","evmSigner","polkadotSigner","sourceKeyOrChain","getParachainBalances","chain","address","polkadot","PolkadotService","getAssetsBalances"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/getTransferData/getSourceData.ts","../src/contract/contracts/Erc20/Erc20.ts","../src/contract/contract.utils.ts","../src/contract/contracts/Erc20/Erc20ABI.json","../src/contract/contracts/Xtokens/Xtokens.ts","../src/contract/contracts/Xtokens/XtokensABI.json","../src/contract/contracts/Erc20/Erc20Public.ts","../src/contract/contract.factory.ts","../src/getTransferData/getTransferData.utils.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts","../src/polkadot/PolkadotService.ts","../src/getTransferData/getDestinationData.ts"],"sourcesContent":["export * from './getTransferData/getSourceData';\nexport * from './getTransferData/getTransferData.utils';\nexport * from './sdk';\nexport * from './sdk.interfaces';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n CallType,\n ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport {\n AssetConfig,\n DestinationFeeConfig,\n FeeAssetConfig,\n TransferConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n AssetAmount,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport {\n convertDecimals,\n toBigInt,\n toDecimal,\n} from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n createContract,\n createContractWithoutSigner,\n} from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport {\n GetBalancesParams,\n getBalance,\n getDecimals,\n getMin,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n destinationFee: AssetAmount;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n transferConfig,\n destinationAddress,\n destinationFee,\n polkadot,\n sourceAddress,\n evmSigner,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const feeAsset = polkadot.chain.getBalanceAssetId(\n config?.fee?.asset || config.asset,\n );\n\n const feeCfg = config.fee?.balance.build({\n address: destinationAddress,\n asset: feeAsset,\n });\n\n const feeDecimals = config.fee?.asset\n ? await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n assetBuiltConfig: feeCfg,\n chain,\n config,\n polkadot,\n })\n : undefined;\n\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: feeDecimals || 0,\n })\n : zeroAmount;\n\n const zeroDestinationFeeAmount = config.destinationFee?.asset\n ? AssetAmount.fromAsset(config.destinationFee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.destinationFee.asset,\n chain,\n config,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n\n const feeBalance = await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroFeeAmount.decimals,\n feeConfig: config.fee,\n polkadot,\n });\n\n const destinationFeeBalance = config.asset.isEqual(\n config.destinationFee.asset,\n )\n ? balance\n : await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroDestinationFeeAmount.decimals,\n feeConfig: config.destinationFee,\n polkadot,\n });\n\n const min = await getMin(config, polkadot);\n\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n\n const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\n });\n\n const fee = await getFee({\n balance,\n chain,\n contract,\n decimals: zeroFeeAmount.decimals,\n destinationFeeBalanceAmount,\n destinationFeeConfig: config.destinationFee,\n evmSigner,\n extrinsic,\n feeConfig: config.fee,\n polkadot,\n sourceAddress,\n });\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n const feeAmount = zeroFeeAmount.copyWith({ amount: fee });\n const feeBalanceAmount = zeroFeeAmount.copyWith({ amount: feeBalance });\n\n const minAmount = zeroAmount.copyWith({ amount: min });\n\n const maxAmount = getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n });\n\n return {\n balance: balanceAmount,\n chain,\n destinationFeeBalance: destinationFeeBalanceAmount,\n existentialDeposit,\n fee: feeAmount,\n feeBalance: feeBalanceAmount,\n max: maxAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeBalanceParams\n extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {\n balance: bigint;\n feeConfig: FeeAssetConfig | undefined;\n}\n\nexport async function getFeeBalance({\n address,\n balance,\n chain,\n decimals,\n feeConfig,\n polkadot,\n}: GetFeeBalanceParams) {\n if (!feeConfig) {\n return balance;\n }\n\n const cfg = feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig;\n\n if (cfg.type === CallType.Evm) {\n const contract = createContractWithoutSigner(\n cfg,\n chain as EvmParachain,\n ) as BalanceContractInterface;\n\n const decimalsFromContract = await contract.getDecimals();\n const balanceFromContract = await contract.getBalance();\n\n return chain.usesChainDecimals\n ? convertDecimals(\n balanceFromContract,\n polkadot.decimals,\n decimalsFromContract,\n )\n : balanceFromContract;\n }\n\n const feeBalance = await polkadot.query(cfg);\n\n return chain.usesChainDecimals\n ? convertDecimals(feeBalance, polkadot.decimals, decimals)\n : feeBalance;\n}\n\nexport interface GetFeeParams {\n balance: bigint;\n contract?: ContractConfig;\n chain: AnyChain;\n decimals: number;\n evmSigner?: EvmSigner;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeAssetConfig;\n destinationFeeConfig?: DestinationFeeConfig;\n destinationFeeBalanceAmount?: AssetAmount;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n chain,\n contract,\n decimals,\n destinationFeeConfig,\n destinationFeeBalanceAmount,\n evmSigner,\n extrinsic,\n feeConfig,\n polkadot,\n sourceAddress,\n}: GetFeeParams): Promise<bigint> {\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n if (\n destinationFeeConfig &&\n destinationFeeBalanceAmount &&\n typeof destinationFeeConfig.amount === 'number'\n ) {\n const destinationFeeBalance = Number(\n toDecimal(\n destinationFeeBalanceAmount.amount,\n destinationFeeBalanceAmount.decimals,\n ),\n );\n if (\n destinationFeeBalance &&\n destinationFeeConfig.amount > destinationFeeBalance\n ) {\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFeeConfig?.amount} ${destinationFeeConfig?.asset.originSymbol} in your source balance, needed for destination fees`,\n );\n }\n }\n\n return getContractFee({\n balance,\n chain: chain as EvmParachain,\n config: contract,\n decimals,\n evmSigner,\n });\n }\n\n if (extrinsic) {\n const extrinsicFee = await getExtrinsicFee(\n balance,\n extrinsic,\n polkadot,\n sourceAddress,\n );\n\n const xcmDeliveryFee = getXcmDeliveryFee(decimals, feeConfig);\n\n const totalFee = extrinsicFee + xcmDeliveryFee;\n\n return chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, decimals)\n : totalFee;\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n}\n\nexport async function getContractFee({\n balance,\n config,\n decimals,\n evmSigner,\n chain,\n}: {\n balance: bigint;\n config: ContractConfig;\n decimals: number;\n evmSigner: EvmSigner;\n chain: EvmParachain;\n}): Promise<bigint> {\n const contract = createContract(\n config,\n evmSigner,\n chain,\n ) as TransferContractInterface;\n const fee = await contract.getFee(balance);\n\n return convertDecimals(fee, 18, decimals);\n}\n\nexport async function getExtrinsicFee(\n balance: bigint,\n extrinsic: ExtrinsicConfig,\n polkadot: PolkadotService,\n sourceAddress: string,\n): Promise<bigint> {\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 return await polkadot.getFee(sourceAddress, extrinsic);\n } catch (error) {\n if (balance) {\n throw error;\n }\n\n return 0n;\n }\n}\n\nfunction getXcmDeliveryFee(\n decimals: number,\n feeConfig?: FeeAssetConfig,\n): bigint {\n return feeConfig?.xcmDeliveryFeeAmount\n ? toBigInt(feeConfig.xcmDeliveryFeeAmount, decimals)\n : 0n;\n}\n\nexport interface GetMaxParams {\n balanceAmount: AssetAmount;\n existentialDeposit: AssetAmount;\n feeAmount: AssetAmount;\n minAmount: AssetAmount;\n}\n\nexport function getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n}: GetMaxParams): AssetAmount {\n const result = balanceAmount\n .toBig()\n .minus(minAmount.toBig())\n .minus(\n balanceAmount.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balanceAmount.isSame(feeAmount) ? feeAmount.toBig() : Big(0));\n\n return balanceAmount.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyChain;\n assets: AssetConfig[];\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n assets,\n polkadot,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueAssets = assets.reduce(\n (acc: AssetConfig[], asset: AssetConfig) => {\n if (!acc.some((a: AssetConfig) => a.asset.isEqual(asset.asset))) {\n return [asset, ...acc];\n }\n\n return acc;\n },\n [],\n );\n\n const balances = await Promise.all(\n uniqueAssets.map(async (asset: AssetConfig) => {\n const decimals = await getDecimals({\n address,\n asset: asset.asset,\n chain,\n config: asset,\n polkadot,\n });\n\n // eslint-disable-next-line no-await-in-loop\n const balance = await getBalance({\n address,\n chain,\n config: asset,\n decimals,\n polkadot,\n });\n\n const assetAmount = AssetAmount.fromAsset(asset.asset, {\n amount: balance,\n decimals,\n });\n\n return assetAmount;\n }),\n );\n\n return balances;\n}\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n createPublicClient,\n getContract,\n http,\n} from 'viem';\nimport { EvmSigner } from '../../../sdk.interfaces';\nimport { BalanceContractInterface } from '../../contract.interfaces';\nimport { isEthersContract, isEthersSigner } from '../../contract.utils';\nimport abi from './Erc20ABI.json';\n\ntype Erc20Contract = GetContractReturnType<typeof abi, PublicClient>;\n\nexport class Erc20 implements BalanceContractInterface {\n readonly address: string;\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | Erc20Contract;\n\n constructor(config: ContractConfig, signer: EvmSigner) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n this.address = config.address;\n\n this.#config = config;\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address as `0x${string}`,\n client: {\n public: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n wallet: signer,\n },\n });\n }\n\n async getBalance(): Promise<bigint> {\n if (isEthersContract(this.#contract)) {\n const balance = await this.#contract.balanceOf(...this.#config.args);\n return balance.toBigInt();\n }\n return this.#contract.read.balanceOf(\n this.#config.args,\n ) as unknown as bigint;\n }\n\n async getDecimals(): Promise<number> {\n const decimals = isEthersContract(this.#contract)\n ? await this.#contract.decimals()\n : this.#contract.read.decimals();\n\n return decimals;\n }\n}\n","import { Contract, Signer as EthersSigner } from 'ethers';\nimport { Abi, GetContractReturnType, WalletClient } from 'viem';\nimport { EvmSigner } from '../sdk.interfaces';\n\nexport function isEthersSigner(signer: EvmSigner): signer is EthersSigner {\n return 'provider' in signer;\n}\n\nexport function isWalletClient(signer: EvmSigner): signer is WalletClient {\n return 'chain' in signer;\n}\n\nexport function isEthersContract(\n contract: Contract | GetContractReturnType<Abi | readonly unknown[]>,\n): contract is Contract {\n return 'signer' in contract;\n}\n","[\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": false,\n \"inputs\": [\n {\n \"name\": \"_spender\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": false,\n \"inputs\": [\n {\n \"name\": \"_from\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [\n {\n \"name\": \"_owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"name\": \"balance\",\n \"type\": \"uint256\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": false,\n \"inputs\": [\n {\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [\n {\n \"name\": \"_owner\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"payable\": true,\n \"stateMutability\": \"payable\",\n \"type\": \"fallback\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n }\n]\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract, TransactionResponse } from 'ethers';\nimport {\n Address,\n GetContractReturnType,\n PublicClient,\n WriteContractReturnType,\n createPublicClient,\n getContract,\n http,\n} from 'viem';\nimport { EvmSigner } from '../../../sdk.interfaces';\nimport { TransferContractInterface } from '../../contract.interfaces';\nimport { isEthersContract, isEthersSigner } from '../../contract.utils';\nimport abi from './XtokensABI.json';\n\ntype XtokensContract = GetContractReturnType<typeof abi, PublicClient>;\n\nexport class Xtokens implements TransferContractInterface {\n readonly defaultMoonChainAddress =\n '0x0000000000000000000000000000000000000804';\n\n readonly address: Address;\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | XtokensContract;\n\n readonly #signer: EvmSigner;\n\n constructor(config: ContractConfig, signer: EvmSigner, address?: Address) {\n this.#config = config;\n\n this.#signer = signer;\n\n this.address = address ?? this.defaultMoonChainAddress;\n\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address,\n client: {\n public: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n wallet: signer,\n },\n });\n }\n\n async transfer(): Promise<TransactionResponse | WriteContractReturnType> {\n if (isEthersContract(this.#contract)) {\n return this.#contract[this.#config.func](...this.#config.args);\n }\n\n return this.#contract.write[this.#config.func](this.#config.args);\n }\n\n async getEthersContractEstimatedGas(contract: Contract): Promise<bigint> {\n return contract[this.#config.func].estimateGas(...this.#config.args);\n }\n\n async getViemContractEstimatedGas(\n contract: XtokensContract,\n ): Promise<bigint> {\n if (!contract) {\n return 0n;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return contract.estimateGas[this.#config.func](this.#config.args as any);\n }\n\n async getFee(amount: bigint): Promise<bigint> {\n if (amount === 0n) {\n return 0n;\n }\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 try {\n const estimatedGas = isEthersContract(this.#contract)\n ? await this.getEthersContractEstimatedGas(this.#contract)\n : await this.getViemContractEstimatedGas(this.#contract);\n const gasPrice = await this.getGasPrice();\n return estimatedGas * gasPrice;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n throw new Error(\n \"Can't get a fee. Make sure that you have enough balance!\",\n );\n }\n }\n\n private async getGasPrice() {\n if (isEthersSigner(this.#signer)) {\n if (!this.#signer.provider) return 0n;\n const { gasPrice, maxPriorityFeePerGas } =\n await this.#signer.provider.getFeeData();\n\n return (gasPrice || 0n) + (maxPriorityFeePerGas || 0n);\n }\n\n const publicClient = createPublicClient({\n chain: this.#signer.chain,\n transport: http(),\n });\n\n return publicClient.getGasPrice();\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"currencyAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"parents\",\n \"type\": \"uint8\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"interior\",\n \"type\": \"bytes[]\"\n }\n ],\n \"internalType\": \"struct Xtokens.Multilocation\",\n \"name\": \"destination\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"weight\",\n \"type\": \"uint64\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"currencyAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct Xtokens.Currency[]\",\n \"name\": \"currencies\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"feeItem\",\n \"type\": \"uint32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"parents\",\n \"type\": \"uint8\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"interior\",\n \"type\": \"bytes[]\"\n }\n ],\n \"internalType\": \"struct Xtokens.Multilocation\",\n \"name\": \"destination\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"weight\",\n \"type\": \"uint64\"\n }\n ],\n \"name\": \"transferMultiCurrencies\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Chain, PublicClient, createPublicClient, http } from 'viem';\nimport { BalanceContractInterface } from '../../contract.interfaces';\nimport abi from './Erc20ABI.json';\n\nexport class Erc20Public implements BalanceContractInterface {\n readonly address: string;\n\n readonly #config: ContractConfig;\n\n readonly #publicClient: PublicClient;\n\n constructor(config: ContractConfig, chain: Chain) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n this.address = config.address;\n\n this.#config = config;\n\n this.#publicClient = createPublicClient({\n chain,\n transport: http(),\n });\n }\n\n async getBalance(): Promise<bigint> {\n const data = await this.#publicClient.readContract({\n abi,\n address: this.#config.address as `0x${string}`,\n args: this.#config.args,\n functionName: 'balanceOf',\n });\n\n return data as unknown as bigint;\n }\n\n async getDecimals(): Promise<number> {\n const data = await this.#publicClient.readContract({\n abi,\n address: this.#config.address as `0x${string}`,\n functionName: 'decimals',\n });\n\n return data as unknown as number;\n }\n}\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { AnyChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport { EvmSigner } from '../sdk.interfaces';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\nimport { Erc20Public } from './contracts/Erc20/Erc20Public';\n\nexport function createContractWithSigner(\n config: ContractConfig,\n signer: EvmSigner,\n chain?: AnyChain,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20(config, signer);\n }\n\n if (config.module === 'Xtokens') {\n if (chain && 'contracts' in chain) {\n const address = chain?.contracts?.Xtokens;\n\n return new Xtokens(config, signer, address);\n }\n\n return new Xtokens(config, signer);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n\nexport function createContractWithoutSigner(\n config: ContractConfig,\n chain: EvmParachain,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20Public(config, chain.getViemChain());\n }\n\n throw new Error(`Public Contract ${config.module} not found`);\n}\n\nexport function createContract(\n config: ContractConfig,\n signer: EvmSigner | undefined,\n chain: AnyChain,\n): TransferContractInterface | BalanceContractInterface {\n return signer\n ? createContractWithSigner(config, signer, chain)\n : createContractWithoutSigner(config, chain as EvmParachain);\n}\n","import {\n CallType,\n ContractConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { AssetConfig } from '@moonbeam-network/xcm-config';\nimport { AnyChain, Asset, EvmParachain } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport {\n BalanceContractInterface,\n createContractWithoutSigner,\n} from '../contract';\nimport { PolkadotService } from '../polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset?: Asset;\n chain: AnyChain;\n config: AssetConfig;\n decimals: number;\n polkadot: PolkadotService;\n}\n\nexport type GetDecimalsParams = Omit<GetBalancesParams, 'decimals'> & {\n assetBuiltConfig?: SubstrateQueryConfig | ContractConfig;\n};\n\nexport async function getBalance({\n address,\n chain,\n config,\n decimals,\n polkadot,\n}: GetBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\n if (cfg.type === CallType.Substrate) {\n const balance = await polkadot.query(cfg as SubstrateQueryConfig);\n return chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, decimals)\n : balance;\n }\n\n const contract = createContractWithoutSigner(\n cfg,\n chain as EvmParachain,\n ) as BalanceContractInterface;\n\n const balance = await contract.getBalance();\n\n return balance;\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n polkadot,\n chain,\n assetBuiltConfig,\n}: GetDecimalsParams) {\n const cfg =\n assetBuiltConfig ||\n config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(asset || config.asset),\n });\n\n if (cfg.type === CallType.Substrate) {\n return polkadot.getAssetDecimals(asset || config.asset);\n }\n\n const contract = createContractWithoutSigner(\n cfg,\n chain as EvmParachain,\n ) as BalanceContractInterface;\n\n return contract.getDecimals();\n}\n\nexport async function getMin(config: AssetConfig, polkadot: PolkadotService) {\n if (config.min) {\n return polkadot.query(\n config.min.build({ asset: polkadot.chain.getMinAssetId(config.asset) }),\n );\n }\n\n const min = polkadot.chain.getAssetMin(config.asset);\n\n if (min) {\n const decimals = await polkadot.getAssetDecimals(config.asset);\n\n return toBigInt(min, decimals);\n }\n\n return 0n;\n}\n","/* eslint-disable sort-keys */\nimport {\n ConfigBuilder,\n ConfigService,\n IConfigService,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n Asset,\n AssetAmount,\n Ecosystem,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\nimport { PolkadotService } from './polkadot';\nimport { Signers, TransferData } from './sdk.interfaces';\n\nexport interface SdkOptions extends Partial<Signers> {\n configService?: IConfigService;\n}\n\nexport function Sdk(options?: SdkOptions) {\n const configService = options?.configService ?? new ConfigService();\n\n return {\n assets(ecosystem?: Ecosystem) {\n const { assets, asset } = ConfigBuilder(configService).assets(ecosystem);\n\n return {\n assets,\n asset(keyOrAsset: string | Asset) {\n const { sourceChains, source } = asset(keyOrAsset);\n\n return {\n sourceChains,\n source(keyOrChain: string | AnyChain) {\n const { destinationChains, destination } = source(keyOrChain);\n\n return {\n destinationChains,\n destination(destKeyOrChain: string | AnyChain) {\n return {\n async accounts(\n sourceAddress: string,\n destinationAddress: string,\n signers?: Partial<Signers>,\n ): Promise<TransferData> {\n return gtd({\n ...options,\n configService,\n destinationAddress,\n evmSigner: signers?.evmSigner ?? signers?.ethersSigner,\n sourceAddress,\n transferConfig: destination(destKeyOrChain).build(),\n polkadotSigner: signers?.polkadotSigner,\n });\n },\n };\n },\n };\n },\n };\n },\n };\n },\n async getTransferData({\n destinationAddress,\n destinationKeyOrChain,\n ethersSigner,\n evmSigner,\n keyOrAsset,\n polkadotSigner,\n sourceAddress,\n sourceKeyOrChain,\n }: SdkTransferParams): Promise<TransferData> {\n return gtd({\n configService,\n destinationAddress,\n evmSigner: evmSigner ?? ethersSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig: ConfigBuilder(configService)\n .assets()\n .asset(keyOrAsset)\n .source(sourceKeyOrChain)\n .destination(destinationKeyOrChain)\n .build(),\n });\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyChain,\n address: string,\n): Promise<AssetAmount[]> {\n const configService = new ConfigService();\n const chainsConfig = configService.getChainConfig(chain);\n const assets = chainsConfig.getAssetsConfigs();\n\n const polkadot = await PolkadotService.create(chain, configService);\n\n const balances = await getAssetsBalances({\n chain,\n assets,\n address,\n polkadot,\n });\n\n return balances;\n}\n\nexport interface SdkTransferParams extends Partial<Signers> {\n destinationAddress: string;\n destinationKeyOrChain: string | AnyChain;\n keyOrAsset: string | Asset;\n sourceAddress: string;\n sourceKeyOrChain: string | AnyChain;\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { IConfigService, TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport { TransactionResponse } from 'ethers';\nimport { TransferContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport {\n DestinationChainTransferData,\n Signers,\n TransferData,\n} from '../sdk.interfaces';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\n\nexport interface GetTransferDataParams extends Partial<Signers> {\n configService: IConfigService;\n destinationAddress: string;\n sourceAddress: string;\n transferConfig: TransferConfig;\n}\n\nexport async function getTransferData({\n configService,\n destinationAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig,\n}: GetTransferDataParams): Promise<TransferData> {\n const [destPolkadot, srcPolkadot] = await PolkadotService.createMulti(\n [transferConfig.destination.chain, transferConfig.source.chain],\n configService,\n );\n\n const destination = await getDestinationData({\n destinationAddress,\n polkadot: destPolkadot,\n transferConfig,\n });\n\n const destinationFee = await getDestinationFeeWithSourceDecimals(\n srcPolkadot,\n destination.fee,\n );\n\n const source = await getSourceData({\n destinationAddress,\n destinationFee,\n evmSigner,\n polkadot: srcPolkadot,\n sourceAddress,\n transferConfig,\n });\n\n return {\n destination,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, source.balance.decimals).toString(),\n );\n const result = bigAmount.minus(\n source.balance.isSame(destinationFee) ? destinationFee.toBig() : Big(0),\n );\n\n return source.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n /**\n * Right now it will be always true\n * because all current asset can be sent both directions\n * and our configuration need destination config.\n */\n isSwapPossible: true,\n max: source.max,\n min: getMin(destination),\n source,\n async swap() {\n return getTransferData({\n configService,\n destinationAddress: sourceAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress: destinationAddress,\n transferConfig: {\n ...transferConfig,\n destination: transferConfig.source,\n source: transferConfig.destination,\n },\n });\n },\n async transfer(amount): Promise<string> {\n const bigintAmount = toBigInt(amount, source.balance.decimals);\n const {\n asset,\n source: { chain, config },\n } = transferConfig;\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n return (\n createContract(\n contract,\n evmSigner,\n chain,\n ) as TransferContractInterface\n )\n .transfer()\n .then((tx) =>\n typeof tx === 'object' ? (tx as TransactionResponse).hash : tx,\n );\n }\n\n if (extrinsic) {\n if (!polkadotSigner) {\n throw new Error('Polkadot signer must be provided');\n }\n\n return srcPolkadot.transfer(sourceAddress, extrinsic, polkadotSigner);\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n\nfunction 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 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 async function getDestinationFeeWithSourceDecimals(\n sourcePolkadot: PolkadotService,\n destinationFee: AssetAmount,\n): Promise<AssetAmount> {\n const destinationFeeDecimals =\n await sourcePolkadot.getAssetDecimals(destinationFee);\n const destinationFeeAsset =\n destinationFee.decimals === destinationFeeDecimals\n ? destinationFee\n : destinationFee.copyWith({\n amount: convertDecimals(\n destinationFee.amount,\n destinationFee.decimals,\n destinationFeeDecimals,\n ),\n decimals: destinationFeeDecimals,\n });\n\n return destinationFeeAsset;\n}\n","import '@polkadot/api-augment';\n\nimport {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { IConfigService, eq, equilibrium } from '@moonbeam-network/xcm-config';\nimport {\n AnyParachain,\n Asset,\n AssetAmount,\n ChainAssetId,\n} from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport { ApiPromise } from '@polkadot/api';\nimport type { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { Option, u128, u8 } from '@polkadot/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { AssetMetadata } from './PolkadotService.interfaces';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n readonly configService: IConfigService;\n\n constructor(\n api: ApiPromise,\n chain: AnyParachain,\n configService: IConfigService,\n ) {\n this.api = api;\n this.chain = chain;\n this.configService = configService;\n }\n\n static async create(\n chain: AnyParachain,\n configService: IConfigService,\n ): Promise<PolkadotService> {\n return new PolkadotService(\n await getPolkadotApi(chain.ws),\n chain,\n configService,\n );\n }\n\n static async createMulti(\n chains: AnyParachain[],\n configService: IConfigService,\n ): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) =>\n PolkadotService.create(chain, configService),\n ),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get asset(): Asset {\n const symbol = this.api.registry.chainTokens.at(0);\n const key = symbol?.toString().toLowerCase();\n\n // TODO: Remove this once Equilibrium is updated\n // or find better way if issue appears on other chains\n if (key === 'token' && [equilibrium.key].includes(this.chain.key)) {\n return eq;\n }\n\n if (!key) {\n throw new Error('No native symbol key found');\n }\n\n const asset = this.configService.getAsset(key);\n\n if (!asset) {\n throw new Error(`No asset found for key \"${key}\" and symbol \"${symbol}\"`);\n }\n\n return asset;\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.fromAsset(this.asset, {\n amount,\n decimals: this.decimals,\n });\n }\n\n async getAssetMeta(\n asset: ChainAssetId,\n ): Promise<{ symbol: string; decimals: number } | undefined> {\n const fn =\n this.api.query.assets?.metadata ||\n this.api.query.assetRegistry?.assets ||\n this.api.query.assetRegistry?.metadata ||\n this.api.query.assetRegistry?.currencyMetadatas ||\n this.api.query.assetRegistry?.assetMetadatas ||\n this.api.query.assetRegistry?.assetMetadataMap;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as AssetMetadata | Option<AssetMetadata>;\n const unwrapped = 'unwrapOrDefault' in data ? data.unwrapOrDefault() : data;\n const decimals =\n 'unwrapOrDefault' in unwrapped.decimals\n ? unwrapped.decimals.unwrapOrDefault()\n : unwrapped.decimals;\n\n return {\n decimals: decimals.toNumber(),\n symbol: unwrapped.symbol.toString(),\n };\n }\n\n async getAssetDecimalsFromQuery(\n asset: ChainAssetId,\n ): Promise<number | undefined> {\n const fn = this.api.query.assetsRegistry?.assetDecimals;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as Option<u8>;\n\n return data.unwrapOrDefault().toNumber();\n }\n\n async getAssetDecimals(asset: Asset): Promise<number> {\n const metaId = this.chain.getMetadataAssetId(asset);\n\n const decimals =\n this.chain.getAssetDecimals(asset) ||\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.decimals; // TODO remove this and handle it separately only for native assets\n\n if (!decimals) {\n throw new Error(`No decimals found for asset ${asset.originSymbol}`);\n }\n\n return decimals;\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 async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const info = await extrinsic.paymentInfo(account, { nonce: -1 });\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n ): Promise<string> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const hash = await extrinsic.signAndSend(\n this.#isSigner(signer) ? account : signer,\n {\n nonce: -1,\n signer: this.#isSigner(signer) ? signer : undefined,\n },\n );\n\n return hash.toString();\n }\n\n // eslint-disable-next-line class-methods-use-this\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { FeeConfigBuilder } from '@moonbeam-network/xcm-builder';\nimport { TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport { PolkadotService } from '../polkadot';\nimport { DestinationChainTransferData } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n polkadot,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const {\n asset,\n destination: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n const min = await getMin(config, polkadot);\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n\n const feeAmount = await getFee({\n address: destinationAddress,\n config: transferConfig,\n polkadot,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\n return {\n balance: balanceAmount,\n chain,\n existentialDeposit,\n fee: feeAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeParams {\n address: string;\n config: TransferConfig;\n polkadot: PolkadotService;\n}\n\nexport async function getFee({\n config,\n polkadot,\n}: GetFeeParams): Promise<AssetAmount> {\n const { amount, asset } = config.source.config.destinationFee;\n // TODO we have to consider correctly here when an asset is ERC20 to get it from contract\n const decimals = await polkadot.getAssetDecimals(asset);\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals,\n });\n\n if (Number.isFinite(amount)) {\n return zeroAmount.copyWith({\n amount: toBigInt(amount as number, decimals),\n });\n }\n\n const cfg = (amount as FeeConfigBuilder).build({\n api: polkadot.api,\n asset: polkadot.chain.getAssetId(asset),\n });\n\n return zeroAmount.copyWith({\n amount: await cfg.call(),\n });\n}\n"],"mappings":"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","names":["src_exports","__export","Sdk","getAssetsBalances","getBalance","getContractFee","getDecimals","getExtrinsicFee","getFee","getFeeBalance","getMax","getMin","getParachainBalances","getSourceData","__toCommonJS","import_xcm_builder","import_xcm_types","import_xcm_utils","import_big","import_ethers","import_viem","isEthersSigner","signer","isEthersContract","contract","Erc20ABI_default","Erc20","#config","#contract","config","signer","isEthersSigner","Erc20ABI_default","isEthersContract","import_ethers","import_viem","XtokensABI_default","Xtokens","#config","#contract","#signer","config","signer","address","isEthersSigner","XtokensABI_default","isEthersContract","contract","amount","estimatedGas","gasPrice","error","maxPriorityFeePerGas","import_viem","Erc20Public","#config","#publicClient","config","chain","Erc20ABI_default","createContractWithSigner","config","signer","chain","_a","Erc20","address","Xtokens","createContractWithoutSigner","Erc20Public","createContract","import_xcm_builder","import_xcm_utils","getBalance","address","chain","config","decimals","polkadot","cfg","balance","createContractWithoutSigner","getDecimals","asset","assetBuiltConfig","getMin","min","getSourceData","transferConfig","destinationAddress","destinationFee","polkadot","sourceAddress","evmSigner","_a","_b","_c","_d","_e","_f","_g","asset","destination","chain","config","zeroAmount","getDecimals","feeAsset","feeCfg","feeDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalance","destinationFeeBalance","min","getMin","extrinsic","contract","destinationFeeBalanceAmount","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","minAmount","maxAmount","getMax","address","decimals","feeConfig","cfg","createContractWithoutSigner","decimalsFromContract","balanceFromContract","destinationFeeConfig","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","totalFee","createContract","error","result","Big","getAssetsBalances","assets","uniqueAssets","acc","a","import_xcm_config","import_xcm_utils","import_big","import_api_augment","import_xcm_config","import_xcm_types","import_xcm_utils","PolkadotService","_PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","_f","fn","data","unwrapped","metaId","decimals","config","response","account","args","signer","#isSigner","import_xcm_types","import_xcm_utils","getDestinationData","transferConfig","destinationAddress","polkadot","asset","chain","config","zeroAmount","getDecimals","balance","getBalance","min","getMin","balanceAmount","existentialDeposit","feeAmount","getFee","minAmount","amount","decimals","cfg","getTransferData","configService","destinationAddress","evmSigner","polkadotSigner","sourceAddress","transferConfig","destPolkadot","srcPolkadot","PolkadotService","destination","getDestinationData","destinationFee","getDestinationFeeWithSourceDecimals","source","getSourceData","amount","result","Big","getMin","_a","_b","bigintAmount","asset","chain","config","contract","extrinsic","createContract","tx","balance","existentialDeposit","fee","min","sourcePolkadot","destinationFeeDecimals","Sdk","options","configService","ecosystem","assets","asset","keyOrAsset","sourceChains","source","keyOrChain","destinationChains","destination","destKeyOrChain","sourceAddress","destinationAddress","signers","getTransferData","destinationKeyOrChain","ethersSigner","evmSigner","polkadotSigner","sourceKeyOrChain","getParachainBalances","chain","address","polkadot","PolkadotService","getAssetsBalances"]}
package/build/index.d.cts CHANGED
@@ -4,6 +4,7 @@ import { AnyParachain, Asset, AssetAmount, ChainAssetId, AnyChain, EvmParachain,
4
4
  import { ApiPromise } from '@polkadot/api';
5
5
  import { Signer } from '@polkadot/api/types';
6
6
  import { IKeyringPair } from '@polkadot/types/types';
7
+ import { Signer as Signer$1 } from 'ethers';
7
8
  import { WalletClient } from 'viem';
8
9
 
9
10
  declare class PolkadotService {
@@ -28,10 +29,14 @@ declare class PolkadotService {
28
29
  transfer(account: string, config: ExtrinsicConfig, signer: Signer | IKeyringPair): Promise<string>;
29
30
  }
30
31
 
31
- type EvmSigner = WalletClient;
32
+ type EvmSigner = Signer$1 | WalletClient;
32
33
  interface Signers {
34
+ /**
35
+ * @deprecated ethersSigner - is deprecated and will be removed in v2, use evmSigner instead
36
+ */
37
+ ethersSigner?: Signer$1;
33
38
  evmSigner?: EvmSigner;
34
- polkadotSigner?: Signer | IKeyringPair;
39
+ polkadotSigner: Signer | IKeyringPair;
35
40
  }
36
41
  interface TransferData {
37
42
  destination: DestinationChainTransferData;
@@ -41,7 +46,7 @@ interface TransferData {
41
46
  min: AssetAmount;
42
47
  source: SourceChainTransferData;
43
48
  swap(): Promise<TransferData | undefined>;
44
- transfer(amount: bigint | number | string, signers?: Signers): Promise<string>;
49
+ transfer(amount: bigint | number | string): Promise<string>;
45
50
  }
46
51
  interface SourceChainTransferData extends ChainTransferData {
47
52
  destinationFeeBalance: AssetAmount;
@@ -77,10 +82,11 @@ interface GetSourceDataParams {
77
82
  transferConfig: TransferConfig;
78
83
  destinationAddress: string;
79
84
  destinationFee: AssetAmount;
85
+ evmSigner?: EvmSigner;
80
86
  polkadot: PolkadotService;
81
87
  sourceAddress: string;
82
88
  }
83
- declare function getSourceData({ transferConfig, destinationAddress, destinationFee, polkadot, sourceAddress, }: GetSourceDataParams): Promise<SourceChainTransferData>;
89
+ declare function getSourceData({ transferConfig, destinationAddress, destinationFee, polkadot, sourceAddress, evmSigner, }: GetSourceDataParams): Promise<SourceChainTransferData>;
84
90
  interface GetFeeBalanceParams extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {
85
91
  balance: bigint;
86
92
  feeConfig: FeeAssetConfig | undefined;
@@ -91,6 +97,7 @@ interface GetFeeParams {
91
97
  contract?: ContractConfig;
92
98
  chain: AnyChain;
93
99
  decimals: number;
100
+ evmSigner?: EvmSigner;
94
101
  extrinsic?: ExtrinsicConfig;
95
102
  feeConfig?: FeeAssetConfig;
96
103
  destinationFeeConfig?: DestinationFeeConfig;
@@ -98,12 +105,12 @@ interface GetFeeParams {
98
105
  polkadot: PolkadotService;
99
106
  sourceAddress: string;
100
107
  }
101
- declare function getFee({ balance, chain, contract, decimals, destinationFeeConfig, destinationFeeBalanceAmount, extrinsic, feeConfig, polkadot, sourceAddress, }: GetFeeParams): Promise<bigint>;
102
- declare function getContractFee({ address, balance, config, decimals, chain, }: {
103
- address: string;
108
+ declare function getFee({ balance, chain, contract, decimals, destinationFeeConfig, destinationFeeBalanceAmount, evmSigner, extrinsic, feeConfig, polkadot, sourceAddress, }: GetFeeParams): Promise<bigint>;
109
+ declare function getContractFee({ balance, config, decimals, evmSigner, chain, }: {
104
110
  balance: bigint;
105
111
  config: ContractConfig;
106
112
  decimals: number;
113
+ evmSigner: EvmSigner;
107
114
  chain: EvmParachain;
108
115
  }): Promise<bigint>;
109
116
  declare function getExtrinsicFee(balance: bigint, extrinsic: ExtrinsicConfig, polkadot: PolkadotService, sourceAddress: string): Promise<bigint>;
@@ -134,12 +141,12 @@ declare function Sdk(options?: SdkOptions): {
134
141
  source(keyOrChain: string | AnyChain): {
135
142
  destinationChains: AnyChain[];
136
143
  destination(destKeyOrChain: string | AnyChain): {
137
- accounts(sourceAddress: string, destinationAddress: string): Promise<TransferData>;
144
+ accounts(sourceAddress: string, destinationAddress: string, signers?: Partial<Signers>): Promise<TransferData>;
138
145
  };
139
146
  };
140
147
  };
141
148
  };
142
- getTransferData({ destinationAddress, destinationKeyOrChain, evmSigner, keyOrAsset, polkadotSigner, sourceAddress, sourceKeyOrChain, }: SdkTransferParams): Promise<TransferData>;
149
+ getTransferData({ destinationAddress, destinationKeyOrChain, ethersSigner, evmSigner, keyOrAsset, polkadotSigner, sourceAddress, sourceKeyOrChain, }: SdkTransferParams): Promise<TransferData>;
143
150
  };
144
151
  declare function getParachainBalances(chain: AnyChain, address: string): Promise<AssetAmount[]>;
145
152
  interface SdkTransferParams extends Partial<Signers> {
package/build/index.d.ts CHANGED
@@ -22,6 +22,7 @@ import {
22
22
  import { ApiPromise } from '@polkadot/api';
23
23
  import { Signer } from '@polkadot/api/types';
24
24
  import { IKeyringPair } from '@polkadot/types/types';
25
+ import { Signer as Signer$1 } from 'ethers';
25
26
  import { WalletClient } from 'viem';
26
27
 
27
28
  declare class PolkadotService {
@@ -63,10 +64,14 @@ declare class PolkadotService {
63
64
  ): Promise<string>;
64
65
  }
65
66
 
66
- type EvmSigner = WalletClient;
67
+ type EvmSigner = Signer$1 | WalletClient;
67
68
  interface Signers {
69
+ /**
70
+ * @deprecated ethersSigner - is deprecated and will be removed in v2, use evmSigner instead
71
+ */
72
+ ethersSigner?: Signer$1;
68
73
  evmSigner?: EvmSigner;
69
- polkadotSigner?: Signer | IKeyringPair;
74
+ polkadotSigner: Signer | IKeyringPair;
70
75
  }
71
76
  interface TransferData {
72
77
  destination: DestinationChainTransferData;
@@ -76,10 +81,7 @@ interface TransferData {
76
81
  min: AssetAmount;
77
82
  source: SourceChainTransferData;
78
83
  swap(): Promise<TransferData | undefined>;
79
- transfer(
80
- amount: bigint | number | string,
81
- signers?: Signers,
82
- ): Promise<string>;
84
+ transfer(amount: bigint | number | string): Promise<string>;
83
85
  }
84
86
  interface SourceChainTransferData extends ChainTransferData {
85
87
  destinationFeeBalance: AssetAmount;
@@ -130,6 +132,7 @@ interface GetSourceDataParams {
130
132
  transferConfig: TransferConfig;
131
133
  destinationAddress: string;
132
134
  destinationFee: AssetAmount;
135
+ evmSigner?: EvmSigner;
133
136
  polkadot: PolkadotService;
134
137
  sourceAddress: string;
135
138
  }
@@ -139,6 +142,7 @@ declare function getSourceData({
139
142
  destinationFee,
140
143
  polkadot,
141
144
  sourceAddress,
145
+ evmSigner,
142
146
  }: GetSourceDataParams): Promise<SourceChainTransferData>;
143
147
  interface GetFeeBalanceParams
144
148
  extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {
@@ -158,6 +162,7 @@ interface GetFeeParams {
158
162
  contract?: ContractConfig;
159
163
  chain: AnyChain;
160
164
  decimals: number;
165
+ evmSigner?: EvmSigner;
161
166
  extrinsic?: ExtrinsicConfig;
162
167
  feeConfig?: FeeAssetConfig;
163
168
  destinationFeeConfig?: DestinationFeeConfig;
@@ -172,22 +177,23 @@ declare function getFee({
172
177
  decimals,
173
178
  destinationFeeConfig,
174
179
  destinationFeeBalanceAmount,
180
+ evmSigner,
175
181
  extrinsic,
176
182
  feeConfig,
177
183
  polkadot,
178
184
  sourceAddress,
179
185
  }: GetFeeParams): Promise<bigint>;
180
186
  declare function getContractFee({
181
- address,
182
187
  balance,
183
188
  config,
184
189
  decimals,
190
+ evmSigner,
185
191
  chain,
186
192
  }: {
187
- address: string;
188
193
  balance: bigint;
189
194
  config: ContractConfig;
190
195
  decimals: number;
196
+ evmSigner: EvmSigner;
191
197
  chain: EvmParachain;
192
198
  }): Promise<bigint>;
193
199
  declare function getExtrinsicFee(
@@ -236,6 +242,7 @@ declare function Sdk(options?: SdkOptions): {
236
242
  accounts(
237
243
  sourceAddress: string,
238
244
  destinationAddress: string,
245
+ signers?: Partial<Signers>,
239
246
  ): Promise<TransferData>;
240
247
  };
241
248
  };
@@ -244,6 +251,7 @@ declare function Sdk(options?: SdkOptions): {
244
251
  getTransferData({
245
252
  destinationAddress,
246
253
  destinationKeyOrChain,
254
+ ethersSigner,
247
255
  evmSigner,
248
256
  keyOrAsset,
249
257
  polkadotSigner,
package/build/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{CallType as ft}from"@moonbeam-network/xcm-builder";import{AssetAmount as E}from"@moonbeam-network/xcm-types";import{convertDecimals as M,toBigInt as lt,toDecimal as dt}from"@moonbeam-network/xcm-utils";import V from"big.js";import{createPublicClient as rt,http as it}from"viem";var k=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}];var B=class{address;#t;#e;constructor(t,e){if(!t.address)throw new Error("Contract address is required");this.address=t.address,this.#t=t,this.#e=rt({chain:e.getViemChain(),transport:it()})}async getBalance(){let t=this.#t.args[0];return this.#e.readContract({abi:k,address:this.address,args:[t],functionName:"balanceOf"})}async getDecimals(){return this.#e.readContract({abi:k,address:this.address,functionName:"decimals"})}};import{createPublicClient as ot,http as ct}from"viem";var G=[{inputs:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transfer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],internalType:"struct Xtokens.Currency[]",name:"currencies",type:"tuple[]"},{internalType:"uint32",name:"feeItem",type:"uint32"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transferMultiCurrencies",outputs:[],stateMutability:"nonpayable",type:"function"}];var I=class{defaultMoonChainAddress="0x0000000000000000000000000000000000000804";address;#t;#e;constructor(t,e,a){this.#t=t,this.address=a??this.defaultMoonChainAddress,this.#e=ot({chain:e.getViemChain(),transport:ct()})}async transfer(t){let{request:e}=await this.#e.simulateContract({abi:G,account:t.account,address:this.address,args:this.#t.args,functionName:this.#t.func});return await t.writeContract(e)}async getFee(t,e){if(t===0n)return 0n;try{let a=await this.#e.estimateContractGas({abi:G,account:e,address:this.address,args:this.#t.args,functionName:this.#t.func}),n=await this.getGasPrice();return a*n}catch(a){throw console.error(a),new Error("Can't get a fee. Make sure that you have enough balance!")}}async getGasPrice(){return this.#e.getGasPrice()}};function y(s,t){var e;if(!s.isEvmParachain())throw new Error("Chain is not an EVM parachain");if(t.module==="Erc20")return new B(t,s);if(t.module==="Xtokens"){let a="contracts"in s?(e=s==null?void 0:s.contracts)==null?void 0:e.Xtokens:void 0;return new I(t,s,a)}throw new Error(`Contract ${t.module} not found`)}import{CallType as H}from"@moonbeam-network/xcm-builder";import{convertDecimals as mt,toBigInt as ut}from"@moonbeam-network/xcm-utils";async function P({address:s,chain:t,config:e,decimals:a,polkadot:n}){let i=e.balance.build({address:s,asset:n.chain.getBalanceAssetId(e.asset)});if(i.type===H.Substrate){let r=await n.query(i);return t.usesChainDecimals?mt(r,n.decimals,a):r}return await y(t,i).getBalance()}async function A({address:s,asset:t,config:e,polkadot:a,chain:n,assetBuiltConfig:i}){let o=i||e.balance.build({address:s,asset:a.chain.getBalanceAssetId(t||e.asset)});return o.type===H.Substrate?a.getAssetDecimals(t||e.asset):y(n,o).getDecimals()}async function T(s,t){if(s.min)return t.query(s.min.build({asset:t.chain.getMinAssetId(s.asset)}));let e=t.chain.getAssetMin(s.asset);if(e){let a=await t.getAssetDecimals(s.asset);return ut(e,a)}return 0n}async function j({transferConfig:s,destinationAddress:t,destinationFee:e,polkadot:a,sourceAddress:n}){var _,Q,R,X,K,$,z;let{asset:i,destination:o,source:{chain:c,config:r}}=s,m=E.fromAsset(i,{amount:0n,decimals:await A({address:t,chain:c,config:r,polkadot:a})}),u=a.chain.getBalanceAssetId(((_=r==null?void 0:r.fee)==null?void 0:_.asset)||r.asset),l=(Q=r.fee)==null?void 0:Q.balance.build({address:t,asset:u}),d=(R=r.fee)!=null&&R.asset?await A({address:t,asset:r.fee.asset,assetBuiltConfig:l,chain:c,config:r,polkadot:a}):void 0,p=(X=r.fee)!=null&&X.asset?E.fromAsset(r.fee.asset,{amount:0n,decimals:d||0}):m,h=(K=r.destinationFee)!=null&&K.asset?E.fromAsset(r.destinationFee.asset,{amount:0n,decimals:await A({address:t,asset:r.destinationFee.asset,chain:c,config:r,polkadot:a})}):m,f=await P({address:n,chain:c,config:r,decimals:m.decimals,polkadot:a}),w=await L({address:n,balance:f,chain:c,decimals:p.decimals,feeConfig:r.fee,polkadot:a}),x=r.asset.isEqual(r.destinationFee.asset)?f:await L({address:n,balance:f,chain:c,decimals:h.decimals,feeConfig:r.destinationFee,polkadot:a}),S=await T(r,a),v=($=r.extrinsic)==null?void 0:$.build({address:t,amount:f,asset:c.getAssetId(i),destination:o.chain,fee:e.amount,feeAsset:c.getAssetId(e),palletInstance:c.getAssetPalletInstance(i),source:c}),D=(z=r.contract)==null?void 0:z.build({address:t,amount:f,asset:c.getAssetId(i),destination:o.chain,fee:e.amount,feeAsset:c.getAssetId(e)}),g=h.copyWith({amount:x}),at=await pt({balance:f,chain:c,contract:D,decimals:p.decimals,destinationFeeBalanceAmount:g,destinationFeeConfig:r.destinationFee,extrinsic:v,feeConfig:r.fee,polkadot:a,sourceAddress:n}),q=m.copyWith({amount:f}),{existentialDeposit:O}=a,W=p.copyWith({amount:at}),nt=p.copyWith({amount:w}),N=m.copyWith({amount:S}),st=ht({balanceAmount:q,existentialDeposit:O,feeAmount:W,minAmount:N});return{balance:q,chain:c,destinationFeeBalance:g,existentialDeposit:O,fee:W,feeBalance:nt,max:st,min:N}}async function L({address:s,balance:t,chain:e,decimals:a,feeConfig:n,polkadot:i}){if(!n)return t;let o=n.balance.build({address:s,asset:i.chain.getBalanceAssetId(n.asset)});if(o.type===ft.Evm){let r=y(e,o),m=await r.getDecimals(),u=await r.getBalance();return e.usesChainDecimals?M(u,i.decimals,m):u}let c=await i.query(o);return e.usesChainDecimals?M(c,i.decimals,a):c}async function pt({balance:s,chain:t,contract:e,decimals:a,destinationFeeConfig:n,destinationFeeBalanceAmount:i,extrinsic:o,feeConfig:c,polkadot:r,sourceAddress:m}){if(e){if(n&&i&&typeof n.amount=="number"){let u=Number(dt(i.amount,i.decimals));if(u&&n.amount>u)throw new Error(`Can't get a fee, make sure you have ${n==null?void 0:n.amount} ${n==null?void 0:n.asset.originSymbol} in your source balance, needed for destination fees`)}return gt({address:m,balance:s,chain:t,config:e,decimals:a})}if(o){let u=await yt(s,o,r,m),l=At(a,c),d=u+l;return t.usesChainDecimals?M(d,r.decimals,a):d}throw new Error("Either contract or extrinsic must be provided")}async function gt({address:s,balance:t,config:e,decimals:a,chain:n}){let o=await y(n,e).getFee(t,s);return M(o,18,a)}async function yt(s,t,e,a){try{return await e.getFee(a,t)}catch(n){if(s)throw n;return 0n}}function At(s,t){return t!=null&&t.xcmDeliveryFeeAmount?lt(t.xcmDeliveryFeeAmount,s):0n}function ht({balanceAmount:s,existentialDeposit:t,feeAmount:e,minAmount:a}){let n=s.toBig().minus(a.toBig()).minus(s.isSame(t)?t.toBig():V(0)).minus(s.isSame(e)?e.toBig():V(0));return s.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}async function J({address:s,chain:t,assets:e,polkadot:a}){let n=e.reduce((o,c)=>o.some(r=>r.asset.isEqual(c.asset))?o:[c,...o],[]);return await Promise.all(n.map(async o=>{let c=await A({address:s,asset:o.asset,chain:t,config:o,polkadot:a}),r=await P({address:s,chain:t,config:o,decimals:c,polkadot:a});return E.fromAsset(o.asset,{amount:r,decimals:c})}))}import{ConfigBuilder as tt,ConfigService as et}from"@moonbeam-network/xcm-config";import{convertDecimals as vt,toBigInt as Z}from"@moonbeam-network/xcm-utils";import b from"big.js";import"@polkadot/api-augment";import{eq as Ct,equilibrium as bt}from"@moonbeam-network/xcm-config";import{AssetAmount as Pt}from"@moonbeam-network/xcm-types";import{getPolkadotApi as wt}from"@moonbeam-network/xcm-utils";var C=class s{api;chain;configService;constructor(t,e,a){this.api=t,this.chain=e,this.configService=a}static async create(t,e){return new s(await wt(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(a=>s.create(a,e)))}get decimals(){return this.api.registry.chainDecimals.at(0)||12}get asset(){let t=this.api.registry.chainTokens.at(0),e=t==null?void 0:t.toString().toLowerCase();if(e==="token"&&[bt.key].includes(this.chain.key))return Ct;if(!e)throw new Error("No native symbol key found");let a=this.configService.getAsset(e);if(!a)throw new Error(`No asset found for key "${e}" and symbol "${t}"`);return a}get existentialDeposit(){var n,i;let t=(n=this.api.consts.balances)==null?void 0:n.existentialDeposit,e=(i=this.api.consts.eqBalances)==null?void 0:i.existentialDeposit,a=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return Pt.fromAsset(this.asset,{amount:a,decimals:this.decimals})}async getAssetMeta(t){var o,c,r,m,u,l;let e=((o=this.api.query.assets)==null?void 0:o.metadata)||((c=this.api.query.assetRegistry)==null?void 0:c.assets)||((r=this.api.query.assetRegistry)==null?void 0:r.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.currencyMetadatas)||((u=this.api.query.assetRegistry)==null?void 0:u.assetMetadatas)||((l=this.api.query.assetRegistry)==null?void 0:l.assetMetadataMap);if(!e)return;let a=await e(t),n="unwrapOrDefault"in a?a.unwrapOrDefault():a;return{decimals:("unwrapOrDefault"in n.decimals?n.decimals.unwrapOrDefault():n.decimals).toNumber(),symbol:n.symbol.toString()}}async getAssetDecimalsFromQuery(t){var n;let e=(n=this.api.query.assetsRegistry)==null?void 0:n.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var n;let e=this.chain.getMetadataAssetId(t),a=this.chain.getAssetDecimals(t)||await this.getAssetDecimalsFromQuery(e)||((n=await this.getAssetMeta(e))==null?void 0:n.decimals)||this.decimals;if(!a)throw new Error(`No decimals found for asset ${t.originSymbol}`);return a}async query(t){let e=await this.api.query[t.module][t.func](...t.args);return t.transform(e)}async getFee(t,e){let a=this.api.tx[e.module][e.func],n=e.getArgs(a);return(await a(...n).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,a){let n=this.api.tx[e.module][e.func],i=e.getArgs(n);return(await n(...i).signAndSend(this.#t(a)?t:a,{nonce:-1,signer:this.#t(a)?a:void 0})).toString()}#t(t){return"signPayload"in t}};import{AssetAmount as U}from"@moonbeam-network/xcm-types";import{toBigInt as xt}from"@moonbeam-network/xcm-utils";async function Y({transferConfig:s,destinationAddress:t,polkadot:e}){let{asset:a,destination:{chain:n,config:i}}=s,o=U.fromAsset(a,{amount:0n,decimals:await A({address:t,chain:n,config:i,polkadot:e})}),c=await P({address:t,chain:n,config:i,decimals:o.decimals,polkadot:e}),r=await T(i,e),m=o.copyWith({amount:c}),{existentialDeposit:u}=e,l=await St({address:t,config:s,polkadot:e}),d=o.copyWith({amount:r});return{balance:m,chain:n,existentialDeposit:u,fee:l,min:d}}async function St({config:s,polkadot:t}){let{amount:e,asset:a}=s.source.config.destinationFee,n=await t.getAssetDecimals(a),i=U.fromAsset(a,{amount:0n,decimals:n});if(Number.isFinite(e))return i.copyWith({amount:xt(e,n)});let o=e.build({api:t.api,asset:t.chain.getAssetId(a)});return i.copyWith({amount:await o.call()})}async function F({configService:s,destinationAddress:t,evmSigner:e,polkadotSigner:a,sourceAddress:n,transferConfig:i}){let[o,c]=await C.createMulti([i.destination.chain,i.source.chain],s),r=await Y({destinationAddress:t,polkadot:o,transferConfig:i}),m=await Bt(c,r.fee),u=await j({destinationAddress:t,destinationFee:m,polkadot:c,sourceAddress:n,transferConfig:i});return{destination:r,getEstimate(l){let p=b(Z(l,u.balance.decimals).toString()).minus(u.balance.isSame(m)?m.toBig():b(0));return u.balance.copyWith({amount:p.lt(0)?0n:BigInt(p.toFixed())})},isSwapPossible:!0,max:u.max,min:Dt(r),source:u,async swap(){return F({configService:s,destinationAddress:n,evmSigner:e,polkadotSigner:a,sourceAddress:t,transferConfig:{...i,destination:i.source,source:i.destination}})},async transfer(l,d){var v,D;let p=Z(l,u.balance.decimals),{asset:h,source:{chain:f,config:w}}=i,x=(v=w.contract)==null?void 0:v.build({address:t,amount:p,asset:f.getAssetId(h),destination:r.chain,fee:m.amount,feeAsset:f.getAssetId(m)}),S=(D=w.extrinsic)==null?void 0:D.build({address:t,amount:p,asset:f.getAssetId(h),destination:r.chain,fee:m.amount,feeAsset:f.getAssetId(m),palletInstance:f.getAssetPalletInstance(h),source:f});if(x){let g=e||d.evmSigner;if(!g)throw new Error("EVM Signer must be provided");return y(f,x).transfer(g)}if(S){let g=a||d.polkadotSigner;if(!g)throw new Error("Polkadot signer must be provided");return c.transfer(n,S,g)}throw new Error("Either contract or extrinsic must be provided")}}}function Dt({balance:s,existentialDeposit:t,fee:e,min:a}){let n=b(0).plus(s.isSame(e)?e.toBig():b(0)).plus(s.isSame(t)&&s.toBig().lt(t.toBig())?t.toBig():b(0)).plus(s.toBig().lt(a.toBig())?a.toBig():b(0));return s.copyWith({amount:BigInt(n.toFixed())})}async function Bt(s,t){let e=await s.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:vt(t.amount,t.decimals,e),decimals:e})}function Ue(s){let t=(s==null?void 0:s.configService)??new et;return{assets(e){let{assets:a,asset:n}=tt(t).assets(e);return{assets:a,asset(i){let{sourceChains:o,source:c}=n(i);return{sourceChains:o,source(r){let{destinationChains:m,destination:u}=c(r);return{destinationChains:m,destination(l){return{async accounts(d,p){return F({...s,configService:t,destinationAddress:p,sourceAddress:d,transferConfig:u(l).build()})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:a,evmSigner:n,keyOrAsset:i,polkadotSigner:o,sourceAddress:c,sourceKeyOrChain:r}){return F({configService:t,destinationAddress:e,evmSigner:n,polkadotSigner:o,sourceAddress:c,transferConfig:tt(t).assets().asset(i).source(r).destination(a).build()})}}}async function Ye(s,t){let e=new et,n=e.getChainConfig(s).getAssetsConfigs(),i=await C.create(s,e);return await J({chain:s,assets:n,address:t,polkadot:i})}export{Ue as Sdk,J as getAssetsBalances,P as getBalance,gt as getContractFee,A as getDecimals,yt as getExtrinsicFee,pt as getFee,L as getFeeBalance,ht as getMax,T as getMin,Ye as getParachainBalances,j as getSourceData};
1
+ import{CallType as xt}from"@moonbeam-network/xcm-builder";import{AssetAmount as k}from"@moonbeam-network/xcm-types";import{convertDecimals as W,toBigInt as Dt,toDecimal as Bt}from"@moonbeam-network/xcm-utils";import Z from"big.js";import{Contract as pt}from"ethers";import{createPublicClient as dt,getContract as gt,http as yt}from"viem";function v(n){return"provider"in n}function h(n){return"signer"in n}var C=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}];var T=class{address;#t;#e;constructor(t,e){if(!t.address)throw new Error("Contract address is required");this.address=t.address,this.#t=t,this.#e=v(e)?new pt(this.address,C,e):gt({abi:C,address:this.address,client:{public:dt({chain:e.chain,transport:yt()}),wallet:e}})}async getBalance(){return h(this.#e)?(await this.#e.balanceOf(...this.#t.args)).toBigInt():this.#e.read.balanceOf(this.#t.args)}async getDecimals(){return h(this.#e)?await this.#e.decimals():this.#e.read.decimals()}};import{Contract as Ct}from"ethers";import{createPublicClient as J,getContract as At,http as U}from"viem";var O=[{inputs:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transfer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"address",name:"currencyAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],internalType:"struct Xtokens.Currency[]",name:"currencies",type:"tuple[]"},{internalType:"uint32",name:"feeItem",type:"uint32"},{components:[{internalType:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"destination",type:"tuple"},{internalType:"uint64",name:"weight",type:"uint64"}],name:"transferMultiCurrencies",outputs:[],stateMutability:"nonpayable",type:"function"}];var x=class{defaultMoonChainAddress="0x0000000000000000000000000000000000000804";address;#t;#e;#a;constructor(t,e,a){this.#t=t,this.#a=e,this.address=a??this.defaultMoonChainAddress,this.#e=v(e)?new Ct(this.address,O,e):At({abi:O,address:this.address,client:{public:J({chain:e.chain,transport:U()}),wallet:e}})}async transfer(){return h(this.#e)?this.#e[this.#t.func](...this.#t.args):this.#e.write[this.#t.func](this.#t.args)}async getEthersContractEstimatedGas(t){return t[this.#t.func].estimateGas(...this.#t.args)}async getViemContractEstimatedGas(t){return t?t.estimateGas[this.#t.func](this.#t.args):0n}async getFee(t){if(t===0n)return 0n;try{let e=h(this.#e)?await this.getEthersContractEstimatedGas(this.#e):await this.getViemContractEstimatedGas(this.#e),a=await this.getGasPrice();return e*a}catch(e){throw console.error(e),new Error("Can't get a fee. Make sure that you have enough balance!")}}async getGasPrice(){if(v(this.#a)){if(!this.#a.provider)return 0n;let{gasPrice:e,maxPriorityFeePerGas:a}=await this.#a.provider.getFeeData();return(e||0n)+(a||0n)}return J({chain:this.#a.chain,transport:U()}).getGasPrice()}};import{createPublicClient as bt,http as Pt}from"viem";var F=class{address;#t;#e;constructor(t,e){if(!t.address)throw new Error("Contract address is required");this.address=t.address,this.#t=t,this.#e=bt({chain:e,transport:Pt()})}async getBalance(){return await this.#e.readContract({abi:C,address:this.#t.address,args:this.#t.args,functionName:"balanceOf"})}async getDecimals(){return await this.#e.readContract({abi:C,address:this.#t.address,functionName:"decimals"})}};function wt(n,t,e){var a;if(n.module==="Erc20")return new T(n,t);if(n.module==="Xtokens"){if(e&&"contracts"in e){let s=(a=e==null?void 0:e.contracts)==null?void 0:a.Xtokens;return new x(n,t,s)}return new x(n,t)}throw new Error(`Contract ${n.module} not found`)}function A(n,t){if(n.module==="Erc20")return new F(n,t.getViemChain());throw new Error(`Public Contract ${n.module} not found`)}function M(n,t,e){return t?wt(n,t,e):A(n,e)}import{CallType as Y}from"@moonbeam-network/xcm-builder";import{convertDecimals as St,toBigInt as vt}from"@moonbeam-network/xcm-utils";async function D({address:n,chain:t,config:e,decimals:a,polkadot:s}){let i=e.balance.build({address:n,asset:s.chain.getBalanceAssetId(e.asset)});if(i.type===Y.Substrate){let c=await s.query(i);return t.usesChainDecimals?St(c,s.decimals,a):c}return await A(i,t).getBalance()}async function y({address:n,asset:t,config:e,polkadot:a,chain:s,assetBuiltConfig:i}){let o=i||e.balance.build({address:n,asset:a.chain.getBalanceAssetId(t||e.asset)});return o.type===Y.Substrate?a.getAssetDecimals(t||e.asset):A(o,s).getDecimals()}async function G(n,t){if(n.min)return t.query(n.min.build({asset:t.chain.getMinAssetId(n.asset)}));let e=t.chain.getAssetMin(n.asset);if(e){let a=await t.getAssetDecimals(n.asset);return vt(e,a)}return 0n}async function et({transferConfig:n,destinationAddress:t,destinationFee:e,polkadot:a,sourceAddress:s,evmSigner:i}){var _,z,K,V,j,L,H;let{asset:o,destination:m,source:{chain:c,config:r}}=n,u=k.fromAsset(o,{amount:0n,decimals:await y({address:t,chain:c,config:r,polkadot:a})}),l=a.chain.getBalanceAssetId(((_=r==null?void 0:r.fee)==null?void 0:_.asset)||r.asset),d=(z=r.fee)==null?void 0:z.balance.build({address:t,asset:l}),p=(K=r.fee)!=null&&K.asset?await y({address:t,asset:r.fee.asset,assetBuiltConfig:d,chain:c,config:r,polkadot:a}):void 0,f=(V=r.fee)!=null&&V.asset?k.fromAsset(r.fee.asset,{amount:0n,decimals:p||0}):u,w=(j=r.destinationFee)!=null&&j.asset?k.fromAsset(r.destinationFee.asset,{amount:0n,decimals:await y({address:t,asset:r.destinationFee.asset,chain:c,config:r,polkadot:a})}):u,g=await D({address:s,chain:c,config:r,decimals:u.decimals,polkadot:a}),B=await tt({address:s,balance:g,chain:c,decimals:f.decimals,feeConfig:r.fee,polkadot:a}),E=r.asset.isEqual(r.destinationFee.asset)?g:await tt({address:s,balance:g,chain:c,decimals:w.decimals,feeConfig:r.destinationFee,polkadot:a}),I=await G(r,a),S=(L=r.extrinsic)==null?void 0:L.build({address:t,amount:g,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e),palletInstance:c.getAssetPalletInstance(o),source:c}),ct=(H=r.contract)==null?void 0:H.build({address:t,amount:g,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e)}),R=w.copyWith({amount:E}),mt=await Et({balance:g,chain:c,contract:ct,decimals:f.decimals,destinationFeeBalanceAmount:R,destinationFeeConfig:r.destinationFee,evmSigner:i,extrinsic:S,feeConfig:r.fee,polkadot:a,sourceAddress:s}),$=u.copyWith({amount:g}),{existentialDeposit:N}=a,Q=f.copyWith({amount:mt}),ut=f.copyWith({amount:B}),X=u.copyWith({amount:I}),ft=Mt({balanceAmount:$,existentialDeposit:N,feeAmount:Q,minAmount:X});return{balance:$,chain:c,destinationFeeBalance:R,existentialDeposit:N,fee:Q,feeBalance:ut,max:ft,min:X}}async function tt({address:n,balance:t,chain:e,decimals:a,feeConfig:s,polkadot:i}){if(!s)return t;let o=s.balance.build({address:n,asset:i.chain.getBalanceAssetId(s.asset)});if(o.type===xt.Evm){let c=A(o,e),r=await c.getDecimals(),u=await c.getBalance();return e.usesChainDecimals?W(u,i.decimals,r):u}let m=await i.query(o);return e.usesChainDecimals?W(m,i.decimals,a):m}async function Et({balance:n,chain:t,contract:e,decimals:a,destinationFeeConfig:s,destinationFeeBalanceAmount:i,evmSigner:o,extrinsic:m,feeConfig:c,polkadot:r,sourceAddress:u}){if(e){if(!o)throw new Error("EVM Signer must be provided");if(s&&i&&typeof s.amount=="number"){let l=Number(Bt(i.amount,i.decimals));if(l&&s.amount>l)throw new Error(`Can't get a fee, make sure you have ${s==null?void 0:s.amount} ${s==null?void 0:s.asset.originSymbol} in your source balance, needed for destination fees`)}return It({balance:n,chain:t,config:e,decimals:a,evmSigner:o})}if(m){let l=await Tt(n,m,r,u),d=Ft(a,c),p=l+d;return t.usesChainDecimals?W(p,r.decimals,a):p}throw new Error("Either contract or extrinsic must be provided")}async function It({balance:n,config:t,decimals:e,evmSigner:a,chain:s}){let o=await M(t,a,s).getFee(n);return W(o,18,e)}async function Tt(n,t,e,a){try{return await e.getFee(a,t)}catch(s){if(n)throw s;return 0n}}function Ft(n,t){return t!=null&&t.xcmDeliveryFeeAmount?Dt(t.xcmDeliveryFeeAmount,n):0n}function Mt({balanceAmount:n,existentialDeposit:t,feeAmount:e,minAmount:a}){let s=n.toBig().minus(a.toBig()).minus(n.isSame(t)?t.toBig():Z(0)).minus(n.isSame(e)?e.toBig():Z(0));return n.copyWith({amount:s.lt(0)?0n:BigInt(s.toFixed())})}async function at({address:n,chain:t,assets:e,polkadot:a}){let s=e.reduce((o,m)=>o.some(c=>c.asset.isEqual(m.asset))?o:[m,...o],[]);return await Promise.all(s.map(async o=>{let m=await y({address:n,asset:o.asset,chain:t,config:o,polkadot:a}),c=await D({address:n,chain:t,config:o,decimals:m,polkadot:a});return k.fromAsset(o.asset,{amount:c,decimals:m})}))}import{ConfigBuilder as it,ConfigService as ot}from"@moonbeam-network/xcm-config";import{convertDecimals as $t,toBigInt as rt}from"@moonbeam-network/xcm-utils";import P from"big.js";import"@polkadot/api-augment";import{eq as Gt,equilibrium as kt}from"@moonbeam-network/xcm-config";import{AssetAmount as Wt}from"@moonbeam-network/xcm-types";import{getPolkadotApi as qt}from"@moonbeam-network/xcm-utils";var b=class n{api;chain;configService;constructor(t,e,a){this.api=t,this.chain=e,this.configService=a}static async create(t,e){return new n(await qt(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(a=>n.create(a,e)))}get decimals(){return this.api.registry.chainDecimals.at(0)||12}get asset(){let t=this.api.registry.chainTokens.at(0),e=t==null?void 0:t.toString().toLowerCase();if(e==="token"&&[kt.key].includes(this.chain.key))return Gt;if(!e)throw new Error("No native symbol key found");let a=this.configService.getAsset(e);if(!a)throw new Error(`No asset found for key "${e}" and symbol "${t}"`);return a}get existentialDeposit(){var s,i;let t=(s=this.api.consts.balances)==null?void 0:s.existentialDeposit,e=(i=this.api.consts.eqBalances)==null?void 0:i.existentialDeposit,a=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return Wt.fromAsset(this.asset,{amount:a,decimals:this.decimals})}async getAssetMeta(t){var o,m,c,r,u,l;let e=((o=this.api.query.assets)==null?void 0:o.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.assets)||((c=this.api.query.assetRegistry)==null?void 0:c.metadata)||((r=this.api.query.assetRegistry)==null?void 0:r.currencyMetadatas)||((u=this.api.query.assetRegistry)==null?void 0:u.assetMetadatas)||((l=this.api.query.assetRegistry)==null?void 0:l.assetMetadataMap);if(!e)return;let a=await e(t),s="unwrapOrDefault"in a?a.unwrapOrDefault():a;return{decimals:("unwrapOrDefault"in s.decimals?s.decimals.unwrapOrDefault():s.decimals).toNumber(),symbol:s.symbol.toString()}}async getAssetDecimalsFromQuery(t){var s;let e=(s=this.api.query.assetsRegistry)==null?void 0:s.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var s;let e=this.chain.getMetadataAssetId(t),a=this.chain.getAssetDecimals(t)||await this.getAssetDecimalsFromQuery(e)||((s=await this.getAssetMeta(e))==null?void 0:s.decimals)||this.decimals;if(!a)throw new Error(`No decimals found for asset ${t.originSymbol}`);return a}async query(t){let e=await this.api.query[t.module][t.func](...t.args);return t.transform(e)}async getFee(t,e){let a=this.api.tx[e.module][e.func],s=e.getArgs(a);return(await a(...s).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,a){let s=this.api.tx[e.module][e.func],i=e.getArgs(s);return(await s(...i).signAndSend(this.#t(a)?t:a,{nonce:-1,signer:this.#t(a)?a:void 0})).toString()}#t(t){return"signPayload"in t}};import{AssetAmount as nt}from"@moonbeam-network/xcm-types";import{toBigInt as Ot}from"@moonbeam-network/xcm-utils";async function st({transferConfig:n,destinationAddress:t,polkadot:e}){let{asset:a,destination:{chain:s,config:i}}=n,o=nt.fromAsset(a,{amount:0n,decimals:await y({address:t,chain:s,config:i,polkadot:e})}),m=await D({address:t,chain:s,config:i,decimals:o.decimals,polkadot:e}),c=await G(i,e),r=o.copyWith({amount:m}),{existentialDeposit:u}=e,l=await Rt({address:t,config:n,polkadot:e}),d=o.copyWith({amount:c});return{balance:r,chain:s,existentialDeposit:u,fee:l,min:d}}async function Rt({config:n,polkadot:t}){let{amount:e,asset:a}=n.source.config.destinationFee,s=await t.getAssetDecimals(a),i=nt.fromAsset(a,{amount:0n,decimals:s});if(Number.isFinite(e))return i.copyWith({amount:Ot(e,s)});let o=e.build({api:t.api,asset:t.chain.getAssetId(a)});return i.copyWith({amount:await o.call()})}async function q({configService:n,destinationAddress:t,evmSigner:e,polkadotSigner:a,sourceAddress:s,transferConfig:i}){let[o,m]=await b.createMulti([i.destination.chain,i.source.chain],n),c=await st({destinationAddress:t,polkadot:o,transferConfig:i}),r=await Qt(m,c.fee),u=await et({destinationAddress:t,destinationFee:r,evmSigner:e,polkadot:m,sourceAddress:s,transferConfig:i});return{destination:c,getEstimate(l){let p=P(rt(l,u.balance.decimals).toString()).minus(u.balance.isSame(r)?r.toBig():P(0));return u.balance.copyWith({amount:p.lt(0)?0n:BigInt(p.toFixed())})},isSwapPossible:!0,max:u.max,min:Nt(c),source:u,async swap(){return q({configService:n,destinationAddress:s,evmSigner:e,polkadotSigner:a,sourceAddress:t,transferConfig:{...i,destination:i.source,source:i.destination}})},async transfer(l){var E,I;let d=rt(l,u.balance.decimals),{asset:p,source:{chain:f,config:w}}=i,g=(E=w.contract)==null?void 0:E.build({address:t,amount:d,asset:f.getAssetId(p),destination:c.chain,fee:r.amount,feeAsset:f.getAssetId(r)}),B=(I=w.extrinsic)==null?void 0:I.build({address:t,amount:d,asset:f.getAssetId(p),destination:c.chain,fee:r.amount,feeAsset:f.getAssetId(r),palletInstance:f.getAssetPalletInstance(p),source:f});if(g){if(!e)throw new Error("EVM Signer must be provided");return M(g,e,f).transfer().then(S=>typeof S=="object"?S.hash:S)}if(B){if(!a)throw new Error("Polkadot signer must be provided");return m.transfer(s,B,a)}throw new Error("Either contract or extrinsic must be provided")}}}function Nt({balance:n,existentialDeposit:t,fee:e,min:a}){let s=P(0).plus(n.isSame(e)?e.toBig():P(0)).plus(n.isSame(t)&&n.toBig().lt(t.toBig())?t.toBig():P(0)).plus(n.toBig().lt(a.toBig())?a.toBig():P(0));return n.copyWith({amount:BigInt(s.toFixed())})}async function Qt(n,t){let e=await n.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:$t(t.amount,t.decimals,e),decimals:e})}function Sa(n){let t=(n==null?void 0:n.configService)??new ot;return{assets(e){let{assets:a,asset:s}=it(t).assets(e);return{assets:a,asset(i){let{sourceChains:o,source:m}=s(i);return{sourceChains:o,source(c){let{destinationChains:r,destination:u}=m(c);return{destinationChains:r,destination(l){return{async accounts(d,p,f){return q({...n,configService:t,destinationAddress:p,evmSigner:(f==null?void 0:f.evmSigner)??(f==null?void 0:f.ethersSigner),sourceAddress:d,transferConfig:u(l).build(),polkadotSigner:f==null?void 0:f.polkadotSigner})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:a,ethersSigner:s,evmSigner:i,keyOrAsset:o,polkadotSigner:m,sourceAddress:c,sourceKeyOrChain:r}){return q({configService:t,destinationAddress:e,evmSigner:i??s,polkadotSigner:m,sourceAddress:c,transferConfig:it(t).assets().asset(o).source(r).destination(a).build()})}}}async function va(n,t){let e=new ot,s=e.getChainConfig(n).getAssetsConfigs(),i=await b.create(n,e);return await at({chain:n,assets:s,address:t,polkadot:i})}export{Sa as Sdk,at as getAssetsBalances,D as getBalance,It as getContractFee,y as getDecimals,Tt as getExtrinsicFee,Et as getFee,tt as getFeeBalance,Mt as getMax,G as getMin,va as getParachainBalances,et as getSourceData};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/getTransferData/getSourceData.ts","../src/contract/contracts/Erc20/Erc20.ts","../src/contract/contracts/Erc20/Erc20ABI.ts","../src/contract/contracts/Xtokens/Xtokens.ts","../src/contract/contracts/Xtokens/XtokensABI.ts","../src/contract/contract.factory.ts","../src/getTransferData/getTransferData.utils.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts","../src/polkadot/PolkadotService.ts","../src/getTransferData/getDestinationData.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n CallType,\n ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport {\n AssetConfig,\n DestinationFeeConfig,\n FeeAssetConfig,\n TransferConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n AssetAmount,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport {\n convertDecimals,\n toBigInt,\n toDecimal,\n} from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n createContract,\n} from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport {\n GetBalancesParams,\n getBalance,\n getDecimals,\n getMin,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n destinationFee: AssetAmount;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n transferConfig,\n destinationAddress,\n destinationFee,\n polkadot,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const feeAsset = polkadot.chain.getBalanceAssetId(\n config?.fee?.asset || config.asset,\n );\n\n const feeCfg = config.fee?.balance.build({\n address: destinationAddress,\n asset: feeAsset,\n });\n\n const feeDecimals = config.fee?.asset\n ? await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n assetBuiltConfig: feeCfg,\n chain,\n config,\n polkadot,\n })\n : undefined;\n\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: feeDecimals || 0,\n })\n : zeroAmount;\n\n const zeroDestinationFeeAmount = config.destinationFee?.asset\n ? AssetAmount.fromAsset(config.destinationFee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.destinationFee.asset,\n chain,\n config,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n\n const feeBalance = await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroFeeAmount.decimals,\n feeConfig: config.fee,\n polkadot,\n });\n\n const destinationFeeBalance = config.asset.isEqual(\n config.destinationFee.asset,\n )\n ? balance\n : await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroDestinationFeeAmount.decimals,\n feeConfig: config.destinationFee,\n polkadot,\n });\n\n const min = await getMin(config, polkadot);\n\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n\n const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\n });\n\n const fee = await getFee({\n balance,\n chain,\n contract,\n decimals: zeroFeeAmount.decimals,\n destinationFeeBalanceAmount,\n destinationFeeConfig: config.destinationFee,\n extrinsic,\n feeConfig: config.fee,\n polkadot,\n sourceAddress,\n });\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n const feeAmount = zeroFeeAmount.copyWith({ amount: fee });\n const feeBalanceAmount = zeroFeeAmount.copyWith({ amount: feeBalance });\n\n const minAmount = zeroAmount.copyWith({ amount: min });\n\n const maxAmount = getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n });\n\n return {\n balance: balanceAmount,\n chain,\n destinationFeeBalance: destinationFeeBalanceAmount,\n existentialDeposit,\n fee: feeAmount,\n feeBalance: feeBalanceAmount,\n max: maxAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeBalanceParams\n extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {\n balance: bigint;\n feeConfig: FeeAssetConfig | undefined;\n}\n\nexport async function getFeeBalance({\n address,\n balance,\n chain,\n decimals,\n feeConfig,\n polkadot,\n}: GetFeeBalanceParams) {\n if (!feeConfig) {\n return balance;\n }\n\n const cfg = feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig;\n\n if (cfg.type === CallType.Evm) {\n const contract = createContract(chain, cfg) as BalanceContractInterface;\n\n const decimalsFromContract = await contract.getDecimals();\n const balanceFromContract = await contract.getBalance();\n\n return chain.usesChainDecimals\n ? convertDecimals(\n balanceFromContract,\n polkadot.decimals,\n decimalsFromContract,\n )\n : balanceFromContract;\n }\n\n const feeBalance = await polkadot.query(cfg);\n\n return chain.usesChainDecimals\n ? convertDecimals(feeBalance, polkadot.decimals, decimals)\n : feeBalance;\n}\n\nexport interface GetFeeParams {\n balance: bigint;\n contract?: ContractConfig;\n chain: AnyChain;\n decimals: number;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeAssetConfig;\n destinationFeeConfig?: DestinationFeeConfig;\n destinationFeeBalanceAmount?: AssetAmount;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n chain,\n contract,\n decimals,\n destinationFeeConfig,\n destinationFeeBalanceAmount,\n extrinsic,\n feeConfig,\n polkadot,\n sourceAddress,\n}: GetFeeParams): Promise<bigint> {\n if (contract) {\n if (\n destinationFeeConfig &&\n destinationFeeBalanceAmount &&\n typeof destinationFeeConfig.amount === 'number'\n ) {\n const destinationFeeBalance = Number(\n toDecimal(\n destinationFeeBalanceAmount.amount,\n destinationFeeBalanceAmount.decimals,\n ),\n );\n if (\n destinationFeeBalance &&\n destinationFeeConfig.amount > destinationFeeBalance\n ) {\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFeeConfig?.amount} ${destinationFeeConfig?.asset.originSymbol} in your source balance, needed for destination fees`,\n );\n }\n }\n\n return getContractFee({\n address: sourceAddress,\n balance,\n chain: chain as EvmParachain,\n config: contract,\n decimals,\n });\n }\n\n if (extrinsic) {\n const extrinsicFee = await getExtrinsicFee(\n balance,\n extrinsic,\n polkadot,\n sourceAddress,\n );\n\n const xcmDeliveryFee = getXcmDeliveryFee(decimals, feeConfig);\n\n const totalFee = extrinsicFee + xcmDeliveryFee;\n\n return chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, decimals)\n : totalFee;\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n}\n\nexport async function getContractFee({\n address,\n balance,\n config,\n decimals,\n chain,\n}: {\n address: string;\n balance: bigint;\n config: ContractConfig;\n decimals: number;\n chain: EvmParachain;\n}): Promise<bigint> {\n const contract = createContract(chain, config) as TransferContractInterface;\n const fee = await contract.getFee(balance, address);\n\n return convertDecimals(fee, 18, decimals);\n}\n\nexport async function getExtrinsicFee(\n balance: bigint,\n extrinsic: ExtrinsicConfig,\n polkadot: PolkadotService,\n sourceAddress: string,\n): Promise<bigint> {\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 return await polkadot.getFee(sourceAddress, extrinsic);\n } catch (error) {\n if (balance) {\n throw error;\n }\n\n return 0n;\n }\n}\n\nfunction getXcmDeliveryFee(\n decimals: number,\n feeConfig?: FeeAssetConfig,\n): bigint {\n return feeConfig?.xcmDeliveryFeeAmount\n ? toBigInt(feeConfig.xcmDeliveryFeeAmount, decimals)\n : 0n;\n}\n\nexport interface GetMaxParams {\n balanceAmount: AssetAmount;\n existentialDeposit: AssetAmount;\n feeAmount: AssetAmount;\n minAmount: AssetAmount;\n}\n\nexport function getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n}: GetMaxParams): AssetAmount {\n const result = balanceAmount\n .toBig()\n .minus(minAmount.toBig())\n .minus(\n balanceAmount.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balanceAmount.isSame(feeAmount) ? feeAmount.toBig() : Big(0));\n\n return balanceAmount.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyChain;\n assets: AssetConfig[];\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n assets,\n polkadot,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueAssets = assets.reduce(\n (acc: AssetConfig[], asset: AssetConfig) => {\n if (!acc.some((a: AssetConfig) => a.asset.isEqual(asset.asset))) {\n return [asset, ...acc];\n }\n\n return acc;\n },\n [],\n );\n\n const balances = await Promise.all(\n uniqueAssets.map(async (asset: AssetConfig) => {\n const decimals = await getDecimals({\n address,\n asset: asset.asset,\n chain,\n config: asset,\n polkadot,\n });\n\n // eslint-disable-next-line no-await-in-loop\n const balance = await getBalance({\n address,\n chain,\n config: asset,\n decimals,\n polkadot,\n });\n\n const assetAmount = AssetAmount.fromAsset(asset.asset, {\n amount: balance,\n decimals,\n });\n\n return assetAmount;\n }),\n );\n\n return balances;\n}\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport {\n Address,\n HttpTransport,\n PublicClient,\n createPublicClient,\n http,\n} from 'viem';\nimport { EvmParachain } from '@moonbeam-network/xcm-types';\nimport { BalanceContractInterface } from '../../contract.interfaces';\nimport { ERC20_ABI } from './Erc20ABI';\n\nexport class Erc20 implements BalanceContractInterface {\n readonly address: Address;\n\n readonly #config: ContractConfig;\n\n readonly #client: PublicClient<HttpTransport>;\n\n constructor(config: ContractConfig, chain: EvmParachain) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n\n this.address = config.address as Address;\n this.#config = config;\n this.#client = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async getBalance(): Promise<bigint> {\n const address = this.#config.args[0] as Address;\n\n return this.#client.readContract({\n abi: ERC20_ABI,\n address: this.address,\n args: [address],\n functionName: 'balanceOf',\n });\n }\n\n async getDecimals(): Promise<number> {\n return this.#client.readContract({\n abi: ERC20_ABI,\n address: this.address,\n functionName: 'decimals',\n });\n }\n}\n","export const ERC20_ABI = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [\n {\n name: '',\n type: 'string',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n {\n name: '_spender',\n type: 'address',\n },\n {\n name: '_value',\n type: 'uint256',\n },\n ],\n name: 'approve',\n outputs: [\n {\n name: '',\n type: 'bool',\n },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n name: '',\n type: 'uint256',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n {\n name: '_from',\n type: 'address',\n },\n {\n name: '_to',\n type: 'address',\n },\n {\n name: '_value',\n type: 'uint256',\n },\n ],\n name: 'transferFrom',\n outputs: [\n {\n name: '',\n type: 'bool',\n },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [\n {\n name: '',\n type: 'uint8',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n name: 'balance',\n type: 'uint256',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n name: '',\n type: 'string',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n {\n name: '_to',\n type: 'address',\n },\n {\n name: '_value',\n type: 'uint256',\n },\n ],\n name: 'transfer',\n outputs: [\n {\n name: '',\n type: 'bool',\n },\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address',\n },\n {\n name: '_spender',\n type: 'address',\n },\n ],\n name: 'allowance',\n outputs: [\n {\n name: '',\n type: 'uint256',\n },\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n payable: true,\n stateMutability: 'payable',\n type: 'fallback',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address',\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'from',\n type: 'address',\n },\n {\n indexed: true,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n] as const;\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Address, Hash, PublicClient, createPublicClient, http } from 'viem';\nimport { EvmParachain } from '@moonbeam-network/xcm-types';\nimport { EvmSigner } from '../../../sdk.interfaces';\nimport { TransferContractInterface } from '../../contract.interfaces';\nimport { XTOKENS_ABI } from './XtokensABI';\n\nexport class Xtokens implements TransferContractInterface {\n readonly defaultMoonChainAddress =\n '0x0000000000000000000000000000000000000804';\n\n readonly address: string;\n\n readonly #config: ContractConfig;\n\n readonly #publicClient: PublicClient;\n\n constructor(config: ContractConfig, chain: EvmParachain, address?: string) {\n this.#config = config;\n this.address = address ?? this.defaultMoonChainAddress;\n this.#publicClient = createPublicClient({\n chain: chain.getViemChain(),\n transport: http(),\n });\n }\n\n async transfer(signer: EvmSigner): Promise<Hash> {\n const { request } = await this.#publicClient.simulateContract({\n abi: XTOKENS_ABI,\n account: signer.account,\n address: this.address as Address,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: this.#config.args as any,\n functionName: this.#config.func as 'transfer',\n });\n const hash = await signer.writeContract(request);\n\n return hash;\n }\n\n async getFee(amount: bigint, address: string): Promise<bigint> {\n if (amount === 0n) {\n return 0n;\n }\n\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 try {\n const gas = await this.#publicClient.estimateContractGas({\n abi: XTOKENS_ABI,\n account: address as Address,\n address: this.address as Address,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: this.#config.args as any,\n functionName: this.#config.func as 'transfer',\n });\n\n const gasPrice = await this.getGasPrice();\n\n return gas * gasPrice;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n throw new Error(\n \"Can't get a fee. Make sure that you have enough balance!\",\n );\n }\n }\n\n private async getGasPrice() {\n return this.#publicClient.getGasPrice();\n }\n}\n","export const XTOKENS_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'currencyAddress',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n components: [\n {\n internalType: 'uint8',\n name: 'parents',\n type: 'uint8',\n },\n {\n internalType: 'bytes[]',\n name: 'interior',\n type: 'bytes[]',\n },\n ],\n internalType: 'struct Xtokens.Multilocation',\n name: 'destination',\n type: 'tuple',\n },\n {\n internalType: 'uint64',\n name: 'weight',\n type: 'uint64',\n },\n ],\n name: 'transfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: 'address',\n name: 'currencyAddress',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n internalType: 'struct Xtokens.Currency[]',\n name: 'currencies',\n type: 'tuple[]',\n },\n {\n internalType: 'uint32',\n name: 'feeItem',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'uint8',\n name: 'parents',\n type: 'uint8',\n },\n {\n internalType: 'bytes[]',\n name: 'interior',\n type: 'bytes[]',\n },\n ],\n internalType: 'struct Xtokens.Multilocation',\n name: 'destination',\n type: 'tuple',\n },\n {\n internalType: 'uint64',\n name: 'weight',\n type: 'uint64',\n },\n ],\n name: 'transferMultiCurrencies',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { AnyChain } from '@moonbeam-network/xcm-types';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\n\nexport function createContract(\n chain: AnyChain,\n config: ContractConfig,\n): TransferContractInterface | BalanceContractInterface {\n if (!chain.isEvmParachain()) {\n throw new Error('Chain is not an EVM parachain');\n }\n\n if (config.module === 'Erc20') {\n return new Erc20(config, chain);\n }\n\n if (config.module === 'Xtokens') {\n const address =\n 'contracts' in chain ? chain?.contracts?.Xtokens : undefined;\n\n return new Xtokens(config, chain, address);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n","import {\n CallType,\n ContractConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { AssetConfig } from '@moonbeam-network/xcm-config';\nimport { AnyChain, Asset } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport { BalanceContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset?: Asset;\n chain: AnyChain;\n config: AssetConfig;\n decimals: number;\n polkadot: PolkadotService;\n}\n\nexport type GetDecimalsParams = Omit<GetBalancesParams, 'decimals'> & {\n assetBuiltConfig?: SubstrateQueryConfig | ContractConfig;\n};\n\nexport async function getBalance({\n address,\n chain,\n config,\n decimals,\n polkadot,\n}: GetBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\n if (cfg.type === CallType.Substrate) {\n const balance = await polkadot.query(cfg as SubstrateQueryConfig);\n return chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, decimals)\n : balance;\n }\n\n const contract = createContract(chain, cfg) as BalanceContractInterface;\n const balance = await contract.getBalance();\n\n return balance;\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n polkadot,\n chain,\n assetBuiltConfig,\n}: GetDecimalsParams) {\n const cfg =\n assetBuiltConfig ||\n config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(asset || config.asset),\n });\n\n if (cfg.type === CallType.Substrate) {\n return polkadot.getAssetDecimals(asset || config.asset);\n }\n\n const contract = createContract(chain, cfg) as BalanceContractInterface;\n\n return contract.getDecimals();\n}\n\nexport async function getMin(config: AssetConfig, polkadot: PolkadotService) {\n if (config.min) {\n return polkadot.query(\n config.min.build({ asset: polkadot.chain.getMinAssetId(config.asset) }),\n );\n }\n\n const min = polkadot.chain.getAssetMin(config.asset);\n\n if (min) {\n const decimals = await polkadot.getAssetDecimals(config.asset);\n\n return toBigInt(min, decimals);\n }\n\n return 0n;\n}\n","/* eslint-disable sort-keys */\nimport {\n ConfigBuilder,\n ConfigService,\n IConfigService,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n Asset,\n AssetAmount,\n Ecosystem,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\nimport { PolkadotService } from './polkadot';\nimport { Signers, TransferData } from './sdk.interfaces';\n\nexport interface SdkOptions extends Partial<Signers> {\n configService?: IConfigService;\n}\n\nexport function Sdk(options?: SdkOptions) {\n const configService = options?.configService ?? new ConfigService();\n\n return {\n assets(ecosystem?: Ecosystem) {\n const { assets, asset } = ConfigBuilder(configService).assets(ecosystem);\n\n return {\n assets,\n asset(keyOrAsset: string | Asset) {\n const { sourceChains, source } = asset(keyOrAsset);\n\n return {\n sourceChains,\n source(keyOrChain: string | AnyChain) {\n const { destinationChains, destination } = source(keyOrChain);\n\n return {\n destinationChains,\n destination(destKeyOrChain: string | AnyChain) {\n return {\n async accounts(\n sourceAddress: string,\n destinationAddress: string,\n ): Promise<TransferData> {\n return gtd({\n ...options,\n configService,\n destinationAddress,\n sourceAddress,\n transferConfig: destination(destKeyOrChain).build(),\n });\n },\n };\n },\n };\n },\n };\n },\n };\n },\n async getTransferData({\n destinationAddress,\n destinationKeyOrChain,\n evmSigner,\n keyOrAsset,\n polkadotSigner,\n sourceAddress,\n sourceKeyOrChain,\n }: SdkTransferParams): Promise<TransferData> {\n return gtd({\n configService,\n destinationAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig: ConfigBuilder(configService)\n .assets()\n .asset(keyOrAsset)\n .source(sourceKeyOrChain)\n .destination(destinationKeyOrChain)\n .build(),\n });\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyChain,\n address: string,\n): Promise<AssetAmount[]> {\n const configService = new ConfigService();\n const chainsConfig = configService.getChainConfig(chain);\n const assets = chainsConfig.getAssetsConfigs();\n\n const polkadot = await PolkadotService.create(chain, configService);\n\n const balances = await getAssetsBalances({\n chain,\n assets,\n address,\n polkadot,\n });\n\n return balances;\n}\n\nexport interface SdkTransferParams extends Partial<Signers> {\n destinationAddress: string;\n destinationKeyOrChain: string | AnyChain;\n keyOrAsset: string | Asset;\n sourceAddress: string;\n sourceKeyOrChain: string | AnyChain;\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { IConfigService, TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport { TransferContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport {\n DestinationChainTransferData,\n Signers,\n TransferData,\n} from '../sdk.interfaces';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\n\nexport interface GetTransferDataParams extends Partial<Signers> {\n configService: IConfigService;\n destinationAddress: string;\n sourceAddress: string;\n transferConfig: TransferConfig;\n}\n\nexport async function getTransferData({\n configService,\n destinationAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig,\n}: GetTransferDataParams): Promise<TransferData> {\n const [destPolkadot, srcPolkadot] = await PolkadotService.createMulti(\n [transferConfig.destination.chain, transferConfig.source.chain],\n configService,\n );\n\n const destination = await getDestinationData({\n destinationAddress,\n polkadot: destPolkadot,\n transferConfig,\n });\n\n const destinationFee = await getDestinationFeeWithSourceDecimals(\n srcPolkadot,\n destination.fee,\n );\n\n const source = await getSourceData({\n destinationAddress,\n destinationFee,\n polkadot: srcPolkadot,\n sourceAddress,\n transferConfig,\n });\n\n return {\n destination,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, source.balance.decimals).toString(),\n );\n const result = bigAmount.minus(\n source.balance.isSame(destinationFee) ? destinationFee.toBig() : Big(0),\n );\n\n return source.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n /**\n * Right now it will be always true\n * because all current asset can be sent both directions\n * and our configuration need destination config.\n */\n isSwapPossible: true,\n max: source.max,\n min: getMin(destination),\n source,\n async swap() {\n return getTransferData({\n configService,\n destinationAddress: sourceAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress: destinationAddress,\n transferConfig: {\n ...transferConfig,\n destination: transferConfig.source,\n source: transferConfig.destination,\n },\n });\n },\n async transfer(amount, signers: Partial<Signers>): Promise<string> {\n const bigintAmount = toBigInt(amount, source.balance.decimals);\n const {\n asset,\n source: { chain, config },\n } = transferConfig;\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n if (contract) {\n const signer = evmSigner || signers.evmSigner;\n\n if (!signer) {\n throw new Error('EVM Signer must be provided');\n }\n\n return (\n createContract(chain, contract) as TransferContractInterface\n ).transfer(signer);\n }\n\n if (extrinsic) {\n const signer = polkadotSigner || signers.polkadotSigner;\n\n if (!signer) {\n throw new Error('Polkadot signer must be provided');\n }\n\n return srcPolkadot.transfer(sourceAddress, extrinsic, signer);\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n\nfunction 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 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 async function getDestinationFeeWithSourceDecimals(\n sourcePolkadot: PolkadotService,\n destinationFee: AssetAmount,\n): Promise<AssetAmount> {\n const destinationFeeDecimals =\n await sourcePolkadot.getAssetDecimals(destinationFee);\n const destinationFeeAsset =\n destinationFee.decimals === destinationFeeDecimals\n ? destinationFee\n : destinationFee.copyWith({\n amount: convertDecimals(\n destinationFee.amount,\n destinationFee.decimals,\n destinationFeeDecimals,\n ),\n decimals: destinationFeeDecimals,\n });\n\n return destinationFeeAsset;\n}\n","import '@polkadot/api-augment';\n\nimport {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { IConfigService, eq, equilibrium } from '@moonbeam-network/xcm-config';\nimport {\n AnyParachain,\n Asset,\n AssetAmount,\n ChainAssetId,\n} from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport { ApiPromise } from '@polkadot/api';\nimport type { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { Option, u128, u8 } from '@polkadot/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { AssetMetadata } from './PolkadotService.interfaces';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n readonly configService: IConfigService;\n\n constructor(\n api: ApiPromise,\n chain: AnyParachain,\n configService: IConfigService,\n ) {\n this.api = api;\n this.chain = chain;\n this.configService = configService;\n }\n\n static async create(\n chain: AnyParachain,\n configService: IConfigService,\n ): Promise<PolkadotService> {\n return new PolkadotService(\n await getPolkadotApi(chain.ws),\n chain,\n configService,\n );\n }\n\n static async createMulti(\n chains: AnyParachain[],\n configService: IConfigService,\n ): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) =>\n PolkadotService.create(chain, configService),\n ),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get asset(): Asset {\n const symbol = this.api.registry.chainTokens.at(0);\n const key = symbol?.toString().toLowerCase();\n\n // TODO: Remove this once Equilibrium is updated\n // or find better way if issue appears on other chains\n if (key === 'token' && [equilibrium.key].includes(this.chain.key)) {\n return eq;\n }\n\n if (!key) {\n throw new Error('No native symbol key found');\n }\n\n const asset = this.configService.getAsset(key);\n\n if (!asset) {\n throw new Error(`No asset found for key \"${key}\" and symbol \"${symbol}\"`);\n }\n\n return asset;\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.fromAsset(this.asset, {\n amount,\n decimals: this.decimals,\n });\n }\n\n async getAssetMeta(\n asset: ChainAssetId,\n ): Promise<{ symbol: string; decimals: number } | undefined> {\n const fn =\n this.api.query.assets?.metadata ||\n this.api.query.assetRegistry?.assets ||\n this.api.query.assetRegistry?.metadata ||\n this.api.query.assetRegistry?.currencyMetadatas ||\n this.api.query.assetRegistry?.assetMetadatas ||\n this.api.query.assetRegistry?.assetMetadataMap;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as AssetMetadata | Option<AssetMetadata>;\n const unwrapped = 'unwrapOrDefault' in data ? data.unwrapOrDefault() : data;\n const decimals =\n 'unwrapOrDefault' in unwrapped.decimals\n ? unwrapped.decimals.unwrapOrDefault()\n : unwrapped.decimals;\n\n return {\n decimals: decimals.toNumber(),\n symbol: unwrapped.symbol.toString(),\n };\n }\n\n async getAssetDecimalsFromQuery(\n asset: ChainAssetId,\n ): Promise<number | undefined> {\n const fn = this.api.query.assetsRegistry?.assetDecimals;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as Option<u8>;\n\n return data.unwrapOrDefault().toNumber();\n }\n\n async getAssetDecimals(asset: Asset): Promise<number> {\n const metaId = this.chain.getMetadataAssetId(asset);\n\n const decimals =\n this.chain.getAssetDecimals(asset) ||\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.decimals; // TODO remove this and handle it separately only for native assets\n\n if (!decimals) {\n throw new Error(`No decimals found for asset ${asset.originSymbol}`);\n }\n\n return decimals;\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 async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const info = await extrinsic.paymentInfo(account, { nonce: -1 });\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n ): Promise<string> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const hash = await extrinsic.signAndSend(\n this.#isSigner(signer) ? account : signer,\n {\n nonce: -1,\n signer: this.#isSigner(signer) ? signer : undefined,\n },\n );\n\n return hash.toString();\n }\n\n // eslint-disable-next-line class-methods-use-this\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { FeeConfigBuilder } from '@moonbeam-network/xcm-builder';\nimport { TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport { PolkadotService } from '../polkadot';\nimport { DestinationChainTransferData } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n polkadot,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const {\n asset,\n destination: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n const min = await getMin(config, polkadot);\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n\n const feeAmount = await getFee({\n address: destinationAddress,\n config: transferConfig,\n polkadot,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\n return {\n balance: balanceAmount,\n chain,\n existentialDeposit,\n fee: feeAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeParams {\n address: string;\n config: TransferConfig;\n polkadot: PolkadotService;\n}\n\nexport async function getFee({\n config,\n polkadot,\n}: GetFeeParams): Promise<AssetAmount> {\n const { amount, asset } = config.source.config.destinationFee;\n // TODO we have to consider correctly here when an asset is ERC20 to get it from contract\n const decimals = await polkadot.getAssetDecimals(asset);\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals,\n });\n\n if (Number.isFinite(amount)) {\n return zeroAmount.copyWith({\n amount: toBigInt(amount as number, decimals),\n });\n }\n\n const cfg = (amount as FeeConfigBuilder).build({\n api: polkadot.api,\n asset: polkadot.chain.getAssetId(asset),\n });\n\n return zeroAmount.copyWith({\n amount: await cfg.call(),\n });\n}\n"],"mappings":"AACA,OACE,YAAAA,OAIK,gCAOP,OAEE,eAAAC,MAEK,8BACP,OACE,mBAAAC,EACA,YAAAC,GACA,aAAAC,OACK,8BACP,OAAOC,MAAS,SCtBhB,OAIE,sBAAAC,GACA,QAAAC,OACK,OCPA,IAAMC,EAAY,CACvB,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,QACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,WACN,KAAM,SACR,EACA,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,MACR,CACF,EACA,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,QACN,KAAM,SACR,EACA,CACE,KAAM,MACN,KAAM,SACR,EACA,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,MACR,CACF,EACA,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,KAAM,UACN,KAAM,SACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,KAAM,GACN,KAAM,QACR,CACF,EACA,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EA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","names":["CallType","AssetAmount","convertDecimals","toBigInt","toDecimal","Big","createPublicClient","http","ERC20_ABI","Erc20","#config","#client","config","chain","createPublicClient","http","address","ERC20_ABI","createPublicClient","http","XTOKENS_ABI","Xtokens","#config","#publicClient","config","chain","address","createPublicClient","http","signer","request","XTOKENS_ABI","amount","gas","gasPrice","error","createContract","chain","config","_a","Erc20","address","Xtokens","CallType","convertDecimals","toBigInt","getBalance","address","chain","config","decimals","polkadot","cfg","CallType","balance","convertDecimals","createContract","getDecimals","asset","assetBuiltConfig","getMin","min","toBigInt","getSourceData","transferConfig","destinationAddress","destinationFee","polkadot","sourceAddress","_a","_b","_c","_d","_e","_f","_g","asset","destination","chain","config","zeroAmount","AssetAmount","getDecimals","feeAsset","feeCfg","feeDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalance","destinationFeeBalance","min","getMin","extrinsic","contract","destinationFeeBalanceAmount","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","minAmount","maxAmount","getMax","address","decimals","feeConfig","cfg","CallType","createContract","decimalsFromContract","balanceFromContract","convertDecimals","destinationFeeConfig","toDecimal","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","totalFee","error","toBigInt","result","Big","getAssetsBalances","assets","uniqueAssets","acc","a","ConfigBuilder","ConfigService","convertDecimals","toBigInt","Big","eq","equilibrium","AssetAmount","getPolkadotApi","PolkadotService","_PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","_f","fn","data","unwrapped","metaId","decimals","config","response","account","args","signer","#isSigner","AssetAmount","toBigInt","getDestinationData","transferConfig","destinationAddress","polkadot","asset","chain","config","zeroAmount","AssetAmount","getDecimals","balance","getBalance","min","getMin","balanceAmount","existentialDeposit","feeAmount","getFee","minAmount","amount","decimals","toBigInt","cfg","getTransferData","configService","destinationAddress","evmSigner","polkadotSigner","sourceAddress","transferConfig","destPolkadot","srcPolkadot","PolkadotService","destination","getDestinationData","destinationFee","getDestinationFeeWithSourceDecimals","source","getSourceData","amount","result","Big","toBigInt","getMin","signers","_a","_b","bigintAmount","asset","chain","config","contract","extrinsic","signer","createContract","balance","existentialDeposit","fee","min","sourcePolkadot","destinationFeeDecimals","convertDecimals","Sdk","options","configService","ConfigService","ecosystem","assets","asset","ConfigBuilder","keyOrAsset","sourceChains","source","keyOrChain","destinationChains","destination","destKeyOrChain","sourceAddress","destinationAddress","getTransferData","destinationKeyOrChain","evmSigner","polkadotSigner","sourceKeyOrChain","getParachainBalances","chain","address","polkadot","PolkadotService","getAssetsBalances"]}
1
+ {"version":3,"sources":["../src/getTransferData/getSourceData.ts","../src/contract/contracts/Erc20/Erc20.ts","../src/contract/contract.utils.ts","../src/contract/contracts/Erc20/Erc20ABI.json","../src/contract/contracts/Xtokens/Xtokens.ts","../src/contract/contracts/Xtokens/XtokensABI.json","../src/contract/contracts/Erc20/Erc20Public.ts","../src/contract/contract.factory.ts","../src/getTransferData/getTransferData.utils.ts","../src/sdk.ts","../src/getTransferData/getTransferData.ts","../src/polkadot/PolkadotService.ts","../src/getTransferData/getDestinationData.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n CallType,\n ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport {\n AssetConfig,\n DestinationFeeConfig,\n FeeAssetConfig,\n TransferConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n AssetAmount,\n EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport {\n convertDecimals,\n toBigInt,\n toDecimal,\n} from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n createContract,\n createContractWithoutSigner,\n} from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport {\n GetBalancesParams,\n getBalance,\n getDecimals,\n getMin,\n} from './getTransferData.utils';\n\nexport interface GetSourceDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n destinationFee: AssetAmount;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getSourceData({\n transferConfig,\n destinationAddress,\n destinationFee,\n polkadot,\n sourceAddress,\n evmSigner,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const feeAsset = polkadot.chain.getBalanceAssetId(\n config?.fee?.asset || config.asset,\n );\n\n const feeCfg = config.fee?.balance.build({\n address: destinationAddress,\n asset: feeAsset,\n });\n\n const feeDecimals = config.fee?.asset\n ? await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n assetBuiltConfig: feeCfg,\n chain,\n config,\n polkadot,\n })\n : undefined;\n\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: feeDecimals || 0,\n })\n : zeroAmount;\n\n const zeroDestinationFeeAmount = config.destinationFee?.asset\n ? AssetAmount.fromAsset(config.destinationFee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.destinationFee.asset,\n chain,\n config,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n\n const feeBalance = await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroFeeAmount.decimals,\n feeConfig: config.fee,\n polkadot,\n });\n\n const destinationFeeBalance = config.asset.isEqual(\n config.destinationFee.asset,\n )\n ? balance\n : await getFeeBalance({\n address: sourceAddress,\n balance,\n chain,\n decimals: zeroDestinationFeeAmount.decimals,\n feeConfig: config.destinationFee,\n polkadot,\n });\n\n const min = await getMin(config, polkadot);\n\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: balance,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n\n const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\n });\n\n const fee = await getFee({\n balance,\n chain,\n contract,\n decimals: zeroFeeAmount.decimals,\n destinationFeeBalanceAmount,\n destinationFeeConfig: config.destinationFee,\n evmSigner,\n extrinsic,\n feeConfig: config.fee,\n polkadot,\n sourceAddress,\n });\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n const feeAmount = zeroFeeAmount.copyWith({ amount: fee });\n const feeBalanceAmount = zeroFeeAmount.copyWith({ amount: feeBalance });\n\n const minAmount = zeroAmount.copyWith({ amount: min });\n\n const maxAmount = getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n });\n\n return {\n balance: balanceAmount,\n chain,\n destinationFeeBalance: destinationFeeBalanceAmount,\n existentialDeposit,\n fee: feeAmount,\n feeBalance: feeBalanceAmount,\n max: maxAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeBalanceParams\n extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {\n balance: bigint;\n feeConfig: FeeAssetConfig | undefined;\n}\n\nexport async function getFeeBalance({\n address,\n balance,\n chain,\n decimals,\n feeConfig,\n polkadot,\n}: GetFeeBalanceParams) {\n if (!feeConfig) {\n return balance;\n }\n\n const cfg = feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig;\n\n if (cfg.type === CallType.Evm) {\n const contract = createContractWithoutSigner(\n cfg,\n chain as EvmParachain,\n ) as BalanceContractInterface;\n\n const decimalsFromContract = await contract.getDecimals();\n const balanceFromContract = await contract.getBalance();\n\n return chain.usesChainDecimals\n ? convertDecimals(\n balanceFromContract,\n polkadot.decimals,\n decimalsFromContract,\n )\n : balanceFromContract;\n }\n\n const feeBalance = await polkadot.query(cfg);\n\n return chain.usesChainDecimals\n ? convertDecimals(feeBalance, polkadot.decimals, decimals)\n : feeBalance;\n}\n\nexport interface GetFeeParams {\n balance: bigint;\n contract?: ContractConfig;\n chain: AnyChain;\n decimals: number;\n evmSigner?: EvmSigner;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeAssetConfig;\n destinationFeeConfig?: DestinationFeeConfig;\n destinationFeeBalanceAmount?: AssetAmount;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n chain,\n contract,\n decimals,\n destinationFeeConfig,\n destinationFeeBalanceAmount,\n evmSigner,\n extrinsic,\n feeConfig,\n polkadot,\n sourceAddress,\n}: GetFeeParams): Promise<bigint> {\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n if (\n destinationFeeConfig &&\n destinationFeeBalanceAmount &&\n typeof destinationFeeConfig.amount === 'number'\n ) {\n const destinationFeeBalance = Number(\n toDecimal(\n destinationFeeBalanceAmount.amount,\n destinationFeeBalanceAmount.decimals,\n ),\n );\n if (\n destinationFeeBalance &&\n destinationFeeConfig.amount > destinationFeeBalance\n ) {\n throw new Error(\n `Can't get a fee, make sure you have ${destinationFeeConfig?.amount} ${destinationFeeConfig?.asset.originSymbol} in your source balance, needed for destination fees`,\n );\n }\n }\n\n return getContractFee({\n balance,\n chain: chain as EvmParachain,\n config: contract,\n decimals,\n evmSigner,\n });\n }\n\n if (extrinsic) {\n const extrinsicFee = await getExtrinsicFee(\n balance,\n extrinsic,\n polkadot,\n sourceAddress,\n );\n\n const xcmDeliveryFee = getXcmDeliveryFee(decimals, feeConfig);\n\n const totalFee = extrinsicFee + xcmDeliveryFee;\n\n return chain.usesChainDecimals\n ? convertDecimals(totalFee, polkadot.decimals, decimals)\n : totalFee;\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n}\n\nexport async function getContractFee({\n balance,\n config,\n decimals,\n evmSigner,\n chain,\n}: {\n balance: bigint;\n config: ContractConfig;\n decimals: number;\n evmSigner: EvmSigner;\n chain: EvmParachain;\n}): Promise<bigint> {\n const contract = createContract(\n config,\n evmSigner,\n chain,\n ) as TransferContractInterface;\n const fee = await contract.getFee(balance);\n\n return convertDecimals(fee, 18, decimals);\n}\n\nexport async function getExtrinsicFee(\n balance: bigint,\n extrinsic: ExtrinsicConfig,\n polkadot: PolkadotService,\n sourceAddress: string,\n): Promise<bigint> {\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 return await polkadot.getFee(sourceAddress, extrinsic);\n } catch (error) {\n if (balance) {\n throw error;\n }\n\n return 0n;\n }\n}\n\nfunction getXcmDeliveryFee(\n decimals: number,\n feeConfig?: FeeAssetConfig,\n): bigint {\n return feeConfig?.xcmDeliveryFeeAmount\n ? toBigInt(feeConfig.xcmDeliveryFeeAmount, decimals)\n : 0n;\n}\n\nexport interface GetMaxParams {\n balanceAmount: AssetAmount;\n existentialDeposit: AssetAmount;\n feeAmount: AssetAmount;\n minAmount: AssetAmount;\n}\n\nexport function getMax({\n balanceAmount,\n existentialDeposit,\n feeAmount,\n minAmount,\n}: GetMaxParams): AssetAmount {\n const result = balanceAmount\n .toBig()\n .minus(minAmount.toBig())\n .minus(\n balanceAmount.isSame(existentialDeposit)\n ? existentialDeposit.toBig()\n : Big(0),\n )\n .minus(balanceAmount.isSame(feeAmount) ? feeAmount.toBig() : Big(0));\n\n return balanceAmount.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\nexport interface GetAssetsBalancesParams {\n address: string;\n chain: AnyChain;\n assets: AssetConfig[];\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getAssetsBalances({\n address,\n chain,\n assets,\n polkadot,\n}: GetAssetsBalancesParams): Promise<AssetAmount[]> {\n const uniqueAssets = assets.reduce(\n (acc: AssetConfig[], asset: AssetConfig) => {\n if (!acc.some((a: AssetConfig) => a.asset.isEqual(asset.asset))) {\n return [asset, ...acc];\n }\n\n return acc;\n },\n [],\n );\n\n const balances = await Promise.all(\n uniqueAssets.map(async (asset: AssetConfig) => {\n const decimals = await getDecimals({\n address,\n asset: asset.asset,\n chain,\n config: asset,\n polkadot,\n });\n\n // eslint-disable-next-line no-await-in-loop\n const balance = await getBalance({\n address,\n chain,\n config: asset,\n decimals,\n polkadot,\n });\n\n const assetAmount = AssetAmount.fromAsset(asset.asset, {\n amount: balance,\n decimals,\n });\n\n return assetAmount;\n }),\n );\n\n return balances;\n}\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n createPublicClient,\n getContract,\n http,\n} from 'viem';\nimport { EvmSigner } from '../../../sdk.interfaces';\nimport { BalanceContractInterface } from '../../contract.interfaces';\nimport { isEthersContract, isEthersSigner } from '../../contract.utils';\nimport abi from './Erc20ABI.json';\n\ntype Erc20Contract = GetContractReturnType<typeof abi, PublicClient>;\n\nexport class Erc20 implements BalanceContractInterface {\n readonly address: string;\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | Erc20Contract;\n\n constructor(config: ContractConfig, signer: EvmSigner) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n this.address = config.address;\n\n this.#config = config;\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address as `0x${string}`,\n client: {\n public: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n wallet: signer,\n },\n });\n }\n\n async getBalance(): Promise<bigint> {\n if (isEthersContract(this.#contract)) {\n const balance = await this.#contract.balanceOf(...this.#config.args);\n return balance.toBigInt();\n }\n return this.#contract.read.balanceOf(\n this.#config.args,\n ) as unknown as bigint;\n }\n\n async getDecimals(): Promise<number> {\n const decimals = isEthersContract(this.#contract)\n ? await this.#contract.decimals()\n : this.#contract.read.decimals();\n\n return decimals;\n }\n}\n","import { Contract, Signer as EthersSigner } from 'ethers';\nimport { Abi, GetContractReturnType, WalletClient } from 'viem';\nimport { EvmSigner } from '../sdk.interfaces';\n\nexport function isEthersSigner(signer: EvmSigner): signer is EthersSigner {\n return 'provider' in signer;\n}\n\nexport function isWalletClient(signer: EvmSigner): signer is WalletClient {\n return 'chain' in signer;\n}\n\nexport function isEthersContract(\n contract: Contract | GetContractReturnType<Abi | readonly unknown[]>,\n): contract is Contract {\n return 'signer' in contract;\n}\n","[\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"name\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": false,\n \"inputs\": [\n {\n \"name\": \"_spender\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"approve\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": false,\n \"inputs\": [\n {\n \"name\": \"_from\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transferFrom\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"decimals\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint8\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [\n {\n \"name\": \"_owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"balanceOf\",\n \"outputs\": [\n {\n \"name\": \"balance\",\n \"type\": \"uint256\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [],\n \"name\": \"symbol\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"constant\": false,\n \"inputs\": [\n {\n \"name\": \"_to\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"constant\": true,\n \"inputs\": [\n {\n \"name\": \"_owner\",\n \"type\": \"address\"\n },\n {\n \"name\": \"_spender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"allowance\",\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"payable\": false,\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"payable\": true,\n \"stateMutability\": \"payable\",\n \"type\": \"fallback\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"name\": \"spender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Approval\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"name\": \"from\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Transfer\",\n \"type\": \"event\"\n }\n]\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract, TransactionResponse } from 'ethers';\nimport {\n Address,\n GetContractReturnType,\n PublicClient,\n WriteContractReturnType,\n createPublicClient,\n getContract,\n http,\n} from 'viem';\nimport { EvmSigner } from '../../../sdk.interfaces';\nimport { TransferContractInterface } from '../../contract.interfaces';\nimport { isEthersContract, isEthersSigner } from '../../contract.utils';\nimport abi from './XtokensABI.json';\n\ntype XtokensContract = GetContractReturnType<typeof abi, PublicClient>;\n\nexport class Xtokens implements TransferContractInterface {\n readonly defaultMoonChainAddress =\n '0x0000000000000000000000000000000000000804';\n\n readonly address: Address;\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | XtokensContract;\n\n readonly #signer: EvmSigner;\n\n constructor(config: ContractConfig, signer: EvmSigner, address?: Address) {\n this.#config = config;\n\n this.#signer = signer;\n\n this.address = address ?? this.defaultMoonChainAddress;\n\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address,\n client: {\n public: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n wallet: signer,\n },\n });\n }\n\n async transfer(): Promise<TransactionResponse | WriteContractReturnType> {\n if (isEthersContract(this.#contract)) {\n return this.#contract[this.#config.func](...this.#config.args);\n }\n\n return this.#contract.write[this.#config.func](this.#config.args);\n }\n\n async getEthersContractEstimatedGas(contract: Contract): Promise<bigint> {\n return contract[this.#config.func].estimateGas(...this.#config.args);\n }\n\n async getViemContractEstimatedGas(\n contract: XtokensContract,\n ): Promise<bigint> {\n if (!contract) {\n return 0n;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return contract.estimateGas[this.#config.func](this.#config.args as any);\n }\n\n async getFee(amount: bigint): Promise<bigint> {\n if (amount === 0n) {\n return 0n;\n }\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 try {\n const estimatedGas = isEthersContract(this.#contract)\n ? await this.getEthersContractEstimatedGas(this.#contract)\n : await this.getViemContractEstimatedGas(this.#contract);\n const gasPrice = await this.getGasPrice();\n return estimatedGas * gasPrice;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n throw new Error(\n \"Can't get a fee. Make sure that you have enough balance!\",\n );\n }\n }\n\n private async getGasPrice() {\n if (isEthersSigner(this.#signer)) {\n if (!this.#signer.provider) return 0n;\n const { gasPrice, maxPriorityFeePerGas } =\n await this.#signer.provider.getFeeData();\n\n return (gasPrice || 0n) + (maxPriorityFeePerGas || 0n);\n }\n\n const publicClient = createPublicClient({\n chain: this.#signer.chain,\n transport: http(),\n });\n\n return publicClient.getGasPrice();\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"currencyAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"parents\",\n \"type\": \"uint8\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"interior\",\n \"type\": \"bytes[]\"\n }\n ],\n \"internalType\": \"struct Xtokens.Multilocation\",\n \"name\": \"destination\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"weight\",\n \"type\": \"uint64\"\n }\n ],\n \"name\": \"transfer\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"currencyAddress\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct Xtokens.Currency[]\",\n \"name\": \"currencies\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"uint32\",\n \"name\": \"feeItem\",\n \"type\": \"uint32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint8\",\n \"name\": \"parents\",\n \"type\": \"uint8\"\n },\n {\n \"internalType\": \"bytes[]\",\n \"name\": \"interior\",\n \"type\": \"bytes[]\"\n }\n ],\n \"internalType\": \"struct Xtokens.Multilocation\",\n \"name\": \"destination\",\n \"type\": \"tuple\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"weight\",\n \"type\": \"uint64\"\n }\n ],\n \"name\": \"transferMultiCurrencies\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Chain, PublicClient, createPublicClient, http } from 'viem';\nimport { BalanceContractInterface } from '../../contract.interfaces';\nimport abi from './Erc20ABI.json';\n\nexport class Erc20Public implements BalanceContractInterface {\n readonly address: string;\n\n readonly #config: ContractConfig;\n\n readonly #publicClient: PublicClient;\n\n constructor(config: ContractConfig, chain: Chain) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n this.address = config.address;\n\n this.#config = config;\n\n this.#publicClient = createPublicClient({\n chain,\n transport: http(),\n });\n }\n\n async getBalance(): Promise<bigint> {\n const data = await this.#publicClient.readContract({\n abi,\n address: this.#config.address as `0x${string}`,\n args: this.#config.args,\n functionName: 'balanceOf',\n });\n\n return data as unknown as bigint;\n }\n\n async getDecimals(): Promise<number> {\n const data = await this.#publicClient.readContract({\n abi,\n address: this.#config.address as `0x${string}`,\n functionName: 'decimals',\n });\n\n return data as unknown as number;\n }\n}\n","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { AnyChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport { EvmSigner } from '../sdk.interfaces';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\nimport { Erc20Public } from './contracts/Erc20/Erc20Public';\n\nexport function createContractWithSigner(\n config: ContractConfig,\n signer: EvmSigner,\n chain?: AnyChain,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20(config, signer);\n }\n\n if (config.module === 'Xtokens') {\n if (chain && 'contracts' in chain) {\n const address = chain?.contracts?.Xtokens;\n\n return new Xtokens(config, signer, address);\n }\n\n return new Xtokens(config, signer);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n\nexport function createContractWithoutSigner(\n config: ContractConfig,\n chain: EvmParachain,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20Public(config, chain.getViemChain());\n }\n\n throw new Error(`Public Contract ${config.module} not found`);\n}\n\nexport function createContract(\n config: ContractConfig,\n signer: EvmSigner | undefined,\n chain: AnyChain,\n): TransferContractInterface | BalanceContractInterface {\n return signer\n ? createContractWithSigner(config, signer, chain)\n : createContractWithoutSigner(config, chain as EvmParachain);\n}\n","import {\n CallType,\n ContractConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { AssetConfig } from '@moonbeam-network/xcm-config';\nimport { AnyChain, Asset, EvmParachain } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport {\n BalanceContractInterface,\n createContractWithoutSigner,\n} from '../contract';\nimport { PolkadotService } from '../polkadot';\n\nexport interface GetBalancesParams {\n address: string;\n asset?: Asset;\n chain: AnyChain;\n config: AssetConfig;\n decimals: number;\n polkadot: PolkadotService;\n}\n\nexport type GetDecimalsParams = Omit<GetBalancesParams, 'decimals'> & {\n assetBuiltConfig?: SubstrateQueryConfig | ContractConfig;\n};\n\nexport async function getBalance({\n address,\n chain,\n config,\n decimals,\n polkadot,\n}: GetBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\n if (cfg.type === CallType.Substrate) {\n const balance = await polkadot.query(cfg as SubstrateQueryConfig);\n return chain.usesChainDecimals\n ? convertDecimals(balance, polkadot.decimals, decimals)\n : balance;\n }\n\n const contract = createContractWithoutSigner(\n cfg,\n chain as EvmParachain,\n ) as BalanceContractInterface;\n\n const balance = await contract.getBalance();\n\n return balance;\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n polkadot,\n chain,\n assetBuiltConfig,\n}: GetDecimalsParams) {\n const cfg =\n assetBuiltConfig ||\n config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(asset || config.asset),\n });\n\n if (cfg.type === CallType.Substrate) {\n return polkadot.getAssetDecimals(asset || config.asset);\n }\n\n const contract = createContractWithoutSigner(\n cfg,\n chain as EvmParachain,\n ) as BalanceContractInterface;\n\n return contract.getDecimals();\n}\n\nexport async function getMin(config: AssetConfig, polkadot: PolkadotService) {\n if (config.min) {\n return polkadot.query(\n config.min.build({ asset: polkadot.chain.getMinAssetId(config.asset) }),\n );\n }\n\n const min = polkadot.chain.getAssetMin(config.asset);\n\n if (min) {\n const decimals = await polkadot.getAssetDecimals(config.asset);\n\n return toBigInt(min, decimals);\n }\n\n return 0n;\n}\n","/* eslint-disable sort-keys */\nimport {\n ConfigBuilder,\n ConfigService,\n IConfigService,\n} from '@moonbeam-network/xcm-config';\nimport {\n AnyChain,\n Asset,\n AssetAmount,\n Ecosystem,\n} from '@moonbeam-network/xcm-types';\nimport { getAssetsBalances } from './getTransferData/getSourceData';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\nimport { PolkadotService } from './polkadot';\nimport { Signers, TransferData } from './sdk.interfaces';\n\nexport interface SdkOptions extends Partial<Signers> {\n configService?: IConfigService;\n}\n\nexport function Sdk(options?: SdkOptions) {\n const configService = options?.configService ?? new ConfigService();\n\n return {\n assets(ecosystem?: Ecosystem) {\n const { assets, asset } = ConfigBuilder(configService).assets(ecosystem);\n\n return {\n assets,\n asset(keyOrAsset: string | Asset) {\n const { sourceChains, source } = asset(keyOrAsset);\n\n return {\n sourceChains,\n source(keyOrChain: string | AnyChain) {\n const { destinationChains, destination } = source(keyOrChain);\n\n return {\n destinationChains,\n destination(destKeyOrChain: string | AnyChain) {\n return {\n async accounts(\n sourceAddress: string,\n destinationAddress: string,\n signers?: Partial<Signers>,\n ): Promise<TransferData> {\n return gtd({\n ...options,\n configService,\n destinationAddress,\n evmSigner: signers?.evmSigner ?? signers?.ethersSigner,\n sourceAddress,\n transferConfig: destination(destKeyOrChain).build(),\n polkadotSigner: signers?.polkadotSigner,\n });\n },\n };\n },\n };\n },\n };\n },\n };\n },\n async getTransferData({\n destinationAddress,\n destinationKeyOrChain,\n ethersSigner,\n evmSigner,\n keyOrAsset,\n polkadotSigner,\n sourceAddress,\n sourceKeyOrChain,\n }: SdkTransferParams): Promise<TransferData> {\n return gtd({\n configService,\n destinationAddress,\n evmSigner: evmSigner ?? ethersSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig: ConfigBuilder(configService)\n .assets()\n .asset(keyOrAsset)\n .source(sourceKeyOrChain)\n .destination(destinationKeyOrChain)\n .build(),\n });\n },\n };\n}\n\nexport async function getParachainBalances(\n chain: AnyChain,\n address: string,\n): Promise<AssetAmount[]> {\n const configService = new ConfigService();\n const chainsConfig = configService.getChainConfig(chain);\n const assets = chainsConfig.getAssetsConfigs();\n\n const polkadot = await PolkadotService.create(chain, configService);\n\n const balances = await getAssetsBalances({\n chain,\n assets,\n address,\n polkadot,\n });\n\n return balances;\n}\n\nexport interface SdkTransferParams extends Partial<Signers> {\n destinationAddress: string;\n destinationKeyOrChain: string | AnyChain;\n keyOrAsset: string | Asset;\n sourceAddress: string;\n sourceKeyOrChain: string | AnyChain;\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { IConfigService, TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { convertDecimals, toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport { TransactionResponse } from 'ethers';\nimport { TransferContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport {\n DestinationChainTransferData,\n Signers,\n TransferData,\n} from '../sdk.interfaces';\nimport { getDestinationData } from './getDestinationData';\nimport { getSourceData } from './getSourceData';\n\nexport interface GetTransferDataParams extends Partial<Signers> {\n configService: IConfigService;\n destinationAddress: string;\n sourceAddress: string;\n transferConfig: TransferConfig;\n}\n\nexport async function getTransferData({\n configService,\n destinationAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress,\n transferConfig,\n}: GetTransferDataParams): Promise<TransferData> {\n const [destPolkadot, srcPolkadot] = await PolkadotService.createMulti(\n [transferConfig.destination.chain, transferConfig.source.chain],\n configService,\n );\n\n const destination = await getDestinationData({\n destinationAddress,\n polkadot: destPolkadot,\n transferConfig,\n });\n\n const destinationFee = await getDestinationFeeWithSourceDecimals(\n srcPolkadot,\n destination.fee,\n );\n\n const source = await getSourceData({\n destinationAddress,\n destinationFee,\n evmSigner,\n polkadot: srcPolkadot,\n sourceAddress,\n transferConfig,\n });\n\n return {\n destination,\n getEstimate(amount: number | string) {\n const bigAmount = Big(\n toBigInt(amount, source.balance.decimals).toString(),\n );\n const result = bigAmount.minus(\n source.balance.isSame(destinationFee) ? destinationFee.toBig() : Big(0),\n );\n\n return source.balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n },\n /**\n * Right now it will be always true\n * because all current asset can be sent both directions\n * and our configuration need destination config.\n */\n isSwapPossible: true,\n max: source.max,\n min: getMin(destination),\n source,\n async swap() {\n return getTransferData({\n configService,\n destinationAddress: sourceAddress,\n evmSigner,\n polkadotSigner,\n sourceAddress: destinationAddress,\n transferConfig: {\n ...transferConfig,\n destination: transferConfig.source,\n source: transferConfig.destination,\n },\n });\n },\n async transfer(amount): Promise<string> {\n const bigintAmount = toBigInt(amount, source.balance.decimals);\n const {\n asset,\n source: { chain, config },\n } = transferConfig;\n\n const contract = config.contract?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n });\n const extrinsic = config.extrinsic?.build({\n address: destinationAddress,\n amount: bigintAmount,\n asset: chain.getAssetId(asset),\n destination: destination.chain,\n fee: destinationFee.amount,\n feeAsset: chain.getAssetId(destinationFee),\n palletInstance: chain.getAssetPalletInstance(asset),\n source: chain,\n });\n\n if (contract) {\n if (!evmSigner) {\n throw new Error('EVM Signer must be provided');\n }\n\n return (\n createContract(\n contract,\n evmSigner,\n chain,\n ) as TransferContractInterface\n )\n .transfer()\n .then((tx) =>\n typeof tx === 'object' ? (tx as TransactionResponse).hash : tx,\n );\n }\n\n if (extrinsic) {\n if (!polkadotSigner) {\n throw new Error('Polkadot signer must be provided');\n }\n\n return srcPolkadot.transfer(sourceAddress, extrinsic, polkadotSigner);\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n },\n };\n}\n\nfunction 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 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 async function getDestinationFeeWithSourceDecimals(\n sourcePolkadot: PolkadotService,\n destinationFee: AssetAmount,\n): Promise<AssetAmount> {\n const destinationFeeDecimals =\n await sourcePolkadot.getAssetDecimals(destinationFee);\n const destinationFeeAsset =\n destinationFee.decimals === destinationFeeDecimals\n ? destinationFee\n : destinationFee.copyWith({\n amount: convertDecimals(\n destinationFee.amount,\n destinationFee.decimals,\n destinationFeeDecimals,\n ),\n decimals: destinationFeeDecimals,\n });\n\n return destinationFeeAsset;\n}\n","import '@polkadot/api-augment';\n\nimport {\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { IConfigService, eq, equilibrium } from '@moonbeam-network/xcm-config';\nimport {\n AnyParachain,\n Asset,\n AssetAmount,\n ChainAssetId,\n} from '@moonbeam-network/xcm-types';\nimport { getPolkadotApi } from '@moonbeam-network/xcm-utils';\nimport { ApiPromise } from '@polkadot/api';\nimport type { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { Option, u128, u8 } from '@polkadot/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { AssetMetadata } from './PolkadotService.interfaces';\n\nexport class PolkadotService {\n readonly api: ApiPromise;\n\n readonly chain: AnyParachain;\n\n readonly configService: IConfigService;\n\n constructor(\n api: ApiPromise,\n chain: AnyParachain,\n configService: IConfigService,\n ) {\n this.api = api;\n this.chain = chain;\n this.configService = configService;\n }\n\n static async create(\n chain: AnyParachain,\n configService: IConfigService,\n ): Promise<PolkadotService> {\n return new PolkadotService(\n await getPolkadotApi(chain.ws),\n chain,\n configService,\n );\n }\n\n static async createMulti(\n chains: AnyParachain[],\n configService: IConfigService,\n ): Promise<PolkadotService[]> {\n return Promise.all(\n chains.map((chain: AnyParachain) =>\n PolkadotService.create(chain, configService),\n ),\n );\n }\n\n get decimals(): number {\n return this.api.registry.chainDecimals.at(0) || 12;\n }\n\n get asset(): Asset {\n const symbol = this.api.registry.chainTokens.at(0);\n const key = symbol?.toString().toLowerCase();\n\n // TODO: Remove this once Equilibrium is updated\n // or find better way if issue appears on other chains\n if (key === 'token' && [equilibrium.key].includes(this.chain.key)) {\n return eq;\n }\n\n if (!key) {\n throw new Error('No native symbol key found');\n }\n\n const asset = this.configService.getAsset(key);\n\n if (!asset) {\n throw new Error(`No asset found for key \"${key}\" and symbol \"${symbol}\"`);\n }\n\n return asset;\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.fromAsset(this.asset, {\n amount,\n decimals: this.decimals,\n });\n }\n\n async getAssetMeta(\n asset: ChainAssetId,\n ): Promise<{ symbol: string; decimals: number } | undefined> {\n const fn =\n this.api.query.assets?.metadata ||\n this.api.query.assetRegistry?.assets ||\n this.api.query.assetRegistry?.metadata ||\n this.api.query.assetRegistry?.currencyMetadatas ||\n this.api.query.assetRegistry?.assetMetadatas ||\n this.api.query.assetRegistry?.assetMetadataMap;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as AssetMetadata | Option<AssetMetadata>;\n const unwrapped = 'unwrapOrDefault' in data ? data.unwrapOrDefault() : data;\n const decimals =\n 'unwrapOrDefault' in unwrapped.decimals\n ? unwrapped.decimals.unwrapOrDefault()\n : unwrapped.decimals;\n\n return {\n decimals: decimals.toNumber(),\n symbol: unwrapped.symbol.toString(),\n };\n }\n\n async getAssetDecimalsFromQuery(\n asset: ChainAssetId,\n ): Promise<number | undefined> {\n const fn = this.api.query.assetsRegistry?.assetDecimals;\n\n if (!fn) {\n return undefined;\n }\n\n const data = (await fn(asset)) as Option<u8>;\n\n return data.unwrapOrDefault().toNumber();\n }\n\n async getAssetDecimals(asset: Asset): Promise<number> {\n const metaId = this.chain.getMetadataAssetId(asset);\n\n const decimals =\n this.chain.getAssetDecimals(asset) ||\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.decimals; // TODO remove this and handle it separately only for native assets\n\n if (!decimals) {\n throw new Error(`No decimals found for asset ${asset.originSymbol}`);\n }\n\n return decimals;\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 async getFee(account: string, config: ExtrinsicConfig): Promise<bigint> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const info = await extrinsic.paymentInfo(account, { nonce: -1 });\n\n return info.partialFee.toBigInt();\n }\n\n async transfer(\n account: string,\n config: ExtrinsicConfig,\n signer: PolkadotSigner | IKeyringPair,\n ): Promise<string> {\n const fn = this.api.tx[config.module][config.func];\n const args = config.getArgs(fn);\n\n const extrinsic = fn(...args);\n const hash = await extrinsic.signAndSend(\n this.#isSigner(signer) ? account : signer,\n {\n nonce: -1,\n signer: this.#isSigner(signer) ? signer : undefined,\n },\n );\n\n return hash.toString();\n }\n\n // eslint-disable-next-line class-methods-use-this\n #isSigner(signer: PolkadotSigner | IKeyringPair): signer is PolkadotSigner {\n return 'signPayload' in signer;\n }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { FeeConfigBuilder } from '@moonbeam-network/xcm-builder';\nimport { TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AssetAmount } from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport { PolkadotService } from '../polkadot';\nimport { DestinationChainTransferData } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n polkadot,\n}: GetDestinationDataParams): Promise<DestinationChainTransferData> {\n const {\n asset,\n destination: { chain, config },\n } = transferConfig;\n\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n polkadot,\n });\n const min = await getMin(config, polkadot);\n\n const balanceAmount = zeroAmount.copyWith({ amount: balance });\n const { existentialDeposit } = polkadot;\n\n const feeAmount = await getFee({\n address: destinationAddress,\n config: transferConfig,\n polkadot,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\n return {\n balance: balanceAmount,\n chain,\n existentialDeposit,\n fee: feeAmount,\n min: minAmount,\n };\n}\n\nexport interface GetFeeParams {\n address: string;\n config: TransferConfig;\n polkadot: PolkadotService;\n}\n\nexport async function getFee({\n config,\n polkadot,\n}: GetFeeParams): Promise<AssetAmount> {\n const { amount, asset } = config.source.config.destinationFee;\n // TODO we have to consider correctly here when an asset is ERC20 to get it from contract\n const decimals = await polkadot.getAssetDecimals(asset);\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals,\n });\n\n if (Number.isFinite(amount)) {\n return zeroAmount.copyWith({\n amount: toBigInt(amount as number, decimals),\n });\n }\n\n const cfg = (amount as FeeConfigBuilder).build({\n api: polkadot.api,\n asset: polkadot.chain.getAssetId(asset),\n });\n\n return zeroAmount.copyWith({\n amount: await cfg.call(),\n });\n}\n"],"mappings":"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","names":["CallType","AssetAmount","convertDecimals","toBigInt","toDecimal","Big","Contract","createPublicClient","getContract","http","isEthersSigner","signer","isEthersContract","contract","Erc20ABI_default","Erc20","#config","#contract","config","signer","isEthersSigner","Contract","Erc20ABI_default","getContract","createPublicClient","http","isEthersContract","Contract","createPublicClient","getContract","http","XtokensABI_default","Xtokens","#config","#contract","#signer","config","signer","address","isEthersSigner","Contract","XtokensABI_default","getContract","createPublicClient","http","isEthersContract","contract","amount","estimatedGas","gasPrice","error","maxPriorityFeePerGas","createPublicClient","http","Erc20Public","#config","#publicClient","config","chain","createPublicClient","http","Erc20ABI_default","createContractWithSigner","config","signer","chain","_a","Erc20","address","Xtokens","createContractWithoutSigner","Erc20Public","createContract","CallType","convertDecimals","toBigInt","getBalance","address","chain","config","decimals","polkadot","cfg","CallType","balance","convertDecimals","createContractWithoutSigner","getDecimals","asset","assetBuiltConfig","getMin","min","toBigInt","getSourceData","transferConfig","destinationAddress","destinationFee","polkadot","sourceAddress","evmSigner","_a","_b","_c","_d","_e","_f","_g","asset","destination","chain","config","zeroAmount","AssetAmount","getDecimals","feeAsset","feeCfg","feeDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalance","destinationFeeBalance","min","getMin","extrinsic","contract","destinationFeeBalanceAmount","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","minAmount","maxAmount","getMax","address","decimals","feeConfig","cfg","CallType","createContractWithoutSigner","decimalsFromContract","balanceFromContract","convertDecimals","destinationFeeConfig","toDecimal","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","totalFee","createContract","error","toBigInt","result","Big","getAssetsBalances","assets","uniqueAssets","acc","a","ConfigBuilder","ConfigService","convertDecimals","toBigInt","Big","eq","equilibrium","AssetAmount","getPolkadotApi","PolkadotService","_PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","_f","fn","data","unwrapped","metaId","decimals","config","response","account","args","signer","#isSigner","AssetAmount","toBigInt","getDestinationData","transferConfig","destinationAddress","polkadot","asset","chain","config","zeroAmount","AssetAmount","getDecimals","balance","getBalance","min","getMin","balanceAmount","existentialDeposit","feeAmount","getFee","minAmount","amount","decimals","toBigInt","cfg","getTransferData","configService","destinationAddress","evmSigner","polkadotSigner","sourceAddress","transferConfig","destPolkadot","srcPolkadot","PolkadotService","destination","getDestinationData","destinationFee","getDestinationFeeWithSourceDecimals","source","getSourceData","amount","result","Big","toBigInt","getMin","_a","_b","bigintAmount","asset","chain","config","contract","extrinsic","createContract","tx","balance","existentialDeposit","fee","min","sourcePolkadot","destinationFeeDecimals","convertDecimals","Sdk","options","configService","ConfigService","ecosystem","assets","asset","ConfigBuilder","keyOrAsset","sourceChains","source","keyOrChain","destinationChains","destination","destKeyOrChain","sourceAddress","destinationAddress","signers","getTransferData","destinationKeyOrChain","ethersSigner","evmSigner","polkadotSigner","sourceKeyOrChain","getParachainBalances","chain","address","polkadot","PolkadotService","getAssetsBalances"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonbeam-network/xcm-sdk",
3
- "version": "1.0.0-dev.101",
3
+ "version": "1.0.0-dev.103",
4
4
  "description": "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",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -51,10 +51,10 @@
51
51
  "types": "./build/index.d.ts",
52
52
  "main": "./build/index.cjs",
53
53
  "dependencies": {
54
- "@moonbeam-network/xcm-builder": "1.0.0-dev.101",
55
- "@moonbeam-network/xcm-config": "1.0.0-dev.101",
56
- "@moonbeam-network/xcm-types": "1.0.0-dev.101",
57
- "@moonbeam-network/xcm-utils": "1.0.0-dev.101",
54
+ "@moonbeam-network/xcm-builder": "1.0.0-dev.103",
55
+ "@moonbeam-network/xcm-config": "1.0.0-dev.103",
56
+ "@moonbeam-network/xcm-types": "1.0.0-dev.103",
57
+ "@moonbeam-network/xcm-utils": "1.0.0-dev.103",
58
58
  "big.js": "^6.2.1"
59
59
  },
60
60
  "peerDependencies": {
@@ -62,6 +62,7 @@
62
62
  "@polkadot/api-augment": "^11.2.1",
63
63
  "@polkadot/types": "^11.2.1",
64
64
  "@polkadot/util": "^12.6.2",
65
+ "ethers": "^6.13.0",
65
66
  "viem": "^2.13.7"
66
67
  }
67
68
  }