@moonbeam-network/xcm-sdk 0.0.1-dev.10 → 0.0.1-dev.11

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/README.md CHANGED
@@ -13,6 +13,12 @@ The Moonbeam XCM SDK enables developers to easily deposit and withdraw assets to
13
13
  npm i @moonbeam-network/xcm-config @moonbeam-network/xcm-sdk
14
14
  ```
15
15
 
16
+ :warning: You need to have peer dependencies of SDK installed as well.
17
+
18
+ ```bash
19
+ npm i @polkadot/api-augment @polkadot/types @polkadot/util @polkadot/util-crypto ethers
20
+ ```
21
+
16
22
  # Usage
17
23
 
18
24
  ## Init
package/build/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ie=Object.create;var B=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty;var ce=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),le=(s,e)=>{for(var t in e)B(s,t,{get:e[t],enumerable:!0})},q=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of oe(e))!me.call(s,i)&&i!==t&&B(s,i,{get:()=>e[i],enumerable:!(n=ae(e,i))||n.enumerable});return s};var G=(s,e,t)=>(t=s!=null?ie(re(s)):{},q(e||!s||!s.__esModule?B(t,"default",{value:s,enumerable:!0}):t,s)),ye=s=>q(B({},"__esModule",{value:!0}),s);var N=ce((xe,be)=>{be.exports=[{inputs:[{internalType:"address",name:"currency_address",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:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"asset",type:"tuple"},{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_multiasset",outputs:[],stateMutability:"nonpayable",type:"function"}]});var fe={};le(fe,{ExtrinsicStatus:()=>te.ExtrinsicStatus,PolkadotService:()=>A,XTokensContract:()=>x,createPolkadotServices:()=>P,getPolkadotApi:()=>T,init:()=>Se,isXcmSdkDeposit:()=>_,isXcmSdkWithdraw:()=>J,toDecimal:()=>M});module.exports=ye(fe);var te=require("@moonbeam-network/xcm-utils");var U=require("ethers"),O=G(N()),x=class{constructor(e){this.address="0x0000000000000000000000000000000000000804";this.#t=e,this.#e=new U.Contract(this.address,O.default,e)}#e;#t;async transfer(e,t,n,i){return this.#e.transfer(n.erc20Id,t,i.getParams(e),i.weight)}async getTransferFees(e,t,n,i){let a=(await this.#e.estimateGas.transfer(n.erc20Id,t,i.getParams(e),i.weight)).toBigInt(),r=await this.getGasPrice();return a*r}async getGasPrice(){let{gasPrice:e,maxPriorityFeePerGas:t}=await this.#t.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((t==null?void 0:t.toBigInt())||0n)}};var K=require("@polkadot/api"),R=G(require("lru-cache")),ue=10*60*1e3,L=new R.default({max:20,ttl:ue,updateAgeOnGet:!0,ttlAutopurge:!0,dispose:async s=>{let e=await s;e.isConnected&&e.disconnect()}});async function T(s){let e=L.get(s)||K.ApiPromise.create({provider:new K.WsProvider(s)});L.set(s,e);let t=await e;return await t.isReady,t}var Te=require("@moonbeam-network/api-augment"),I=require("lodash");function H(s,e){return BigInt(s)*e/BigInt(10**12)}var A=class{#e;constructor(e){this.#e=e}static async create(e){return new A(await T(e))}getMetadata(){return{decimals:this.#e.registry.chainDecimals.at(0)||12,symbol:this.#e.registry.chainTokens.at(0)}}getExistentialDeposit(){var e;return((e=this.#e.consts.balances)==null?void 0:e.existentialDeposit.toBigInt())||0n}async getAssetDecimals(e){return(await this.getAssetMeta(e)).decimals.toNumber()}async getAssetMeta(e){return(e.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata)(e.id)}async subscribeToAccountInfo(e,t){return this.#e.query.system.account(e,t)}async subscribeToBalance(e,t){return this.subscribeToAccountInfo(e,({data:n})=>t(n.free.toBigInt()-n.miscFrozen.toBigInt()))}async getGenericBalance(e,{pallet:t,function:n,getParams:i,path:a,calc:r}){var m;let o=await this.#e.query[t][n](...i(e));if(o.isEmpty)return 0n;let c=((m=o.unwrap)==null?void 0:m.call(o))||o;return r(a.length?(0,I.get)(c,a):c)}async getAssetMinBalance({pallet:e,function:t,params:n,path:i}){let a=await this.#e.query[e][t](...n);return a.isEmpty?0n:(0,I.get)(a.value,i).toBigInt()}getXcmExtrinsic(e,t,{pallet:n,extrinsic:i,getParams:a},r,o){let c=this.#e.tx[n][i](...a(e,t,r));return o&&(c=this.#e.tx.proxy.proxy(o,null,c)),c}async getAssetFee(e,t,n){return H(t,await this.getUnitsPerSecond(e,n))}async getUnitsPerSecond(e,t){if(e.isNative)return t.unitsPerSecond;let n=await this.getAssetType(e.id);return n?(await this.#e.query.assetManager.assetTypeUnitsPerSecond(n)).unwrapOrDefault().toBigInt():0n}async getAssetType(e){return(await this.#e.query.assetManager.assetIdType(e)).unwrapOr(void 0)}async subscribeToAssetsBalanceInfo(e,t,n){let i=Object.values(t.assets),a=await this.getAssetsMetadata(i);return this.subscribeToAccountBalances(e,i,r=>{n(r.map((o,c)=>{var p;let m=i[c],l=a[c],{chains:[y],from:u}=t.deposit(m.originSymbol),{origin:b}=u(y.key);return{asset:m,balance:{balance:o.balance.toBigInt(),decimals:m.isNative?b.decimals:l.decimals.toNumber(),symbol:m.isNative?m.originSymbol:((p=l.symbol.toHuman())==null?void 0:p.toString())||""},origin:b}}))})}async getAssetsMetadata(e){let t=e.map(n=>[n.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata,[n.id]]);return this.#e.queryMulti(t)}async subscribeToAccountBalances(e,t,n){let i=t.map(a=>[a.isLocalAsset?this.#e.query.localAssets.account:this.#e.query.assets.account,[a.id,e]]);return this.#e.queryMulti(i,a=>{let r=a.map(o=>o.unwrapOrDefault());n(r)})}};async function P(s){return Promise.all(s.map(e=>A.create(e)))}var w=require("@moonbeam-network/xcm-config"),ee=require("lodash");var Q=require("@moonbeam-network/xcm-utils"),j=require("@polkadot/util");function pe({account:s,config:e,foreignPolkadot:t,primaryAccount:n,fee:i}){return a=>t.getXcmExtrinsic(s,a,e.extrinsic,i,n)}async function z({account:s,asset:e,config:t,foreignPolkadot:n,moonChain:i,nativeAsset:a,origin:r,polkadot:o,polkadotSigner:c,primaryAccount:m,sourceAccount:l}){var W,F;let y=typeof l=="string"?l:l.address,u=n.getMetadata(),b={asset:((W=t.xcmFeeAsset)==null?void 0:W.asset)??e,balance:((F=t.xcmFeeAsset)==null?void 0:F.balance)??t.balance},[p,g,f,d,S=0n,h,C,k]=await Promise.all([o.getAssetDecimals(e),n.getExistentialDeposit(),n.getGenericBalance(m||y,t.balance),t.sourceFeeBalance?n.getGenericBalance(y,t.sourceFeeBalance):void 0,t.sourceMinBalance?n.getAssetMinBalance(t.sourceMinBalance):void 0,o.getAssetFee(b.asset,t.source.weight,i),n.getGenericBalance(m||y,b.balance),o.getAssetDecimals(b.asset)]),se=t.xcmFeeAsset?0n:h,X=pe({account:s,config:t,foreignPolkadot:n,primaryAccount:m,fee:h});return{asset:{...e,decimals:p},existentialDeposit:g,min:se,moonChainFee:{balance:C,decimals:b.asset.isNative?u.decimals:k,fee:h,symbol:b.asset.originSymbol},native:{...a,decimals:u.decimals},origin:r,source:t.source,sourceBalance:f,sourceFeeBalance:(0,j.isUndefined)(d)?void 0:{...u,balance:d},sourceMinBalance:S,getFee:async(v=f)=>(await(await X(v)).paymentInfo(l)).partialFee.toBigInt(),send:async(v,D)=>(await(await X(v)).signAndSend(l,{signer:c},D&&(0,Q.createExtrinsicEventHandler)(t.extrinsic.pallet,t.extrinsic.successEvent,D))).toString()}}function _(s){return!!s.from}function J(s){return!!s.to}function M(s,e,t=6){let n=10**t,i=s*BigInt(n),a=10n**BigInt(e);return Number(i/a)/n}function de(s,e){if(s.asset.isNative)return-1;if(e.asset.isNative)return 1;let t=M(s.balance.balance,s.balance.decimals),n=M(e.balance.balance,e.balance.decimals);if(t||n)return n-t;let i=(s.origin.name+s.asset.originSymbol).toLowerCase(),a=(e.origin.name+e.asset.originSymbol).toLowerCase();return i<a?-1:i>a?1:0}async function V({account:s,polkadot:e,configBuilder:t,cb:n}){let i=0n,a=[],r=m=>{let l=typeof m=="bigint";i=l?m:i,a=(l?a:m).map(y=>(y.asset.isNative&&(y.balance.balance=i),y)).sort(de),a.length&&n(a)},o=await e.subscribeToBalance(s,r),c=await e.subscribeToAssetsBalanceInfo(s,t,r);return()=>{o(),c()}}function Y(s){return{id:"",erc20Id:"",originSymbol:s}}var Z=require("@moonbeam-network/xcm-utils");async function $({asset:s,config:e,contract:t,destinationAccount:n,destinationPolkadot:i,ethersSigner:a,moonChain:r,nativeAsset:o,origin:c,polkadot:m}){let l=i.getMetadata(),[y,u,b,p]=await Promise.all([s.isNative?r.decimals:m.getAssetDecimals(s),i.getGenericBalance(n,e.balance),s.isNative?0n:i.getExistentialDeposit(),e.sourceMinBalance?i.getAssetMinBalance(e.sourceMinBalance):0n]),g=he(p,e),f=ge(p||b,u,g);return{asset:{...s,decimals:y},destination:e.destination,destinationBalance:u,destinationFee:g,existentialDeposit:b,min:f,native:{...o,decimals:l.decimals},origin:c,getFee:async d=>t.getTransferFees(n,d,s,e),send:async(d,S)=>{let h=await t.transfer(n,d,s,e);return S&&(0,Z.createTxEventHandler)(a,h.hash,S),h.hash}}}function he(s,e){let t=BigInt(e.weight*e.feePerWeight);return s>t?s:t}function ge(s,e,t){let n=e>=s?0n:s-e;return t+n}function Se(s){return{moonbase:E(w.moonbase,s),moonbeam:E(w.moonbeam,s),moonriver:E(w.moonriver,s)}}function E(s,e){let{symbols:t,assets:n,moonAsset:i,moonChain:a}=s;return{symbols:t,assets:n,moonAsset:i,moonChain:a,subscribeToAssetsBalanceInfo:async(r,o)=>{let[c]=await P([s.moonChain.ws]);return V({account:r,polkadot:c,configBuilder:s,cb:o})},deposit:r=>{let{chains:o,from:c}=s.deposit(r);return{chains:o,from:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,p,{primaryAccount:g,polkadotSigner:f}={})=>{let d=f||(e==null?void 0:e.polkadotSigner);if((0,ee.isString)(p)&&!d)throw new Error("Polkadot Signer/KeyringPair are not provided to XCM-SDK");let[S,h]=await P([s.moonChain.ws,u.source.ws]),C=h.getMetadata(),k=s.assets[C.symbol]||Y(C.symbol);return z({account:b,asset:l,config:u,foreignPolkadot:h,moonChain:a,nativeAsset:k,origin:y,polkadot:S,polkadotSigner:d,primaryAccount:g,sourceAccount:p})}}}}},withdraw:r=>{let{chains:o,to:c}=s.withdraw(r);return{chains:o,to:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,{ethersSigner:p}={})=>{let g=p||(e==null?void 0:e.ethersSigner);if(!g)throw new Error("Ethers signer is not provided to XCM-SDK");let f=new x(g),[d,S]=await P([s.moonChain.ws,u.destination.ws]),h=S.getMetadata(),C=s.assets[h.symbol];return $({asset:l,config:u,contract:f,destinationAccount:b,destinationPolkadot:S,ethersSigner:g,moonChain:a,nativeAsset:C,origin:y,polkadot:d})}}}}}}}0&&(module.exports={ExtrinsicStatus,PolkadotService,XTokensContract,createPolkadotServices,getPolkadotApi,init,isXcmSdkDeposit,isXcmSdkWithdraw,toDecimal});
1
+ "use strict";var ne=Object.create;var B=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var me=(s,e)=>{for(var t in e)B(s,t,{get:e[t],enumerable:!0})},G=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ae(e))!re.call(s,i)&&i!==t&&B(s,i,{get:()=>e[i],enumerable:!(n=ie(e,i))||n.enumerable});return s};var T=(s,e,t)=>(t=s!=null?ne(oe(s)):{},G(e||!s||!s.__esModule?B(t,"default",{value:s,enumerable:!0}):t,s)),ce=s=>G(B({},"__esModule",{value:!0}),s);var ge={};me(ge,{ExtrinsicStatus:()=>ee.ExtrinsicStatus,PolkadotService:()=>A,XTokensContract:()=>x,createPolkadotServices:()=>P,getPolkadotApi:()=>I,init:()=>he,isXcmSdkDeposit:()=>j,isXcmSdkWithdraw:()=>z,toDecimal:()=>M});module.exports=ce(ge);var ee=require("@moonbeam-network/xcm-utils");var N=require("ethers");var O=[{inputs:[{internalType:"address",name:"currency_address",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:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"asset",type:"tuple"},{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_multiasset",outputs:[],stateMutability:"nonpayable",type:"function"}];var x=class{constructor(e){this.address="0x0000000000000000000000000000000000000804";this.#t=e,this.#e=new N.Contract(this.address,O,e)}#e;#t;async transfer(e,t,n,i){return this.#e.transfer(n.erc20Id,t,i.getParams(e),i.weight)}async getTransferFees(e,t,n,i){let a=(await this.#e.estimateGas.transfer(n.erc20Id,t,i.getParams(e),i.weight)).toBigInt(),r=await this.getGasPrice();return a*r}async getGasPrice(){let{gasPrice:e,maxPriorityFeePerGas:t}=await this.#t.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((t==null?void 0:t.toBigInt())||0n)}};var K=require("@polkadot/api"),L=T(require("lru-cache"),1),ye=10*60*1e3,U=new L.default({max:20,ttl:ye,updateAgeOnGet:!0,ttlAutopurge:!0,dispose:async s=>{let e=await s;e.isConnected&&e.disconnect()}});async function I(s){let e=U.get(s)||K.ApiPromise.create({provider:new K.WsProvider(s)});U.set(s,e);let t=await e;return await t.isReady,t}var De=require("@polkadot/api-augment"),E=T(require("lodash"),1);function R(s,e){return BigInt(s)*e/BigInt(10**12)}var A=class{#e;constructor(e){this.#e=e}static async create(e){return new A(await I(e))}getMetadata(){return{decimals:this.#e.registry.chainDecimals.at(0)||12,symbol:this.#e.registry.chainTokens.at(0)}}getExistentialDeposit(){var e;return((e=this.#e.consts.balances)==null?void 0:e.existentialDeposit.toBigInt())||0n}async getAssetDecimals(e){return(await this.getAssetMeta(e)).decimals.toNumber()}async getAssetMeta(e){return await(e.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata)(e.id)}async subscribeToAccountInfo(e,t){return this.#e.query.system.account(e,t)}async subscribeToBalance(e,t){return this.subscribeToAccountInfo(e,({data:n})=>t(n.free.toBigInt()-n.miscFrozen.toBigInt()))}async getGenericBalance(e,{pallet:t,function:n,getParams:i,path:a,calc:r}){var m;let o=await this.#e.query[t][n](...i(e));if(o.isEmpty)return 0n;let c=((m=o.unwrap)==null?void 0:m.call(o))||o;return r(a.length?E.default.get(c,a):c)}async getAssetMinBalance({pallet:e,function:t,params:n,path:i}){let a=await this.#e.query[e][t](...n);return a.isEmpty?0n:E.default.get(a.value,i).toBigInt()}getXcmExtrinsic(e,t,{pallet:n,extrinsic:i,getParams:a},r,o){let c=this.#e.tx[n][i](...a(e,t,r));return o&&(c=this.#e.tx.proxy.proxy(o,null,c)),c}async getAssetFee(e,t,n){return R(t,await this.getUnitsPerSecond(e,n))}async getUnitsPerSecond(e,t){if(e.isNative)return t.unitsPerSecond;let n=await this.getAssetType(e.id);return n?(await this.#e.query.assetManager.assetTypeUnitsPerSecond(n)).unwrapOrDefault().toBigInt():0n}async getAssetType(e){return(await this.#e.query.assetManager.assetIdType(e)).unwrapOr(void 0)}async subscribeToAssetsBalanceInfo(e,t,n){let i=Object.values(t.assets),a=await this.getAssetsMetadata(i);return this.subscribeToAccountBalances(e,i,r=>{n(r.map((o,c)=>{var p;let m=i[c],l=a[c],{chains:[y],from:u}=t.deposit(m.originSymbol),{origin:b}=u(y.key);return{asset:m,balance:{balance:o.balance.toBigInt(),decimals:m.isNative?b.decimals:l.decimals.toNumber(),symbol:m.isNative?m.originSymbol:((p=l.symbol.toHuman())==null?void 0:p.toString())||""},origin:b}}))})}async getAssetsMetadata(e){let t=e.map(n=>[n.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata,[n.id]]);return this.#e.queryMulti(t)}async subscribeToAccountBalances(e,t,n){let i=t.map(a=>[a.isLocalAsset?this.#e.query.localAssets.account:this.#e.query.assets.account,[a.id,e]]);return this.#e.queryMulti(i,a=>{let r=a.map(o=>o.unwrapOrDefault());n(r)})}};async function P(s){return Promise.all(s.map(e=>A.create(e)))}var w=require("@moonbeam-network/xcm-config"),$=T(require("lodash"),1);var H=require("@moonbeam-network/xcm-utils"),Q=require("@polkadot/util");function be({account:s,config:e,foreignPolkadot:t,primaryAccount:n,fee:i}){return a=>t.getXcmExtrinsic(s,a,e.extrinsic,i,n)}async function _({account:s,asset:e,config:t,foreignPolkadot:n,moonChain:i,nativeAsset:a,origin:r,polkadot:o,polkadotSigner:c,primaryAccount:m,sourceAccount:l}){var F,q;let y=typeof l=="string"?l:l.address,u=n.getMetadata(),b={asset:((F=t.xcmFeeAsset)==null?void 0:F.asset)??e,balance:((q=t.xcmFeeAsset)==null?void 0:q.balance)??t.balance},[p,g,f,d,S=0n,h,C,k]=await Promise.all([o.getAssetDecimals(e),n.getExistentialDeposit(),n.getGenericBalance(m||y,t.balance),t.sourceFeeBalance?n.getGenericBalance(y,t.sourceFeeBalance):void 0,t.sourceMinBalance?n.getAssetMinBalance(t.sourceMinBalance):void 0,o.getAssetFee(b.asset,t.source.weight,i),n.getGenericBalance(m||y,b.balance),o.getAssetDecimals(b.asset)]),te=t.xcmFeeAsset?0n:h,W=be({account:s,config:t,foreignPolkadot:n,primaryAccount:m,fee:h});return{asset:{...e,decimals:p},existentialDeposit:g,min:te,moonChainFee:{balance:C,decimals:b.asset.isNative?u.decimals:k,fee:h,symbol:b.asset.originSymbol},native:{...a,decimals:u.decimals},origin:r,source:t.source,sourceBalance:f,sourceFeeBalance:(0,Q.isUndefined)(d)?void 0:{...u,balance:d},sourceMinBalance:S,getFee:async(v=f)=>(await(await W(v)).paymentInfo(l)).partialFee.toBigInt(),send:async(v,D)=>(await(await W(v)).signAndSend(l,{signer:c},D&&(0,H.createExtrinsicEventHandler)(t.extrinsic.pallet,t.extrinsic.successEvent,D))).toString()}}function j(s){return!!s.from}function z(s){return!!s.to}function M(s,e,t=6){let n=10**t,i=s*BigInt(n),a=10n**BigInt(e);return Number(i/a)/n}function ue(s,e){if(s.asset.isNative)return-1;if(e.asset.isNative)return 1;let t=M(s.balance.balance,s.balance.decimals),n=M(e.balance.balance,e.balance.decimals);if(t||n)return n-t;let i=(s.origin.name+s.asset.originSymbol).toLowerCase(),a=(e.origin.name+e.asset.originSymbol).toLowerCase();return i<a?-1:i>a?1:0}async function J({account:s,polkadot:e,configBuilder:t,cb:n}){let i=0n,a=[],r=m=>{let l=typeof m=="bigint";i=l?m:i,a=(l?a:m).map(y=>(y.asset.isNative&&(y.balance.balance=i),y)).sort(ue),a.length&&n(a)},o=await e.subscribeToBalance(s,r),c=await e.subscribeToAssetsBalanceInfo(s,t,r);return()=>{o(),c()}}function V(s){return{id:"",erc20Id:"",originSymbol:s}}var Y=require("@moonbeam-network/xcm-utils");async function Z({asset:s,config:e,contract:t,destinationAccount:n,destinationPolkadot:i,ethersSigner:a,moonChain:r,nativeAsset:o,origin:c,polkadot:m}){let l=i.getMetadata(),[y,u,b,p]=await Promise.all([s.isNative?r.decimals:m.getAssetDecimals(s),i.getGenericBalance(n,e.balance),s.isNative?0n:i.getExistentialDeposit(),e.sourceMinBalance?i.getAssetMinBalance(e.sourceMinBalance):0n]),g=pe(p,e),f=de(p||b,u,g);return{asset:{...s,decimals:y},destination:e.destination,destinationBalance:u,destinationFee:g,existentialDeposit:b,min:f,native:{...o,decimals:l.decimals},origin:c,getFee:async d=>t.getTransferFees(n,d,s,e),send:async(d,S)=>{let h=await t.transfer(n,d,s,e);return S&&(0,Y.createTxEventHandler)(a,h.hash,S),h.hash}}}function pe(s,e){let t=BigInt(e.weight*e.feePerWeight);return s>t?s:t}function de(s,e,t){let n=e>=s?0n:s-e;return t+n}function he(s){return{moonbase:X(w.moonbase,s),moonbeam:X(w.moonbeam,s),moonriver:X(w.moonriver,s)}}function X(s,e){let{symbols:t,assets:n,moonAsset:i,moonChain:a}=s;return{symbols:t,assets:n,moonAsset:i,moonChain:a,subscribeToAssetsBalanceInfo:async(r,o)=>{let[c]=await P([s.moonChain.ws]);return J({account:r,polkadot:c,configBuilder:s,cb:o})},deposit:r=>{let{chains:o,from:c}=s.deposit(r);return{chains:o,from:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,p,{primaryAccount:g,polkadotSigner:f}={})=>{let d=f||(e==null?void 0:e.polkadotSigner);if($.default.isString(p)&&!d)throw new Error("Polkadot Signer/KeyringPair are not provided to XCM-SDK");let[S,h]=await P([s.moonChain.ws,u.source.ws]),C=h.getMetadata(),k=s.assets[C.symbol]||V(C.symbol);return _({account:b,asset:l,config:u,foreignPolkadot:h,moonChain:a,nativeAsset:k,origin:y,polkadot:S,polkadotSigner:d,primaryAccount:g,sourceAccount:p})}}}}},withdraw:r=>{let{chains:o,to:c}=s.withdraw(r);return{chains:o,to:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,{ethersSigner:p}={})=>{let g=p||(e==null?void 0:e.ethersSigner);if(!g)throw new Error("Ethers signer is not provided to XCM-SDK");let f=new x(g),[d,S]=await P([s.moonChain.ws,u.destination.ws]),h=S.getMetadata(),C=s.assets[h.symbol];return Z({asset:l,config:u,contract:f,destinationAccount:b,destinationPolkadot:S,ethersSigner:g,moonChain:a,nativeAsset:C,origin:y,polkadot:d})}}}}}}}0&&(module.exports={ExtrinsicStatus,PolkadotService,XTokensContract,createPolkadotServices,getPolkadotApi,init,isXcmSdkDeposit,isXcmSdkWithdraw,toDecimal});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/contracts/XTokensContract/XTokensContract.ts","../src/polkadot/polkadot.api.ts","../src/polkadot/PolkadotService.ts","../src/polkadot/polkadot.utils.ts","../src/polkadot/polkadot.factory.ts","../src/sdk/sdk.ts","../src/sdk/sdk.deposit.ts","../src/sdk/sdk.utils.ts","../src/sdk/sdk.withdraw.ts"],"sourcesContent":["export { ExtrinsicStatus } from '@moonbeam-network/xcm-utils';\nexport type {\n ExtrinsicEvent,\n ExtrinsicEventsCallback,\n ExtrinsicFailedEvent,\n ExtrinsicSentEvent,\n ExtrinsicSuccessEvent,\n} from '@moonbeam-network/xcm-utils';\nexport * from './contracts';\nexport * from './polkadot';\nexport * from './sdk';\n","import type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n Asset,\n AssetSymbol,\n WithdrawXTokensConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Contract, Signer } from 'ethers';\n\nimport ContractInterface from './XTokensABI.json';\n\nexport class XTokensContract<Symbols extends AssetSymbol = AssetSymbol> {\n readonly address: string = '0x0000000000000000000000000000000000000804';\n\n readonly #contract: Contract;\n\n readonly #signer: Signer;\n\n constructor(signer: Signer) {\n this.#signer = signer;\n this.#contract = new Contract(this.address, ContractInterface, signer);\n }\n\n async transfer(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ): Promise<TransactionResponse> {\n return this.#contract.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n );\n }\n\n async getTransferFees(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ) {\n const estimatedGas = (\n await this.#contract.estimateGas.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n )\n ).toBigInt();\n const gasPrice = await this.getGasPrice();\n\n return estimatedGas * gasPrice;\n }\n\n private async getGasPrice() {\n const { gasPrice, maxPriorityFeePerGas } = await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\n }\n}\n","import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst tenMin = 10 * 60 * 1000;\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n ttl: tenMin,\n updateAgeOnGet: true,\n ttlAutopurge: true,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(ws: string): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n return api;\n}\n","import '@moonbeam-network/api-augment';\n\nimport {\n Asset,\n AssetSymbol,\n BalanceConfig,\n ChainKey,\n ExtrinsicConfig,\n MinBalanceConfig,\n MoonChain,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { ApiPromise } from '@polkadot/api';\nimport {\n QueryableStorageMultiArg,\n SubmittableExtrinsic,\n UnsubscribePromise,\n} from '@polkadot/api/types';\nimport { Option } from '@polkadot/types';\nimport { AccountInfo } from '@polkadot/types/interfaces';\nimport {\n MoonbeamRuntimeXcmConfigAssetType,\n PalletAssetsAssetAccount,\n PalletAssetsAssetMetadata,\n} from '@polkadot/types/lookup';\nimport { get } from 'lodash';\nimport { getPolkadotApi } from './polkadot.api';\nimport { AssetBalanceInfo } from './polkadot.interfaces';\nimport { calculateMin } from './polkadot.utils';\n\nexport class PolkadotService<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n> {\n readonly #api: ApiPromise;\n\n constructor(api: ApiPromise) {\n this.#api = api;\n }\n\n static async create<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n >(ws: string): Promise<PolkadotService<Symbols, ChainKeys>> {\n return new PolkadotService(await getPolkadotApi(ws));\n }\n\n getMetadata() {\n return {\n decimals: this.#api.registry.chainDecimals.at(0) || 12,\n symbol: this.#api.registry.chainTokens.at(0) as Symbols,\n };\n }\n\n getExistentialDeposit(): bigint {\n return this.#api.consts.balances?.existentialDeposit.toBigInt() || 0n;\n }\n\n async getAssetDecimals(asset: Asset<Symbols>): Promise<number> {\n const meta = await this.getAssetMeta(asset);\n\n return meta.decimals.toNumber();\n }\n\n async getAssetMeta(\n asset: Asset<Symbols>,\n ): Promise<PalletAssetsAssetMetadata> {\n return (\n asset.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata\n )(asset.id);\n }\n\n async subscribeToAccountInfo(\n account: string,\n callback: (info: AccountInfo) => void,\n ): UnsubscribePromise {\n return this.#api.query.system.account<AccountInfo>(account, callback);\n }\n\n async subscribeToBalance(\n account: string,\n callback: (balance: bigint) => void,\n ): UnsubscribePromise {\n return this.subscribeToAccountInfo(account, ({ data }) =>\n callback(data.free.toBigInt() - data.miscFrozen.toBigInt()),\n );\n }\n\n async getGenericBalance(\n account: string,\n { pallet, function: fn, getParams, path, calc }: BalanceConfig<Symbols>,\n ): Promise<bigint> {\n const response = await this.#api.query[pallet][fn](...getParams(account));\n\n if (response.isEmpty) {\n return 0n;\n }\n\n const unwrapped = (response as any).unwrap?.() || response;\n\n return calc(path.length ? get(unwrapped, path) : unwrapped);\n }\n\n async getAssetMinBalance({\n pallet,\n function: fn,\n params,\n path,\n }: MinBalanceConfig): Promise<bigint> {\n const details = (await this.#api.query[pallet][fn](\n ...params,\n )) as Option<any>;\n\n if (details.isEmpty) {\n return 0n;\n }\n\n return get(details.value, path).toBigInt();\n }\n\n getXcmExtrinsic(\n account: string,\n amount: bigint,\n { pallet, extrinsic, getParams }: ExtrinsicConfig<Symbols>,\n fee?: bigint,\n primaryAccount?: string,\n ): SubmittableExtrinsic<'promise'> {\n let transferExtrinsic = this.#api.tx[pallet][extrinsic](\n // TODO: check issue with types and if we can fix it\n // @ts-ignore\n ...getParams(account, amount, fee),\n );\n\n if (primaryAccount) {\n transferExtrinsic = this.#api.tx.proxy.proxy(\n primaryAccount,\n null,\n transferExtrinsic,\n );\n }\n\n return transferExtrinsic;\n }\n\n async getAssetFee(\n asset: Asset,\n weight: number,\n moonChain: MoonChain,\n ): Promise<bigint> {\n return calculateMin(weight, await this.getUnitsPerSecond(asset, moonChain));\n }\n\n async getUnitsPerSecond(asset: Asset, moonChain: MoonChain): Promise<bigint> {\n if (asset.isNative) {\n return moonChain.unitsPerSecond;\n }\n const type = await this.getAssetType(asset.id);\n\n if (!type) {\n return 0n;\n }\n\n return (await this.#api.query.assetManager.assetTypeUnitsPerSecond(type))\n .unwrapOrDefault()\n .toBigInt();\n }\n\n async getAssetType(\n id: string,\n ): Promise<MoonbeamRuntimeXcmConfigAssetType | undefined> {\n const type = await this.#api.query.assetManager.assetIdType(id);\n\n return type.unwrapOr(undefined);\n }\n\n async subscribeToAssetsBalanceInfo(\n account: string,\n config: XcmConfigBuilder<Symbols, ChainKeys>,\n callback: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise {\n const assetsArray = Object.values<Asset<Symbols>>(config.assets);\n const metadata = await this.getAssetsMetadata(assetsArray);\n\n return this.subscribeToAccountBalances(account, assetsArray, (data) => {\n callback(\n data.map((balance, index): AssetBalanceInfo<Symbols> => {\n const asset = assetsArray[index];\n const meta = metadata[index];\n const {\n chains: [chain],\n from,\n } = config.deposit(asset.originSymbol);\n const { origin } = from(chain.key);\n\n return {\n asset,\n balance: {\n balance: balance.balance.toBigInt(),\n decimals: asset.isNative\n ? (origin as MoonChain).decimals\n : meta.decimals.toNumber(),\n symbol: asset.isNative\n ? asset.originSymbol\n : meta.symbol.toHuman()?.toString() || '',\n },\n origin,\n };\n }),\n );\n });\n }\n\n async getAssetsMetadata(\n assetsArray: Asset<Symbols>[],\n ): Promise<PalletAssetsAssetMetadata[]> {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata,\n [x.id],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(queries);\n }\n\n async subscribeToAccountBalances(\n account: string,\n assetsArray: Asset<Symbols>[],\n callback: (balances: PalletAssetsAssetAccount[]) => void,\n ): UnsubscribePromise {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.account\n : this.#api.query.assets.account,\n [x.id, account],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(\n queries,\n (res: Option<PalletAssetsAssetAccount>[]) => {\n const response = res.map((item) => item.unwrapOrDefault());\n\n callback(response);\n },\n );\n }\n}\n","export function calculateMin(weight: number, unitsPerSecond: bigint): bigint {\n // 10**12 weight = 1 second\n return (BigInt(weight) * unitsPerSecond) / BigInt(10 ** 12);\n}\n","import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';\nimport { PolkadotService } from './PolkadotService';\n\nexport async function createPolkadotServices<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>(ws: string[]): Promise<PolkadotService<Symbols, ChainKeys>[]> {\n return Promise.all(\n ws.map((url) => PolkadotService.create<Symbols, ChainKeys>(url)),\n );\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n moonbase,\n MoonbaseAssets,\n MoonbaseChains,\n moonbeam,\n MoonbeamAssets,\n MoonbeamChains,\n moonriver,\n MoonriverAssets,\n MoonriverChains,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { isString } from 'lodash';\nimport { XTokensContract } from '../contracts';\nimport { AssetBalanceInfo, createPolkadotServices } from '../polkadot';\nimport { getDepositData } from './sdk.deposit';\nimport {\n DepositTransferData,\n SdkOptions,\n WithdrawGetParams,\n WithdrawTransferData,\n XcmSdk,\n XcmSdkByChain,\n XcmSdkDeposit,\n XcmSdkWithdraw,\n} from './sdk.interfaces';\nimport { createDummyAsset, subscribeToAssetsBalanceInfo } from './sdk.utils';\nimport { getWithdrawData } from './sdk.withdraw';\n\nexport function init(options?: SdkOptions): XcmSdkByChain {\n return {\n moonbase: initByChain<MoonbaseAssets, MoonbaseChains>(moonbase, options),\n moonbeam: initByChain<MoonbeamAssets, MoonbeamChains>(moonbeam, options),\n moonriver: initByChain<MoonriverAssets, MoonriverChains>(\n moonriver,\n options,\n ),\n };\n}\n\nfunction initByChain<Symbols extends AssetSymbol, ChainKeys extends ChainKey>(\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>,\n options?: SdkOptions,\n): XcmSdk<Symbols, ChainKeys> {\n const { symbols, assets, moonAsset, moonChain } = configBuilder;\n\n return {\n symbols,\n assets,\n moonAsset,\n moonChain,\n subscribeToAssetsBalanceInfo: async (\n account: string,\n cb: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise => {\n const [polkadot] = await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n ]);\n\n return subscribeToAssetsBalanceInfo({\n account,\n polkadot,\n configBuilder,\n cb,\n });\n },\n deposit: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkDeposit<Symbols, ChainKeys> => {\n const { chains, from } = configBuilder.deposit(symbolOrAsset);\n\n return {\n chains,\n from: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = from(keyOrChain);\n\n return {\n get: async (\n account: string,\n sourceAccount: string | IKeyringPair,\n { primaryAccount, polkadotSigner } = {},\n ): Promise<DepositTransferData<Symbols>> => {\n const signer = polkadotSigner || options?.polkadotSigner;\n\n if (isString(sourceAccount) && !signer) {\n throw new Error(\n 'Polkadot Signer/KeyringPair are not provided to XCM-SDK',\n );\n }\n\n const [polkadot, foreignPolkadot] = await createPolkadotServices<\n Symbols,\n ChainKeys\n >([configBuilder.moonChain.ws, config.source.ws]);\n const meta = foreignPolkadot.getMetadata();\n const nativeAsset =\n configBuilder.assets[meta.symbol] ||\n createDummyAsset(meta.symbol);\n\n return getDepositData({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner: signer,\n primaryAccount,\n sourceAccount,\n });\n },\n };\n },\n };\n },\n withdraw: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkWithdraw<Symbols, ChainKeys> => {\n const { chains, to } = configBuilder.withdraw(symbolOrAsset);\n\n return {\n chains,\n to: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = to(keyOrChain);\n\n return {\n get: async (\n destinationAccount: string,\n { ethersSigner }: WithdrawGetParams = {},\n ): Promise<WithdrawTransferData<Symbols>> => {\n const signer = ethersSigner || options?.ethersSigner;\n\n if (!signer) {\n throw new Error('Ethers signer is not provided to XCM-SDK');\n }\n\n const contract = new XTokensContract<Symbols>(signer);\n const [polkadot, destinationPolkadot] =\n await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n config.destination.ws,\n ]);\n const meta = destinationPolkadot.getMetadata();\n const nativeAsset = configBuilder.assets[meta.symbol];\n\n return getWithdrawData({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner: signer,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n });\n },\n };\n },\n };\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n DepositConfig,\n MoonChain,\n} from '@moonbeam-network/xcm-config';\nimport {\n createExtrinsicEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { isUndefined } from '@polkadot/util';\nimport { PolkadotService } from '../polkadot';\nimport { DepositTransferData } from './sdk.interfaces';\n\nexport interface CreateExtrinsicOptions<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n config: DepositConfig<Symbols>;\n fee?: bigint;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n primaryAccount?: string;\n}\n\nexport function getCreateExtrinsic<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee,\n}: CreateExtrinsicOptions<Symbols, ChainKeys>) {\n return (amount: bigint) =>\n foreignPolkadot.getXcmExtrinsic(\n account,\n amount,\n config.extrinsic,\n fee,\n primaryAccount,\n );\n}\n\nexport interface GetDepositDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n asset: Asset<Symbols>;\n config: DepositConfig<Symbols>;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n polkadotSigner?: PolkadotSigner;\n primaryAccount?: string;\n sourceAccount: string | IKeyringPair;\n}\n\nexport async function getDepositData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner,\n primaryAccount,\n sourceAccount,\n}: GetDepositDataParams<Symbols, ChainKeys>): Promise<\n DepositTransferData<Symbols>\n> {\n const sourceAddress =\n typeof sourceAccount === 'string' ? sourceAccount : sourceAccount.address;\n const meta = foreignPolkadot.getMetadata();\n const xcmFeeAssetConfig = {\n asset: config.xcmFeeAsset?.asset ?? asset,\n balance: config.xcmFeeAsset?.balance ?? config.balance,\n };\n\n const [\n assetDecimals,\n existentialDeposit,\n sourceBalance,\n sourceFeeBalance,\n sourceMinBalance = 0n,\n xcmFee,\n xcmFeeBalance,\n xcmFeeDecimals,\n ] = await Promise.all([\n // assetDecimals\n polkadot.getAssetDecimals(asset),\n // existentialDeposit\n foreignPolkadot.getExistentialDeposit(),\n // sourceBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n config.balance,\n ),\n // sourceFeeBalance\n config.sourceFeeBalance\n ? foreignPolkadot.getGenericBalance(\n sourceAddress,\n config.sourceFeeBalance,\n )\n : undefined,\n // sourceMinBalance\n config.sourceMinBalance\n ? foreignPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : undefined,\n // xcmFee\n polkadot.getAssetFee(\n xcmFeeAssetConfig.asset,\n config.source.weight,\n moonChain,\n ),\n // xcmFeeBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n xcmFeeAssetConfig.balance,\n ),\n // xcmFeeDecimals\n polkadot.getAssetDecimals(xcmFeeAssetConfig.asset),\n ]);\n\n // Min is basically the XCM fee, if it's the same asset. If less is sent then\n // Moon* won't process the message.\n const min = config.xcmFeeAsset ? 0n : xcmFee;\n const createExtrinsic = getCreateExtrinsic({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee: xcmFee,\n });\n\n return {\n asset: { ...asset, decimals: assetDecimals },\n existentialDeposit,\n min,\n moonChainFee: {\n balance: xcmFeeBalance,\n decimals: xcmFeeAssetConfig.asset.isNative\n ? meta.decimals\n : xcmFeeDecimals,\n fee: xcmFee,\n symbol: xcmFeeAssetConfig.asset.originSymbol,\n },\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n source: config.source,\n sourceBalance,\n sourceFeeBalance: !isUndefined(sourceFeeBalance)\n ? { ...meta, balance: sourceFeeBalance }\n : undefined,\n sourceMinBalance,\n getFee: async (amount = sourceBalance): Promise<bigint> => {\n const extrinsic = await createExtrinsic(amount);\n const info = await extrinsic.paymentInfo(sourceAccount);\n\n return info.partialFee.toBigInt();\n },\n send: async (\n amount: bigint,\n cb?: ExtrinsicEventsCallback,\n ): Promise<string> => {\n const extrinsic = await createExtrinsic(amount);\n const hash = await extrinsic.signAndSend(\n sourceAccount,\n {\n signer: polkadotSigner,\n },\n\n cb &&\n createExtrinsicEventHandler(\n config.extrinsic.pallet,\n config.extrinsic.successEvent,\n cb,\n ),\n );\n\n return hash.toString();\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n ChainKey,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { AssetBalanceInfo, PolkadotService } from '../polkadot';\nimport { XcmSdkDeposit, XcmSdkWithdraw } from './sdk.interfaces';\n\nexport function isXcmSdkDeposit(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkDeposit {\n return !!(config as XcmSdkDeposit).from;\n}\n\nexport function isXcmSdkWithdraw(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkWithdraw {\n return !!(config as XcmSdkWithdraw).to;\n}\n\nexport function toDecimal(\n number: bigint,\n decimals: number,\n maxDecimal = 6,\n): number {\n const decimalMultiplier = 10 ** maxDecimal;\n const dividend = number * BigInt(decimalMultiplier);\n const divisor = 10n ** BigInt(decimals);\n\n return Number(dividend / divisor) / decimalMultiplier;\n}\n\nexport function sortByBalanceAndChainName<Symbols extends AssetSymbol>(\n a: AssetBalanceInfo<Symbols>,\n b: AssetBalanceInfo<Symbols>,\n) {\n if (a.asset.isNative) {\n return -1;\n }\n\n if (b.asset.isNative) {\n return 1;\n }\n\n const aDecimal = toDecimal(a.balance.balance, a.balance.decimals);\n const bDecimal = toDecimal(b.balance.balance, b.balance.decimals);\n\n if (aDecimal || bDecimal) {\n return bDecimal - aDecimal;\n }\n\n const aName = (a.origin.name + a.asset.originSymbol).toLowerCase();\n const bName = (b.origin.name + b.asset.originSymbol).toLowerCase();\n\n if (aName < bName) {\n return -1;\n }\n\n if (aName > bName) {\n return 1;\n }\n\n return 0;\n}\n\nexport interface SubscribeToAssetsBalanceInfoParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>;\n cb: (data: AssetBalanceInfo<Symbols>[]) => void;\n}\n\nexport async function subscribeToAssetsBalanceInfo<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n polkadot,\n configBuilder,\n cb,\n}: SubscribeToAssetsBalanceInfoParams<Symbols, ChainKeys>): UnsubscribePromise {\n let lastBalance = 0n;\n let lastInfo: AssetBalanceInfo<Symbols>[] = [];\n const handler = (data: bigint | AssetBalanceInfo<Symbols>[]) => {\n const isBalance = typeof data === 'bigint';\n\n lastBalance = isBalance ? data : lastBalance;\n lastInfo = (isBalance ? lastInfo : data)\n .map((info) => {\n if (info.asset.isNative) {\n // eslint-disable-next-line no-param-reassign\n info.balance.balance = lastBalance;\n }\n\n return info;\n })\n .sort(sortByBalanceAndChainName);\n\n if (lastInfo.length) {\n cb(lastInfo);\n }\n };\n\n const unsubscribeBalance = await polkadot.subscribeToBalance(\n account,\n handler,\n );\n const unsubscribeInfo = await polkadot.subscribeToAssetsBalanceInfo(\n account,\n configBuilder,\n handler,\n );\n\n return () => {\n unsubscribeBalance();\n unsubscribeInfo();\n };\n}\n\nexport function createDummyAsset(symbol: AssetSymbol): Asset<AssetSymbol> {\n return {\n id: '',\n erc20Id: '',\n originSymbol: symbol,\n };\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n MoonChain,\n WithdrawConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n createTxEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as EthersSigner } from 'ethers';\nimport { XTokensContract } from '../contracts';\nimport { PolkadotService } from '../polkadot';\nimport { WithdrawTransferData } from './sdk.interfaces';\n\nexport interface GetWithdrawDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n asset: Asset<Symbols>;\n config: WithdrawConfig<Symbols>;\n contract: XTokensContract;\n destinationAccount: string;\n destinationPolkadot: PolkadotService<Symbols, ChainKeys>;\n ethersSigner: EthersSigner;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n}\n\nexport async function getWithdrawData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n}: GetWithdrawDataParams<Symbols, ChainKeys>): Promise<\n WithdrawTransferData<Symbols>\n> {\n const meta = destinationPolkadot.getMetadata();\n const [decimals, destinationBalance, existentialDeposit, assetMinBalance] =\n await Promise.all([\n asset.isNative ? moonChain.decimals : polkadot.getAssetDecimals(asset),\n destinationPolkadot.getGenericBalance(destinationAccount, config.balance),\n asset.isNative ? 0n : destinationPolkadot.getExistentialDeposit(),\n config.sourceMinBalance\n ? destinationPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : 0n,\n ]);\n\n const destinationFee = getFee(assetMinBalance, config);\n const min = getMin(\n assetMinBalance || existentialDeposit,\n destinationBalance,\n destinationFee,\n );\n\n return {\n asset: { ...asset, decimals },\n destination: config.destination,\n destinationBalance,\n destinationFee,\n existentialDeposit,\n min,\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n getFee: async (amount) =>\n contract.getTransferFees(destinationAccount, amount, asset, config),\n send: async (amount: bigint, cb?: ExtrinsicEventsCallback) => {\n const tx = await contract.transfer(\n destinationAccount,\n amount,\n asset,\n config,\n );\n\n if (cb) {\n createTxEventHandler(ethersSigner, tx.hash, cb);\n }\n\n return tx.hash;\n },\n };\n}\n\nexport function getFee<Symbols extends AssetSymbol>(\n assetMinBalance: bigint,\n config: WithdrawConfig<Symbols>,\n) {\n const calculatedFee = BigInt(config.weight * config.feePerWeight);\n\n return assetMinBalance > calculatedFee ? assetMinBalance : calculatedFee;\n}\n\nexport function getMin(\n balanceNeeded: bigint,\n destinationBalance: bigint,\n destinationFee: bigint,\n) {\n const extra =\n destinationBalance >= balanceNeeded\n ? 0n\n : balanceNeeded - destinationBalance;\n\n return destinationFee + extra;\n}\n"],"mappings":"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","names":["src_exports","__export","PolkadotService","XTokensContract","createPolkadotServices","getPolkadotApi","init","isXcmSdkDeposit","isXcmSdkWithdraw","toDecimal","__toCommonJS","import_xcm_utils","import_ethers","import_XTokensABI","XTokensContract","signer","#signer","#contract","ContractInterface","account","amount","asset","config","estimatedGas","gasPrice","maxPriorityFeePerGas","import_api","import_lru_cache","tenMin","cache","LRU","promise","api","getPolkadotApi","ws","import_api_augment","import_lodash","calculateMin","weight","unitsPerSecond","PolkadotService","#api","api","ws","getPolkadotApi","_a","asset","account","callback","data","pallet","fn","getParams","path","calc","response","unwrapped","params","details","amount","extrinsic","fee","primaryAccount","transferExtrinsic","weight","moonChain","calculateMin","type","id","config","assetsArray","metadata","balance","index","meta","chain","from","origin","queries","x","res","item","createPolkadotServices","ws","url","PolkadotService","import_xcm_config","import_lodash","import_xcm_utils","import_util","getCreateExtrinsic","account","config","foreignPolkadot","primaryAccount","fee","amount","getDepositData","asset","moonChain","nativeAsset","origin","polkadot","polkadotSigner","sourceAccount","_a","_b","sourceAddress","meta","xcmFeeAssetConfig","assetDecimals","existentialDeposit","sourceBalance","sourceFeeBalance","sourceMinBalance","xcmFee","xcmFeeBalance","xcmFeeDecimals","min","createExtrinsic","cb","isXcmSdkDeposit","config","isXcmSdkWithdraw","toDecimal","number","decimals","maxDecimal","decimalMultiplier","dividend","divisor","sortByBalanceAndChainName","a","b","aDecimal","bDecimal","aName","bName","subscribeToAssetsBalanceInfo","account","polkadot","configBuilder","cb","lastBalance","lastInfo","handler","data","isBalance","info","unsubscribeBalance","unsubscribeInfo","createDummyAsset","symbol","import_xcm_utils","getWithdrawData","asset","config","contract","destinationAccount","destinationPolkadot","ethersSigner","moonChain","nativeAsset","origin","polkadot","meta","decimals","destinationBalance","existentialDeposit","assetMinBalance","destinationFee","getFee","min","getMin","amount","cb","tx","calculatedFee","balanceNeeded","extra","init","options","initByChain","configBuilder","symbols","assets","moonAsset","moonChain","account","cb","polkadot","createPolkadotServices","subscribeToAssetsBalanceInfo","symbolOrAsset","chains","from","keyOrChain","asset","origin","config","sourceAccount","primaryAccount","polkadotSigner","signer","foreignPolkadot","meta","nativeAsset","createDummyAsset","getDepositData","to","destinationAccount","ethersSigner","contract","XTokensContract","destinationPolkadot","getWithdrawData"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/contracts/XTokensContract/XTokensContract.ts","../src/polkadot/polkadot.api.ts","../src/polkadot/PolkadotService.ts","../src/polkadot/polkadot.utils.ts","../src/polkadot/polkadot.factory.ts","../src/sdk/sdk.ts","../src/sdk/sdk.deposit.ts","../src/sdk/sdk.utils.ts","../src/sdk/sdk.withdraw.ts"],"sourcesContent":["export { ExtrinsicStatus } from '@moonbeam-network/xcm-utils';\nexport type {\n ExtrinsicEvent,\n ExtrinsicEventsCallback,\n ExtrinsicFailedEvent,\n ExtrinsicSentEvent,\n ExtrinsicSuccessEvent,\n} from '@moonbeam-network/xcm-utils';\nexport * from './contracts';\nexport * from './polkadot';\nexport * from './sdk';\n","import type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n Asset,\n AssetSymbol,\n WithdrawXTokensConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Contract, Signer } from 'ethers';\n\nimport ContractInterface from './XTokensABI.json';\n\nexport class XTokensContract<Symbols extends AssetSymbol = AssetSymbol> {\n readonly address: string = '0x0000000000000000000000000000000000000804';\n\n readonly #contract: Contract;\n\n readonly #signer: Signer;\n\n constructor(signer: Signer) {\n this.#signer = signer;\n this.#contract = new Contract(this.address, ContractInterface, signer);\n }\n\n async transfer(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ): Promise<TransactionResponse> {\n return this.#contract.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n );\n }\n\n async getTransferFees(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ) {\n const estimatedGas = (\n await this.#contract.estimateGas.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n )\n ).toBigInt();\n const gasPrice = await this.getGasPrice();\n\n return estimatedGas * gasPrice;\n }\n\n private async getGasPrice() {\n const { gasPrice, maxPriorityFeePerGas } = await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\n }\n}\n","import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst tenMin = 10 * 60 * 1000;\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n ttl: tenMin,\n updateAgeOnGet: true,\n ttlAutopurge: true,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(ws: string): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n return api;\n}\n","import '@polkadot/api-augment';\n\nimport {\n Asset,\n AssetSymbol,\n BalanceConfig,\n ChainKey,\n ExtrinsicConfig,\n MinBalanceConfig,\n MoonChain,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { ApiPromise } from '@polkadot/api';\nimport {\n QueryableStorageMultiArg,\n SubmittableExtrinsic,\n UnsubscribePromise,\n} from '@polkadot/api/types';\nimport { Option, u128 } from '@polkadot/types';\nimport { AccountInfo } from '@polkadot/types/interfaces';\nimport {\n PalletAssetsAssetAccount,\n PalletAssetsAssetMetadata,\n} from '@polkadot/types/lookup';\nimport _ from 'lodash';\nimport { getPolkadotApi } from './polkadot.api';\nimport { AssetBalanceInfo, XCMType } from './polkadot.interfaces';\nimport { calculateMin } from './polkadot.utils';\n\nexport class PolkadotService<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n> {\n readonly #api: ApiPromise;\n\n constructor(api: ApiPromise) {\n this.#api = api;\n }\n\n static async create<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n >(ws: string): Promise<PolkadotService<Symbols, ChainKeys>> {\n return new PolkadotService(await getPolkadotApi(ws));\n }\n\n getMetadata() {\n return {\n decimals: this.#api.registry.chainDecimals.at(0) || 12,\n symbol: this.#api.registry.chainTokens.at(0) as Symbols,\n };\n }\n\n getExistentialDeposit(): bigint {\n return this.#api.consts.balances?.existentialDeposit.toBigInt() || 0n;\n }\n\n async getAssetDecimals(asset: Asset<Symbols>): Promise<number> {\n const meta = await this.getAssetMeta(asset);\n\n return meta.decimals.toNumber();\n }\n\n async getAssetMeta(\n asset: Asset<Symbols>,\n ): Promise<PalletAssetsAssetMetadata> {\n const data = await (asset.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata)(asset.id);\n\n return data as PalletAssetsAssetMetadata;\n }\n\n async subscribeToAccountInfo(\n account: string,\n callback: (info: AccountInfo) => void,\n ): UnsubscribePromise {\n return this.#api.query.system.account<AccountInfo>(account, callback);\n }\n\n async subscribeToBalance(\n account: string,\n callback: (balance: bigint) => void,\n ): UnsubscribePromise {\n return this.subscribeToAccountInfo(account, ({ data }) =>\n callback(data.free.toBigInt() - data.miscFrozen.toBigInt()),\n );\n }\n\n async getGenericBalance(\n account: string,\n { pallet, function: fn, getParams, path, calc }: BalanceConfig<Symbols>,\n ): Promise<bigint> {\n const response = await this.#api.query[pallet][fn](...getParams(account));\n\n if (response.isEmpty) {\n return 0n;\n }\n\n const unwrapped = (response as any).unwrap?.() || response;\n\n return calc(path.length ? _.get(unwrapped, path) : unwrapped);\n }\n\n async getAssetMinBalance({\n pallet,\n function: fn,\n params,\n path,\n }: MinBalanceConfig): Promise<bigint> {\n const details = (await this.#api.query[pallet][fn](\n ...params,\n )) as Option<any>;\n\n if (details.isEmpty) {\n return 0n;\n }\n\n return _.get(details.value, path).toBigInt();\n }\n\n getXcmExtrinsic(\n account: string,\n amount: bigint,\n { pallet, extrinsic, getParams }: ExtrinsicConfig<Symbols>,\n fee?: bigint,\n primaryAccount?: string,\n ): SubmittableExtrinsic<'promise'> {\n let transferExtrinsic = this.#api.tx[pallet][extrinsic](\n // TODO: check issue with types and if we can fix it\n // @ts-ignore\n ...getParams(account, amount, fee),\n );\n\n if (primaryAccount) {\n transferExtrinsic = this.#api.tx.proxy.proxy(\n primaryAccount,\n null,\n transferExtrinsic,\n );\n }\n\n return transferExtrinsic;\n }\n\n async getAssetFee(\n asset: Asset,\n weight: number,\n moonChain: MoonChain,\n ): Promise<bigint> {\n return calculateMin(weight, await this.getUnitsPerSecond(asset, moonChain));\n }\n\n async getUnitsPerSecond(asset: Asset, moonChain: MoonChain): Promise<bigint> {\n if (asset.isNative) {\n return moonChain.unitsPerSecond;\n }\n const type = await this.getAssetType(asset.id);\n\n if (!type) {\n return 0n;\n }\n\n const res = (await this.#api.query.assetManager.assetTypeUnitsPerSecond(\n type,\n )) as Option<u128>;\n\n return res.unwrapOrDefault().toBigInt();\n }\n\n /**\n * this is only for Moon* chains\n */\n async getAssetType(id: string): Promise<XCMType | undefined> {\n const type = (await this.#api.query.assetManager.assetIdType(\n id,\n )) as Option<any>;\n\n return type.unwrapOr(undefined);\n }\n\n async subscribeToAssetsBalanceInfo(\n account: string,\n config: XcmConfigBuilder<Symbols, ChainKeys>,\n callback: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise {\n const assetsArray = Object.values<Asset<Symbols>>(config.assets);\n const metadata = await this.getAssetsMetadata(assetsArray);\n\n return this.subscribeToAccountBalances(account, assetsArray, (data) => {\n callback(\n data.map((balance, index): AssetBalanceInfo<Symbols> => {\n const asset = assetsArray[index];\n const meta = metadata[index];\n const {\n chains: [chain],\n from,\n } = config.deposit(asset.originSymbol);\n const { origin } = from(chain.key);\n\n return {\n asset,\n balance: {\n balance: balance.balance.toBigInt(),\n decimals: asset.isNative\n ? (origin as MoonChain).decimals\n : meta.decimals.toNumber(),\n symbol: asset.isNative\n ? asset.originSymbol\n : meta.symbol.toHuman()?.toString() || '',\n },\n origin,\n };\n }),\n );\n });\n }\n\n async getAssetsMetadata(\n assetsArray: Asset<Symbols>[],\n ): Promise<PalletAssetsAssetMetadata[]> {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata,\n [x.id],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(queries);\n }\n\n async subscribeToAccountBalances(\n account: string,\n assetsArray: Asset<Symbols>[],\n callback: (balances: PalletAssetsAssetAccount[]) => void,\n ): UnsubscribePromise {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.account\n : this.#api.query.assets.account,\n [x.id, account],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(\n queries,\n (res: Option<PalletAssetsAssetAccount>[]) => {\n const response = res.map((item) => item.unwrapOrDefault());\n\n callback(response);\n },\n );\n }\n}\n","export function calculateMin(weight: number, unitsPerSecond: bigint): bigint {\n // 10**12 weight = 1 second\n return (BigInt(weight) * unitsPerSecond) / BigInt(10 ** 12);\n}\n","import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';\nimport { PolkadotService } from './PolkadotService';\n\nexport async function createPolkadotServices<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>(ws: string[]): Promise<PolkadotService<Symbols, ChainKeys>[]> {\n return Promise.all(\n ws.map((url) => PolkadotService.create<Symbols, ChainKeys>(url)),\n );\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n moonbase,\n MoonbaseAssets,\n MoonbaseChains,\n moonbeam,\n MoonbeamAssets,\n MoonbeamChains,\n moonriver,\n MoonriverAssets,\n MoonriverChains,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport _ from 'lodash';\nimport { XTokensContract } from '../contracts';\nimport { AssetBalanceInfo, createPolkadotServices } from '../polkadot';\nimport { getDepositData } from './sdk.deposit';\nimport {\n DepositTransferData,\n SdkOptions,\n WithdrawGetParams,\n WithdrawTransferData,\n XcmSdk,\n XcmSdkByChain,\n XcmSdkDeposit,\n XcmSdkWithdraw,\n} from './sdk.interfaces';\nimport { createDummyAsset, subscribeToAssetsBalanceInfo } from './sdk.utils';\nimport { getWithdrawData } from './sdk.withdraw';\n\nexport function init(options?: SdkOptions): XcmSdkByChain {\n return {\n moonbase: initByChain<MoonbaseAssets, MoonbaseChains>(moonbase, options),\n moonbeam: initByChain<MoonbeamAssets, MoonbeamChains>(moonbeam, options),\n moonriver: initByChain<MoonriverAssets, MoonriverChains>(\n moonriver,\n options,\n ),\n };\n}\n\nfunction initByChain<Symbols extends AssetSymbol, ChainKeys extends ChainKey>(\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>,\n options?: SdkOptions,\n): XcmSdk<Symbols, ChainKeys> {\n const { symbols, assets, moonAsset, moonChain } = configBuilder;\n\n return {\n symbols,\n assets,\n moonAsset,\n moonChain,\n subscribeToAssetsBalanceInfo: async (\n account: string,\n cb: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise => {\n const [polkadot] = await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n ]);\n\n return subscribeToAssetsBalanceInfo({\n account,\n polkadot,\n configBuilder,\n cb,\n });\n },\n deposit: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkDeposit<Symbols, ChainKeys> => {\n const { chains, from } = configBuilder.deposit(symbolOrAsset);\n\n return {\n chains,\n from: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = from(keyOrChain);\n\n return {\n get: async (\n account: string,\n sourceAccount: string | IKeyringPair,\n { primaryAccount, polkadotSigner } = {},\n ): Promise<DepositTransferData<Symbols>> => {\n const signer = polkadotSigner || options?.polkadotSigner;\n\n if (_.isString(sourceAccount) && !signer) {\n throw new Error(\n 'Polkadot Signer/KeyringPair are not provided to XCM-SDK',\n );\n }\n\n const [polkadot, foreignPolkadot] = await createPolkadotServices<\n Symbols,\n ChainKeys\n >([configBuilder.moonChain.ws, config.source.ws]);\n const meta = foreignPolkadot.getMetadata();\n const nativeAsset =\n configBuilder.assets[meta.symbol] ||\n createDummyAsset(meta.symbol);\n\n return getDepositData({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner: signer,\n primaryAccount,\n sourceAccount,\n });\n },\n };\n },\n };\n },\n withdraw: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkWithdraw<Symbols, ChainKeys> => {\n const { chains, to } = configBuilder.withdraw(symbolOrAsset);\n\n return {\n chains,\n to: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = to(keyOrChain);\n\n return {\n get: async (\n destinationAccount: string,\n { ethersSigner }: WithdrawGetParams = {},\n ): Promise<WithdrawTransferData<Symbols>> => {\n const signer = ethersSigner || options?.ethersSigner;\n\n if (!signer) {\n throw new Error('Ethers signer is not provided to XCM-SDK');\n }\n\n const contract = new XTokensContract<Symbols>(signer);\n const [polkadot, destinationPolkadot] =\n await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n config.destination.ws,\n ]);\n const meta = destinationPolkadot.getMetadata();\n const nativeAsset = configBuilder.assets[meta.symbol];\n\n return getWithdrawData({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner: signer,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n });\n },\n };\n },\n };\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n DepositConfig,\n MoonChain,\n} from '@moonbeam-network/xcm-config';\nimport {\n createExtrinsicEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { isUndefined } from '@polkadot/util';\nimport { PolkadotService } from '../polkadot';\nimport { DepositTransferData } from './sdk.interfaces';\n\nexport interface CreateExtrinsicOptions<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n config: DepositConfig<Symbols>;\n fee?: bigint;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n primaryAccount?: string;\n}\n\nexport function getCreateExtrinsic<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee,\n}: CreateExtrinsicOptions<Symbols, ChainKeys>) {\n return (amount: bigint) =>\n foreignPolkadot.getXcmExtrinsic(\n account,\n amount,\n config.extrinsic,\n fee,\n primaryAccount,\n );\n}\n\nexport interface GetDepositDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n asset: Asset<Symbols>;\n config: DepositConfig<Symbols>;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n polkadotSigner?: PolkadotSigner;\n primaryAccount?: string;\n sourceAccount: string | IKeyringPair;\n}\n\nexport async function getDepositData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner,\n primaryAccount,\n sourceAccount,\n}: GetDepositDataParams<Symbols, ChainKeys>): Promise<\n DepositTransferData<Symbols>\n> {\n const sourceAddress =\n typeof sourceAccount === 'string' ? sourceAccount : sourceAccount.address;\n const meta = foreignPolkadot.getMetadata();\n const xcmFeeAssetConfig = {\n asset: config.xcmFeeAsset?.asset ?? asset,\n balance: config.xcmFeeAsset?.balance ?? config.balance,\n };\n\n const [\n assetDecimals,\n existentialDeposit,\n sourceBalance,\n sourceFeeBalance,\n sourceMinBalance = 0n,\n xcmFee,\n xcmFeeBalance,\n xcmFeeDecimals,\n ] = await Promise.all([\n // assetDecimals\n polkadot.getAssetDecimals(asset),\n // existentialDeposit\n foreignPolkadot.getExistentialDeposit(),\n // sourceBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n config.balance,\n ),\n // sourceFeeBalance\n config.sourceFeeBalance\n ? foreignPolkadot.getGenericBalance(\n sourceAddress,\n config.sourceFeeBalance,\n )\n : undefined,\n // sourceMinBalance\n config.sourceMinBalance\n ? foreignPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : undefined,\n // xcmFee\n polkadot.getAssetFee(\n xcmFeeAssetConfig.asset,\n config.source.weight,\n moonChain,\n ),\n // xcmFeeBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n xcmFeeAssetConfig.balance,\n ),\n // xcmFeeDecimals\n polkadot.getAssetDecimals(xcmFeeAssetConfig.asset),\n ]);\n\n // Min is basically the XCM fee, if it's the same asset. If less is sent then\n // Moon* won't process the message.\n const min = config.xcmFeeAsset ? 0n : xcmFee;\n const createExtrinsic = getCreateExtrinsic({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee: xcmFee,\n });\n\n return {\n asset: { ...asset, decimals: assetDecimals },\n existentialDeposit,\n min,\n moonChainFee: {\n balance: xcmFeeBalance,\n decimals: xcmFeeAssetConfig.asset.isNative\n ? meta.decimals\n : xcmFeeDecimals,\n fee: xcmFee,\n symbol: xcmFeeAssetConfig.asset.originSymbol,\n },\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n source: config.source,\n sourceBalance,\n sourceFeeBalance: !isUndefined(sourceFeeBalance)\n ? { ...meta, balance: sourceFeeBalance }\n : undefined,\n sourceMinBalance,\n getFee: async (amount = sourceBalance): Promise<bigint> => {\n const extrinsic = await createExtrinsic(amount);\n const info = await extrinsic.paymentInfo(sourceAccount);\n\n return info.partialFee.toBigInt();\n },\n send: async (\n amount: bigint,\n cb?: ExtrinsicEventsCallback,\n ): Promise<string> => {\n const extrinsic = await createExtrinsic(amount);\n const hash = await extrinsic.signAndSend(\n sourceAccount,\n {\n signer: polkadotSigner,\n },\n\n cb &&\n createExtrinsicEventHandler(\n config.extrinsic.pallet,\n config.extrinsic.successEvent,\n cb,\n ),\n );\n\n return hash.toString();\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n ChainKey,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { AssetBalanceInfo, PolkadotService } from '../polkadot';\nimport { XcmSdkDeposit, XcmSdkWithdraw } from './sdk.interfaces';\n\nexport function isXcmSdkDeposit(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkDeposit {\n return !!(config as XcmSdkDeposit).from;\n}\n\nexport function isXcmSdkWithdraw(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkWithdraw {\n return !!(config as XcmSdkWithdraw).to;\n}\n\nexport function toDecimal(\n number: bigint,\n decimals: number,\n maxDecimal = 6,\n): number {\n const decimalMultiplier = 10 ** maxDecimal;\n const dividend = number * BigInt(decimalMultiplier);\n const divisor = 10n ** BigInt(decimals);\n\n return Number(dividend / divisor) / decimalMultiplier;\n}\n\nexport function sortByBalanceAndChainName<Symbols extends AssetSymbol>(\n a: AssetBalanceInfo<Symbols>,\n b: AssetBalanceInfo<Symbols>,\n) {\n if (a.asset.isNative) {\n return -1;\n }\n\n if (b.asset.isNative) {\n return 1;\n }\n\n const aDecimal = toDecimal(a.balance.balance, a.balance.decimals);\n const bDecimal = toDecimal(b.balance.balance, b.balance.decimals);\n\n if (aDecimal || bDecimal) {\n return bDecimal - aDecimal;\n }\n\n const aName = (a.origin.name + a.asset.originSymbol).toLowerCase();\n const bName = (b.origin.name + b.asset.originSymbol).toLowerCase();\n\n if (aName < bName) {\n return -1;\n }\n\n if (aName > bName) {\n return 1;\n }\n\n return 0;\n}\n\nexport interface SubscribeToAssetsBalanceInfoParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>;\n cb: (data: AssetBalanceInfo<Symbols>[]) => void;\n}\n\nexport async function subscribeToAssetsBalanceInfo<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n polkadot,\n configBuilder,\n cb,\n}: SubscribeToAssetsBalanceInfoParams<Symbols, ChainKeys>): UnsubscribePromise {\n let lastBalance = 0n;\n let lastInfo: AssetBalanceInfo<Symbols>[] = [];\n const handler = (data: bigint | AssetBalanceInfo<Symbols>[]) => {\n const isBalance = typeof data === 'bigint';\n\n lastBalance = isBalance ? data : lastBalance;\n lastInfo = (isBalance ? lastInfo : data)\n .map((info) => {\n if (info.asset.isNative) {\n // eslint-disable-next-line no-param-reassign\n info.balance.balance = lastBalance;\n }\n\n return info;\n })\n .sort(sortByBalanceAndChainName);\n\n if (lastInfo.length) {\n cb(lastInfo);\n }\n };\n\n const unsubscribeBalance = await polkadot.subscribeToBalance(\n account,\n handler,\n );\n const unsubscribeInfo = await polkadot.subscribeToAssetsBalanceInfo(\n account,\n configBuilder,\n handler,\n );\n\n return () => {\n unsubscribeBalance();\n unsubscribeInfo();\n };\n}\n\nexport function createDummyAsset(symbol: AssetSymbol): Asset<AssetSymbol> {\n return {\n id: '',\n erc20Id: '',\n originSymbol: symbol,\n };\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n MoonChain,\n WithdrawConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n createTxEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as EthersSigner } from 'ethers';\nimport { XTokensContract } from '../contracts';\nimport { PolkadotService } from '../polkadot';\nimport { WithdrawTransferData } from './sdk.interfaces';\n\nexport interface GetWithdrawDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n asset: Asset<Symbols>;\n config: WithdrawConfig<Symbols>;\n contract: XTokensContract;\n destinationAccount: string;\n destinationPolkadot: PolkadotService<Symbols, ChainKeys>;\n ethersSigner: EthersSigner;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n}\n\nexport async function getWithdrawData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n}: GetWithdrawDataParams<Symbols, ChainKeys>): Promise<\n WithdrawTransferData<Symbols>\n> {\n const meta = destinationPolkadot.getMetadata();\n const [decimals, destinationBalance, existentialDeposit, assetMinBalance] =\n await Promise.all([\n asset.isNative ? moonChain.decimals : polkadot.getAssetDecimals(asset),\n destinationPolkadot.getGenericBalance(destinationAccount, config.balance),\n asset.isNative ? 0n : destinationPolkadot.getExistentialDeposit(),\n config.sourceMinBalance\n ? destinationPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : 0n,\n ]);\n\n const destinationFee = getFee(assetMinBalance, config);\n const min = getMin(\n assetMinBalance || existentialDeposit,\n destinationBalance,\n destinationFee,\n );\n\n return {\n asset: { ...asset, decimals },\n destination: config.destination,\n destinationBalance,\n destinationFee,\n existentialDeposit,\n min,\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n getFee: async (amount) =>\n contract.getTransferFees(destinationAccount, amount, asset, config),\n send: async (amount: bigint, cb?: ExtrinsicEventsCallback) => {\n const tx = await contract.transfer(\n destinationAccount,\n amount,\n asset,\n config,\n );\n\n if (cb) {\n createTxEventHandler(ethersSigner, tx.hash, cb);\n }\n\n return tx.hash;\n },\n };\n}\n\nexport function getFee<Symbols extends AssetSymbol>(\n assetMinBalance: bigint,\n config: WithdrawConfig<Symbols>,\n) {\n const calculatedFee = BigInt(config.weight * config.feePerWeight);\n\n return assetMinBalance > calculatedFee ? assetMinBalance : calculatedFee;\n}\n\nexport function getMin(\n balanceNeeded: bigint,\n destinationBalance: bigint,\n destinationFee: bigint,\n) {\n const extra =\n destinationBalance >= balanceNeeded\n ? 0n\n : balanceNeeded - destinationBalance;\n\n return destinationFee + extra;\n}\n"],"mappings":"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","names":["src_exports","__export","PolkadotService","XTokensContract","createPolkadotServices","getPolkadotApi","init","isXcmSdkDeposit","isXcmSdkWithdraw","toDecimal","__toCommonJS","import_xcm_utils","import_ethers","XTokensContract","signer","#signer","#contract","XTokensABI_default","account","amount","asset","config","estimatedGas","gasPrice","maxPriorityFeePerGas","import_api","import_lru_cache","tenMin","cache","LRU","promise","api","getPolkadotApi","ws","import_api_augment","import_lodash","calculateMin","weight","unitsPerSecond","PolkadotService","#api","api","ws","getPolkadotApi","_a","asset","account","callback","data","pallet","fn","getParams","path","calc","response","unwrapped","_","params","details","amount","extrinsic","fee","primaryAccount","transferExtrinsic","weight","moonChain","calculateMin","type","id","config","assetsArray","metadata","balance","index","meta","chain","from","origin","queries","x","res","item","createPolkadotServices","ws","url","PolkadotService","import_xcm_config","import_lodash","import_xcm_utils","import_util","getCreateExtrinsic","account","config","foreignPolkadot","primaryAccount","fee","amount","getDepositData","asset","moonChain","nativeAsset","origin","polkadot","polkadotSigner","sourceAccount","_a","_b","sourceAddress","meta","xcmFeeAssetConfig","assetDecimals","existentialDeposit","sourceBalance","sourceFeeBalance","sourceMinBalance","xcmFee","xcmFeeBalance","xcmFeeDecimals","min","createExtrinsic","cb","isXcmSdkDeposit","config","isXcmSdkWithdraw","toDecimal","number","decimals","maxDecimal","decimalMultiplier","dividend","divisor","sortByBalanceAndChainName","a","b","aDecimal","bDecimal","aName","bName","subscribeToAssetsBalanceInfo","account","polkadot","configBuilder","cb","lastBalance","lastInfo","handler","data","isBalance","info","unsubscribeBalance","unsubscribeInfo","createDummyAsset","symbol","import_xcm_utils","getWithdrawData","asset","config","contract","destinationAccount","destinationPolkadot","ethersSigner","moonChain","nativeAsset","origin","polkadot","meta","decimals","destinationBalance","existentialDeposit","assetMinBalance","destinationFee","getFee","min","getMin","amount","cb","tx","calculatedFee","balanceNeeded","extra","init","options","initByChain","configBuilder","symbols","assets","moonAsset","moonChain","account","cb","polkadot","createPolkadotServices","subscribeToAssetsBalanceInfo","symbolOrAsset","chains","from","keyOrChain","asset","origin","config","sourceAccount","primaryAccount","polkadotSigner","signer","_","foreignPolkadot","meta","nativeAsset","createDummyAsset","getDepositData","to","destinationAccount","ethersSigner","contract","XTokensContract","destinationPolkadot","getWithdrawData"]}
package/build/index.d.ts CHANGED
@@ -37,7 +37,6 @@ import {
37
37
  import { AccountInfo } from '@polkadot/types/interfaces';
38
38
  import {
39
39
  PalletAssetsAssetMetadata,
40
- MoonbeamRuntimeXcmConfigAssetType,
41
40
  PalletAssetsAssetAccount,
42
41
  } from '@polkadot/types/lookup';
43
42
  import { IKeyringPair } from '@polkadot/types/types';
@@ -199,6 +198,12 @@ interface AssetBalanceInfo<
199
198
  balance: Balance<string>;
200
199
  origin: Chain<ChainKeys> | MoonChain;
201
200
  }
201
+ interface XCMType {
202
+ Xcm: {
203
+ parents: number;
204
+ interior: unknown;
205
+ };
206
+ }
202
207
 
203
208
  declare class PolkadotService<
204
209
  Symbols extends AssetSymbol = AssetSymbol,
@@ -248,9 +253,10 @@ declare class PolkadotService<
248
253
  moonChain: MoonChain,
249
254
  ): Promise<bigint>;
250
255
  getUnitsPerSecond(asset: Asset, moonChain: MoonChain): Promise<bigint>;
251
- getAssetType(
252
- id: string,
253
- ): Promise<MoonbeamRuntimeXcmConfigAssetType | undefined>;
256
+ /**
257
+ * this is only for Moon* chains
258
+ */
259
+ getAssetType(id: string): Promise<XCMType | undefined>;
254
260
  subscribeToAssetsBalanceInfo(
255
261
  account: string,
256
262
  config: XcmConfigBuilder<Symbols, ChainKeys>,
@@ -285,6 +291,7 @@ export {
285
291
  SdkOptions,
286
292
  WithdrawGetParams,
287
293
  WithdrawTransferData,
294
+ XCMType,
288
295
  XTokensContract,
289
296
  XcmFeeWithBalance,
290
297
  XcmSdk,
package/build/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var Q=Object.create;var I=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var V=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var Y=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of z(e))!J.call(s,i)&&i!==t&&I(s,i,{get:()=>e[i],enumerable:!(n=j(e,i))||n.enumerable});return s};var Z=(s,e,t)=>(t=s!=null?Q(_(s)):{},Y(e||!s||!s.__esModule?I(t,"default",{value:s,enumerable:!0}):t,s));var E=V((Ae,$)=>{$.exports=[{inputs:[{internalType:"address",name:"currency_address",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:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"asset",type:"tuple"},{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_multiasset",outputs:[],stateMutability:"nonpayable",type:"function"}]});import{ExtrinsicStatus as Bt}from"@moonbeam-network/xcm-utils";var X=Z(E());import{Contract as ee}from"ethers";var x=class{constructor(e){this.address="0x0000000000000000000000000000000000000804";this.#t=e,this.#e=new ee(this.address,X.default,e)}#e;#t;async transfer(e,t,n,i){return this.#e.transfer(n.erc20Id,t,i.getParams(e),i.weight)}async getTransferFees(e,t,n,i){let a=(await this.#e.estimateGas.transfer(n.erc20Id,t,i.getParams(e),i.weight)).toBigInt(),r=await this.getGasPrice();return a*r}async getGasPrice(){let{gasPrice:e,maxPriorityFeePerGas:t}=await this.#t.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((t==null?void 0:t.toBigInt())||0n)}};import{ApiPromise as te,WsProvider as se}from"@polkadot/api";import ne from"lru-cache";var ie=10*60*1e3,W=new ne({max:20,ttl:ie,updateAgeOnGet:!0,ttlAutopurge:!0,dispose:async s=>{let e=await s;e.isConnected&&e.disconnect()}});async function F(s){let e=W.get(s)||te.create({provider:new se(s)});W.set(s,e);let t=await e;return await t.isReady,t}import"@moonbeam-network/api-augment";import{get as G}from"lodash";function q(s,e){return BigInt(s)*e/BigInt(10**12)}var C=class{#e;constructor(e){this.#e=e}static async create(e){return new C(await F(e))}getMetadata(){return{decimals:this.#e.registry.chainDecimals.at(0)||12,symbol:this.#e.registry.chainTokens.at(0)}}getExistentialDeposit(){var e;return((e=this.#e.consts.balances)==null?void 0:e.existentialDeposit.toBigInt())||0n}async getAssetDecimals(e){return(await this.getAssetMeta(e)).decimals.toNumber()}async getAssetMeta(e){return(e.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata)(e.id)}async subscribeToAccountInfo(e,t){return this.#e.query.system.account(e,t)}async subscribeToBalance(e,t){return this.subscribeToAccountInfo(e,({data:n})=>t(n.free.toBigInt()-n.miscFrozen.toBigInt()))}async getGenericBalance(e,{pallet:t,function:n,getParams:i,path:a,calc:r}){var m;let o=await this.#e.query[t][n](...i(e));if(o.isEmpty)return 0n;let c=((m=o.unwrap)==null?void 0:m.call(o))||o;return r(a.length?G(c,a):c)}async getAssetMinBalance({pallet:e,function:t,params:n,path:i}){let a=await this.#e.query[e][t](...n);return a.isEmpty?0n:G(a.value,i).toBigInt()}getXcmExtrinsic(e,t,{pallet:n,extrinsic:i,getParams:a},r,o){let c=this.#e.tx[n][i](...a(e,t,r));return o&&(c=this.#e.tx.proxy.proxy(o,null,c)),c}async getAssetFee(e,t,n){return q(t,await this.getUnitsPerSecond(e,n))}async getUnitsPerSecond(e,t){if(e.isNative)return t.unitsPerSecond;let n=await this.getAssetType(e.id);return n?(await this.#e.query.assetManager.assetTypeUnitsPerSecond(n)).unwrapOrDefault().toBigInt():0n}async getAssetType(e){return(await this.#e.query.assetManager.assetIdType(e)).unwrapOr(void 0)}async subscribeToAssetsBalanceInfo(e,t,n){let i=Object.values(t.assets),a=await this.getAssetsMetadata(i);return this.subscribeToAccountBalances(e,i,r=>{n(r.map((o,c)=>{var p;let m=i[c],l=a[c],{chains:[y],from:u}=t.deposit(m.originSymbol),{origin:b}=u(y.key);return{asset:m,balance:{balance:o.balance.toBigInt(),decimals:m.isNative?b.decimals:l.decimals.toNumber(),symbol:m.isNative?m.originSymbol:((p=l.symbol.toHuman())==null?void 0:p.toString())||""},origin:b}}))})}async getAssetsMetadata(e){let t=e.map(n=>[n.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata,[n.id]]);return this.#e.queryMulti(t)}async subscribeToAccountBalances(e,t,n){let i=t.map(a=>[a.isLocalAsset?this.#e.query.localAssets.account:this.#e.query.assets.account,[a.id,e]]);return this.#e.queryMulti(i,a=>{let r=a.map(o=>o.unwrapOrDefault());n(r)})}};async function w(s){return Promise.all(s.map(e=>C.create(e)))}import{moonbase as pe,moonbeam as de,moonriver as he}from"@moonbeam-network/xcm-config";import{isString as ge}from"lodash";import{createExtrinsicEventHandler as ae}from"@moonbeam-network/xcm-utils";import{isUndefined as oe}from"@polkadot/util";function re({account:s,config:e,foreignPolkadot:t,primaryAccount:n,fee:i}){return a=>t.getXcmExtrinsic(s,a,e.extrinsic,i,n)}async function N({account:s,asset:e,config:t,foreignPolkadot:n,moonChain:i,nativeAsset:a,origin:r,polkadot:o,polkadotSigner:c,primaryAccount:m,sourceAccount:l}){var D,T;let y=typeof l=="string"?l:l.address,u=n.getMetadata(),b={asset:((D=t.xcmFeeAsset)==null?void 0:D.asset)??e,balance:((T=t.xcmFeeAsset)==null?void 0:T.balance)??t.balance},[p,g,f,d,S=0n,h,A,P]=await Promise.all([o.getAssetDecimals(e),n.getExistentialDeposit(),n.getGenericBalance(m||y,t.balance),t.sourceFeeBalance?n.getGenericBalance(y,t.sourceFeeBalance):void 0,t.sourceMinBalance?n.getAssetMinBalance(t.sourceMinBalance):void 0,o.getAssetFee(b.asset,t.source.weight,i),n.getGenericBalance(m||y,b.balance),o.getAssetDecimals(b.asset)]),R=t.xcmFeeAsset?0n:h,v=re({account:s,config:t,foreignPolkadot:n,primaryAccount:m,fee:h});return{asset:{...e,decimals:p},existentialDeposit:g,min:R,moonChainFee:{balance:A,decimals:b.asset.isNative?u.decimals:P,fee:h,symbol:b.asset.originSymbol},native:{...a,decimals:u.decimals},origin:r,source:t.source,sourceBalance:f,sourceFeeBalance:oe(d)?void 0:{...u,balance:d},sourceMinBalance:S,getFee:async(B=f)=>(await(await v(B)).paymentInfo(l)).partialFee.toBigInt(),send:async(B,K)=>(await(await v(B)).signAndSend(l,{signer:c},K&&ae(t.extrinsic.pallet,t.extrinsic.successEvent,K))).toString()}}function me(s){return!!s.from}function ce(s){return!!s.to}function M(s,e,t=6){let n=10**t,i=s*BigInt(n),a=10n**BigInt(e);return Number(i/a)/n}function le(s,e){if(s.asset.isNative)return-1;if(e.asset.isNative)return 1;let t=M(s.balance.balance,s.balance.decimals),n=M(e.balance.balance,e.balance.decimals);if(t||n)return n-t;let i=(s.origin.name+s.asset.originSymbol).toLowerCase(),a=(e.origin.name+e.asset.originSymbol).toLowerCase();return i<a?-1:i>a?1:0}async function U({account:s,polkadot:e,configBuilder:t,cb:n}){let i=0n,a=[],r=m=>{let l=typeof m=="bigint";i=l?m:i,a=(l?a:m).map(y=>(y.asset.isNative&&(y.balance.balance=i),y)).sort(le),a.length&&n(a)},o=await e.subscribeToBalance(s,r),c=await e.subscribeToAssetsBalanceInfo(s,t,r);return()=>{o(),c()}}function O(s){return{id:"",erc20Id:"",originSymbol:s}}import{createTxEventHandler as ye}from"@moonbeam-network/xcm-utils";async function L({asset:s,config:e,contract:t,destinationAccount:n,destinationPolkadot:i,ethersSigner:a,moonChain:r,nativeAsset:o,origin:c,polkadot:m}){let l=i.getMetadata(),[y,u,b,p]=await Promise.all([s.isNative?r.decimals:m.getAssetDecimals(s),i.getGenericBalance(n,e.balance),s.isNative?0n:i.getExistentialDeposit(),e.sourceMinBalance?i.getAssetMinBalance(e.sourceMinBalance):0n]),g=be(p,e),f=ue(p||b,u,g);return{asset:{...s,decimals:y},destination:e.destination,destinationBalance:u,destinationFee:g,existentialDeposit:b,min:f,native:{...o,decimals:l.decimals},origin:c,getFee:async d=>t.getTransferFees(n,d,s,e),send:async(d,S)=>{let h=await t.transfer(n,d,s,e);return S&&ye(a,h.hash,S),h.hash}}}function be(s,e){let t=BigInt(e.weight*e.feePerWeight);return s>t?s:t}function ue(s,e,t){let n=e>=s?0n:s-e;return t+n}function gt(s){return{moonbase:k(pe,s),moonbeam:k(de,s),moonriver:k(he,s)}}function k(s,e){let{symbols:t,assets:n,moonAsset:i,moonChain:a}=s;return{symbols:t,assets:n,moonAsset:i,moonChain:a,subscribeToAssetsBalanceInfo:async(r,o)=>{let[c]=await w([s.moonChain.ws]);return U({account:r,polkadot:c,configBuilder:s,cb:o})},deposit:r=>{let{chains:o,from:c}=s.deposit(r);return{chains:o,from:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,p,{primaryAccount:g,polkadotSigner:f}={})=>{let d=f||(e==null?void 0:e.polkadotSigner);if(ge(p)&&!d)throw new Error("Polkadot Signer/KeyringPair are not provided to XCM-SDK");let[S,h]=await w([s.moonChain.ws,u.source.ws]),A=h.getMetadata(),P=s.assets[A.symbol]||O(A.symbol);return N({account:b,asset:l,config:u,foreignPolkadot:h,moonChain:a,nativeAsset:P,origin:y,polkadot:S,polkadotSigner:d,primaryAccount:g,sourceAccount:p})}}}}},withdraw:r=>{let{chains:o,to:c}=s.withdraw(r);return{chains:o,to:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,{ethersSigner:p}={})=>{let g=p||(e==null?void 0:e.ethersSigner);if(!g)throw new Error("Ethers signer is not provided to XCM-SDK");let f=new x(g),[d,S]=await w([s.moonChain.ws,u.destination.ws]),h=S.getMetadata(),A=s.assets[h.symbol];return L({asset:l,config:u,contract:f,destinationAccount:b,destinationPolkadot:S,ethersSigner:g,moonChain:a,nativeAsset:A,origin:y,polkadot:d})}}}}}}}export{Bt as ExtrinsicStatus,C as PolkadotService,x as XTokensContract,w as createPolkadotServices,F as getPolkadotApi,gt as init,me as isXcmSdkDeposit,ce as isXcmSdkWithdraw,M as toDecimal};
1
+ import{ExtrinsicStatus as dt}from"@moonbeam-network/xcm-utils";import{Contract as H}from"ethers";var I=[{inputs:[{internalType:"address",name:"currency_address",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:"uint8",name:"parents",type:"uint8"},{internalType:"bytes[]",name:"interior",type:"bytes[]"}],internalType:"struct Xtokens.Multilocation",name:"asset",type:"tuple"},{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_multiasset",outputs:[],stateMutability:"nonpayable",type:"function"}];var x=class{constructor(e){this.address="0x0000000000000000000000000000000000000804";this.#t=e,this.#e=new H(this.address,I,e)}#e;#t;async transfer(e,t,n,i){return this.#e.transfer(n.erc20Id,t,i.getParams(e),i.weight)}async getTransferFees(e,t,n,i){let a=(await this.#e.estimateGas.transfer(n.erc20Id,t,i.getParams(e),i.weight)).toBigInt(),r=await this.getGasPrice();return a*r}async getGasPrice(){let{gasPrice:e,maxPriorityFeePerGas:t}=await this.#t.getFeeData();return((e==null?void 0:e.toBigInt())||0n)+((t==null?void 0:t.toBigInt())||0n)}};import{ApiPromise as Q,WsProvider as _}from"@polkadot/api";import j from"lru-cache";var z=10*60*1e3,E=new j({max:20,ttl:z,updateAgeOnGet:!0,ttlAutopurge:!0,dispose:async s=>{let e=await s;e.isConnected&&e.disconnect()}});async function X(s){let e=E.get(s)||Q.create({provider:new _(s)});E.set(s,e);let t=await e;return await t.isReady,t}import"@polkadot/api-augment";import F from"lodash";function W(s,e){return BigInt(s)*e/BigInt(10**12)}var C=class{#e;constructor(e){this.#e=e}static async create(e){return new C(await X(e))}getMetadata(){return{decimals:this.#e.registry.chainDecimals.at(0)||12,symbol:this.#e.registry.chainTokens.at(0)}}getExistentialDeposit(){var e;return((e=this.#e.consts.balances)==null?void 0:e.existentialDeposit.toBigInt())||0n}async getAssetDecimals(e){return(await this.getAssetMeta(e)).decimals.toNumber()}async getAssetMeta(e){return await(e.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata)(e.id)}async subscribeToAccountInfo(e,t){return this.#e.query.system.account(e,t)}async subscribeToBalance(e,t){return this.subscribeToAccountInfo(e,({data:n})=>t(n.free.toBigInt()-n.miscFrozen.toBigInt()))}async getGenericBalance(e,{pallet:t,function:n,getParams:i,path:a,calc:r}){var m;let o=await this.#e.query[t][n](...i(e));if(o.isEmpty)return 0n;let c=((m=o.unwrap)==null?void 0:m.call(o))||o;return r(a.length?F.get(c,a):c)}async getAssetMinBalance({pallet:e,function:t,params:n,path:i}){let a=await this.#e.query[e][t](...n);return a.isEmpty?0n:F.get(a.value,i).toBigInt()}getXcmExtrinsic(e,t,{pallet:n,extrinsic:i,getParams:a},r,o){let c=this.#e.tx[n][i](...a(e,t,r));return o&&(c=this.#e.tx.proxy.proxy(o,null,c)),c}async getAssetFee(e,t,n){return W(t,await this.getUnitsPerSecond(e,n))}async getUnitsPerSecond(e,t){if(e.isNative)return t.unitsPerSecond;let n=await this.getAssetType(e.id);return n?(await this.#e.query.assetManager.assetTypeUnitsPerSecond(n)).unwrapOrDefault().toBigInt():0n}async getAssetType(e){return(await this.#e.query.assetManager.assetIdType(e)).unwrapOr(void 0)}async subscribeToAssetsBalanceInfo(e,t,n){let i=Object.values(t.assets),a=await this.getAssetsMetadata(i);return this.subscribeToAccountBalances(e,i,r=>{n(r.map((o,c)=>{var p;let m=i[c],l=a[c],{chains:[y],from:u}=t.deposit(m.originSymbol),{origin:b}=u(y.key);return{asset:m,balance:{balance:o.balance.toBigInt(),decimals:m.isNative?b.decimals:l.decimals.toNumber(),symbol:m.isNative?m.originSymbol:((p=l.symbol.toHuman())==null?void 0:p.toString())||""},origin:b}}))})}async getAssetsMetadata(e){let t=e.map(n=>[n.isLocalAsset?this.#e.query.localAssets.metadata:this.#e.query.assets.metadata,[n.id]]);return this.#e.queryMulti(t)}async subscribeToAccountBalances(e,t,n){let i=t.map(a=>[a.isLocalAsset?this.#e.query.localAssets.account:this.#e.query.assets.account,[a.id,e]]);return this.#e.queryMulti(i,a=>{let r=a.map(o=>o.unwrapOrDefault());n(r)})}};async function w(s){return Promise.all(s.map(e=>C.create(e)))}import{moonbase as ie,moonbeam as ae,moonriver as oe}from"@moonbeam-network/xcm-config";import re from"lodash";import{createExtrinsicEventHandler as J}from"@moonbeam-network/xcm-utils";import{isUndefined as V}from"@polkadot/util";function Y({account:s,config:e,foreignPolkadot:t,primaryAccount:n,fee:i}){return a=>t.getXcmExtrinsic(s,a,e.extrinsic,i,n)}async function q({account:s,asset:e,config:t,foreignPolkadot:n,moonChain:i,nativeAsset:a,origin:r,polkadot:o,polkadotSigner:c,primaryAccount:m,sourceAccount:l}){var D,T;let y=typeof l=="string"?l:l.address,u=n.getMetadata(),b={asset:((D=t.xcmFeeAsset)==null?void 0:D.asset)??e,balance:((T=t.xcmFeeAsset)==null?void 0:T.balance)??t.balance},[p,g,f,d,S=0n,h,A,P]=await Promise.all([o.getAssetDecimals(e),n.getExistentialDeposit(),n.getGenericBalance(m||y,t.balance),t.sourceFeeBalance?n.getGenericBalance(y,t.sourceFeeBalance):void 0,t.sourceMinBalance?n.getAssetMinBalance(t.sourceMinBalance):void 0,o.getAssetFee(b.asset,t.source.weight,i),n.getGenericBalance(m||y,b.balance),o.getAssetDecimals(b.asset)]),U=t.xcmFeeAsset?0n:h,v=Y({account:s,config:t,foreignPolkadot:n,primaryAccount:m,fee:h});return{asset:{...e,decimals:p},existentialDeposit:g,min:U,moonChainFee:{balance:A,decimals:b.asset.isNative?u.decimals:P,fee:h,symbol:b.asset.originSymbol},native:{...a,decimals:u.decimals},origin:r,source:t.source,sourceBalance:f,sourceFeeBalance:V(d)?void 0:{...u,balance:d},sourceMinBalance:S,getFee:async(B=f)=>(await(await v(B)).paymentInfo(l)).partialFee.toBigInt(),send:async(B,K)=>(await(await v(B)).signAndSend(l,{signer:c},K&&J(t.extrinsic.pallet,t.extrinsic.successEvent,K))).toString()}}function Z(s){return!!s.from}function $(s){return!!s.to}function M(s,e,t=6){let n=10**t,i=s*BigInt(n),a=10n**BigInt(e);return Number(i/a)/n}function ee(s,e){if(s.asset.isNative)return-1;if(e.asset.isNative)return 1;let t=M(s.balance.balance,s.balance.decimals),n=M(e.balance.balance,e.balance.decimals);if(t||n)return n-t;let i=(s.origin.name+s.asset.originSymbol).toLowerCase(),a=(e.origin.name+e.asset.originSymbol).toLowerCase();return i<a?-1:i>a?1:0}async function G({account:s,polkadot:e,configBuilder:t,cb:n}){let i=0n,a=[],r=m=>{let l=typeof m=="bigint";i=l?m:i,a=(l?a:m).map(y=>(y.asset.isNative&&(y.balance.balance=i),y)).sort(ee),a.length&&n(a)},o=await e.subscribeToBalance(s,r),c=await e.subscribeToAssetsBalanceInfo(s,t,r);return()=>{o(),c()}}function O(s){return{id:"",erc20Id:"",originSymbol:s}}import{createTxEventHandler as te}from"@moonbeam-network/xcm-utils";async function N({asset:s,config:e,contract:t,destinationAccount:n,destinationPolkadot:i,ethersSigner:a,moonChain:r,nativeAsset:o,origin:c,polkadot:m}){let l=i.getMetadata(),[y,u,b,p]=await Promise.all([s.isNative?r.decimals:m.getAssetDecimals(s),i.getGenericBalance(n,e.balance),s.isNative?0n:i.getExistentialDeposit(),e.sourceMinBalance?i.getAssetMinBalance(e.sourceMinBalance):0n]),g=se(p,e),f=ne(p||b,u,g);return{asset:{...s,decimals:y},destination:e.destination,destinationBalance:u,destinationFee:g,existentialDeposit:b,min:f,native:{...o,decimals:l.decimals},origin:c,getFee:async d=>t.getTransferFees(n,d,s,e),send:async(d,S)=>{let h=await t.transfer(n,d,s,e);return S&&te(a,h.hash,S),h.hash}}}function se(s,e){let t=BigInt(e.weight*e.feePerWeight);return s>t?s:t}function ne(s,e,t){let n=e>=s?0n:s-e;return t+n}function rt(s){return{moonbase:k(ie,s),moonbeam:k(ae,s),moonriver:k(oe,s)}}function k(s,e){let{symbols:t,assets:n,moonAsset:i,moonChain:a}=s;return{symbols:t,assets:n,moonAsset:i,moonChain:a,subscribeToAssetsBalanceInfo:async(r,o)=>{let[c]=await w([s.moonChain.ws]);return G({account:r,polkadot:c,configBuilder:s,cb:o})},deposit:r=>{let{chains:o,from:c}=s.deposit(r);return{chains:o,from:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,p,{primaryAccount:g,polkadotSigner:f}={})=>{let d=f||(e==null?void 0:e.polkadotSigner);if(re.isString(p)&&!d)throw new Error("Polkadot Signer/KeyringPair are not provided to XCM-SDK");let[S,h]=await w([s.moonChain.ws,u.source.ws]),A=h.getMetadata(),P=s.assets[A.symbol]||O(A.symbol);return q({account:b,asset:l,config:u,foreignPolkadot:h,moonChain:a,nativeAsset:P,origin:y,polkadot:S,polkadotSigner:d,primaryAccount:g,sourceAccount:p})}}}}},withdraw:r=>{let{chains:o,to:c}=s.withdraw(r);return{chains:o,to:m=>{let{asset:l,origin:y,config:u}=c(m);return{get:async(b,{ethersSigner:p}={})=>{let g=p||(e==null?void 0:e.ethersSigner);if(!g)throw new Error("Ethers signer is not provided to XCM-SDK");let f=new x(g),[d,S]=await w([s.moonChain.ws,u.destination.ws]),h=S.getMetadata(),A=s.assets[h.symbol];return N({asset:l,config:u,contract:f,destinationAccount:b,destinationPolkadot:S,ethersSigner:g,moonChain:a,nativeAsset:A,origin:y,polkadot:d})}}}}}}}export{dt as ExtrinsicStatus,C as PolkadotService,x as XTokensContract,w as createPolkadotServices,X as getPolkadotApi,rt as init,Z as isXcmSdkDeposit,$ as isXcmSdkWithdraw,M as toDecimal};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/contracts/XTokensContract/XTokensContract.ts","../src/polkadot/polkadot.api.ts","../src/polkadot/PolkadotService.ts","../src/polkadot/polkadot.utils.ts","../src/polkadot/polkadot.factory.ts","../src/sdk/sdk.ts","../src/sdk/sdk.deposit.ts","../src/sdk/sdk.utils.ts","../src/sdk/sdk.withdraw.ts"],"sourcesContent":["export { ExtrinsicStatus } from '@moonbeam-network/xcm-utils';\nexport type {\n ExtrinsicEvent,\n ExtrinsicEventsCallback,\n ExtrinsicFailedEvent,\n ExtrinsicSentEvent,\n ExtrinsicSuccessEvent,\n} from '@moonbeam-network/xcm-utils';\nexport * from './contracts';\nexport * from './polkadot';\nexport * from './sdk';\n","import type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n Asset,\n AssetSymbol,\n WithdrawXTokensConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Contract, Signer } from 'ethers';\n\nimport ContractInterface from './XTokensABI.json';\n\nexport class XTokensContract<Symbols extends AssetSymbol = AssetSymbol> {\n readonly address: string = '0x0000000000000000000000000000000000000804';\n\n readonly #contract: Contract;\n\n readonly #signer: Signer;\n\n constructor(signer: Signer) {\n this.#signer = signer;\n this.#contract = new Contract(this.address, ContractInterface, signer);\n }\n\n async transfer(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ): Promise<TransactionResponse> {\n return this.#contract.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n );\n }\n\n async getTransferFees(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ) {\n const estimatedGas = (\n await this.#contract.estimateGas.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n )\n ).toBigInt();\n const gasPrice = await this.getGasPrice();\n\n return estimatedGas * gasPrice;\n }\n\n private async getGasPrice() {\n const { gasPrice, maxPriorityFeePerGas } = await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\n }\n}\n","import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst tenMin = 10 * 60 * 1000;\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n ttl: tenMin,\n updateAgeOnGet: true,\n ttlAutopurge: true,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(ws: string): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n return api;\n}\n","import '@moonbeam-network/api-augment';\n\nimport {\n Asset,\n AssetSymbol,\n BalanceConfig,\n ChainKey,\n ExtrinsicConfig,\n MinBalanceConfig,\n MoonChain,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { ApiPromise } from '@polkadot/api';\nimport {\n QueryableStorageMultiArg,\n SubmittableExtrinsic,\n UnsubscribePromise,\n} from '@polkadot/api/types';\nimport { Option } from '@polkadot/types';\nimport { AccountInfo } from '@polkadot/types/interfaces';\nimport {\n MoonbeamRuntimeXcmConfigAssetType,\n PalletAssetsAssetAccount,\n PalletAssetsAssetMetadata,\n} from '@polkadot/types/lookup';\nimport { get } from 'lodash';\nimport { getPolkadotApi } from './polkadot.api';\nimport { AssetBalanceInfo } from './polkadot.interfaces';\nimport { calculateMin } from './polkadot.utils';\n\nexport class PolkadotService<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n> {\n readonly #api: ApiPromise;\n\n constructor(api: ApiPromise) {\n this.#api = api;\n }\n\n static async create<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n >(ws: string): Promise<PolkadotService<Symbols, ChainKeys>> {\n return new PolkadotService(await getPolkadotApi(ws));\n }\n\n getMetadata() {\n return {\n decimals: this.#api.registry.chainDecimals.at(0) || 12,\n symbol: this.#api.registry.chainTokens.at(0) as Symbols,\n };\n }\n\n getExistentialDeposit(): bigint {\n return this.#api.consts.balances?.existentialDeposit.toBigInt() || 0n;\n }\n\n async getAssetDecimals(asset: Asset<Symbols>): Promise<number> {\n const meta = await this.getAssetMeta(asset);\n\n return meta.decimals.toNumber();\n }\n\n async getAssetMeta(\n asset: Asset<Symbols>,\n ): Promise<PalletAssetsAssetMetadata> {\n return (\n asset.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata\n )(asset.id);\n }\n\n async subscribeToAccountInfo(\n account: string,\n callback: (info: AccountInfo) => void,\n ): UnsubscribePromise {\n return this.#api.query.system.account<AccountInfo>(account, callback);\n }\n\n async subscribeToBalance(\n account: string,\n callback: (balance: bigint) => void,\n ): UnsubscribePromise {\n return this.subscribeToAccountInfo(account, ({ data }) =>\n callback(data.free.toBigInt() - data.miscFrozen.toBigInt()),\n );\n }\n\n async getGenericBalance(\n account: string,\n { pallet, function: fn, getParams, path, calc }: BalanceConfig<Symbols>,\n ): Promise<bigint> {\n const response = await this.#api.query[pallet][fn](...getParams(account));\n\n if (response.isEmpty) {\n return 0n;\n }\n\n const unwrapped = (response as any).unwrap?.() || response;\n\n return calc(path.length ? get(unwrapped, path) : unwrapped);\n }\n\n async getAssetMinBalance({\n pallet,\n function: fn,\n params,\n path,\n }: MinBalanceConfig): Promise<bigint> {\n const details = (await this.#api.query[pallet][fn](\n ...params,\n )) as Option<any>;\n\n if (details.isEmpty) {\n return 0n;\n }\n\n return get(details.value, path).toBigInt();\n }\n\n getXcmExtrinsic(\n account: string,\n amount: bigint,\n { pallet, extrinsic, getParams }: ExtrinsicConfig<Symbols>,\n fee?: bigint,\n primaryAccount?: string,\n ): SubmittableExtrinsic<'promise'> {\n let transferExtrinsic = this.#api.tx[pallet][extrinsic](\n // TODO: check issue with types and if we can fix it\n // @ts-ignore\n ...getParams(account, amount, fee),\n );\n\n if (primaryAccount) {\n transferExtrinsic = this.#api.tx.proxy.proxy(\n primaryAccount,\n null,\n transferExtrinsic,\n );\n }\n\n return transferExtrinsic;\n }\n\n async getAssetFee(\n asset: Asset,\n weight: number,\n moonChain: MoonChain,\n ): Promise<bigint> {\n return calculateMin(weight, await this.getUnitsPerSecond(asset, moonChain));\n }\n\n async getUnitsPerSecond(asset: Asset, moonChain: MoonChain): Promise<bigint> {\n if (asset.isNative) {\n return moonChain.unitsPerSecond;\n }\n const type = await this.getAssetType(asset.id);\n\n if (!type) {\n return 0n;\n }\n\n return (await this.#api.query.assetManager.assetTypeUnitsPerSecond(type))\n .unwrapOrDefault()\n .toBigInt();\n }\n\n async getAssetType(\n id: string,\n ): Promise<MoonbeamRuntimeXcmConfigAssetType | undefined> {\n const type = await this.#api.query.assetManager.assetIdType(id);\n\n return type.unwrapOr(undefined);\n }\n\n async subscribeToAssetsBalanceInfo(\n account: string,\n config: XcmConfigBuilder<Symbols, ChainKeys>,\n callback: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise {\n const assetsArray = Object.values<Asset<Symbols>>(config.assets);\n const metadata = await this.getAssetsMetadata(assetsArray);\n\n return this.subscribeToAccountBalances(account, assetsArray, (data) => {\n callback(\n data.map((balance, index): AssetBalanceInfo<Symbols> => {\n const asset = assetsArray[index];\n const meta = metadata[index];\n const {\n chains: [chain],\n from,\n } = config.deposit(asset.originSymbol);\n const { origin } = from(chain.key);\n\n return {\n asset,\n balance: {\n balance: balance.balance.toBigInt(),\n decimals: asset.isNative\n ? (origin as MoonChain).decimals\n : meta.decimals.toNumber(),\n symbol: asset.isNative\n ? asset.originSymbol\n : meta.symbol.toHuman()?.toString() || '',\n },\n origin,\n };\n }),\n );\n });\n }\n\n async getAssetsMetadata(\n assetsArray: Asset<Symbols>[],\n ): Promise<PalletAssetsAssetMetadata[]> {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata,\n [x.id],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(queries);\n }\n\n async subscribeToAccountBalances(\n account: string,\n assetsArray: Asset<Symbols>[],\n callback: (balances: PalletAssetsAssetAccount[]) => void,\n ): UnsubscribePromise {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.account\n : this.#api.query.assets.account,\n [x.id, account],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(\n queries,\n (res: Option<PalletAssetsAssetAccount>[]) => {\n const response = res.map((item) => item.unwrapOrDefault());\n\n callback(response);\n },\n );\n }\n}\n","export function calculateMin(weight: number, unitsPerSecond: bigint): bigint {\n // 10**12 weight = 1 second\n return (BigInt(weight) * unitsPerSecond) / BigInt(10 ** 12);\n}\n","import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';\nimport { PolkadotService } from './PolkadotService';\n\nexport async function createPolkadotServices<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>(ws: string[]): Promise<PolkadotService<Symbols, ChainKeys>[]> {\n return Promise.all(\n ws.map((url) => PolkadotService.create<Symbols, ChainKeys>(url)),\n );\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n moonbase,\n MoonbaseAssets,\n MoonbaseChains,\n moonbeam,\n MoonbeamAssets,\n MoonbeamChains,\n moonriver,\n MoonriverAssets,\n MoonriverChains,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { isString } from 'lodash';\nimport { XTokensContract } from '../contracts';\nimport { AssetBalanceInfo, createPolkadotServices } from '../polkadot';\nimport { getDepositData } from './sdk.deposit';\nimport {\n DepositTransferData,\n SdkOptions,\n WithdrawGetParams,\n WithdrawTransferData,\n XcmSdk,\n XcmSdkByChain,\n XcmSdkDeposit,\n XcmSdkWithdraw,\n} from './sdk.interfaces';\nimport { createDummyAsset, subscribeToAssetsBalanceInfo } from './sdk.utils';\nimport { getWithdrawData } from './sdk.withdraw';\n\nexport function init(options?: SdkOptions): XcmSdkByChain {\n return {\n moonbase: initByChain<MoonbaseAssets, MoonbaseChains>(moonbase, options),\n moonbeam: initByChain<MoonbeamAssets, MoonbeamChains>(moonbeam, options),\n moonriver: initByChain<MoonriverAssets, MoonriverChains>(\n moonriver,\n options,\n ),\n };\n}\n\nfunction initByChain<Symbols extends AssetSymbol, ChainKeys extends ChainKey>(\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>,\n options?: SdkOptions,\n): XcmSdk<Symbols, ChainKeys> {\n const { symbols, assets, moonAsset, moonChain } = configBuilder;\n\n return {\n symbols,\n assets,\n moonAsset,\n moonChain,\n subscribeToAssetsBalanceInfo: async (\n account: string,\n cb: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise => {\n const [polkadot] = await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n ]);\n\n return subscribeToAssetsBalanceInfo({\n account,\n polkadot,\n configBuilder,\n cb,\n });\n },\n deposit: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkDeposit<Symbols, ChainKeys> => {\n const { chains, from } = configBuilder.deposit(symbolOrAsset);\n\n return {\n chains,\n from: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = from(keyOrChain);\n\n return {\n get: async (\n account: string,\n sourceAccount: string | IKeyringPair,\n { primaryAccount, polkadotSigner } = {},\n ): Promise<DepositTransferData<Symbols>> => {\n const signer = polkadotSigner || options?.polkadotSigner;\n\n if (isString(sourceAccount) && !signer) {\n throw new Error(\n 'Polkadot Signer/KeyringPair are not provided to XCM-SDK',\n );\n }\n\n const [polkadot, foreignPolkadot] = await createPolkadotServices<\n Symbols,\n ChainKeys\n >([configBuilder.moonChain.ws, config.source.ws]);\n const meta = foreignPolkadot.getMetadata();\n const nativeAsset =\n configBuilder.assets[meta.symbol] ||\n createDummyAsset(meta.symbol);\n\n return getDepositData({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner: signer,\n primaryAccount,\n sourceAccount,\n });\n },\n };\n },\n };\n },\n withdraw: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkWithdraw<Symbols, ChainKeys> => {\n const { chains, to } = configBuilder.withdraw(symbolOrAsset);\n\n return {\n chains,\n to: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = to(keyOrChain);\n\n return {\n get: async (\n destinationAccount: string,\n { ethersSigner }: WithdrawGetParams = {},\n ): Promise<WithdrawTransferData<Symbols>> => {\n const signer = ethersSigner || options?.ethersSigner;\n\n if (!signer) {\n throw new Error('Ethers signer is not provided to XCM-SDK');\n }\n\n const contract = new XTokensContract<Symbols>(signer);\n const [polkadot, destinationPolkadot] =\n await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n config.destination.ws,\n ]);\n const meta = destinationPolkadot.getMetadata();\n const nativeAsset = configBuilder.assets[meta.symbol];\n\n return getWithdrawData({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner: signer,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n });\n },\n };\n },\n };\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n DepositConfig,\n MoonChain,\n} from '@moonbeam-network/xcm-config';\nimport {\n createExtrinsicEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { isUndefined } from '@polkadot/util';\nimport { PolkadotService } from '../polkadot';\nimport { DepositTransferData } from './sdk.interfaces';\n\nexport interface CreateExtrinsicOptions<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n config: DepositConfig<Symbols>;\n fee?: bigint;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n primaryAccount?: string;\n}\n\nexport function getCreateExtrinsic<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee,\n}: CreateExtrinsicOptions<Symbols, ChainKeys>) {\n return (amount: bigint) =>\n foreignPolkadot.getXcmExtrinsic(\n account,\n amount,\n config.extrinsic,\n fee,\n primaryAccount,\n );\n}\n\nexport interface GetDepositDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n asset: Asset<Symbols>;\n config: DepositConfig<Symbols>;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n polkadotSigner?: PolkadotSigner;\n primaryAccount?: string;\n sourceAccount: string | IKeyringPair;\n}\n\nexport async function getDepositData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner,\n primaryAccount,\n sourceAccount,\n}: GetDepositDataParams<Symbols, ChainKeys>): Promise<\n DepositTransferData<Symbols>\n> {\n const sourceAddress =\n typeof sourceAccount === 'string' ? sourceAccount : sourceAccount.address;\n const meta = foreignPolkadot.getMetadata();\n const xcmFeeAssetConfig = {\n asset: config.xcmFeeAsset?.asset ?? asset,\n balance: config.xcmFeeAsset?.balance ?? config.balance,\n };\n\n const [\n assetDecimals,\n existentialDeposit,\n sourceBalance,\n sourceFeeBalance,\n sourceMinBalance = 0n,\n xcmFee,\n xcmFeeBalance,\n xcmFeeDecimals,\n ] = await Promise.all([\n // assetDecimals\n polkadot.getAssetDecimals(asset),\n // existentialDeposit\n foreignPolkadot.getExistentialDeposit(),\n // sourceBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n config.balance,\n ),\n // sourceFeeBalance\n config.sourceFeeBalance\n ? foreignPolkadot.getGenericBalance(\n sourceAddress,\n config.sourceFeeBalance,\n )\n : undefined,\n // sourceMinBalance\n config.sourceMinBalance\n ? foreignPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : undefined,\n // xcmFee\n polkadot.getAssetFee(\n xcmFeeAssetConfig.asset,\n config.source.weight,\n moonChain,\n ),\n // xcmFeeBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n xcmFeeAssetConfig.balance,\n ),\n // xcmFeeDecimals\n polkadot.getAssetDecimals(xcmFeeAssetConfig.asset),\n ]);\n\n // Min is basically the XCM fee, if it's the same asset. If less is sent then\n // Moon* won't process the message.\n const min = config.xcmFeeAsset ? 0n : xcmFee;\n const createExtrinsic = getCreateExtrinsic({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee: xcmFee,\n });\n\n return {\n asset: { ...asset, decimals: assetDecimals },\n existentialDeposit,\n min,\n moonChainFee: {\n balance: xcmFeeBalance,\n decimals: xcmFeeAssetConfig.asset.isNative\n ? meta.decimals\n : xcmFeeDecimals,\n fee: xcmFee,\n symbol: xcmFeeAssetConfig.asset.originSymbol,\n },\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n source: config.source,\n sourceBalance,\n sourceFeeBalance: !isUndefined(sourceFeeBalance)\n ? { ...meta, balance: sourceFeeBalance }\n : undefined,\n sourceMinBalance,\n getFee: async (amount = sourceBalance): Promise<bigint> => {\n const extrinsic = await createExtrinsic(amount);\n const info = await extrinsic.paymentInfo(sourceAccount);\n\n return info.partialFee.toBigInt();\n },\n send: async (\n amount: bigint,\n cb?: ExtrinsicEventsCallback,\n ): Promise<string> => {\n const extrinsic = await createExtrinsic(amount);\n const hash = await extrinsic.signAndSend(\n sourceAccount,\n {\n signer: polkadotSigner,\n },\n\n cb &&\n createExtrinsicEventHandler(\n config.extrinsic.pallet,\n config.extrinsic.successEvent,\n cb,\n ),\n );\n\n return hash.toString();\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n ChainKey,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { AssetBalanceInfo, PolkadotService } from '../polkadot';\nimport { XcmSdkDeposit, XcmSdkWithdraw } from './sdk.interfaces';\n\nexport function isXcmSdkDeposit(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkDeposit {\n return !!(config as XcmSdkDeposit).from;\n}\n\nexport function isXcmSdkWithdraw(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkWithdraw {\n return !!(config as XcmSdkWithdraw).to;\n}\n\nexport function toDecimal(\n number: bigint,\n decimals: number,\n maxDecimal = 6,\n): number {\n const decimalMultiplier = 10 ** maxDecimal;\n const dividend = number * BigInt(decimalMultiplier);\n const divisor = 10n ** BigInt(decimals);\n\n return Number(dividend / divisor) / decimalMultiplier;\n}\n\nexport function sortByBalanceAndChainName<Symbols extends AssetSymbol>(\n a: AssetBalanceInfo<Symbols>,\n b: AssetBalanceInfo<Symbols>,\n) {\n if (a.asset.isNative) {\n return -1;\n }\n\n if (b.asset.isNative) {\n return 1;\n }\n\n const aDecimal = toDecimal(a.balance.balance, a.balance.decimals);\n const bDecimal = toDecimal(b.balance.balance, b.balance.decimals);\n\n if (aDecimal || bDecimal) {\n return bDecimal - aDecimal;\n }\n\n const aName = (a.origin.name + a.asset.originSymbol).toLowerCase();\n const bName = (b.origin.name + b.asset.originSymbol).toLowerCase();\n\n if (aName < bName) {\n return -1;\n }\n\n if (aName > bName) {\n return 1;\n }\n\n return 0;\n}\n\nexport interface SubscribeToAssetsBalanceInfoParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>;\n cb: (data: AssetBalanceInfo<Symbols>[]) => void;\n}\n\nexport async function subscribeToAssetsBalanceInfo<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n polkadot,\n configBuilder,\n cb,\n}: SubscribeToAssetsBalanceInfoParams<Symbols, ChainKeys>): UnsubscribePromise {\n let lastBalance = 0n;\n let lastInfo: AssetBalanceInfo<Symbols>[] = [];\n const handler = (data: bigint | AssetBalanceInfo<Symbols>[]) => {\n const isBalance = typeof data === 'bigint';\n\n lastBalance = isBalance ? data : lastBalance;\n lastInfo = (isBalance ? lastInfo : data)\n .map((info) => {\n if (info.asset.isNative) {\n // eslint-disable-next-line no-param-reassign\n info.balance.balance = lastBalance;\n }\n\n return info;\n })\n .sort(sortByBalanceAndChainName);\n\n if (lastInfo.length) {\n cb(lastInfo);\n }\n };\n\n const unsubscribeBalance = await polkadot.subscribeToBalance(\n account,\n handler,\n );\n const unsubscribeInfo = await polkadot.subscribeToAssetsBalanceInfo(\n account,\n configBuilder,\n handler,\n );\n\n return () => {\n unsubscribeBalance();\n unsubscribeInfo();\n };\n}\n\nexport function createDummyAsset(symbol: AssetSymbol): Asset<AssetSymbol> {\n return {\n id: '',\n erc20Id: '',\n originSymbol: symbol,\n };\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n MoonChain,\n WithdrawConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n createTxEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as EthersSigner } from 'ethers';\nimport { XTokensContract } from '../contracts';\nimport { PolkadotService } from '../polkadot';\nimport { WithdrawTransferData } from './sdk.interfaces';\n\nexport interface GetWithdrawDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n asset: Asset<Symbols>;\n config: WithdrawConfig<Symbols>;\n contract: XTokensContract;\n destinationAccount: string;\n destinationPolkadot: PolkadotService<Symbols, ChainKeys>;\n ethersSigner: EthersSigner;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n}\n\nexport async function getWithdrawData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n}: GetWithdrawDataParams<Symbols, ChainKeys>): Promise<\n WithdrawTransferData<Symbols>\n> {\n const meta = destinationPolkadot.getMetadata();\n const [decimals, destinationBalance, existentialDeposit, assetMinBalance] =\n await Promise.all([\n asset.isNative ? moonChain.decimals : polkadot.getAssetDecimals(asset),\n destinationPolkadot.getGenericBalance(destinationAccount, config.balance),\n asset.isNative ? 0n : destinationPolkadot.getExistentialDeposit(),\n config.sourceMinBalance\n ? destinationPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : 0n,\n ]);\n\n const destinationFee = getFee(assetMinBalance, config);\n const min = getMin(\n assetMinBalance || existentialDeposit,\n destinationBalance,\n destinationFee,\n );\n\n return {\n asset: { ...asset, decimals },\n destination: config.destination,\n destinationBalance,\n destinationFee,\n existentialDeposit,\n min,\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n getFee: async (amount) =>\n contract.getTransferFees(destinationAccount, amount, asset, config),\n send: async (amount: bigint, cb?: ExtrinsicEventsCallback) => {\n const tx = await contract.transfer(\n destinationAccount,\n amount,\n asset,\n config,\n );\n\n if (cb) {\n createTxEventHandler(ethersSigner, tx.hash, cb);\n }\n\n return tx.hash;\n },\n };\n}\n\nexport function getFee<Symbols extends AssetSymbol>(\n assetMinBalance: bigint,\n config: WithdrawConfig<Symbols>,\n) {\n const calculatedFee = BigInt(config.weight * config.feePerWeight);\n\n return assetMinBalance > calculatedFee ? assetMinBalance : calculatedFee;\n}\n\nexport function getMin(\n balanceNeeded: bigint,\n destinationBalance: bigint,\n destinationFee: bigint,\n) {\n const extra =\n destinationBalance >= balanceNeeded\n ? 0n\n : balanceNeeded - destinationBalance;\n\n return destinationFee + extra;\n}\n"],"mappings":"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","names":["ExtrinsicStatus","import_XTokensABI","Contract","XTokensContract","signer","#signer","#contract","ContractInterface","account","amount","asset","config","estimatedGas","gasPrice","maxPriorityFeePerGas","ApiPromise","WsProvider","LRU","tenMin","cache","promise","api","getPolkadotApi","ws","get","calculateMin","weight","unitsPerSecond","PolkadotService","#api","api","ws","getPolkadotApi","_a","asset","account","callback","data","pallet","fn","getParams","path","calc","response","unwrapped","get","params","details","amount","extrinsic","fee","primaryAccount","transferExtrinsic","weight","moonChain","calculateMin","type","id","config","assetsArray","metadata","balance","index","meta","chain","from","origin","queries","x","res","item","createPolkadotServices","ws","url","PolkadotService","moonbase","moonbeam","moonriver","isString","createExtrinsicEventHandler","isUndefined","getCreateExtrinsic","account","config","foreignPolkadot","primaryAccount","fee","amount","getDepositData","asset","moonChain","nativeAsset","origin","polkadot","polkadotSigner","sourceAccount","_a","_b","sourceAddress","meta","xcmFeeAssetConfig","assetDecimals","existentialDeposit","sourceBalance","sourceFeeBalance","sourceMinBalance","xcmFee","xcmFeeBalance","xcmFeeDecimals","min","createExtrinsic","cb","isXcmSdkDeposit","config","isXcmSdkWithdraw","toDecimal","number","decimals","maxDecimal","decimalMultiplier","dividend","divisor","sortByBalanceAndChainName","a","b","aDecimal","bDecimal","aName","bName","subscribeToAssetsBalanceInfo","account","polkadot","configBuilder","cb","lastBalance","lastInfo","handler","data","isBalance","info","unsubscribeBalance","unsubscribeInfo","createDummyAsset","symbol","createTxEventHandler","getWithdrawData","asset","config","contract","destinationAccount","destinationPolkadot","ethersSigner","moonChain","nativeAsset","origin","polkadot","meta","decimals","destinationBalance","existentialDeposit","assetMinBalance","destinationFee","getFee","min","getMin","amount","cb","tx","calculatedFee","balanceNeeded","extra","init","options","initByChain","moonbase","moonbeam","moonriver","configBuilder","symbols","assets","moonAsset","moonChain","account","cb","polkadot","createPolkadotServices","subscribeToAssetsBalanceInfo","symbolOrAsset","chains","from","keyOrChain","asset","origin","config","sourceAccount","primaryAccount","polkadotSigner","signer","isString","foreignPolkadot","meta","nativeAsset","createDummyAsset","getDepositData","to","destinationAccount","ethersSigner","contract","XTokensContract","destinationPolkadot","getWithdrawData"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/contracts/XTokensContract/XTokensContract.ts","../src/polkadot/polkadot.api.ts","../src/polkadot/PolkadotService.ts","../src/polkadot/polkadot.utils.ts","../src/polkadot/polkadot.factory.ts","../src/sdk/sdk.ts","../src/sdk/sdk.deposit.ts","../src/sdk/sdk.utils.ts","../src/sdk/sdk.withdraw.ts"],"sourcesContent":["export { ExtrinsicStatus } from '@moonbeam-network/xcm-utils';\nexport type {\n ExtrinsicEvent,\n ExtrinsicEventsCallback,\n ExtrinsicFailedEvent,\n ExtrinsicSentEvent,\n ExtrinsicSuccessEvent,\n} from '@moonbeam-network/xcm-utils';\nexport * from './contracts';\nexport * from './polkadot';\nexport * from './sdk';\n","import type { TransactionResponse } from '@ethersproject/abstract-provider';\nimport {\n Asset,\n AssetSymbol,\n WithdrawXTokensConfig,\n} from '@moonbeam-network/xcm-config';\nimport { Contract, Signer } from 'ethers';\n\nimport ContractInterface from './XTokensABI.json';\n\nexport class XTokensContract<Symbols extends AssetSymbol = AssetSymbol> {\n readonly address: string = '0x0000000000000000000000000000000000000804';\n\n readonly #contract: Contract;\n\n readonly #signer: Signer;\n\n constructor(signer: Signer) {\n this.#signer = signer;\n this.#contract = new Contract(this.address, ContractInterface, signer);\n }\n\n async transfer(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ): Promise<TransactionResponse> {\n return this.#contract.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n );\n }\n\n async getTransferFees(\n account: string,\n amount: bigint,\n asset: Asset<Symbols>,\n config: WithdrawXTokensConfig<Symbols>,\n ) {\n const estimatedGas = (\n await this.#contract.estimateGas.transfer(\n asset.erc20Id,\n amount,\n config.getParams(account),\n config.weight,\n )\n ).toBigInt();\n const gasPrice = await this.getGasPrice();\n\n return estimatedGas * gasPrice;\n }\n\n private async getGasPrice() {\n const { gasPrice, maxPriorityFeePerGas } = await this.#signer.getFeeData();\n\n return (\n (gasPrice?.toBigInt() || 0n) + (maxPriorityFeePerGas?.toBigInt() || 0n)\n );\n }\n}\n","import { ApiPromise, WsProvider } from '@polkadot/api';\nimport LRU from 'lru-cache';\n\nconst tenMin = 10 * 60 * 1000;\n\nconst cache = new LRU<string, Promise<ApiPromise>>({\n max: 20,\n ttl: tenMin,\n updateAgeOnGet: true,\n ttlAutopurge: true,\n dispose: async (promise: Promise<ApiPromise>) => {\n const api = await promise;\n\n if (api.isConnected) {\n api.disconnect();\n }\n },\n});\n\nexport async function getPolkadotApi(ws: string): Promise<ApiPromise> {\n const promise =\n cache.get(ws) ||\n ApiPromise.create({\n provider: new WsProvider(ws),\n });\n\n cache.set(ws, promise);\n\n const api = await promise;\n\n await api.isReady;\n\n return api;\n}\n","import '@polkadot/api-augment';\n\nimport {\n Asset,\n AssetSymbol,\n BalanceConfig,\n ChainKey,\n ExtrinsicConfig,\n MinBalanceConfig,\n MoonChain,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { ApiPromise } from '@polkadot/api';\nimport {\n QueryableStorageMultiArg,\n SubmittableExtrinsic,\n UnsubscribePromise,\n} from '@polkadot/api/types';\nimport { Option, u128 } from '@polkadot/types';\nimport { AccountInfo } from '@polkadot/types/interfaces';\nimport {\n PalletAssetsAssetAccount,\n PalletAssetsAssetMetadata,\n} from '@polkadot/types/lookup';\nimport _ from 'lodash';\nimport { getPolkadotApi } from './polkadot.api';\nimport { AssetBalanceInfo, XCMType } from './polkadot.interfaces';\nimport { calculateMin } from './polkadot.utils';\n\nexport class PolkadotService<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n> {\n readonly #api: ApiPromise;\n\n constructor(api: ApiPromise) {\n this.#api = api;\n }\n\n static async create<\n Symbols extends AssetSymbol = AssetSymbol,\n ChainKeys extends ChainKey = ChainKey,\n >(ws: string): Promise<PolkadotService<Symbols, ChainKeys>> {\n return new PolkadotService(await getPolkadotApi(ws));\n }\n\n getMetadata() {\n return {\n decimals: this.#api.registry.chainDecimals.at(0) || 12,\n symbol: this.#api.registry.chainTokens.at(0) as Symbols,\n };\n }\n\n getExistentialDeposit(): bigint {\n return this.#api.consts.balances?.existentialDeposit.toBigInt() || 0n;\n }\n\n async getAssetDecimals(asset: Asset<Symbols>): Promise<number> {\n const meta = await this.getAssetMeta(asset);\n\n return meta.decimals.toNumber();\n }\n\n async getAssetMeta(\n asset: Asset<Symbols>,\n ): Promise<PalletAssetsAssetMetadata> {\n const data = await (asset.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata)(asset.id);\n\n return data as PalletAssetsAssetMetadata;\n }\n\n async subscribeToAccountInfo(\n account: string,\n callback: (info: AccountInfo) => void,\n ): UnsubscribePromise {\n return this.#api.query.system.account<AccountInfo>(account, callback);\n }\n\n async subscribeToBalance(\n account: string,\n callback: (balance: bigint) => void,\n ): UnsubscribePromise {\n return this.subscribeToAccountInfo(account, ({ data }) =>\n callback(data.free.toBigInt() - data.miscFrozen.toBigInt()),\n );\n }\n\n async getGenericBalance(\n account: string,\n { pallet, function: fn, getParams, path, calc }: BalanceConfig<Symbols>,\n ): Promise<bigint> {\n const response = await this.#api.query[pallet][fn](...getParams(account));\n\n if (response.isEmpty) {\n return 0n;\n }\n\n const unwrapped = (response as any).unwrap?.() || response;\n\n return calc(path.length ? _.get(unwrapped, path) : unwrapped);\n }\n\n async getAssetMinBalance({\n pallet,\n function: fn,\n params,\n path,\n }: MinBalanceConfig): Promise<bigint> {\n const details = (await this.#api.query[pallet][fn](\n ...params,\n )) as Option<any>;\n\n if (details.isEmpty) {\n return 0n;\n }\n\n return _.get(details.value, path).toBigInt();\n }\n\n getXcmExtrinsic(\n account: string,\n amount: bigint,\n { pallet, extrinsic, getParams }: ExtrinsicConfig<Symbols>,\n fee?: bigint,\n primaryAccount?: string,\n ): SubmittableExtrinsic<'promise'> {\n let transferExtrinsic = this.#api.tx[pallet][extrinsic](\n // TODO: check issue with types and if we can fix it\n // @ts-ignore\n ...getParams(account, amount, fee),\n );\n\n if (primaryAccount) {\n transferExtrinsic = this.#api.tx.proxy.proxy(\n primaryAccount,\n null,\n transferExtrinsic,\n );\n }\n\n return transferExtrinsic;\n }\n\n async getAssetFee(\n asset: Asset,\n weight: number,\n moonChain: MoonChain,\n ): Promise<bigint> {\n return calculateMin(weight, await this.getUnitsPerSecond(asset, moonChain));\n }\n\n async getUnitsPerSecond(asset: Asset, moonChain: MoonChain): Promise<bigint> {\n if (asset.isNative) {\n return moonChain.unitsPerSecond;\n }\n const type = await this.getAssetType(asset.id);\n\n if (!type) {\n return 0n;\n }\n\n const res = (await this.#api.query.assetManager.assetTypeUnitsPerSecond(\n type,\n )) as Option<u128>;\n\n return res.unwrapOrDefault().toBigInt();\n }\n\n /**\n * this is only for Moon* chains\n */\n async getAssetType(id: string): Promise<XCMType | undefined> {\n const type = (await this.#api.query.assetManager.assetIdType(\n id,\n )) as Option<any>;\n\n return type.unwrapOr(undefined);\n }\n\n async subscribeToAssetsBalanceInfo(\n account: string,\n config: XcmConfigBuilder<Symbols, ChainKeys>,\n callback: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise {\n const assetsArray = Object.values<Asset<Symbols>>(config.assets);\n const metadata = await this.getAssetsMetadata(assetsArray);\n\n return this.subscribeToAccountBalances(account, assetsArray, (data) => {\n callback(\n data.map((balance, index): AssetBalanceInfo<Symbols> => {\n const asset = assetsArray[index];\n const meta = metadata[index];\n const {\n chains: [chain],\n from,\n } = config.deposit(asset.originSymbol);\n const { origin } = from(chain.key);\n\n return {\n asset,\n balance: {\n balance: balance.balance.toBigInt(),\n decimals: asset.isNative\n ? (origin as MoonChain).decimals\n : meta.decimals.toNumber(),\n symbol: asset.isNative\n ? asset.originSymbol\n : meta.symbol.toHuman()?.toString() || '',\n },\n origin,\n };\n }),\n );\n });\n }\n\n async getAssetsMetadata(\n assetsArray: Asset<Symbols>[],\n ): Promise<PalletAssetsAssetMetadata[]> {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.metadata\n : this.#api.query.assets.metadata,\n [x.id],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(queries);\n }\n\n async subscribeToAccountBalances(\n account: string,\n assetsArray: Asset<Symbols>[],\n callback: (balances: PalletAssetsAssetAccount[]) => void,\n ): UnsubscribePromise {\n const queries = assetsArray.map(\n (x) =>\n [\n x.isLocalAsset\n ? this.#api.query.localAssets.account\n : this.#api.query.assets.account,\n [x.id, account],\n ] as QueryableStorageMultiArg<'promise'>,\n );\n\n return this.#api.queryMulti(\n queries,\n (res: Option<PalletAssetsAssetAccount>[]) => {\n const response = res.map((item) => item.unwrapOrDefault());\n\n callback(response);\n },\n );\n }\n}\n","export function calculateMin(weight: number, unitsPerSecond: bigint): bigint {\n // 10**12 weight = 1 second\n return (BigInt(weight) * unitsPerSecond) / BigInt(10 ** 12);\n}\n","import { AssetSymbol, ChainKey } from '@moonbeam-network/xcm-config';\nimport { PolkadotService } from './PolkadotService';\n\nexport async function createPolkadotServices<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>(ws: string[]): Promise<PolkadotService<Symbols, ChainKeys>[]> {\n return Promise.all(\n ws.map((url) => PolkadotService.create<Symbols, ChainKeys>(url)),\n );\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n moonbase,\n MoonbaseAssets,\n MoonbaseChains,\n moonbeam,\n MoonbeamAssets,\n MoonbeamChains,\n moonriver,\n MoonriverAssets,\n MoonriverChains,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport _ from 'lodash';\nimport { XTokensContract } from '../contracts';\nimport { AssetBalanceInfo, createPolkadotServices } from '../polkadot';\nimport { getDepositData } from './sdk.deposit';\nimport {\n DepositTransferData,\n SdkOptions,\n WithdrawGetParams,\n WithdrawTransferData,\n XcmSdk,\n XcmSdkByChain,\n XcmSdkDeposit,\n XcmSdkWithdraw,\n} from './sdk.interfaces';\nimport { createDummyAsset, subscribeToAssetsBalanceInfo } from './sdk.utils';\nimport { getWithdrawData } from './sdk.withdraw';\n\nexport function init(options?: SdkOptions): XcmSdkByChain {\n return {\n moonbase: initByChain<MoonbaseAssets, MoonbaseChains>(moonbase, options),\n moonbeam: initByChain<MoonbeamAssets, MoonbeamChains>(moonbeam, options),\n moonriver: initByChain<MoonriverAssets, MoonriverChains>(\n moonriver,\n options,\n ),\n };\n}\n\nfunction initByChain<Symbols extends AssetSymbol, ChainKeys extends ChainKey>(\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>,\n options?: SdkOptions,\n): XcmSdk<Symbols, ChainKeys> {\n const { symbols, assets, moonAsset, moonChain } = configBuilder;\n\n return {\n symbols,\n assets,\n moonAsset,\n moonChain,\n subscribeToAssetsBalanceInfo: async (\n account: string,\n cb: (data: AssetBalanceInfo<Symbols>[]) => void,\n ): UnsubscribePromise => {\n const [polkadot] = await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n ]);\n\n return subscribeToAssetsBalanceInfo({\n account,\n polkadot,\n configBuilder,\n cb,\n });\n },\n deposit: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkDeposit<Symbols, ChainKeys> => {\n const { chains, from } = configBuilder.deposit(symbolOrAsset);\n\n return {\n chains,\n from: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = from(keyOrChain);\n\n return {\n get: async (\n account: string,\n sourceAccount: string | IKeyringPair,\n { primaryAccount, polkadotSigner } = {},\n ): Promise<DepositTransferData<Symbols>> => {\n const signer = polkadotSigner || options?.polkadotSigner;\n\n if (_.isString(sourceAccount) && !signer) {\n throw new Error(\n 'Polkadot Signer/KeyringPair are not provided to XCM-SDK',\n );\n }\n\n const [polkadot, foreignPolkadot] = await createPolkadotServices<\n Symbols,\n ChainKeys\n >([configBuilder.moonChain.ws, config.source.ws]);\n const meta = foreignPolkadot.getMetadata();\n const nativeAsset =\n configBuilder.assets[meta.symbol] ||\n createDummyAsset(meta.symbol);\n\n return getDepositData({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner: signer,\n primaryAccount,\n sourceAccount,\n });\n },\n };\n },\n };\n },\n withdraw: (\n symbolOrAsset: Symbols | Asset<Symbols>,\n ): XcmSdkWithdraw<Symbols, ChainKeys> => {\n const { chains, to } = configBuilder.withdraw(symbolOrAsset);\n\n return {\n chains,\n to: (keyOrChain: ChainKeys | Chain<ChainKeys>) => {\n const { asset, origin, config } = to(keyOrChain);\n\n return {\n get: async (\n destinationAccount: string,\n { ethersSigner }: WithdrawGetParams = {},\n ): Promise<WithdrawTransferData<Symbols>> => {\n const signer = ethersSigner || options?.ethersSigner;\n\n if (!signer) {\n throw new Error('Ethers signer is not provided to XCM-SDK');\n }\n\n const contract = new XTokensContract<Symbols>(signer);\n const [polkadot, destinationPolkadot] =\n await createPolkadotServices<Symbols, ChainKeys>([\n configBuilder.moonChain.ws,\n config.destination.ws,\n ]);\n const meta = destinationPolkadot.getMetadata();\n const nativeAsset = configBuilder.assets[meta.symbol];\n\n return getWithdrawData({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner: signer,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n });\n },\n };\n },\n };\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n DepositConfig,\n MoonChain,\n} from '@moonbeam-network/xcm-config';\nimport {\n createExtrinsicEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as PolkadotSigner } from '@polkadot/api/types';\nimport { IKeyringPair } from '@polkadot/types/types';\nimport { isUndefined } from '@polkadot/util';\nimport { PolkadotService } from '../polkadot';\nimport { DepositTransferData } from './sdk.interfaces';\n\nexport interface CreateExtrinsicOptions<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n config: DepositConfig<Symbols>;\n fee?: bigint;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n primaryAccount?: string;\n}\n\nexport function getCreateExtrinsic<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee,\n}: CreateExtrinsicOptions<Symbols, ChainKeys>) {\n return (amount: bigint) =>\n foreignPolkadot.getXcmExtrinsic(\n account,\n amount,\n config.extrinsic,\n fee,\n primaryAccount,\n );\n}\n\nexport interface GetDepositDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n asset: Asset<Symbols>;\n config: DepositConfig<Symbols>;\n foreignPolkadot: PolkadotService<Symbols, ChainKeys>;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n polkadotSigner?: PolkadotSigner;\n primaryAccount?: string;\n sourceAccount: string | IKeyringPair;\n}\n\nexport async function getDepositData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n asset,\n config,\n foreignPolkadot,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n polkadotSigner,\n primaryAccount,\n sourceAccount,\n}: GetDepositDataParams<Symbols, ChainKeys>): Promise<\n DepositTransferData<Symbols>\n> {\n const sourceAddress =\n typeof sourceAccount === 'string' ? sourceAccount : sourceAccount.address;\n const meta = foreignPolkadot.getMetadata();\n const xcmFeeAssetConfig = {\n asset: config.xcmFeeAsset?.asset ?? asset,\n balance: config.xcmFeeAsset?.balance ?? config.balance,\n };\n\n const [\n assetDecimals,\n existentialDeposit,\n sourceBalance,\n sourceFeeBalance,\n sourceMinBalance = 0n,\n xcmFee,\n xcmFeeBalance,\n xcmFeeDecimals,\n ] = await Promise.all([\n // assetDecimals\n polkadot.getAssetDecimals(asset),\n // existentialDeposit\n foreignPolkadot.getExistentialDeposit(),\n // sourceBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n config.balance,\n ),\n // sourceFeeBalance\n config.sourceFeeBalance\n ? foreignPolkadot.getGenericBalance(\n sourceAddress,\n config.sourceFeeBalance,\n )\n : undefined,\n // sourceMinBalance\n config.sourceMinBalance\n ? foreignPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : undefined,\n // xcmFee\n polkadot.getAssetFee(\n xcmFeeAssetConfig.asset,\n config.source.weight,\n moonChain,\n ),\n // xcmFeeBalance\n foreignPolkadot.getGenericBalance(\n primaryAccount || sourceAddress,\n xcmFeeAssetConfig.balance,\n ),\n // xcmFeeDecimals\n polkadot.getAssetDecimals(xcmFeeAssetConfig.asset),\n ]);\n\n // Min is basically the XCM fee, if it's the same asset. If less is sent then\n // Moon* won't process the message.\n const min = config.xcmFeeAsset ? 0n : xcmFee;\n const createExtrinsic = getCreateExtrinsic({\n account,\n config,\n foreignPolkadot,\n primaryAccount,\n fee: xcmFee,\n });\n\n return {\n asset: { ...asset, decimals: assetDecimals },\n existentialDeposit,\n min,\n moonChainFee: {\n balance: xcmFeeBalance,\n decimals: xcmFeeAssetConfig.asset.isNative\n ? meta.decimals\n : xcmFeeDecimals,\n fee: xcmFee,\n symbol: xcmFeeAssetConfig.asset.originSymbol,\n },\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n source: config.source,\n sourceBalance,\n sourceFeeBalance: !isUndefined(sourceFeeBalance)\n ? { ...meta, balance: sourceFeeBalance }\n : undefined,\n sourceMinBalance,\n getFee: async (amount = sourceBalance): Promise<bigint> => {\n const extrinsic = await createExtrinsic(amount);\n const info = await extrinsic.paymentInfo(sourceAccount);\n\n return info.partialFee.toBigInt();\n },\n send: async (\n amount: bigint,\n cb?: ExtrinsicEventsCallback,\n ): Promise<string> => {\n const extrinsic = await createExtrinsic(amount);\n const hash = await extrinsic.signAndSend(\n sourceAccount,\n {\n signer: polkadotSigner,\n },\n\n cb &&\n createExtrinsicEventHandler(\n config.extrinsic.pallet,\n config.extrinsic.successEvent,\n cb,\n ),\n );\n\n return hash.toString();\n },\n };\n}\n","import {\n Asset,\n AssetSymbol,\n ChainKey,\n XcmConfigBuilder,\n} from '@moonbeam-network/xcm-config';\nimport { UnsubscribePromise } from '@polkadot/api/types';\nimport { AssetBalanceInfo, PolkadotService } from '../polkadot';\nimport { XcmSdkDeposit, XcmSdkWithdraw } from './sdk.interfaces';\n\nexport function isXcmSdkDeposit(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkDeposit {\n return !!(config as XcmSdkDeposit).from;\n}\n\nexport function isXcmSdkWithdraw(\n config: XcmSdkDeposit | XcmSdkWithdraw,\n): config is XcmSdkWithdraw {\n return !!(config as XcmSdkWithdraw).to;\n}\n\nexport function toDecimal(\n number: bigint,\n decimals: number,\n maxDecimal = 6,\n): number {\n const decimalMultiplier = 10 ** maxDecimal;\n const dividend = number * BigInt(decimalMultiplier);\n const divisor = 10n ** BigInt(decimals);\n\n return Number(dividend / divisor) / decimalMultiplier;\n}\n\nexport function sortByBalanceAndChainName<Symbols extends AssetSymbol>(\n a: AssetBalanceInfo<Symbols>,\n b: AssetBalanceInfo<Symbols>,\n) {\n if (a.asset.isNative) {\n return -1;\n }\n\n if (b.asset.isNative) {\n return 1;\n }\n\n const aDecimal = toDecimal(a.balance.balance, a.balance.decimals);\n const bDecimal = toDecimal(b.balance.balance, b.balance.decimals);\n\n if (aDecimal || bDecimal) {\n return bDecimal - aDecimal;\n }\n\n const aName = (a.origin.name + a.asset.originSymbol).toLowerCase();\n const bName = (b.origin.name + b.asset.originSymbol).toLowerCase();\n\n if (aName < bName) {\n return -1;\n }\n\n if (aName > bName) {\n return 1;\n }\n\n return 0;\n}\n\nexport interface SubscribeToAssetsBalanceInfoParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n account: string;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n configBuilder: XcmConfigBuilder<Symbols, ChainKeys>;\n cb: (data: AssetBalanceInfo<Symbols>[]) => void;\n}\n\nexport async function subscribeToAssetsBalanceInfo<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n account,\n polkadot,\n configBuilder,\n cb,\n}: SubscribeToAssetsBalanceInfoParams<Symbols, ChainKeys>): UnsubscribePromise {\n let lastBalance = 0n;\n let lastInfo: AssetBalanceInfo<Symbols>[] = [];\n const handler = (data: bigint | AssetBalanceInfo<Symbols>[]) => {\n const isBalance = typeof data === 'bigint';\n\n lastBalance = isBalance ? data : lastBalance;\n lastInfo = (isBalance ? lastInfo : data)\n .map((info) => {\n if (info.asset.isNative) {\n // eslint-disable-next-line no-param-reassign\n info.balance.balance = lastBalance;\n }\n\n return info;\n })\n .sort(sortByBalanceAndChainName);\n\n if (lastInfo.length) {\n cb(lastInfo);\n }\n };\n\n const unsubscribeBalance = await polkadot.subscribeToBalance(\n account,\n handler,\n );\n const unsubscribeInfo = await polkadot.subscribeToAssetsBalanceInfo(\n account,\n configBuilder,\n handler,\n );\n\n return () => {\n unsubscribeBalance();\n unsubscribeInfo();\n };\n}\n\nexport function createDummyAsset(symbol: AssetSymbol): Asset<AssetSymbol> {\n return {\n id: '',\n erc20Id: '',\n originSymbol: symbol,\n };\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Asset,\n AssetSymbol,\n Chain,\n ChainKey,\n MoonChain,\n WithdrawConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n createTxEventHandler,\n ExtrinsicEventsCallback,\n} from '@moonbeam-network/xcm-utils';\nimport { Signer as EthersSigner } from 'ethers';\nimport { XTokensContract } from '../contracts';\nimport { PolkadotService } from '../polkadot';\nimport { WithdrawTransferData } from './sdk.interfaces';\n\nexport interface GetWithdrawDataParams<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n> {\n asset: Asset<Symbols>;\n config: WithdrawConfig<Symbols>;\n contract: XTokensContract;\n destinationAccount: string;\n destinationPolkadot: PolkadotService<Symbols, ChainKeys>;\n ethersSigner: EthersSigner;\n moonChain: MoonChain;\n nativeAsset: Asset<Symbols>;\n origin: MoonChain | Chain<ChainKeys>;\n polkadot: PolkadotService<Symbols, ChainKeys>;\n}\n\nexport async function getWithdrawData<\n Symbols extends AssetSymbol,\n ChainKeys extends ChainKey,\n>({\n asset,\n config,\n contract,\n destinationAccount,\n destinationPolkadot,\n ethersSigner,\n moonChain,\n nativeAsset,\n origin,\n polkadot,\n}: GetWithdrawDataParams<Symbols, ChainKeys>): Promise<\n WithdrawTransferData<Symbols>\n> {\n const meta = destinationPolkadot.getMetadata();\n const [decimals, destinationBalance, existentialDeposit, assetMinBalance] =\n await Promise.all([\n asset.isNative ? moonChain.decimals : polkadot.getAssetDecimals(asset),\n destinationPolkadot.getGenericBalance(destinationAccount, config.balance),\n asset.isNative ? 0n : destinationPolkadot.getExistentialDeposit(),\n config.sourceMinBalance\n ? destinationPolkadot.getAssetMinBalance(config.sourceMinBalance)\n : 0n,\n ]);\n\n const destinationFee = getFee(assetMinBalance, config);\n const min = getMin(\n assetMinBalance || existentialDeposit,\n destinationBalance,\n destinationFee,\n );\n\n return {\n asset: { ...asset, decimals },\n destination: config.destination,\n destinationBalance,\n destinationFee,\n existentialDeposit,\n min,\n native: { ...nativeAsset, decimals: meta.decimals },\n origin,\n getFee: async (amount) =>\n contract.getTransferFees(destinationAccount, amount, asset, config),\n send: async (amount: bigint, cb?: ExtrinsicEventsCallback) => {\n const tx = await contract.transfer(\n destinationAccount,\n amount,\n asset,\n config,\n );\n\n if (cb) {\n createTxEventHandler(ethersSigner, tx.hash, cb);\n }\n\n return tx.hash;\n },\n };\n}\n\nexport function getFee<Symbols extends AssetSymbol>(\n assetMinBalance: bigint,\n config: WithdrawConfig<Symbols>,\n) {\n const calculatedFee = BigInt(config.weight * config.feePerWeight);\n\n return assetMinBalance > calculatedFee ? assetMinBalance : calculatedFee;\n}\n\nexport function getMin(\n balanceNeeded: bigint,\n destinationBalance: bigint,\n destinationFee: bigint,\n) {\n const extra =\n destinationBalance >= balanceNeeded\n ? 0n\n : balanceNeeded - destinationBalance;\n\n return destinationFee + extra;\n}\n"],"mappings":"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","names":["ExtrinsicStatus","Contract","XTokensContract","signer","#signer","#contract","Contract","XTokensABI_default","account","amount","asset","config","estimatedGas","gasPrice","maxPriorityFeePerGas","ApiPromise","WsProvider","LRU","tenMin","cache","promise","api","getPolkadotApi","ws","_","calculateMin","weight","unitsPerSecond","PolkadotService","#api","api","ws","getPolkadotApi","_a","asset","account","callback","data","pallet","fn","getParams","path","calc","response","unwrapped","_","params","details","amount","extrinsic","fee","primaryAccount","transferExtrinsic","weight","moonChain","calculateMin","type","id","config","assetsArray","metadata","balance","index","meta","chain","from","origin","queries","x","res","item","createPolkadotServices","ws","url","PolkadotService","moonbase","moonbeam","moonriver","_","createExtrinsicEventHandler","isUndefined","getCreateExtrinsic","account","config","foreignPolkadot","primaryAccount","fee","amount","getDepositData","asset","moonChain","nativeAsset","origin","polkadot","polkadotSigner","sourceAccount","_a","_b","sourceAddress","meta","xcmFeeAssetConfig","assetDecimals","existentialDeposit","sourceBalance","sourceFeeBalance","sourceMinBalance","xcmFee","xcmFeeBalance","xcmFeeDecimals","min","createExtrinsic","cb","isXcmSdkDeposit","config","isXcmSdkWithdraw","toDecimal","number","decimals","maxDecimal","decimalMultiplier","dividend","divisor","sortByBalanceAndChainName","a","b","aDecimal","bDecimal","aName","bName","subscribeToAssetsBalanceInfo","account","polkadot","configBuilder","cb","lastBalance","lastInfo","handler","data","isBalance","info","unsubscribeBalance","unsubscribeInfo","createDummyAsset","symbol","createTxEventHandler","getWithdrawData","asset","config","contract","destinationAccount","destinationPolkadot","ethersSigner","moonChain","nativeAsset","origin","polkadot","meta","decimals","destinationBalance","existentialDeposit","assetMinBalance","destinationFee","getFee","min","getMin","amount","cb","tx","calculatedFee","balanceNeeded","extra","init","options","initByChain","moonbase","moonbeam","moonriver","configBuilder","symbols","assets","moonAsset","moonChain","account","cb","polkadot","createPolkadotServices","subscribeToAssetsBalanceInfo","symbolOrAsset","chains","from","keyOrChain","asset","origin","config","sourceAccount","primaryAccount","polkadotSigner","signer","_","foreignPolkadot","meta","nativeAsset","createDummyAsset","getDepositData","to","destinationAccount","ethersSigner","contract","XTokensContract","destinationPolkadot","getWithdrawData"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonbeam-network/xcm-sdk",
3
- "version": "0.0.1-dev.10",
3
+ "version": "0.0.1-dev.11",
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",
@@ -29,7 +29,7 @@
29
29
  "files": [
30
30
  "build"
31
31
  ],
32
- "type": "commonjs",
32
+ "type": "module",
33
33
  "exports": {
34
34
  ".": {
35
35
  "import": {
@@ -45,17 +45,19 @@
45
45
  "types": "./build/index.d.ts",
46
46
  "main": "./build/index.cjs",
47
47
  "dependencies": {
48
- "@moonbeam-network/api-augment": "^0.1801.0",
49
48
  "@moonbeam-network/xcm-config": "*",
50
49
  "@moonbeam-network/xcm-utils": "*",
51
- "@polkadot/api": "^9.5.2",
52
- "@polkadot/types": "^9.5.2",
53
- "@polkadot/util": "^10.1.11",
54
- "ethers": "^5.7.1",
55
50
  "lodash": "^4.17.21",
56
51
  "lru-cache": "^7.14.0"
57
52
  },
58
53
  "devDependencies": {
59
54
  "@types/lodash": "^4.14.186"
55
+ },
56
+ "peerDependencies": {
57
+ "@polkadot/api": "9.x",
58
+ "@polkadot/api-augment": "9.x",
59
+ "@polkadot/types": "9.x",
60
+ "@polkadot/util": "10.x",
61
+ "ethers": "5.x"
60
62
  }
61
63
  }