@moonbeam-network/xcm-sdk 1.4.22 → 1.4.23

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 yt=Object.create;var M=Object.defineProperty;var ht=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var bt=Object.getPrototypeOf,At=Object.prototype.hasOwnProperty;var wt=(a,t)=>{for(var e in t)M(a,e,{get:t[e],enumerable:!0})},tt=(a,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ct(t))!At.call(a,r)&&r!==e&&M(a,r,{get:()=>t[r],enumerable:!(n=ht(t,r))||n.enumerable});return a};var et=(a,t,e)=>(e=a!=null?yt(bt(a)):{},tt(t||!a||!a.__esModule?M(e,"default",{value:a,enumerable:!0}):e,a)),St=a=>tt(M({},"__esModule",{value:!0}),a);var Bt={};wt(Bt,{Sdk:()=>Tt,getContractFee:()=>it,getExtrinsicFee:()=>ot,getFee:()=>st,getFeeBalances:()=>N,getMax:()=>ct,getSourceData:()=>V});module.exports=St(Bt);var q=require("@moonbeam-network/xcm-types"),O=require("@moonbeam-network/xcm-utils"),K=et(require("big.js"),1);var nt=require("ethers"),S=require("viem");function x(a){return"provider"in a}function w(a){return"signer"in a}var X=[{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=x(e)?new nt.Contract(this.address,X,e):(0,S.getContract)({abi:X,address:this.address,publicClient:(0,S.createPublicClient)({chain:e.chain,transport:(0,S.http)()}),walletClient:e})}async getBalance(){return w(this.#e)?(await this.#e.balanceOf(...this.#t.args)).toBigInt():this.#e.read.balanceOf(this.#t.args)}async getDecimals(){return w(this.#e)?await this.#e.decimals():this.#e.read.decimals()}};var at=require("ethers"),g=require("viem");var _=[{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 G=class{address="0x0000000000000000000000000000000000000804";#t;#e;#n;constructor(t,e){this.#t=t,this.#n=e,this.#e=x(e)?new at.Contract(this.address,_,e):(0,g.getContract)({abi:_,address:this.address,publicClient:(0,g.createPublicClient)({chain:e.chain,transport:(0,g.http)()}),walletClient:e})}async transfer(){return w(this.#e)?this.#e[this.#t.func](...this.#t.args):this.#e.write[this.#t.func](this.#t.args)}async getEthersContractEstimatedGas(t){return(await t.estimateGas[this.#t.func](...this.#t.args)).toBigInt()}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=w(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(x(this.#n)){let{gasPrice:e,maxPriorityFeePerGas:n}=await this.#n.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((n==null?void 0:n.toBigInt())||0n)}return(0,g.createPublicClient)({chain:this.#n.chain,transport:(0,g.http)()}).getGasPrice()}};function h(a,t){if(a.module==="Erc20")return new k(a,t);if(a.module==="Xtokens")return new G(a,t);throw new Error(`Contract ${a.module} not found`)}var z=require("@moonbeam-network/xcm-builder"),rt=require("@moonbeam-network/xcm-utils");async function W({address:a,config:t,evmSigner:e,polkadot:n}){let r=t.balance.build({address:a,asset:n.chain.getBalanceAssetId(t.asset)});if(r.type===z.CallType.Substrate)return n.query(r);if(!e)throw new Error("Evm signer must be provided");return h(r,e).getBalance()}async function P({address:a,asset:t,config:e,evmSigner:n,polkadot:r}){let s=e.balance.build({address:a,asset:r.chain.getBalanceAssetId(t||e.asset)});if(s.type===z.CallType.Substrate)return r.getAssetDecimals(t||e.asset);if(!n)throw new Error("Evm signer must be provided");return h(s,n).getDecimals()}async function R(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,rt.toBigInt)(e,n)}return 0n}async function V({transferConfig:a,destinationAddress:t,destinationFee:e,evmSigner:n,polkadot:r,sourceAddress:s}){var J,U,Y,Z;let{asset:o,destination:m,source:{chain:c,config:i}}=a,p=q.AssetAmount.fromAsset(o,{amount:0n,decimals:await P({address:t,config:i,evmSigner:n,polkadot:r})}),l=(J=i.fee)!=null&&J.asset?q.AssetAmount.fromAsset(i.fee.asset,{amount:0n,decimals:await P({address:t,asset:i.fee.asset,config:i,evmSigner:n,polkadot:r})}):p,d=(U=i.destinationFee)!=null&&U.asset?q.AssetAmount.fromAsset(i.destinationFee.asset,{amount:0n,decimals:await P({address:t,asset:i.destinationFee.asset,config:i,evmSigner:n,polkadot:r})}):p,u=await W({address:s,config:i,evmSigner:n,polkadot:r}),f=await N({address:s,balance:u,feeConfig:i.fee,polkadot:r}),E=i.asset.isEqual(i.destinationFee.asset)?u:await N({address:s,balance:u,feeConfig:i.destinationFee,polkadot:r}),D=await R(i,r),T=(Y=i.extrinsic)==null?void 0:Y.build({address:t,amount:u,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e),palletInstance:c.getAssetPalletInstance(o),source:c}),B=(Z=i.contract)==null?void 0:Z.build({address:t,amount:u,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e)}),F=await st({balance:u,contract:B,decimals:l.decimals,evmSigner:n,extrinsic:T,feeConfig:i.fee,polkadot:r,sourceAddress:s}),A=p.copyWith({amount:u}),{existentialDeposit:j}=r,L=l.copyWith({amount:F}),lt=l.copyWith({amount:f}),dt=d.copyWith({amount:E}),H=p.copyWith({amount:D}),gt=ct({balanceAmount:A,existentialDeposit:j,feeAmount:L,minAmount:H});return{balance:A,chain:c,destinationFeeBalance:dt,existentialDeposit:j,fee:L,feeBalance:lt,max:gt,min:H}}async function N({address:a,balance:t,feeConfig:e,polkadot:n}){return e?n.query(e.balance.build({address:a,asset:n.chain.getBalanceAssetId(e.asset)})):t}async function st({balance:a,contract:t,decimals:e,evmSigner:n,extrinsic:r,feeConfig:s,polkadot:o,sourceAddress:m}){if(t){if(!n)throw new Error("EVM Signer must be provided");return it(a,t,e,n)}if(r){let c=await ot(a,r,o,m),i=vt(e,s);return c+i}throw new Error("Either contract or extrinsic must be provided")}async function it(a,t,e,n){let s=await h(t,n).getFee(a);return(0,O.convertDecimals)(s,18,e)}async function ot(a,t,e,n){try{return await e.getFee(n,t)}catch(r){if(a)throw r;return 0n}}function vt(a,t){return t!=null&&t.xcmDeliveryFeeAmount?(0,O.toBigInt)(t.xcmDeliveryFeeAmount,a):0n}function ct({balanceAmount:a,existentialDeposit:t,feeAmount:e,minAmount:n}){let r=a.toBig().minus(n.toBig()).minus(a.isSame(t)?t.toBig():(0,K.default)(0)).minus(a.isSame(e)?e.toBig():(0,K.default)(0));return a.copyWith({amount:r.lt(0)?0n:BigInt(r.toFixed())})}var I=require("@moonbeam-network/xcm-config");var v=require("@moonbeam-network/xcm-utils"),b=et(require("big.js"),1);var ge=require("@polkadot/api-augment"),y=require("@moonbeam-network/xcm-config"),mt=require("@moonbeam-network/xcm-types"),ut=require("@moonbeam-network/xcm-utils"),C=class{api;chain;configService;constructor(t,e,n){this.api=t,this.chain=e,this.configService=n}static async create(t,e){return new C(await(0,ut.getPolkadotApi)(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(n=>C.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"&&[y.equilibrium.key].includes(this.chain.key))return y.eq;if(e==="oring"&&this.chain.key===y.darwiniaPangoro.key)return y.paring;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 r,s;let t=(r=this.api.consts.balances)==null?void 0:r.existentialDeposit,e=(s=this.api.consts.eqBalances)==null?void 0:s.existentialDeposit,n=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return mt.AssetAmount.fromAsset(this.asset,{amount:n,decimals:this.decimals})}async getAssetMeta(t){var s,o,m,c,i;let e=((s=this.api.query.assets)==null?void 0:s.metadata)||((o=this.api.query.assetRegistry)==null?void 0:o.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.currencyMetadatas)||((c=this.api.query.assetRegistry)==null?void 0:c.assetMetadatas)||((i=this.api.query.assetRegistry)==null?void 0:i.assetMetadataMap);if(!e)return;let n=await e(t),r="unwrapOrDefault"in n?n.unwrapOrDefault():n;return{decimals:r.decimals.toNumber(),symbol:r.symbol.toString()}}async getAssetDecimalsFromQuery(t){var r;let e=(r=this.api.query.assetsRegistry)==null?void 0:r.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var n;let e=this.chain.getMetadataAssetId(t);return await this.getAssetDecimalsFromQuery(e)||((n=await this.getAssetMeta(e))==null?void 0:n.decimals)||this.chain.getAssetDecimals(t)||this.decimals}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],r=e.getArgs(n);return(await n(...r).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,n){let r=this.api.tx[e.module][e.func],s=e.getArgs(r);return(await r(...s).signAndSend(this.#t(n)?t:n,{nonce:-1,signer:this.#t(n)?n:void 0})).toString()}#t(t){return"signPayload"in t}};var $=require("@moonbeam-network/xcm-types"),ft=require("@moonbeam-network/xcm-utils");async function pt({transferConfig:a,destinationAddress:t,evmSigner:e,polkadot:n}){let{asset:r,destination:{chain:s,config:o}}=a,m=$.AssetAmount.fromAsset(r,{amount:0n,decimals:await P({address:t,config:o,evmSigner:e,polkadot:n})}),c=await W({address:t,config:o,evmSigner:e,polkadot:n}),i=await R(o,n),p=m.copyWith({amount:c}),{existentialDeposit:l}=n,d=await It({address:t,config:a,evmSigner:e,polkadot:n}),u=m.copyWith({amount:i});return{balance:p,chain:s,existentialDeposit:l,fee:d,min:u}}async function It({config:a,polkadot:t}){let{amount:e,asset:n}=a.source.config.destinationFee,r=await t.getAssetDecimals(n),s=$.AssetAmount.fromAsset(n,{amount:0n,decimals:r});if(Number.isFinite(e))return s.copyWith({amount:(0,ft.toBigInt)(e,r)});let o=e.build({api:t.api,asset:t.chain.getAssetId(n)});return s.copyWith({amount:await o.call()})}async function Q({configService:a,destinationAddress:t,evmSigner:e,polkadotSigner:n,sourceAddress:r,transferConfig:s}){let[o,m]=await C.createMulti([s.destination.chain,s.source.chain],a),c=await pt({destinationAddress:t,evmSigner:e,polkadot:o,transferConfig:s}),i=await Dt(m,c.fee),p=await V({destinationAddress:t,destinationFee:i,evmSigner:e,polkadot:m,sourceAddress:r,transferConfig:s});return{destination:c,getEstimate(l){let u=(0,b.default)((0,v.toBigInt)(l,p.balance.decimals).toString()).minus(p.balance.isSame(i)?i.toBig():(0,b.default)(0));return p.balance.copyWith({amount:u.lt(0)?0n:BigInt(u.toFixed())})},isSwapPossible:!0,max:p.max,min:Et(c),source:p,async swap(){return Q({configService:a,destinationAddress:r,evmSigner:e,polkadotSigner:n,sourceAddress:t,transferConfig:{...s,destination:s.source,source:s.destination}})},async transfer(l){var B,F;let d=(0,v.toBigInt)(l,p.balance.decimals),{asset:u,source:{chain:f,config:E}}=s,D=(B=E.contract)==null?void 0:B.build({address:t,amount:d,asset:f.getAssetId(u),destination:c.chain,fee:i.amount,feeAsset:f.getAssetId(i)}),T=(F=E.extrinsic)==null?void 0:F.build({address:t,amount:d,asset:f.getAssetId(u),destination:c.chain,fee:i.amount,feeAsset:f.getAssetId(i),palletInstance:f.getAssetPalletInstance(u),source:f});if(D){if(!e)throw new Error("EVM Signer must be provided");return h(D,e).transfer().then(A=>typeof A=="object"?A.hash:A)}if(T){if(!n)throw new Error("Polkadot signer must be provided");return m.transfer(r,T,n)}throw new Error("Either contract or extrinsic must be provided")}}}function Et({balance:a,existentialDeposit:t,fee:e,min:n}){let r=(0,b.default)(0).plus(a.isSame(e)?e.toBig():(0,b.default)(0)).plus(a.isSame(t)&&a.toBig().lt(t.toBig())?t.toBig():(0,b.default)(0)).plus(a.toBig().lt(n.toBig())?n.toBig():(0,b.default)(0));return a.copyWith({amount:BigInt(r.toFixed())})}async function Dt(a,t){let e=await a.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:(0,v.convertDecimals)(t.amount,t.decimals,e),decimals:e})}function Tt(a){let t=(a==null?void 0:a.configService)??new I.ConfigService;return{assets(e){let{assets:n,asset:r}=(0,I.ConfigBuilder)(t).assets(e);return{assets:n,asset(s){let{sourceChains:o,source:m}=r(s);return{sourceChains:o,source(c){let{destinationChains:i,destination:p}=m(c);return{destinationChains:i,destination(l){return{async accounts(d,u,f){return Q({...a,configService:t,destinationAddress:u,evmSigner:(f==null?void 0:f.evmSigner)??(f==null?void 0:f.ethersSigner),sourceAddress:d,transferConfig:p(l).build(),polkadotSigner:f==null?void 0:f.polkadotSigner})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:n,ethersSigner:r,evmSigner:s,keyOrAsset:o,polkadotSigner:m,sourceAddress:c,sourceKeyOrChain:i}){return Q({configService:t,destinationAddress:e,evmSigner:s??r,polkadotSigner:m,sourceAddress:c,transferConfig:(0,I.ConfigBuilder)(t).assets().asset(o).source(i).destination(n).build()})}}}0&&(module.exports={Sdk,getContractFee,getExtrinsicFee,getFee,getFeeBalances,getMax,getSourceData});
1
+ "use strict";var yt=Object.create;var G=Object.defineProperty;var ht=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var bt=Object.getPrototypeOf,At=Object.prototype.hasOwnProperty;var wt=(a,t)=>{for(var e in t)G(a,e,{get:t[e],enumerable:!0})},et=(a,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ct(t))!At.call(a,r)&&r!==e&&G(a,r,{get:()=>t[r],enumerable:!(n=ht(t,r))||n.enumerable});return a};var nt=(a,t,e)=>(e=a!=null?yt(bt(a)):{},et(t||!a||!a.__esModule?G(e,"default",{value:a,enumerable:!0}):e,a)),Pt=a=>et(G({},"__esModule",{value:!0}),a);var Tt={};wt(Tt,{Sdk:()=>Bt,getContractFee:()=>it,getExtrinsicFee:()=>ot,getFee:()=>st,getFeeBalance:()=>V,getMax:()=>ct,getSourceData:()=>$});module.exports=Pt(Tt);var Q=require("@moonbeam-network/xcm-types"),x=require("@moonbeam-network/xcm-utils"),N=nt(require("big.js"),1);var at=require("ethers"),P=require("viem");function v(a){return"provider"in a}function w(a){return"signer"in a}var _=[{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=v(e)?new at.Contract(this.address,_,e):(0,P.getContract)({abi:_,address:this.address,publicClient:(0,P.createPublicClient)({chain:e.chain,transport:(0,P.http)()}),walletClient:e})}async getBalance(){return w(this.#e)?(await this.#e.balanceOf(...this.#t.args)).toBigInt():this.#e.read.balanceOf(this.#t.args)}async getDecimals(){return w(this.#e)?await this.#e.decimals():this.#e.read.decimals()}};var rt=require("ethers"),g=require("viem");var z=[{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 W=class{address="0x0000000000000000000000000000000000000804";#t;#e;#n;constructor(t,e){this.#t=t,this.#n=e,this.#e=v(e)?new rt.Contract(this.address,z,e):(0,g.getContract)({abi:z,address:this.address,publicClient:(0,g.createPublicClient)({chain:e.chain,transport:(0,g.http)()}),walletClient:e})}async transfer(){return w(this.#e)?this.#e[this.#t.func](...this.#t.args):this.#e.write[this.#t.func](this.#t.args)}async getEthersContractEstimatedGas(t){return(await t.estimateGas[this.#t.func](...this.#t.args)).toBigInt()}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=w(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(v(this.#n)){let{gasPrice:e,maxPriorityFeePerGas:n}=await this.#n.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((n==null?void 0:n.toBigInt())||0n)}return(0,g.createPublicClient)({chain:this.#n.chain,transport:(0,g.http)()}).getGasPrice()}};function h(a,t){if(a.module==="Erc20")return new k(a,t);if(a.module==="Xtokens")return new W(a,t);throw new Error(`Contract ${a.module} not found`)}var K=require("@moonbeam-network/xcm-builder"),R=require("@moonbeam-network/xcm-utils");async function O({address:a,chain:t,config:e,decimals:n,evmSigner:r,polkadot:s}){let c=e.balance.build({address:a,asset:s.chain.getBalanceAssetId(e.asset)});if(c.type===K.CallType.Substrate){let o=await s.query(c);return t.usesChainDecimals?(0,R.convertDecimals)(o,s.decimals,n):o}if(!r)throw new Error("Evm signer must be provided");return h(c,r).getBalance()}async function S({address:a,asset:t,config:e,evmSigner:n,polkadot:r}){let s=e.balance.build({address:a,asset:r.chain.getBalanceAssetId(t||e.asset)});if(s.type===K.CallType.Substrate)return r.getAssetDecimals(t||e.asset);if(!n)throw new Error("Evm signer must be provided");return h(s,n).getDecimals()}async function q(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,R.toBigInt)(e,n)}return 0n}async function $({transferConfig:a,destinationAddress:t,destinationFee:e,evmSigner:n,polkadot:r,sourceAddress:s}){var U,Y,Z,tt;let{asset:c,destination:m,source:{chain:o,config:i}}=a,u=Q.AssetAmount.fromAsset(c,{amount:0n,decimals:await S({address:t,chain:o,config:i,evmSigner:n,polkadot:r})}),p=(U=i.fee)!=null&&U.asset?Q.AssetAmount.fromAsset(i.fee.asset,{amount:0n,decimals:await S({address:t,asset:i.fee.asset,chain:o,config:i,evmSigner:n,polkadot:r})}):u,d=(Y=i.destinationFee)!=null&&Y.asset?Q.AssetAmount.fromAsset(i.destinationFee.asset,{amount:0n,decimals:await S({address:t,asset:i.destinationFee.asset,chain:o,config:i,evmSigner:n,polkadot:r})}):u,f=await O({address:s,chain:o,config:i,decimals:u.decimals,evmSigner:n,polkadot:r}),l=await V({address:s,balance:f,chain:o,decimals:p.decimals,feeConfig:i.fee,polkadot:r}),E=i.asset.isEqual(i.destinationFee.asset)?f:await V({address:s,balance:f,chain:o,decimals:d.decimals,feeConfig:i.destinationFee,polkadot:r}),B=await q(i,r),T=(Z=i.extrinsic)==null?void 0:Z.build({address:t,amount:f,asset:o.getAssetId(c),destination:m.chain,fee:e.amount,feeAsset:o.getAssetId(e),palletInstance:o.getAssetPalletInstance(c),source:o}),F=(tt=i.contract)==null?void 0:tt.build({address:t,amount:f,asset:o.getAssetId(c),destination:m.chain,fee:e.amount,feeAsset:o.getAssetId(e)}),M=await st({balance:f,chain:o,contract:F,decimals:p.decimals,evmSigner:n,extrinsic:T,feeConfig:i.fee,polkadot:r,sourceAddress:s}),A=u.copyWith({amount:f}),{existentialDeposit:L}=r,H=p.copyWith({amount:M}),pt=p.copyWith({amount:l}),dt=d.copyWith({amount:E}),J=u.copyWith({amount:B}),gt=ct({balanceAmount:A,existentialDeposit:L,feeAmount:H,minAmount:J});return{balance:A,chain:o,destinationFeeBalance:dt,existentialDeposit:L,fee:H,feeBalance:pt,max:gt,min:J}}async function V({address:a,balance:t,chain:e,decimals:n,feeConfig:r,polkadot:s}){if(!r)return t;let c=await s.query(r.balance.build({address:a,asset:s.chain.getBalanceAssetId(r.asset)}));return e.usesChainDecimals?(0,x.convertDecimals)(c,s.decimals,n):c}async function st({balance:a,chain:t,contract:e,decimals:n,evmSigner:r,extrinsic:s,feeConfig:c,polkadot:m,sourceAddress:o}){if(e){if(!r)throw new Error("EVM Signer must be provided");return it(a,e,n,r)}if(s){let i=await ot(a,s,m,o),u=vt(n,c),p=i+u;return t.usesChainDecimals?(0,x.convertDecimals)(p,m.decimals,n):p}throw new Error("Either contract or extrinsic must be provided")}async function it(a,t,e,n){let s=await h(t,n).getFee(a);return(0,x.convertDecimals)(s,18,e)}async function ot(a,t,e,n){try{return await e.getFee(n,t)}catch(r){if(a)throw r;return 0n}}function vt(a,t){return t!=null&&t.xcmDeliveryFeeAmount?(0,x.toBigInt)(t.xcmDeliveryFeeAmount,a):0n}function ct({balanceAmount:a,existentialDeposit:t,feeAmount:e,minAmount:n}){let r=a.toBig().minus(n.toBig()).minus(a.isSame(t)?t.toBig():(0,N.default)(0)).minus(a.isSame(e)?e.toBig():(0,N.default)(0));return a.copyWith({amount:r.lt(0)?0n:BigInt(r.toFixed())})}var I=require("@moonbeam-network/xcm-config");var D=require("@moonbeam-network/xcm-utils"),b=nt(require("big.js"),1);var he=require("@polkadot/api-augment"),y=require("@moonbeam-network/xcm-config"),mt=require("@moonbeam-network/xcm-types"),ut=require("@moonbeam-network/xcm-utils"),C=class{api;chain;configService;constructor(t,e,n){this.api=t,this.chain=e,this.configService=n}static async create(t,e){return new C(await(0,ut.getPolkadotApi)(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(n=>C.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"&&[y.equilibrium.key].includes(this.chain.key))return y.eq;if(e==="oring"&&this.chain.key===y.darwiniaPangoro.key)return y.paring;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 r,s;let t=(r=this.api.consts.balances)==null?void 0:r.existentialDeposit,e=(s=this.api.consts.eqBalances)==null?void 0:s.existentialDeposit,n=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return mt.AssetAmount.fromAsset(this.asset,{amount:n,decimals:this.decimals})}async getAssetMeta(t){var s,c,m,o,i;let e=((s=this.api.query.assets)==null?void 0:s.metadata)||((c=this.api.query.assetRegistry)==null?void 0:c.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.currencyMetadatas)||((o=this.api.query.assetRegistry)==null?void 0:o.assetMetadatas)||((i=this.api.query.assetRegistry)==null?void 0:i.assetMetadataMap);if(!e)return;let n=await e(t),r="unwrapOrDefault"in n?n.unwrapOrDefault():n;return{decimals:r.decimals.toNumber(),symbol:r.symbol.toString()}}async getAssetDecimalsFromQuery(t){var r;let e=(r=this.api.query.assetsRegistry)==null?void 0:r.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var n;let e=this.chain.getMetadataAssetId(t);return this.chain.getAssetDecimals(t)||await this.getAssetDecimalsFromQuery(e)||((n=await this.getAssetMeta(e))==null?void 0:n.decimals)||this.decimals}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],r=e.getArgs(n);return(await n(...r).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,n){let r=this.api.tx[e.module][e.func],s=e.getArgs(r);return(await r(...s).signAndSend(this.#t(n)?t:n,{nonce:-1,signer:this.#t(n)?n:void 0})).toString()}#t(t){return"signPayload"in t}};var j=require("@moonbeam-network/xcm-types"),ft=require("@moonbeam-network/xcm-utils");async function lt({transferConfig:a,destinationAddress:t,evmSigner:e,polkadot:n}){let{asset:r,destination:{chain:s,config:c}}=a,m=j.AssetAmount.fromAsset(r,{amount:0n,decimals:await S({address:t,chain:s,config:c,evmSigner:e,polkadot:n})}),o=await O({address:t,chain:s,config:c,decimals:m.decimals,evmSigner:e,polkadot:n}),i=await q(c,n),u=m.copyWith({amount:o}),{existentialDeposit:p}=n,d=await Dt({address:t,config:a,evmSigner:e,polkadot:n}),f=m.copyWith({amount:i});return{balance:u,chain:s,existentialDeposit:p,fee:d,min:f}}async function Dt({config:a,polkadot:t}){let{amount:e,asset:n}=a.source.config.destinationFee,r=await t.getAssetDecimals(n),s=j.AssetAmount.fromAsset(n,{amount:0n,decimals:r});if(Number.isFinite(e))return s.copyWith({amount:(0,ft.toBigInt)(e,r)});let c=e.build({api:t.api,asset:t.chain.getAssetId(n)});return s.copyWith({amount:await c.call()})}async function X({configService:a,destinationAddress:t,evmSigner:e,polkadotSigner:n,sourceAddress:r,transferConfig:s}){let[c,m]=await C.createMulti([s.destination.chain,s.source.chain],a),o=await lt({destinationAddress:t,evmSigner:e,polkadot:c,transferConfig:s}),i=await Et(m,o.fee),u=await $({destinationAddress:t,destinationFee:i,evmSigner:e,polkadot:m,sourceAddress:r,transferConfig:s});return{destination:o,getEstimate(p){let f=(0,b.default)((0,D.toBigInt)(p,u.balance.decimals).toString()).minus(u.balance.isSame(i)?i.toBig():(0,b.default)(0));return u.balance.copyWith({amount:f.lt(0)?0n:BigInt(f.toFixed())})},isSwapPossible:!0,max:u.max,min:It(o),source:u,async swap(){return X({configService:a,destinationAddress:r,evmSigner:e,polkadotSigner:n,sourceAddress:t,transferConfig:{...s,destination:s.source,source:s.destination}})},async transfer(p){var F,M;let d=(0,D.toBigInt)(p,u.balance.decimals),{asset:f,source:{chain:l,config:E}}=s,B=(F=E.contract)==null?void 0:F.build({address:t,amount:d,asset:l.getAssetId(f),destination:o.chain,fee:i.amount,feeAsset:l.getAssetId(i)}),T=(M=E.extrinsic)==null?void 0:M.build({address:t,amount:d,asset:l.getAssetId(f),destination:o.chain,fee:i.amount,feeAsset:l.getAssetId(i),palletInstance:l.getAssetPalletInstance(f),source:l});if(B){if(!e)throw new Error("EVM Signer must be provided");return h(B,e).transfer().then(A=>typeof A=="object"?A.hash:A)}if(T){if(!n)throw new Error("Polkadot signer must be provided");return m.transfer(r,T,n)}throw new Error("Either contract or extrinsic must be provided")}}}function It({balance:a,existentialDeposit:t,fee:e,min:n}){let r=(0,b.default)(0).plus(a.isSame(e)?e.toBig():(0,b.default)(0)).plus(a.isSame(t)&&a.toBig().lt(t.toBig())?t.toBig():(0,b.default)(0)).plus(a.toBig().lt(n.toBig())?n.toBig():(0,b.default)(0));return a.copyWith({amount:BigInt(r.toFixed())})}async function Et(a,t){let e=await a.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:(0,D.convertDecimals)(t.amount,t.decimals,e),decimals:e})}function Bt(a){let t=(a==null?void 0:a.configService)??new I.ConfigService;return{assets(e){let{assets:n,asset:r}=(0,I.ConfigBuilder)(t).assets(e);return{assets:n,asset(s){let{sourceChains:c,source:m}=r(s);return{sourceChains:c,source(o){let{destinationChains:i,destination:u}=m(o);return{destinationChains:i,destination(p){return{async accounts(d,f,l){return X({...a,configService:t,destinationAddress:f,evmSigner:(l==null?void 0:l.evmSigner)??(l==null?void 0:l.ethersSigner),sourceAddress:d,transferConfig:u(p).build(),polkadotSigner:l==null?void 0:l.polkadotSigner})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:n,ethersSigner:r,evmSigner:s,keyOrAsset:c,polkadotSigner:m,sourceAddress:o,sourceKeyOrChain:i}){return X({configService:t,destinationAddress:e,evmSigner:s??r,polkadotSigner:m,sourceAddress:o,transferConfig:(0,I.ConfigBuilder)(t).assets().asset(c).source(i).destination(n).build()})}}}0&&(module.exports={Sdk,getContractFee,getExtrinsicFee,getFee,getFeeBalance,getMax,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/contract.utils.ts","../src/contract/contracts/Erc20/Erc20ABI.json","../src/contract/contracts/Xtokens/Xtokens.ts","../src/contract/contracts/Xtokens/XtokensABI.json","../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 './sdk';\nexport * from './sdk.interfaces';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { FeeAssetConfig, 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 { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } 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 evmSigner,\n polkadot,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n config,\n evmSigner,\n polkadot,\n }),\n });\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n config,\n evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\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 config,\n evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n config,\n evmSigner,\n polkadot,\n });\n\n const feeBalance = await getFeeBalances({\n address: sourceAddress,\n balance,\n feeConfig: config.fee,\n polkadot,\n });\n\n const destinationFeeBalance = config.asset.isEqual(\n config.destinationFee.asset,\n )\n ? balance\n : await getFeeBalances({\n address: sourceAddress,\n balance,\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 const fee = await getFee({\n balance,\n contract,\n decimals: zeroFeeAmount.decimals,\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 const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\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 GetBalancesParams {\n address: string;\n balance: bigint;\n feeConfig: FeeAssetConfig | undefined;\n polkadot: PolkadotService;\n}\n\nexport async function getFeeBalances({\n address,\n balance,\n feeConfig,\n polkadot,\n}: GetBalancesParams) {\n return feeConfig\n ? polkadot.query(\n feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig,\n )\n : balance;\n}\n\nexport interface GetFeeParams {\n balance: bigint;\n contract?: ContractConfig;\n decimals: number;\n evmSigner?: EvmSigner;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeAssetConfig;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n contract,\n decimals,\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 return getContractFee(balance, contract, decimals, evmSigner);\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 return extrinsicFee + xcmDeliveryFee;\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n}\n\nexport async function getContractFee(\n balance: bigint,\n config: ContractConfig,\n decimals: number,\n evmSigner: EvmSigner,\n): Promise<bigint> {\n const contract = createContract(\n config,\n evmSigner,\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","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\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\n this.address = config.address;\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 publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\n\nexport class Xtokens implements TransferContractInterface {\n readonly address = '0x0000000000000000000000000000000000000804';\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | XtokensContract;\n\n readonly #signer: EvmSigner;\n\n constructor(config: ContractConfig, signer: EvmSigner) {\n this.#config = config;\n\n this.#signer = signer;\n\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address,\n publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 (\n await contract.estimateGas[this.#config.func](...this.#config.args)\n ).toBigInt();\n }\n\n async getViemContractEstimatedGas(\n contract: XtokensContract,\n ): Promise<bigint> {\n if (!contract) {\n return 0n;\n }\n\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 /**\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\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 const { gasPrice, maxPriorityFeePerGas } =\n await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\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 { EvmSigner } from '../sdk.interfaces';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\n\nexport function createContract(\n config: ContractConfig,\n signer: EvmSigner,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20(config, signer);\n }\n\n if (config.module === 'Xtokens') {\n return new Xtokens(config, signer);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n","import { CallType, SubstrateQueryConfig } from '@moonbeam-network/xcm-builder';\nimport { AssetConfig } from '@moonbeam-network/xcm-config';\nimport { Asset } from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport { BalanceContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport { EvmSigner } from '../sdk.interfaces';\n\nexport interface GetFeeBalancesParams {\n address: string;\n config: AssetConfig;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n asset?: Asset;\n}\n\nexport async function getBalance({\n address,\n config,\n evmSigner,\n polkadot,\n}: GetFeeBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\n\n if (cfg.type === CallType.Substrate) {\n return polkadot.query(cfg as SubstrateQueryConfig);\n }\n\n if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) as BalanceContractInterface;\n\n return contract.getBalance();\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n evmSigner,\n polkadot,\n}: GetFeeBalancesParams) {\n const cfg = 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 if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) 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 { AnyChain, Asset, Ecosystem } from '@moonbeam-network/xcm-types';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\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 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 type { TransactionResponse } from '@ethersproject/abstract-provider';\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 evmSigner,\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(contract, evmSigner) 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 = await sourcePolkadot.getAssetDecimals(\n destinationFee,\n );\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 {\n IConfigService,\n darwiniaPangoro,\n eq,\n equilibrium,\n paring,\n} 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 // TODO: Remove this once Darwinia Pangoro is updated\n if (key === 'oring' && this.chain.key === darwiniaPangoro.key) {\n return paring;\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?.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\n return {\n decimals: unwrapped.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 return (\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.chain.getAssetDecimals(asset) ||\n this.decimals\n );\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, EvmSigner } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n evmSigner,\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 config,\n evmSigner,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n config,\n evmSigner,\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 evmSigner,\n polkadot,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\n\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 evmSigner?: EvmSigner;\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","getContractFee","getExtrinsicFee","getFee","getFeeBalances","getMax","getSourceData","__toCommonJS","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","isEthersSigner","XtokensABI_default","isEthersContract","contract","amount","estimatedGas","gasPrice","error","maxPriorityFeePerGas","createContract","config","signer","Erc20","Xtokens","import_xcm_builder","import_xcm_utils","getBalance","address","config","evmSigner","polkadot","cfg","createContract","getDecimals","asset","getMin","min","decimals","getSourceData","transferConfig","destinationAddress","destinationFee","evmSigner","polkadot","sourceAddress","_a","_b","_c","_d","asset","destination","chain","config","zeroAmount","getDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalances","destinationFeeBalance","min","getMin","extrinsic","contract","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","destinationFeeBalanceAmount","minAmount","maxAmount","getMax","address","feeConfig","decimals","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","createContract","error","result","Big","import_xcm_config","import_xcm_utils","import_big","import_api_augment","import_xcm_config","import_xcm_types","import_xcm_utils","PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","fn","data","unwrapped","metaId","config","response","account","args","signer","#isSigner","import_xcm_types","import_xcm_utils","getDestinationData","transferConfig","destinationAddress","evmSigner","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"]}
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/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 './sdk';\nexport * from './sdk.interfaces';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { FeeAssetConfig, TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AnyChain, 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 { 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 evmSigner,\n polkadot,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n evmSigner,\n polkadot,\n }),\n });\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n chain,\n config,\n evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\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 evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n evmSigner,\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 const fee = await getFee({\n balance,\n chain,\n contract,\n decimals: zeroFeeAmount.decimals,\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 const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\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 feeBalance = await polkadot.query(\n feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig,\n );\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 polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n chain,\n contract,\n decimals,\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 return getContractFee(balance, contract, decimals, evmSigner);\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: bigint,\n config: ContractConfig,\n decimals: number,\n evmSigner: EvmSigner,\n): Promise<bigint> {\n const contract = createContract(\n config,\n evmSigner,\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","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\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\n this.address = config.address;\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 publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\n\nexport class Xtokens implements TransferContractInterface {\n readonly address = '0x0000000000000000000000000000000000000804';\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | XtokensContract;\n\n readonly #signer: EvmSigner;\n\n constructor(config: ContractConfig, signer: EvmSigner) {\n this.#config = config;\n\n this.#signer = signer;\n\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address,\n publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 (\n await contract.estimateGas[this.#config.func](...this.#config.args)\n ).toBigInt();\n }\n\n async getViemContractEstimatedGas(\n contract: XtokensContract,\n ): Promise<bigint> {\n if (!contract) {\n return 0n;\n }\n\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 /**\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\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 const { gasPrice, maxPriorityFeePerGas } =\n await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\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 { EvmSigner } from '../sdk.interfaces';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\n\nexport function createContract(\n config: ContractConfig,\n signer: EvmSigner,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20(config, signer);\n }\n\n if (config.module === 'Xtokens') {\n return new Xtokens(config, signer);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n","import { CallType, SubstrateQueryConfig } 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';\nimport { EvmSigner } from '../sdk.interfaces';\n\nexport interface GetBalancesParams {\n address: string;\n asset?: Asset;\n chain: AnyChain;\n config: AssetConfig;\n decimals: number;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport type GetDecimalsParams = Omit<GetBalancesParams, 'decimals'>;\n\nexport async function getBalance({\n address,\n chain,\n config,\n decimals,\n evmSigner,\n polkadot,\n}: GetBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\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 if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) as BalanceContractInterface;\n\n return contract.getBalance();\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n evmSigner,\n polkadot,\n}: GetDecimalsParams) {\n const cfg = 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 if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) 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 { AnyChain, Asset, Ecosystem } from '@moonbeam-network/xcm-types';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\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 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 type { TransactionResponse } from '@ethersproject/abstract-provider';\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 evmSigner,\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(contract, evmSigner) 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 = await sourcePolkadot.getAssetDecimals(\n destinationFee,\n );\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 {\n IConfigService,\n darwiniaPangoro,\n eq,\n equilibrium,\n paring,\n} 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 // TODO: Remove this once Darwinia Pangoro is updated\n if (key === 'oring' && this.chain.key === darwiniaPangoro.key) {\n return paring;\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?.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\n return {\n decimals: unwrapped.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 return (\n this.chain.getAssetDecimals(asset) ||\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.decimals\n );\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, EvmSigner } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n evmSigner,\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 evmSigner,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n evmSigner,\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 evmSigner,\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 evmSigner?: EvmSigner;\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","getContractFee","getExtrinsicFee","getFee","getFeeBalance","getMax","getSourceData","__toCommonJS","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","isEthersSigner","XtokensABI_default","isEthersContract","contract","amount","estimatedGas","gasPrice","error","maxPriorityFeePerGas","createContract","config","signer","Erc20","Xtokens","import_xcm_builder","import_xcm_utils","getBalance","address","chain","config","decimals","evmSigner","polkadot","cfg","balance","createContract","getDecimals","asset","getMin","min","getSourceData","transferConfig","destinationAddress","destinationFee","evmSigner","polkadot","sourceAddress","_a","_b","_c","_d","asset","destination","chain","config","zeroAmount","getDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalance","destinationFeeBalance","min","getMin","extrinsic","contract","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","destinationFeeBalanceAmount","minAmount","maxAmount","getMax","address","decimals","feeConfig","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","totalFee","createContract","error","result","Big","import_xcm_config","import_xcm_utils","import_big","import_api_augment","import_xcm_config","import_xcm_types","import_xcm_utils","PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","fn","data","unwrapped","metaId","config","response","account","args","signer","#isSigner","import_xcm_types","import_xcm_utils","getDestinationData","transferConfig","destinationAddress","evmSigner","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"]}
package/build/index.d.ts CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  } from '@moonbeam-network/xcm-builder';
6
6
  import {
7
7
  IConfigService,
8
+ AssetConfig,
8
9
  TransferConfig,
9
10
  FeeAssetConfig,
10
11
  } from '@moonbeam-network/xcm-config';
@@ -94,6 +95,16 @@ interface ChainTransferData {
94
95
  min: AssetAmount;
95
96
  }
96
97
 
98
+ interface GetBalancesParams {
99
+ address: string;
100
+ asset?: Asset;
101
+ chain: AnyChain;
102
+ config: AssetConfig;
103
+ decimals: number;
104
+ evmSigner?: EvmSigner;
105
+ polkadot: PolkadotService;
106
+ }
107
+
97
108
  interface GetSourceDataParams {
98
109
  transferConfig: TransferConfig;
99
110
  destinationAddress: string;
@@ -110,21 +121,23 @@ declare function getSourceData({
110
121
  polkadot,
111
122
  sourceAddress,
112
123
  }: GetSourceDataParams): Promise<SourceChainTransferData>;
113
- interface GetBalancesParams {
114
- address: string;
124
+ interface GetFeeBalanceParams
125
+ extends Omit<GetBalancesParams, 'config' | 'evmSigner'> {
115
126
  balance: bigint;
116
127
  feeConfig: FeeAssetConfig | undefined;
117
- polkadot: PolkadotService;
118
128
  }
119
- declare function getFeeBalances({
129
+ declare function getFeeBalance({
120
130
  address,
121
131
  balance,
132
+ chain,
133
+ decimals,
122
134
  feeConfig,
123
135
  polkadot,
124
- }: GetBalancesParams): Promise<bigint>;
136
+ }: GetFeeBalanceParams): Promise<bigint>;
125
137
  interface GetFeeParams {
126
138
  balance: bigint;
127
139
  contract?: ContractConfig;
140
+ chain: AnyChain;
128
141
  decimals: number;
129
142
  evmSigner?: EvmSigner;
130
143
  extrinsic?: ExtrinsicConfig;
@@ -134,6 +147,7 @@ interface GetFeeParams {
134
147
  }
135
148
  declare function getFee({
136
149
  balance,
150
+ chain,
137
151
  contract,
138
152
  decimals,
139
153
  evmSigner,
@@ -210,7 +224,7 @@ export {
210
224
  ChainTransferData,
211
225
  DestinationChainTransferData,
212
226
  EvmSigner,
213
- GetBalancesParams,
227
+ GetFeeBalanceParams,
214
228
  GetFeeParams,
215
229
  GetMaxParams,
216
230
  GetSourceDataParams,
@@ -223,7 +237,7 @@ export {
223
237
  getContractFee,
224
238
  getExtrinsicFee,
225
239
  getFee,
226
- getFeeBalances,
240
+ getFeeBalance,
227
241
  getMax,
228
242
  getSourceData,
229
243
  };
package/build/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{AssetAmount as G}from"@moonbeam-network/xcm-types";import{convertDecimals as ut,toBigInt as ft}from"@moonbeam-network/xcm-utils";import V from"big.js";import{Contract as nt}from"ethers";import{createPublicClient as at,getContract as rt,http as st}from"viem";function w(a){return"provider"in a}function C(a){return"signer"in a}var M=[{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 E=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=w(e)?new nt(this.address,M,e):rt({abi:M,address:this.address,publicClient:at({chain:e.chain,transport:st()}),walletClient:e})}async getBalance(){return C(this.#e)?(await this.#e.balanceOf(...this.#t.args)).toBigInt():this.#e.read.balanceOf(this.#t.args)}async getDecimals(){return C(this.#e)?await this.#e.decimals():this.#e.read.decimals()}};import{Contract as ot}from"ethers";import{createPublicClient as z,getContract as ct,http as K}from"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 D=class{address="0x0000000000000000000000000000000000000804";#t;#e;#n;constructor(t,e){this.#t=t,this.#n=e,this.#e=w(e)?new ot(this.address,k,e):ct({abi:k,address:this.address,publicClient:z({chain:e.chain,transport:K()}),walletClient:e})}async transfer(){return C(this.#e)?this.#e[this.#t.func](...this.#t.args):this.#e.write[this.#t.func](this.#t.args)}async getEthersContractEstimatedGas(t){return(await t.estimateGas[this.#t.func](...this.#t.args)).toBigInt()}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=C(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(w(this.#n)){let{gasPrice:e,maxPriorityFeePerGas:n}=await this.#n.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((n==null?void 0:n.toBigInt())||0n)}return z({chain:this.#n.chain,transport:K()}).getGasPrice()}};function g(a,t){if(a.module==="Erc20")return new E(a,t);if(a.module==="Xtokens")return new D(a,t);throw new Error(`Contract ${a.module} not found`)}import{CallType as N}from"@moonbeam-network/xcm-builder";import{toBigInt as mt}from"@moonbeam-network/xcm-utils";async function T({address:a,config:t,evmSigner:e,polkadot:n}){let r=t.balance.build({address:a,asset:n.chain.getBalanceAssetId(t.asset)});if(r.type===N.Substrate)return n.query(r);if(!e)throw new Error("Evm signer must be provided");return g(r,e).getBalance()}async function b({address:a,asset:t,config:e,evmSigner:n,polkadot:r}){let s=e.balance.build({address:a,asset:r.chain.getBalanceAssetId(t||e.asset)});if(s.type===N.Substrate)return r.getAssetDecimals(t||e.asset);if(!n)throw new Error("Evm signer must be provided");return g(s,n).getDecimals()}async function B(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 mt(e,n)}return 0n}async function j({transferConfig:a,destinationAddress:t,destinationFee:e,evmSigner:n,polkadot:r,sourceAddress:s}){var O,Q,X,_;let{asset:o,destination:m,source:{chain:c,config:i}}=a,p=G.fromAsset(o,{amount:0n,decimals:await b({address:t,config:i,evmSigner:n,polkadot:r})}),l=(O=i.fee)!=null&&O.asset?G.fromAsset(i.fee.asset,{amount:0n,decimals:await b({address:t,asset:i.fee.asset,config:i,evmSigner:n,polkadot:r})}):p,d=(Q=i.destinationFee)!=null&&Q.asset?G.fromAsset(i.destinationFee.asset,{amount:0n,decimals:await b({address:t,asset:i.destinationFee.asset,config:i,evmSigner:n,polkadot:r})}):p,u=await T({address:s,config:i,evmSigner:n,polkadot:r}),f=await $({address:s,balance:u,feeConfig:i.fee,polkadot:r}),S=i.asset.isEqual(i.destinationFee.asset)?u:await $({address:s,balance:u,feeConfig:i.destinationFee,polkadot:r}),P=await B(i,r),x=(X=i.extrinsic)==null?void 0:X.build({address:t,amount:u,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e),palletInstance:c.getAssetPalletInstance(o),source:c}),v=(_=i.contract)==null?void 0:_.build({address:t,amount:u,asset:c.getAssetId(o),destination:m.chain,fee:e.amount,feeAsset:c.getAssetId(e)}),I=await pt({balance:u,contract:v,decimals:l.decimals,evmSigner:n,extrinsic:x,feeConfig:i.fee,polkadot:r,sourceAddress:s}),h=p.copyWith({amount:u}),{existentialDeposit:W}=r,R=l.copyWith({amount:I}),Y=l.copyWith({amount:f}),Z=d.copyWith({amount:S}),q=p.copyWith({amount:P}),tt=yt({balanceAmount:h,existentialDeposit:W,feeAmount:R,minAmount:q});return{balance:h,chain:c,destinationFeeBalance:Z,existentialDeposit:W,fee:R,feeBalance:Y,max:tt,min:q}}async function $({address:a,balance:t,feeConfig:e,polkadot:n}){return e?n.query(e.balance.build({address:a,asset:n.chain.getBalanceAssetId(e.asset)})):t}async function pt({balance:a,contract:t,decimals:e,evmSigner:n,extrinsic:r,feeConfig:s,polkadot:o,sourceAddress:m}){if(t){if(!n)throw new Error("EVM Signer must be provided");return lt(a,t,e,n)}if(r){let c=await dt(a,r,o,m),i=gt(e,s);return c+i}throw new Error("Either contract or extrinsic must be provided")}async function lt(a,t,e,n){let s=await g(t,n).getFee(a);return ut(s,18,e)}async function dt(a,t,e,n){try{return await e.getFee(n,t)}catch(r){if(a)throw r;return 0n}}function gt(a,t){return t!=null&&t.xcmDeliveryFeeAmount?ft(t.xcmDeliveryFeeAmount,a):0n}function yt({balanceAmount:a,existentialDeposit:t,feeAmount:e,minAmount:n}){let r=a.toBig().minus(n.toBig()).minus(a.isSame(t)?t.toBig():V(0)).minus(a.isSame(e)?e.toBig():V(0));return a.copyWith({amount:r.lt(0)?0n:BigInt(r.toFixed())})}import{ConfigBuilder as U,ConfigService as Dt}from"@moonbeam-network/xcm-config";import{convertDecimals as vt,toBigInt as J}from"@moonbeam-network/xcm-utils";import A from"big.js";import"@polkadot/api-augment";import{darwiniaPangoro as ht,eq as Ct,equilibrium as bt,paring as At}from"@moonbeam-network/xcm-config";import{AssetAmount as wt}from"@moonbeam-network/xcm-types";import{getPolkadotApi as St}from"@moonbeam-network/xcm-utils";var y=class{api;chain;configService;constructor(t,e,n){this.api=t,this.chain=e,this.configService=n}static async create(t,e){return new y(await St(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(n=>y.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"&&[bt.key].includes(this.chain.key))return Ct;if(e==="oring"&&this.chain.key===ht.key)return At;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 r,s;let t=(r=this.api.consts.balances)==null?void 0:r.existentialDeposit,e=(s=this.api.consts.eqBalances)==null?void 0:s.existentialDeposit,n=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return wt.fromAsset(this.asset,{amount:n,decimals:this.decimals})}async getAssetMeta(t){var s,o,m,c,i;let e=((s=this.api.query.assets)==null?void 0:s.metadata)||((o=this.api.query.assetRegistry)==null?void 0:o.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.currencyMetadatas)||((c=this.api.query.assetRegistry)==null?void 0:c.assetMetadatas)||((i=this.api.query.assetRegistry)==null?void 0:i.assetMetadataMap);if(!e)return;let n=await e(t),r="unwrapOrDefault"in n?n.unwrapOrDefault():n;return{decimals:r.decimals.toNumber(),symbol:r.symbol.toString()}}async getAssetDecimalsFromQuery(t){var r;let e=(r=this.api.query.assetsRegistry)==null?void 0:r.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var n;let e=this.chain.getMetadataAssetId(t);return await this.getAssetDecimalsFromQuery(e)||((n=await this.getAssetMeta(e))==null?void 0:n.decimals)||this.chain.getAssetDecimals(t)||this.decimals}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],r=e.getArgs(n);return(await n(...r).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,n){let r=this.api.tx[e.module][e.func],s=e.getArgs(r);return(await r(...s).signAndSend(this.#t(n)?t:n,{nonce:-1,signer:this.#t(n)?n:void 0})).toString()}#t(t){return"signPayload"in t}};import{AssetAmount as L}from"@moonbeam-network/xcm-types";import{toBigInt as Pt}from"@moonbeam-network/xcm-utils";async function H({transferConfig:a,destinationAddress:t,evmSigner:e,polkadot:n}){let{asset:r,destination:{chain:s,config:o}}=a,m=L.fromAsset(r,{amount:0n,decimals:await b({address:t,config:o,evmSigner:e,polkadot:n})}),c=await T({address:t,config:o,evmSigner:e,polkadot:n}),i=await B(o,n),p=m.copyWith({amount:c}),{existentialDeposit:l}=n,d=await xt({address:t,config:a,evmSigner:e,polkadot:n}),u=m.copyWith({amount:i});return{balance:p,chain:s,existentialDeposit:l,fee:d,min:u}}async function xt({config:a,polkadot:t}){let{amount:e,asset:n}=a.source.config.destinationFee,r=await t.getAssetDecimals(n),s=L.fromAsset(n,{amount:0n,decimals:r});if(Number.isFinite(e))return s.copyWith({amount:Pt(e,r)});let o=e.build({api:t.api,asset:t.chain.getAssetId(n)});return s.copyWith({amount:await o.call()})}async function F({configService:a,destinationAddress:t,evmSigner:e,polkadotSigner:n,sourceAddress:r,transferConfig:s}){let[o,m]=await y.createMulti([s.destination.chain,s.source.chain],a),c=await H({destinationAddress:t,evmSigner:e,polkadot:o,transferConfig:s}),i=await Et(m,c.fee),p=await j({destinationAddress:t,destinationFee:i,evmSigner:e,polkadot:m,sourceAddress:r,transferConfig:s});return{destination:c,getEstimate(l){let u=A(J(l,p.balance.decimals).toString()).minus(p.balance.isSame(i)?i.toBig():A(0));return p.balance.copyWith({amount:u.lt(0)?0n:BigInt(u.toFixed())})},isSwapPossible:!0,max:p.max,min:It(c),source:p,async swap(){return F({configService:a,destinationAddress:r,evmSigner:e,polkadotSigner:n,sourceAddress:t,transferConfig:{...s,destination:s.source,source:s.destination}})},async transfer(l){var v,I;let d=J(l,p.balance.decimals),{asset:u,source:{chain:f,config:S}}=s,P=(v=S.contract)==null?void 0:v.build({address:t,amount:d,asset:f.getAssetId(u),destination:c.chain,fee:i.amount,feeAsset:f.getAssetId(i)}),x=(I=S.extrinsic)==null?void 0:I.build({address:t,amount:d,asset:f.getAssetId(u),destination:c.chain,fee:i.amount,feeAsset:f.getAssetId(i),palletInstance:f.getAssetPalletInstance(u),source:f});if(P){if(!e)throw new Error("EVM Signer must be provided");return g(P,e).transfer().then(h=>typeof h=="object"?h.hash:h)}if(x){if(!n)throw new Error("Polkadot signer must be provided");return m.transfer(r,x,n)}throw new Error("Either contract or extrinsic must be provided")}}}function It({balance:a,existentialDeposit:t,fee:e,min:n}){let r=A(0).plus(a.isSame(e)?e.toBig():A(0)).plus(a.isSame(t)&&a.toBig().lt(t.toBig())?t.toBig():A(0)).plus(a.toBig().lt(n.toBig())?n.toBig():A(0));return a.copyWith({amount:BigInt(r.toFixed())})}async function Et(a,t){let e=await a.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:vt(t.amount,t.decimals,e),decimals:e})}function je(a){let t=(a==null?void 0:a.configService)??new Dt;return{assets(e){let{assets:n,asset:r}=U(t).assets(e);return{assets:n,asset(s){let{sourceChains:o,source:m}=r(s);return{sourceChains:o,source(c){let{destinationChains:i,destination:p}=m(c);return{destinationChains:i,destination(l){return{async accounts(d,u,f){return F({...a,configService:t,destinationAddress:u,evmSigner:(f==null?void 0:f.evmSigner)??(f==null?void 0:f.ethersSigner),sourceAddress:d,transferConfig:p(l).build(),polkadotSigner:f==null?void 0:f.polkadotSigner})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:n,ethersSigner:r,evmSigner:s,keyOrAsset:o,polkadotSigner:m,sourceAddress:c,sourceKeyOrChain:i}){return F({configService:t,destinationAddress:e,evmSigner:s??r,polkadotSigner:m,sourceAddress:c,transferConfig:U(t).assets().asset(o).source(i).destination(n).build()})}}}export{je as Sdk,lt as getContractFee,dt as getExtrinsicFee,pt as getFee,$ as getFeeBalances,yt as getMax,j as getSourceData};
1
+ import{AssetAmount as k}from"@moonbeam-network/xcm-types";import{convertDecimals as W,toBigInt as lt}from"@moonbeam-network/xcm-utils";import $ from"big.js";import{Contract as at}from"ethers";import{createPublicClient as rt,getContract as st,http as it}from"viem";function w(a){return"provider"in a}function C(a){return"signer"in a}var M=[{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 I=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=w(e)?new at(this.address,M,e):st({abi:M,address:this.address,publicClient:rt({chain:e.chain,transport:it()}),walletClient:e})}async getBalance(){return C(this.#e)?(await this.#e.balanceOf(...this.#t.args)).toBigInt():this.#e.read.balanceOf(this.#t.args)}async getDecimals(){return C(this.#e)?await this.#e.decimals():this.#e.read.decimals()}};import{Contract as ct}from"ethers";import{createPublicClient as K,getContract as mt,http as N}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 E=class{address="0x0000000000000000000000000000000000000804";#t;#e;#n;constructor(t,e){this.#t=t,this.#n=e,this.#e=w(e)?new ct(this.address,G,e):mt({abi:G,address:this.address,publicClient:K({chain:e.chain,transport:N()}),walletClient:e})}async transfer(){return C(this.#e)?this.#e[this.#t.func](...this.#t.args):this.#e.write[this.#t.func](this.#t.args)}async getEthersContractEstimatedGas(t){return(await t.estimateGas[this.#t.func](...this.#t.args)).toBigInt()}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=C(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(w(this.#n)){let{gasPrice:e,maxPriorityFeePerGas:n}=await this.#n.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((n==null?void 0:n.toBigInt())||0n)}return K({chain:this.#n.chain,transport:N()}).getGasPrice()}};function g(a,t){if(a.module==="Erc20")return new I(a,t);if(a.module==="Xtokens")return new E(a,t);throw new Error(`Contract ${a.module} not found`)}import{CallType as V}from"@moonbeam-network/xcm-builder";import{convertDecimals as ut,toBigInt as ft}from"@moonbeam-network/xcm-utils";async function B({address:a,chain:t,config:e,decimals:n,evmSigner:r,polkadot:s}){let c=e.balance.build({address:a,asset:s.chain.getBalanceAssetId(e.asset)});if(c.type===V.Substrate){let o=await s.query(c);return t.usesChainDecimals?ut(o,s.decimals,n):o}if(!r)throw new Error("Evm signer must be provided");return g(c,r).getBalance()}async function b({address:a,asset:t,config:e,evmSigner:n,polkadot:r}){let s=e.balance.build({address:a,asset:r.chain.getBalanceAssetId(t||e.asset)});if(s.type===V.Substrate)return r.getAssetDecimals(t||e.asset);if(!n)throw new Error("Evm signer must be provided");return g(s,n).getDecimals()}async function T(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 ft(e,n)}return 0n}async function L({transferConfig:a,destinationAddress:t,destinationFee:e,evmSigner:n,polkadot:r,sourceAddress:s}){var Q,X,_,z;let{asset:c,destination:m,source:{chain:o,config:i}}=a,u=k.fromAsset(c,{amount:0n,decimals:await b({address:t,chain:o,config:i,evmSigner:n,polkadot:r})}),p=(Q=i.fee)!=null&&Q.asset?k.fromAsset(i.fee.asset,{amount:0n,decimals:await b({address:t,asset:i.fee.asset,chain:o,config:i,evmSigner:n,polkadot:r})}):u,d=(X=i.destinationFee)!=null&&X.asset?k.fromAsset(i.destinationFee.asset,{amount:0n,decimals:await b({address:t,asset:i.destinationFee.asset,chain:o,config:i,evmSigner:n,polkadot:r})}):u,f=await B({address:s,chain:o,config:i,decimals:u.decimals,evmSigner:n,polkadot:r}),l=await j({address:s,balance:f,chain:o,decimals:p.decimals,feeConfig:i.fee,polkadot:r}),P=i.asset.isEqual(i.destinationFee.asset)?f:await j({address:s,balance:f,chain:o,decimals:d.decimals,feeConfig:i.destinationFee,polkadot:r}),S=await T(i,r),x=(_=i.extrinsic)==null?void 0:_.build({address:t,amount:f,asset:o.getAssetId(c),destination:m.chain,fee:e.amount,feeAsset:o.getAssetId(e),palletInstance:o.getAssetPalletInstance(c),source:o}),v=(z=i.contract)==null?void 0:z.build({address:t,amount:f,asset:o.getAssetId(c),destination:m.chain,fee:e.amount,feeAsset:o.getAssetId(e)}),D=await pt({balance:f,chain:o,contract:v,decimals:p.decimals,evmSigner:n,extrinsic:x,feeConfig:i.fee,polkadot:r,sourceAddress:s}),h=u.copyWith({amount:f}),{existentialDeposit:R}=r,O=p.copyWith({amount:D}),Z=p.copyWith({amount:l}),tt=d.copyWith({amount:P}),q=u.copyWith({amount:S}),et=ht({balanceAmount:h,existentialDeposit:R,feeAmount:O,minAmount:q});return{balance:h,chain:o,destinationFeeBalance:tt,existentialDeposit:R,fee:O,feeBalance:Z,max:et,min:q}}async function j({address:a,balance:t,chain:e,decimals:n,feeConfig:r,polkadot:s}){if(!r)return t;let c=await s.query(r.balance.build({address:a,asset:s.chain.getBalanceAssetId(r.asset)}));return e.usesChainDecimals?W(c,s.decimals,n):c}async function pt({balance:a,chain:t,contract:e,decimals:n,evmSigner:r,extrinsic:s,feeConfig:c,polkadot:m,sourceAddress:o}){if(e){if(!r)throw new Error("EVM Signer must be provided");return dt(a,e,n,r)}if(s){let i=await gt(a,s,m,o),u=yt(n,c),p=i+u;return t.usesChainDecimals?W(p,m.decimals,n):p}throw new Error("Either contract or extrinsic must be provided")}async function dt(a,t,e,n){let s=await g(t,n).getFee(a);return W(s,18,e)}async function gt(a,t,e,n){try{return await e.getFee(n,t)}catch(r){if(a)throw r;return 0n}}function yt(a,t){return t!=null&&t.xcmDeliveryFeeAmount?lt(t.xcmDeliveryFeeAmount,a):0n}function ht({balanceAmount:a,existentialDeposit:t,feeAmount:e,minAmount:n}){let r=a.toBig().minus(n.toBig()).minus(a.isSame(t)?t.toBig():$(0)).minus(a.isSame(e)?e.toBig():$(0));return a.copyWith({amount:r.lt(0)?0n:BigInt(r.toFixed())})}import{ConfigBuilder as Y,ConfigService as Bt}from"@moonbeam-network/xcm-config";import{convertDecimals as Dt,toBigInt as U}from"@moonbeam-network/xcm-utils";import A from"big.js";import"@polkadot/api-augment";import{darwiniaPangoro as Ct,eq as bt,equilibrium as At,paring as wt}from"@moonbeam-network/xcm-config";import{AssetAmount as Pt}from"@moonbeam-network/xcm-types";import{getPolkadotApi as St}from"@moonbeam-network/xcm-utils";var y=class{api;chain;configService;constructor(t,e,n){this.api=t,this.chain=e,this.configService=n}static async create(t,e){return new y(await St(t.ws),t,e)}static async createMulti(t,e){return Promise.all(t.map(n=>y.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"&&[At.key].includes(this.chain.key))return bt;if(e==="oring"&&this.chain.key===Ct.key)return wt;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 r,s;let t=(r=this.api.consts.balances)==null?void 0:r.existentialDeposit,e=(s=this.api.consts.eqBalances)==null?void 0:s.existentialDeposit,n=(t==null?void 0:t.toBigInt())||(e==null?void 0:e.toBigInt())||0n;return Pt.fromAsset(this.asset,{amount:n,decimals:this.decimals})}async getAssetMeta(t){var s,c,m,o,i;let e=((s=this.api.query.assets)==null?void 0:s.metadata)||((c=this.api.query.assetRegistry)==null?void 0:c.metadata)||((m=this.api.query.assetRegistry)==null?void 0:m.currencyMetadatas)||((o=this.api.query.assetRegistry)==null?void 0:o.assetMetadatas)||((i=this.api.query.assetRegistry)==null?void 0:i.assetMetadataMap);if(!e)return;let n=await e(t),r="unwrapOrDefault"in n?n.unwrapOrDefault():n;return{decimals:r.decimals.toNumber(),symbol:r.symbol.toString()}}async getAssetDecimalsFromQuery(t){var r;let e=(r=this.api.query.assetsRegistry)==null?void 0:r.assetDecimals;return e?(await e(t)).unwrapOrDefault().toNumber():void 0}async getAssetDecimals(t){var n;let e=this.chain.getMetadataAssetId(t);return this.chain.getAssetDecimals(t)||await this.getAssetDecimalsFromQuery(e)||((n=await this.getAssetMeta(e))==null?void 0:n.decimals)||this.decimals}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],r=e.getArgs(n);return(await n(...r).paymentInfo(t,{nonce:-1})).partialFee.toBigInt()}async transfer(t,e,n){let r=this.api.tx[e.module][e.func],s=e.getArgs(r);return(await r(...s).signAndSend(this.#t(n)?t:n,{nonce:-1,signer:this.#t(n)?n:void 0})).toString()}#t(t){return"signPayload"in t}};import{AssetAmount as H}from"@moonbeam-network/xcm-types";import{toBigInt as xt}from"@moonbeam-network/xcm-utils";async function J({transferConfig:a,destinationAddress:t,evmSigner:e,polkadot:n}){let{asset:r,destination:{chain:s,config:c}}=a,m=H.fromAsset(r,{amount:0n,decimals:await b({address:t,chain:s,config:c,evmSigner:e,polkadot:n})}),o=await B({address:t,chain:s,config:c,decimals:m.decimals,evmSigner:e,polkadot:n}),i=await T(c,n),u=m.copyWith({amount:o}),{existentialDeposit:p}=n,d=await vt({address:t,config:a,evmSigner:e,polkadot:n}),f=m.copyWith({amount:i});return{balance:u,chain:s,existentialDeposit:p,fee:d,min:f}}async function vt({config:a,polkadot:t}){let{amount:e,asset:n}=a.source.config.destinationFee,r=await t.getAssetDecimals(n),s=H.fromAsset(n,{amount:0n,decimals:r});if(Number.isFinite(e))return s.copyWith({amount:xt(e,r)});let c=e.build({api:t.api,asset:t.chain.getAssetId(n)});return s.copyWith({amount:await c.call()})}async function F({configService:a,destinationAddress:t,evmSigner:e,polkadotSigner:n,sourceAddress:r,transferConfig:s}){let[c,m]=await y.createMulti([s.destination.chain,s.source.chain],a),o=await J({destinationAddress:t,evmSigner:e,polkadot:c,transferConfig:s}),i=await Et(m,o.fee),u=await L({destinationAddress:t,destinationFee:i,evmSigner:e,polkadot:m,sourceAddress:r,transferConfig:s});return{destination:o,getEstimate(p){let f=A(U(p,u.balance.decimals).toString()).minus(u.balance.isSame(i)?i.toBig():A(0));return u.balance.copyWith({amount:f.lt(0)?0n:BigInt(f.toFixed())})},isSwapPossible:!0,max:u.max,min:It(o),source:u,async swap(){return F({configService:a,destinationAddress:r,evmSigner:e,polkadotSigner:n,sourceAddress:t,transferConfig:{...s,destination:s.source,source:s.destination}})},async transfer(p){var v,D;let d=U(p,u.balance.decimals),{asset:f,source:{chain:l,config:P}}=s,S=(v=P.contract)==null?void 0:v.build({address:t,amount:d,asset:l.getAssetId(f),destination:o.chain,fee:i.amount,feeAsset:l.getAssetId(i)}),x=(D=P.extrinsic)==null?void 0:D.build({address:t,amount:d,asset:l.getAssetId(f),destination:o.chain,fee:i.amount,feeAsset:l.getAssetId(i),palletInstance:l.getAssetPalletInstance(f),source:l});if(S){if(!e)throw new Error("EVM Signer must be provided");return g(S,e).transfer().then(h=>typeof h=="object"?h.hash:h)}if(x){if(!n)throw new Error("Polkadot signer must be provided");return m.transfer(r,x,n)}throw new Error("Either contract or extrinsic must be provided")}}}function It({balance:a,existentialDeposit:t,fee:e,min:n}){let r=A(0).plus(a.isSame(e)?e.toBig():A(0)).plus(a.isSame(t)&&a.toBig().lt(t.toBig())?t.toBig():A(0)).plus(a.toBig().lt(n.toBig())?n.toBig():A(0));return a.copyWith({amount:BigInt(r.toFixed())})}async function Et(a,t){let e=await a.getAssetDecimals(t);return t.decimals===e?t:t.copyWith({amount:Dt(t.amount,t.decimals,e),decimals:e})}function Je(a){let t=(a==null?void 0:a.configService)??new Bt;return{assets(e){let{assets:n,asset:r}=Y(t).assets(e);return{assets:n,asset(s){let{sourceChains:c,source:m}=r(s);return{sourceChains:c,source(o){let{destinationChains:i,destination:u}=m(o);return{destinationChains:i,destination(p){return{async accounts(d,f,l){return F({...a,configService:t,destinationAddress:f,evmSigner:(l==null?void 0:l.evmSigner)??(l==null?void 0:l.ethersSigner),sourceAddress:d,transferConfig:u(p).build(),polkadotSigner:l==null?void 0:l.polkadotSigner})}}}}}}}}},async getTransferData({destinationAddress:e,destinationKeyOrChain:n,ethersSigner:r,evmSigner:s,keyOrAsset:c,polkadotSigner:m,sourceAddress:o,sourceKeyOrChain:i}){return F({configService:t,destinationAddress:e,evmSigner:s??r,polkadotSigner:m,sourceAddress:o,transferConfig:Y(t).assets().asset(c).source(i).destination(n).build()})}}}export{Je as Sdk,dt as getContractFee,gt as getExtrinsicFee,pt as getFee,j as getFeeBalance,ht as getMax,L 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/contract.utils.ts","../src/contract/contracts/Erc20/Erc20ABI.json","../src/contract/contracts/Xtokens/Xtokens.ts","../src/contract/contracts/Xtokens/XtokensABI.json","../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 ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { FeeAssetConfig, 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 { EvmSigner, SourceChainTransferData } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } 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 evmSigner,\n polkadot,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n config,\n evmSigner,\n polkadot,\n }),\n });\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n config,\n evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\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 config,\n evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n config,\n evmSigner,\n polkadot,\n });\n\n const feeBalance = await getFeeBalances({\n address: sourceAddress,\n balance,\n feeConfig: config.fee,\n polkadot,\n });\n\n const destinationFeeBalance = config.asset.isEqual(\n config.destinationFee.asset,\n )\n ? balance\n : await getFeeBalances({\n address: sourceAddress,\n balance,\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 const fee = await getFee({\n balance,\n contract,\n decimals: zeroFeeAmount.decimals,\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 const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\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 GetBalancesParams {\n address: string;\n balance: bigint;\n feeConfig: FeeAssetConfig | undefined;\n polkadot: PolkadotService;\n}\n\nexport async function getFeeBalances({\n address,\n balance,\n feeConfig,\n polkadot,\n}: GetBalancesParams) {\n return feeConfig\n ? polkadot.query(\n feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig,\n )\n : balance;\n}\n\nexport interface GetFeeParams {\n balance: bigint;\n contract?: ContractConfig;\n decimals: number;\n evmSigner?: EvmSigner;\n extrinsic?: ExtrinsicConfig;\n feeConfig?: FeeAssetConfig;\n polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n contract,\n decimals,\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 return getContractFee(balance, contract, decimals, evmSigner);\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 return extrinsicFee + xcmDeliveryFee;\n }\n\n throw new Error('Either contract or extrinsic must be provided');\n}\n\nexport async function getContractFee(\n balance: bigint,\n config: ContractConfig,\n decimals: number,\n evmSigner: EvmSigner,\n): Promise<bigint> {\n const contract = createContract(\n config,\n evmSigner,\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","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\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\n this.address = config.address;\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 publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\n\nexport class Xtokens implements TransferContractInterface {\n readonly address = '0x0000000000000000000000000000000000000804';\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | XtokensContract;\n\n readonly #signer: EvmSigner;\n\n constructor(config: ContractConfig, signer: EvmSigner) {\n this.#config = config;\n\n this.#signer = signer;\n\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address,\n publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 (\n await contract.estimateGas[this.#config.func](...this.#config.args)\n ).toBigInt();\n }\n\n async getViemContractEstimatedGas(\n contract: XtokensContract,\n ): Promise<bigint> {\n if (!contract) {\n return 0n;\n }\n\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 /**\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\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 const { gasPrice, maxPriorityFeePerGas } =\n await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\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 { EvmSigner } from '../sdk.interfaces';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\n\nexport function createContract(\n config: ContractConfig,\n signer: EvmSigner,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20(config, signer);\n }\n\n if (config.module === 'Xtokens') {\n return new Xtokens(config, signer);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n","import { CallType, SubstrateQueryConfig } from '@moonbeam-network/xcm-builder';\nimport { AssetConfig } from '@moonbeam-network/xcm-config';\nimport { Asset } from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport { BalanceContractInterface, createContract } from '../contract';\nimport { PolkadotService } from '../polkadot';\nimport { EvmSigner } from '../sdk.interfaces';\n\nexport interface GetFeeBalancesParams {\n address: string;\n config: AssetConfig;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n asset?: Asset;\n}\n\nexport async function getBalance({\n address,\n config,\n evmSigner,\n polkadot,\n}: GetFeeBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\n\n if (cfg.type === CallType.Substrate) {\n return polkadot.query(cfg as SubstrateQueryConfig);\n }\n\n if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) as BalanceContractInterface;\n\n return contract.getBalance();\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n evmSigner,\n polkadot,\n}: GetFeeBalancesParams) {\n const cfg = 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 if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) 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 { AnyChain, Asset, Ecosystem } from '@moonbeam-network/xcm-types';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\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 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 type { TransactionResponse } from '@ethersproject/abstract-provider';\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 evmSigner,\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(contract, evmSigner) 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 = await sourcePolkadot.getAssetDecimals(\n destinationFee,\n );\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 {\n IConfigService,\n darwiniaPangoro,\n eq,\n equilibrium,\n paring,\n} 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 // TODO: Remove this once Darwinia Pangoro is updated\n if (key === 'oring' && this.chain.key === darwiniaPangoro.key) {\n return paring;\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?.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\n return {\n decimals: unwrapped.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 return (\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.chain.getAssetDecimals(asset) ||\n this.decimals\n );\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, EvmSigner } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n evmSigner,\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 config,\n evmSigner,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n config,\n evmSigner,\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 evmSigner,\n polkadot,\n });\n const minAmount = zeroAmount.copyWith({ amount: min });\n\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 evmSigner?: EvmSigner;\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":["AssetAmount","convertDecimals","toBigInt","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","isEthersSigner","Contract","XtokensABI_default","getContract","createPublicClient","http","isEthersContract","contract","amount","estimatedGas","gasPrice","error","maxPriorityFeePerGas","createContract","config","signer","Erc20","Xtokens","CallType","toBigInt","getBalance","address","config","evmSigner","polkadot","cfg","CallType","createContract","getDecimals","asset","getMin","min","decimals","toBigInt","getSourceData","transferConfig","destinationAddress","destinationFee","evmSigner","polkadot","sourceAddress","_a","_b","_c","_d","asset","destination","chain","config","zeroAmount","AssetAmount","getDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalances","destinationFeeBalance","min","getMin","extrinsic","contract","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","destinationFeeBalanceAmount","minAmount","maxAmount","getMax","address","feeConfig","decimals","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","createContract","convertDecimals","error","toBigInt","result","Big","ConfigBuilder","ConfigService","convertDecimals","toBigInt","Big","darwiniaPangoro","eq","equilibrium","paring","AssetAmount","getPolkadotApi","PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","fn","data","unwrapped","metaId","config","response","account","args","signer","#isSigner","AssetAmount","toBigInt","getDestinationData","transferConfig","destinationAddress","evmSigner","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"]}
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/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 ContractConfig,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@moonbeam-network/xcm-builder';\nimport { FeeAssetConfig, TransferConfig } from '@moonbeam-network/xcm-config';\nimport { AnyChain, 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 { 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 evmSigner,\n polkadot,\n sourceAddress,\n}: GetSourceDataParams): Promise<SourceChainTransferData> {\n const {\n asset,\n destination,\n source: { chain, config },\n } = transferConfig;\n const zeroAmount = AssetAmount.fromAsset(asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n chain,\n config,\n evmSigner,\n polkadot,\n }),\n });\n const zeroFeeAmount = config.fee?.asset\n ? AssetAmount.fromAsset(config.fee.asset, {\n amount: 0n,\n decimals: await getDecimals({\n address: destinationAddress,\n asset: config.fee.asset,\n chain,\n config,\n evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\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 evmSigner,\n polkadot,\n }),\n })\n : zeroAmount;\n\n const balance = await getBalance({\n address: sourceAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n evmSigner,\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 const fee = await getFee({\n balance,\n chain,\n contract,\n decimals: zeroFeeAmount.decimals,\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 const destinationFeeBalanceAmount = zeroDestinationFeeAmount.copyWith({\n amount: destinationFeeBalance,\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 feeBalance = await polkadot.query(\n feeConfig.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(feeConfig.asset),\n }) as SubstrateQueryConfig,\n );\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 polkadot: PolkadotService;\n sourceAddress: string;\n}\n\nexport async function getFee({\n balance,\n chain,\n contract,\n decimals,\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 return getContractFee(balance, contract, decimals, evmSigner);\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: bigint,\n config: ContractConfig,\n decimals: number,\n evmSigner: EvmSigner,\n): Promise<bigint> {\n const contract = createContract(\n config,\n evmSigner,\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","import { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\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\n this.address = config.address;\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 publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport { ContractConfig } from '@moonbeam-network/xcm-builder';\nimport { Contract } from 'ethers';\nimport {\n GetContractReturnType,\n PublicClient,\n WalletClient,\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<\n typeof abi,\n PublicClient,\n WalletClient\n>;\n\nexport class Xtokens implements TransferContractInterface {\n readonly address = '0x0000000000000000000000000000000000000804';\n\n readonly #config: ContractConfig;\n\n readonly #contract: Contract | XtokensContract;\n\n readonly #signer: EvmSigner;\n\n constructor(config: ContractConfig, signer: EvmSigner) {\n this.#config = config;\n\n this.#signer = signer;\n\n this.#contract = isEthersSigner(signer)\n ? new Contract(this.address, abi, signer)\n : getContract({\n abi,\n address: this.address,\n publicClient: createPublicClient({\n chain: signer.chain,\n transport: http(),\n }),\n walletClient: signer,\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 (\n await contract.estimateGas[this.#config.func](...this.#config.args)\n ).toBigInt();\n }\n\n async getViemContractEstimatedGas(\n contract: XtokensContract,\n ): Promise<bigint> {\n if (!contract) {\n return 0n;\n }\n\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 /**\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\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 const { gasPrice, maxPriorityFeePerGas } =\n await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\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 { EvmSigner } from '../sdk.interfaces';\nimport {\n BalanceContractInterface,\n TransferContractInterface,\n} from './contract.interfaces';\nimport { Erc20, Xtokens } from './contracts';\n\nexport function createContract(\n config: ContractConfig,\n signer: EvmSigner,\n): TransferContractInterface | BalanceContractInterface {\n if (config.module === 'Erc20') {\n return new Erc20(config, signer);\n }\n\n if (config.module === 'Xtokens') {\n return new Xtokens(config, signer);\n }\n\n throw new Error(`Contract ${config.module} not found`);\n}\n","import { CallType, SubstrateQueryConfig } 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';\nimport { EvmSigner } from '../sdk.interfaces';\n\nexport interface GetBalancesParams {\n address: string;\n asset?: Asset;\n chain: AnyChain;\n config: AssetConfig;\n decimals: number;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport type GetDecimalsParams = Omit<GetBalancesParams, 'decimals'>;\n\nexport async function getBalance({\n address,\n chain,\n config,\n decimals,\n evmSigner,\n polkadot,\n}: GetBalancesParams) {\n const cfg = config.balance.build({\n address,\n asset: polkadot.chain.getBalanceAssetId(config.asset),\n });\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 if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) as BalanceContractInterface;\n\n return contract.getBalance();\n}\n\nexport async function getDecimals({\n address,\n asset,\n config,\n evmSigner,\n polkadot,\n}: GetDecimalsParams) {\n const cfg = 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 if (!evmSigner) {\n throw new Error('Evm signer must be provided');\n }\n\n const contract = createContract(cfg, evmSigner) 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 { AnyChain, Asset, Ecosystem } from '@moonbeam-network/xcm-types';\nimport { getTransferData as gtd } from './getTransferData/getTransferData';\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 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 type { TransactionResponse } from '@ethersproject/abstract-provider';\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 evmSigner,\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(contract, evmSigner) 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 = await sourcePolkadot.getAssetDecimals(\n destinationFee,\n );\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 {\n IConfigService,\n darwiniaPangoro,\n eq,\n equilibrium,\n paring,\n} 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 // TODO: Remove this once Darwinia Pangoro is updated\n if (key === 'oring' && this.chain.key === darwiniaPangoro.key) {\n return paring;\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?.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\n return {\n decimals: unwrapped.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 return (\n this.chain.getAssetDecimals(asset) ||\n (await this.getAssetDecimalsFromQuery(metaId)) ||\n (await this.getAssetMeta(metaId))?.decimals ||\n this.decimals\n );\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, EvmSigner } from '../sdk.interfaces';\nimport { getBalance, getDecimals, getMin } from './getTransferData.utils';\n\nexport interface GetDestinationDataParams {\n transferConfig: TransferConfig;\n destinationAddress: string;\n evmSigner?: EvmSigner;\n polkadot: PolkadotService;\n}\n\nexport async function getDestinationData({\n transferConfig,\n destinationAddress,\n evmSigner,\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 evmSigner,\n polkadot,\n }),\n });\n\n const balance = await getBalance({\n address: destinationAddress,\n chain,\n config,\n decimals: zeroAmount.decimals,\n evmSigner,\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 evmSigner,\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 evmSigner?: EvmSigner;\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":["AssetAmount","convertDecimals","toBigInt","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","isEthersSigner","Contract","XtokensABI_default","getContract","createPublicClient","http","isEthersContract","contract","amount","estimatedGas","gasPrice","error","maxPriorityFeePerGas","createContract","config","signer","Erc20","Xtokens","CallType","convertDecimals","toBigInt","getBalance","address","chain","config","decimals","evmSigner","polkadot","cfg","CallType","balance","convertDecimals","createContract","getDecimals","asset","getMin","min","toBigInt","getSourceData","transferConfig","destinationAddress","destinationFee","evmSigner","polkadot","sourceAddress","_a","_b","_c","_d","asset","destination","chain","config","zeroAmount","AssetAmount","getDecimals","zeroFeeAmount","zeroDestinationFeeAmount","balance","getBalance","feeBalance","getFeeBalance","destinationFeeBalance","min","getMin","extrinsic","contract","fee","getFee","balanceAmount","existentialDeposit","feeAmount","feeBalanceAmount","destinationFeeBalanceAmount","minAmount","maxAmount","getMax","address","decimals","feeConfig","convertDecimals","getContractFee","extrinsicFee","getExtrinsicFee","xcmDeliveryFee","getXcmDeliveryFee","totalFee","createContract","error","toBigInt","result","Big","ConfigBuilder","ConfigService","convertDecimals","toBigInt","Big","darwiniaPangoro","eq","equilibrium","paring","AssetAmount","getPolkadotApi","PolkadotService","api","chain","configService","chains","symbol","key","asset","_a","_b","existentialDeposit","eqExistentialDeposit","amount","_c","_d","_e","fn","data","unwrapped","metaId","config","response","account","args","signer","#isSigner","AssetAmount","toBigInt","getDestinationData","transferConfig","destinationAddress","evmSigner","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonbeam-network/xcm-sdk",
3
- "version": "1.4.22",
3
+ "version": "1.4.23",
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,9 +51,9 @@
51
51
  "types": "./build/index.d.ts",
52
52
  "main": "./build/index.cjs",
53
53
  "dependencies": {
54
- "@moonbeam-network/xcm-builder": "1.0.12",
55
- "@moonbeam-network/xcm-config": "1.3.26",
56
- "@moonbeam-network/xcm-types": "1.0.3",
54
+ "@moonbeam-network/xcm-builder": "1.0.13",
55
+ "@moonbeam-network/xcm-config": "1.3.27",
56
+ "@moonbeam-network/xcm-types": "1.0.4",
57
57
  "@moonbeam-network/xcm-utils": "1.0.4",
58
58
  "big.js": "^6.2.1"
59
59
  },