@galacticcouncil/xc-sdk 0.11.0 → 0.12.0-pr297-1d367d1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var An=Object.create;var It=Object.defineProperty;var bn=Object.getOwnPropertyDescriptor;var wn=Object.getOwnPropertyNames;var vn=Object.getPrototypeOf,xn=Object.prototype.hasOwnProperty;var Sn=(l,t)=>{for(var e in t)It(l,e,{get:t[e],enumerable:!0})},we=(l,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of wn(t))!xn.call(l,n)&&n!==e&&It(l,n,{get:()=>t[n],enumerable:!(s=bn(t,n))||s.enumerable});return l};var Pn=(l,t,e)=>(e=l!=null?An(vn(l)):{},we(t||!l||!l.__esModule?It(e,"default",{value:l,enumerable:!0}):e,l)),Tn=l=>we(It({},"__esModule",{value:!0}),l);var Nn={};Sn(Nn,{DISPATCH_ADDRESS:()=>ae,EvmClaim:()=>ut,EvmPlatform:()=>dt,EvmSigner:()=>re,FeeSwap:()=>ot,PlatformAdapter:()=>K,SolanaClaim:()=>ht,SolanaLilJit:()=>Q,SolanaPlatform:()=>pt,SolanaSigner:()=>le,SubstrateClaim:()=>yt,SubstrateExec:()=>Ct,SubstratePlatform:()=>bt,SubstrateService:()=>T,SubstrateSigner:()=>fe,SuiClaim:()=>ye,SuiPlatform:()=>wt,SuiSigner:()=>Ce,TransferBuilder:()=>dn,Wallet:()=>te,WhStatus:()=>Ae,WormholeScan:()=>Tt,WormholeTransfer:()=>be,chunkBySize:()=>ie,deserializeV0:()=>Fn,ixToHuman:()=>M,serializeV0:()=>tt});module.exports=Tn(Nn);var Pt=require("@galacticcouncil/common"),ct=require("@galacticcouncil/xc-core"),ee=require("rxjs");var at=require("@galacticcouncil/xc-core");var Ft=require("@galacticcouncil/xc-core"),ve=require("viem"),se=require("@wormhole-foundation/sdk-base"),ut=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Ft.Wormhole.fromChain(this.#t),n=se.encoding.b64.decode(e),a=se.encoding.hex.encode(n),r=Ft.Abi.TokenBridge,i=(0,ve.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};var R=require("@galacticcouncil/xc-core"),V=require("rxjs");var Y=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}validateConfig(t){if(!t.address)throw new Error("Contract address is required")}};var xe=require("@galacticcouncil/xc-core");var Dt=class extends Y{erc20;constructor(t,e){super(t,e),this.erc20=new xe.Erc20Client(t,e.address)}async getBalance(){let{args:t}=this.config,[e]=t;return this.erc20.balanceOf(e)}async getDecimals(){return this.erc20.decimals()}};var Rt=class extends Y{async getBalance(){let t=this.client.getProvider(),{address:e}=this.config;return t.getBalance({address:e})}async getDecimals(){return this.client.chain.nativeCurrency.decimals}};var kt=class{static get(t,e){switch(e.module){case"Erc20":return new Dt(t,e);case"Native":return new Rt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var _t=require("viem"),Ot=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof _t.ContractFunctionExecutionError?console.log(`Can't estimate fees!
1
+ "use strict";var vn=Object.create;var It=Object.defineProperty;var xn=Object.getOwnPropertyDescriptor;var Sn=Object.getOwnPropertyNames;var Pn=Object.getPrototypeOf,Tn=Object.prototype.hasOwnProperty;var Bn=(u,t)=>{for(var e in t)It(u,e,{get:t[e],enumerable:!0})},ve=(u,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Sn(t))!Tn.call(u,n)&&n!==e&&It(u,n,{get:()=>t[n],enumerable:!(s=xn(t,n))||s.enumerable});return u};var En=(u,t,e)=>(e=u!=null?vn(Pn(u)):{},ve(t||!u||!u.__esModule?It(e,"default",{value:u,enumerable:!0}):e,u)),In=u=>ve(It({},"__esModule",{value:!0}),u);var jn={};Bn(jn,{DISPATCH_ADDRESS:()=>re,EvmClaim:()=>lt,EvmPlatform:()=>dt,EvmSigner:()=>ie,FeeSwap:()=>ot,PlatformAdapter:()=>K,SolanaClaim:()=>ht,SolanaLilJit:()=>Q,SolanaPlatform:()=>pt,SolanaSigner:()=>le,SubstrateClaim:()=>yt,SubstrateExec:()=>Ct,SubstratePlatform:()=>bt,SubstrateService:()=>T,SubstrateSigner:()=>he,SuiClaim:()=>Ce,SuiPlatform:()=>wt,SuiSigner:()=>Ae,TransferBuilder:()=>fn,Wallet:()=>te,WhStatus:()=>be,WormholeScan:()=>Tt,WormholeTransfer:()=>we,chunkBySize:()=>oe,deserializeV0:()=>kn,ixToHuman:()=>M,serializeV0:()=>tt});module.exports=In(jn);var Pt=require("@galacticcouncil/common"),ct=require("@galacticcouncil/xc-core"),ee=require("rxjs");var at=require("@galacticcouncil/xc-core");var Ft=require("@galacticcouncil/xc-core"),xe=require("viem"),se=require("@wormhole-foundation/sdk-base"),lt=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Ft.Wormhole.fromChain(this.#t),n=se.encoding.b64.decode(e),a=se.encoding.hex.encode(n),r=Ft.Abi.TokenBridge,i=(0,xe.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};var R=require("@galacticcouncil/xc-core"),_=require("rxjs");var Y=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}validateConfig(t){if(!t.address)throw new Error("Contract address is required")}};var Se=require("@galacticcouncil/xc-core");var Dt=class extends Y{erc20;constructor(t,e){super(t,e),this.erc20=new Se.Erc20Client(t,e.address)}async getBalance(){let{args:t}=this.config,[e]=t;return this.erc20.balanceOf(e)}async getDecimals(){return this.erc20.decimals()}};var Rt=class extends Y{async getBalance(){let t=this.client.getProvider(),{address:e}=this.config;return t.getBalance({address:e})}async getDecimals(){return this.client.chain.nativeCurrency.decimals}};var kt=class{static get(t,e){switch(e.module){case"Erc20":return new Dt(t,e);case"Native":return new Rt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Vt=require("viem"),Ot=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof Vt.ContractFunctionExecutionError?console.log(`Can't estimate fees!
2
2
  `,s.message):console.log(s),0n}}async getGasPrice(){return this.client.getProvider().getGasPrice()}async getNonce(t){return this.client.getProvider().getTransactionCount({address:t})}async simulateCall(t){let{address:e,args:s,value:n,func:a}=this.config,r=this.client.getProvider(),i=await this.getNonce(t);try{let{results:o}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:i}]}),[c]=o;return c}catch(o){return console.log(`Can't simulate call!
3
- `,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,_t.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var mt=class{static get(t,e){return new Ot(t,e)}};var Se=require("@galacticcouncil/xc-core");function Pe(l){let t=l.module==="Snowbridge"&&l.func==="sendToken"&&l.args[0]==="0x0000000000000000000000000000000000000000";return l.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(l.func)||t}function Te(l){return Object.entries(Se.Precompile).map(([e,s])=>s).includes(l.address)}var dt=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=mt.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:R.CallType.Evm,value:n.value,dryRun:async()=>{let{error:g,logs:p}=await a.simulateCall(t),f=a.decodeEvents(p);return{call:n.module+"."+n.func,error:g?.shortMessage,events:f}}};if(Te(n)||Pe(n))return c;let u=new R.Erc20Client(this.#t,i),m=await u.allowance(t,n.address);if(m>=e)return c;let d=u.approve(n.address,e);return{abi:JSON.stringify(R.Abi.Erc20),allowance:m,data:d,from:t,to:i,type:R.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await mt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=kt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return R.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new V.Subject,n=s.pipe((0,V.shareReplay)(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let u=await this.getBalance(t,e);s.next(u)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe((0,V.finalize)(()=>i?.()),(0,V.distinctUntilChanged)((o,c)=>o.amount===c.amount))}};var Be=require("@galacticcouncil/xc-core"),Ee=require("@galacticcouncil/common"),Ie=require("polkadot-api"),ae="0x0000000000000000000000000000000000000401",{H160:Bn}=Ee.h160,re=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Bn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Be.EvmParachain)try{let i=this.#t.client,o=Ie.Binary.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:ae}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:ae})}else{let{data:i,to:o,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};var jt=require("@galacticcouncil/xc-core"),Ve=require("@solana/web3.js"),Me=require("buffer"),N=require("rxjs");var Z=class{connection;config;constructor(t,e){this.validateConnection(t),this.validateConfig(e),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}validateConfig(t){if(!t.address)throw new Error("Solana address is required")}};var Fe=require("@wormhole-foundation/sdk-solana");var En=9,Vt=class extends Z{async getBalance(){let{address:t}=this.config,e=new Fe.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return En}};var Mt=require("@wormhole-foundation/sdk-solana");var Nt=class extends Z{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Mt.SolanaAddress(t).unwrap(),n=new Mt.SolanaAddress(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:i})=>{let o=i.data.parsed.info.tokenAmount;return r+=BigInt(o.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new Mt.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Wt=class{static get(t,e){switch(e.module){case"Native":return new Vt(t,e);case"Token":return new Nt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var D=require("@solana/web3.js"),De=.5,Re=2,ke=1,Oe=1e6,In=25e4,Ut=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new D.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new D.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=De,s=Re,n=ke,a=Oe){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[D.ComputeBudgetProgram.setComputeUnitLimit({units:r}),D.ComputeBudgetProgram.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new D.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new D.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):In}async determinePriorityFee(t,e=De,s=Re,n=ke,a=Oe){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),u=Math.ceil(c.length*e);if(c.length>u){let d=c[u]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var gt=class{static get(t,e){return new Ut(t,e)}};var _e=require("@solana/web3.js");function M(l){return l.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function ie(l,t=1e3){let e=[],s=[],n=0;for(let a of l){let r=a.data?.length??0;s.length&&n+r>t&&(e.push(s),s=[],n=0),s.push(a),n+=r}return s.length&&e.push(s),e}function tt(l){let t=l.serialize();return Buffer.from(t).toString("hex")}function Fn(l){let t=Buffer.from(l,"hex"),e=Uint8Array.from(t);return _e.MessageV0.deserialize(e)}var pt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=gt.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=Me.Buffer.from(i).toString("hex");return{from:t,data:o,ix:M(n.instructions),signers:n.signers,type:jt.CallType.Solana,dryRun:async()=>{let{err:c,logs:u}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:u}}}}async estimateFee(t,e,s,n){let a=gt.get(this.#t,n),r=await a.estimateFee(t,e),i=await a.getPriorityMessage(t),{accounts:o}=await a.simulateTransaction(t,i),u=(o&&o[0])?.lamports;if(u){let m=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(u)-(m?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}async getBalance(t,e){let s=Wt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return jt.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new N.Subject,n=s.pipe((0,N.shareReplay)(1)),a=async()=>{let i=async()=>{let u=await this.getBalance(t,e);s.next(u)};await i();let o=new Ve.PublicKey(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe((0,N.finalize)(()=>r?.()),(0,N.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var q=require("@galacticcouncil/xc-core"),S=require("@solana/web3.js"),y=require("@solana/spl-token"),Ne=require("@wormhole-foundation/sdk-solana"),oe=require("@wormhole-foundation/sdk-solana-core"),We=require("@wormhole-foundation/sdk-base"),ce=require("@wormhole-foundation/sdk-definitions"),ft=require("@wormhole-foundation/sdk-solana-tokenbridge");var Q=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var ht=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new Q(t)}async redeem(t,e,s){let n=q.Wormhole.fromChain(this.#t),a=We.encoding.b64.decode(e),r=(0,ce.deserialize)("TokenBridge:Transfer",a),i=(0,ce.deserialize)("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new S.PublicKey(t),u=s?new S.PublicKey(s):c,m=c.equals(u),d=[];if(!await this.#e.getAccountInfo(o)){let h=S.Keypair.generate(),B=await oe.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,h.publicKey),k=ie(B,1e3);for(let F=0;F<k.length;F++){let w=k[F],O=await this.getV0Message(c,w),_=tt(O);d.push({from:t,data:_,ix:M(w),signers:[h],type:q.CallType.Solana})}let L=oe.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,h.publicKey),lt=await this.getV0Message(c,[L]),b=tt(lt);d.push({from:t,data:b,ix:M([L]),type:q.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new S.PublicKey(r.payload.token.address.toUint8Array()),C=p&&f.equals(y.NATIVE_MINT),P=await this.#n.getTipAccount(),A=S.SystemProgram.transfer({fromPubkey:c,toPubkey:new S.PublicKey(P[0]),lamports:1e3});if(C&&m){let h=await this.redeemAndUnwrap(n,c,r,A);d.push(h)}else{let h=await this.redeemToken(n,c,u,f,p,r,A);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?ft.createCompleteTransferNativeInstruction:ft.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),u=(0,y.getAssociatedTokenAddressSync)(n,s),m=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,u,s,n),d=await this.getV0Message(e,[m,c,i]),g=tt(d);return{from:e.toBase58(),data:g,ix:M([m,c]),type:q.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new S.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,y.getMint)(this.#e,y.NATIVE_MINT),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await(0,y.getMinimumBalanceForRentExemptAccount)(this.#e),c=S.Keypair.generate(),u=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,y.NATIVE_MINT),m=(0,ft.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=S.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:y.ACCOUNT_SIZE,programId:y.TOKEN_PROGRAM_ID}),g=(0,y.createInitializeAccountInstruction)(c.publicKey,y.NATIVE_MINT,e),p=(0,y.createTransferInstruction)(a,c.publicKey,e,i),f=(0,y.createCloseAccountInstruction)(c.publicKey,e,e),C=[u,m,d,g,p,f,n],P=await this.getV0Message(e,C),A=tt(P);return{from:e.toBase58(),data:A,ix:M(C),signers:[c],type:q.CallType.Solana}}derivePostedVaaKey(t,e){return Ne.utils.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new S.TransactionMessage({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};var X=require("@solana/web3.js"),Kt=require("buffer");var le=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new Q(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof X.Keypair){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let u=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(u);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof X.Keypair)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>Kt.Buffer.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(u=>Kt.Buffer.from(u.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Kt.Buffer.from(t,"hex"),n=Uint8Array.from(s),a=X.MessageV0.deserialize(n),r=new X.VersionedTransaction(a);return e&&r.sign(e),r}};var W=require("@galacticcouncil/xc-core"),ue=require("@wormhole-foundation/sdk-base"),Ue=require("viem"),me=require("polkadot-api"),yt=class{#t;constructor(t){this.#t=t,W.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=ue.encoding.b64.decode(e),n=ue.encoding.hex.encode(s),a=W.Abi.Gmp,r=(0,Ue.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:W.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e);return{data:(await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],fee_payment:{type:"Auto",value:void 0},action:{type:"Call",value:me.Binary.fromHex(a.to)},value:[0n,0n,0n,0n],input:me.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData()).asHex(),from:t,type:W.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var Lt=require("@galacticcouncil/xc-core"),Ht=require("polkadot-api");var je=require("@galacticcouncil/common");async function de(l,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:je.big.convertDecimals(l,a,n),decimals:n}}var Ke=require("@galacticcouncil/common"),ze=l=>{let t=[];for(let e of l)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},et=l=>{let t=l.value.error;return t.type==="Module"?Ke.enums.enumPath(t.value):JSON.stringify(t.value)};var zt=require("@galacticcouncil/common");function Dn(l){return{parents:0,interior:{type:"X1",value:l.startsWith("0x")?zt.xcm.toAccountKey20(l):zt.xcm.toAccountId32(l)}}}function He(l){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:l.parachainId}}}}}var Rn=(l,t)=>({id:zt.xcm.transform(l),fun:{type:"Fungible",value:t}}),Le=(l,t,e,s,n,a)=>{console.log(a);let r=Dn(l),i=Rn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[i]},{type:"BuyExecution",value:{fees:i,weight_limit:{type:"Unlimited"}}},{type:"Transact",value:{origin_kind:{type:"SovereignAccount"},require_weight_at_most:{ref_time:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var Ct=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,u=await c.getCurrency(),m=u.asset,d=u.decimals,g=c.getAssetXcmLocation(m),p=Ht.Binary.fromHex(s.data),C=await(await o.txFromCallData(p)).getPaymentInfo(e),P=BigInt(C.partial_fee)*120n/100n,A=Lt.AssetAmount.fromAsset(m,{amount:P,decimals:d}),h=C.weight.ref_time,B=C.weight.proof_size,k=He(c),L=Le(e,g,A,h,B,p),lt=r.tx.PolkadotXcm.send({dest:k,message:L}),b=[];try{let x=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,A,10),Et=Ht.Binary.fromHex(x),$=await r.txFromCallData(Et);b.push($)}catch{}let F=await n(A),w=Ht.Binary.fromHex(F.data),O=await r.txFromCallData(w);b.push(O),b.push(lt);let _=b.map(x=>x.decodedCall),Bt=r.tx.Utility.batch_all({calls:_}),ne=await Bt.getEncodedData();return{from:t,data:ne.asHex(),type:Lt.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let x=await this.#t.dryRun(t,Bt);return{call:"polkadotXcm.send",error:x.execution_result&&x.execution_result.success?void 0:et(x.execution_result),events:x.emitted_events||[],xcm:x.forwarded_xcms||[]}}catch(x){return{call:"polkadotXcm.send",error:x instanceof Error?x.message:"unknown"}}}:()=>{}}}};var J=require("@galacticcouncil/xc-core"),I=require("rxjs");var U=require("@galacticcouncil/xc-core"),$t=require("@galacticcouncil/common"),Qt=require("@polkadot-api/substrate-bindings"),At=require("@polkadot-api/utils"),ge=require("polkadot-api");var{Ss58Addr:$e}=U.addr,T=class l{chain;_currency;constructor(t){this.chain=t}static async create(t){return new l(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return U.AssetAmount.fromAsset(e,{amount:t,decimals:s})}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Qt.u32.enc(a),i=u=>new TextEncoder().encode(u),o=new Uint8Array([...i(this.chain.parachainId.toString()),...(0,At.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,At.fromHex)(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=(0,Qt.Blake2256)(o);return(0,At.toHex)(c)}async dryRun(t,e){let s=(0,ge.Enum)("Signed",t),n=(0,ge.Enum)("system",s),a=await this.api.apis.DryRunApi.dry_run_call(n,e.decodedCall,4);if(!a.success)throw new Error("DryRun call failed");let r=a.value;if("type"in r&&"value"in r)throw new Error("DryRun call error: "+$t.enums.enumPath(r.value));return r}async estimateNetworkFee(t,e){let s=e.getTx(this.client);try{let n=await s.getPaymentInfo(t);return BigInt(n.partial_fee)}catch{console.warn("Can't estimate network fee.")}return 0n}async estimateDeliveryFee(t,e){if(this.chain.usesDeliveryFee){let s=await this.estimateDeliveryFeeWith(t,e);try{let n=e.getTx(this.client),a=await this.dryRun(s,n);if(a.execution_result?.success)return ze(a.emitted_events||[]);{let r=et(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
- ${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=U.multiloc.findNestedKey(a,"interior"),i=U.multiloc.findParachain(a);if(U.multiloc.findGlobalConsensus(a))return t;if(i){let c=$t.acc.getSovereignAccounts(i);return this.chain.parachainId===0?$e.encodePubKey(c.relay):$e.encodePubKey(c.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var bt=class{#t;constructor(t){this.#t=T.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,i=await this.useSignerFee(s)?{asset:new J.Asset(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,u=await o.getEncodedData();return{from:t,data:u.asHex(),type:J.CallType.Substrate,txOptions:i,dryRun:a.isDryRunSupported()?async()=>{try{let m=n.getTx(a.client),d=await a.dryRun(t,m),g=d.execution_result&&d.execution_result.success?void 0:et(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await de(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return(0,I.firstValueFrom)(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,"best").pipe((0,I.concatMap)(u=>i(u)),(0,I.distinctUntilChanged)((u,m)=>u===m),(0,I.concatMap)(async u=>{let m=await de(u,t,s);return J.AssetAmount.fromAsset(t,m)}),(0,I.catchError)(u=>(console.error("subscribe fails for:",t),(0,I.throwError)(()=>u))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=J.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};var pe=require("@galacticcouncil/xc-core"),nt=require("polkadot-api"),fe=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=nt.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=pe.multiloc.findPalletInstance(e),n=pe.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,nt.Enum)("X2",[(0,nt.Enum)("PalletInstance",Number(s)),(0,nt.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var Xt=require("@galacticcouncil/xc-core"),qe=require("@mysten/sui/transactions"),Xe=require("@mysten/sui/utils"),Je=require("@mysten/bcs"),st=require("@wormhole-foundation/sdk-connect"),Ge=require("@wormhole-foundation/sdk-definitions"),he=require("@wormhole-foundation/sdk-sui"),Ye=require("@wormhole-foundation/sdk-sui-tokenbridge");var Qe=require("@mysten/bcs");function qt(l,t={}){let e=l.inputs??[],s=l.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=u=>n==="bigint"?u:n==="number"?Number(u):u.toString(),i=u=>{let m=(0,Qe.fromBase64)(u),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=u=>{let m=e[u];if(!m)return{Input:u};if(m.Pure?.bytes)return i(m.Pure.bytes);let d=m.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=m.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:u}},c=u=>u?.GasCoin?"GasCoin":Array.isArray(u?.NestedResult)?u:typeof u?.Input=="number"?o(u.Input):u;return s.map(u=>{if(u.MoveCall){let m=u.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(u.SplitCoins){let m=u.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(u.MergeCoins){let m=u.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(u.TransferObjects){let m=u.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return u})}var ye=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Xt.Wormhole.fromChain(this.#t),n=this.#t.client,a=st.encoding.b64.decode(e),r=(0,Ge.deserialize)("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await(0,Ye.getTokenCoinType)(n,o,r.payload.token.address.toUint8Array(),(0,st.toChainId)(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[u,m]=await Promise.all([(0,he.getPackageId)(n,i),(0,he.getPackageId)(n,o)]),d=new qe.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${u}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",(0,st.serialize)(r)),d.object(Xe.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[C]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[C],typeArguments:[c]});let P=await d.build({client:n}),A=await d.toJSON(),h=qt(JSON.parse(A));return{from:t,commands:h,data:(0,Je.toBase64)(P),type:Xt.CallType.Sui}}};var Zt=require("@galacticcouncil/xc-core"),tn=require("@mysten/bcs"),j=require("rxjs");var Jt=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No client found")}validateConfig(t){if(!t.address)throw new Error("Sui address is required")}};var Ze=require("@mysten/sui/utils");var kn=9,Gt=class extends Jt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:Ze.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return kn}};var Yt=class{static get(t,e){switch(e.module){case"Native":return new Gt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var wt=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=await a.toJSON(),o=qt(JSON.parse(i));return{from:t,commands:o,data:(0,tn.toBase64)(r),type:Zt.CallType.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),u=BigInt(o.storageCost),m=c+u;return s.copyWith({amount:m})}async getBalance(t,e){let s=Yt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Zt.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new j.Subject,n=s.pipe((0,j.shareReplay)(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe((0,j.finalize)(()=>r?.()),(0,j.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var en=require("@mysten/sui/keypairs/ed25519"),nn=require("@mysten/sui/transactions"),Ce=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof en.Ed25519Keypair){let o=nn.Transaction.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var K=class{platform={};constructor(t){switch(t.getType()){case at.ChainType.EvmChain:this.registerEvm(t);break;case at.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case at.ChainType.Parachain:this.registerSubstrate(t);break;case at.ChainType.SolanaChain:this.registerSolana(t);break;case at.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new dt(e)}registerSolana(t){let e=t;this.platform.Solana=new pt(e)}registerSui(t){let e=t;this.platform.Sui=new wt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new bt(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};var H=require("@galacticcouncil/xc-core"),vt=require("@galacticcouncil/common");var sn=require("@galacticcouncil/common"),rt=Pn(require("big.js"),1);function an(l,t,e,s){let n=l.toBig().minus(e.toBig()).minus(l.isSame(t)?t.toBig():new rt.default(0));return s&&(n=n.minus(l.isSame(s)?s.toBig():new rt.default(0))),l.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function rn(l,t,e,s){let a=l.copyWith({amount:0n}).toBig().plus(l.isSame(t)?t.toBig():new rt.default(0)).plus(l.toBig().lt(e.toBig())?e.toBig():new rt.default(0));return s&&(a=a.plus(l.isSame(s)&&l.toBig().lt(s.toBig())?s.toBig():new rt.default(0))),l.copyWith({amount:BigInt(a.toFixed())})}async function z(l,t){return t.isEvmParachain()?t.getDerivatedAddress(l):l}function on(l,t){return t?sn.big.toBigInt(t,l):0n}var G=require("@galacticcouncil/xc-core"),cn=require("@galacticcouncil/common");var{EvmAddr:On}=G.addr,it=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof G.Parachain)return(await T.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=On.isValid(r.toString())?await z(t,e):t,o=s.source.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=s.min;if(t instanceof G.Parachain&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}return this.getAssetMin()}async getAssetMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=t.getAssetMin(n),r=await this.getDecimals(n),i=0n;return a&&(i=cn.big.toBigInt(a,r)),G.AssetAmount.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:ln}=H.addr,xt=class extends it{constructor(t,e){super(t,e)}async getCall(t){let{amount:e,sender:s,source:n}=t,a=await this.getTransfer(t);return this.adapter.buildCall(s,e,n.feeBalance,a)}async getDestinationFee(){let{chain:t,route:e}=this.config,{source:s,destination:n,transact:a}=e,r=n.fee.amount,i=s.destinationFee.asset||n.fee.asset,o=await this.getDecimals(i);if(Number.isFinite(r))return{fee:H.AssetAmount.fromAsset(i,{amount:vt.big.toBigInt(r,o),decimals:o}),feeBreakdown:{}};let c=r,{amount:u,breakdown:m}=await c.build({feeAsset:i,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:H.AssetAmount.fromAsset(i,{amount:u,decimals:o}),feeBreakdown:m}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=ln.isValid(o.toString())?await z(t,e):t,u=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,u)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await z(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:u}=s.source,m=u?on(c.decimals,u.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=ln.isValid(r.toString())?await z(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof H.Parachain&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:u,asset:m,sender:d}=t,p=await(await T.create(e)).buildMessageId(d,u,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||r||i;if(o)return o.build({...t});throw new Error("AssetRoute transfer config is invalid! Specify contract, extrinsic, move or program instructions.")}async getTransact(t){let{route:e}=this.config,{transact:s}=e;if(s){let n=Object.assign({transact:{chain:s.chain}}),a={...t,...n};return{...await this.getTransactData(s,a),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,a=await n.build(e),r=await T.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,u=vt.acc.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await i.getPaymentInfo(u),d=await i.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=vt.big.toBigInt(e.amount,s);return H.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){let{chain:s}=this.config,{fee:n}=t,a=n.balance.build({address:e.sender,asset:n.asset,chain:s});return this.adapter.getBalance(n.asset,a)}};var St=class extends it{constructor(t,e){super(t,e)}};var un=require("@galacticcouncil/xc-core"),ot=class{ctx;constructor(t){this.ctx=t}get asset(){let{source:t}=this.ctx;return t.balance}get dex(){let{source:t}=this.ctx;return t.chain.dex}get destFee(){let{source:t,transact:e}=this.ctx;return e?e.fee:t.destinationFee}get destFeeBalance(){let{source:t,transact:e}=this.ctx;return e?e.feeBalance:t.destinationFeeBalance}get feeBalance(){let{source:t}=this.ctx;return t.feeBalance}async getSwap(t){let{asset:e,decimals:s}=await this.dex.chain.getCurrency(),{amount:n}=await this.dex.getQuote(e,t,t);return{aIn:t,aOut:un.AssetAmount.fromAsset(e,{amount:n,decimals:s}),enabled:!0}}isSwapSupported(t){try{this.dex}catch{return!1}return!!(t&&t.swap)}async getDestinationSwap(t){let{amount:e,route:s}=await this.dex.getQuote(t,this.destFee,this.destFee),n=this.destFeeBalance.amount<this.destFee.amount,a=this.feeBalance.amount-t.amount>e*2n;return{aIn:t.copyWith({amount:e}),aOut:this.destFee,enabled:n&&a,route:s}}isDestinationSwapSupported(t){try{this.dex}catch{return!1}let e=!t.isSame(this.destFee),s=this.asset.isSame(this.destFee);return e&&!s}};var{EvmAddr:_n}=ct.addr,te=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,ct.ConfigBuilder)(this.config).assets().asset(t).source(s).destination(a).build();return this.getTransferData(r,e,n)}async remoteXcm(t,e,s,n,a={}){let r=this.config.getChain(e),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,u]=await Promise.all([T.create(r),T.create(i)]),m=new Ct(c,u),d=Pt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await u.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let C=f.toDecimal();return p.buildCall(C)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new K(n.chain),i=new K(a.chain),o=new xt(r,n),c=new St(i,a),u=new ct.TransferValidator(...this.validations),[m,d,g,p,f,C,P]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:A,destination:h}=n.route,B=g.fee.copyWith(h.fee.asset),k=g.feeBreakdown,lt=A.asset.isEqual(B)&&B.amount>10n?B.amount+1n:10n,b={address:s,amount:lt,asset:A.asset,destination:{balance:C,chain:a.chain,fee:B,feeBreakdown:k},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};b.transact=await o.getTransact(b);let F=new ot(b),w=await o.getFee(b),O;F.isSwapSupported(A.fee)&&(O=await F.getSwap(w),b.source.feeSwap=O);let _;F.isDestinationSwapSupported(w)&&(_=await F.getDestinationSwap(w),b.source.destinationFeeSwap=_),(O||_)&&(w=await o.getFee(b),w=w.padByPct(5n));let Bt=await c.getEd(),ne=rn(C,B,P,Bt),x=await o.getEd(),Et=an(m,w,f,x);return b.amount=0n,b.source.fee=w,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:_,fee:w,feeBalance:d,feeSwap:O,max:Et,min:m.copyWith({amount:ne.amount})},destination:{balance:C,fee:B},async buildCall($){let E=Object.assign({},b);return E.amount=Pt.big.toBigInt($,m.decimals),E.transact=await o.getTransact(E),o.getCall(E)},async estimateFee($){let E=Object.assign({},b);return E.amount=Pt.big.toBigInt($,m.decimals),E.transact=await o.getTransact(E),o.getFee(E)},async validate($){let E=Object.assign({},b),Cn=$||w.amount;return E.source.fee=w.copyWith({amount:Cn}),u.validate(E)}}}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new K(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:u,balance:m}=c,d=n.chain.getBalanceAssetId(u),g=_n.isValid(d.toString())?await z(t,n.chain):t,p=m.build({address:g,asset:u,chain:n.chain});return a.subscribeBalance(u,p)}),i=await Promise.all(r);return(0,ee.combineLatest)(i).pipe((0,ee.debounceTime)(500)).subscribe(s)}};var mn=require("@galacticcouncil/xc-core");function dn(l){let t=(0,mn.ConfigBuilder)(l.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:u,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:u,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let C=m(p,f);return l.getTransferData(C,d,g)}}}}}}}}}var gn=require("@galacticcouncil/xc-core"),Vn="https://api.wormholescan.io",Tt=class{_baseUrl;constructor(t){this._baseUrl=t||Vn}buildApi(t,e){return[this._baseUrl,t,"?"].join("")+new URLSearchParams(e).toString()}async getVaaBytes(t){let e=this.buildApi("/v1/signed_vaa/"+t,{});return await(await fetch(e)).json()}async getVaa(t){let e=this.buildApi("/api/v1/vaas/"+t,{});return(await(await fetch(e)).json()).data}async getVaaByTxHash(t){let e=this.buildApi("/api/v1/vaas/",{txHash:t}),n=await(await fetch(e)).json();if(n.data.length>0)return n.data[0];throw Error("Can't find VAA for given txHash: "+t)}async getOperations(t){let e=this.buildApi("/api/v1/operations/",t);return(await(await fetch(e)).json()).operations}async getOperation(t){let e=this.buildApi("/api/v1/operations/"+t,{});return await(await fetch(e)).json()}isMrlTransfer(t){let{payloadType:e,toAddress:s,toChain:n}=t,a="0x"+s.substring(26);return e===3&&n===16&&a===gn.Precompile.Bridge}};var pn=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),fn=require("@wormhole-foundation/sdk-base"),hn=require("@wormhole-foundation/sdk-connect"),yn=require("@wormhole-foundation/sdk-definitions");var Ae=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(Ae||{});var Mn=300*1e3,be=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new Tt}get chains(){let t=this.config.chains.values();return Array.from(t)}get filters(){let t=new Date,e=new Date;e.setDate(t.getDate()-6);let s=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:s}}async getWithdraws(t){let e=pn.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),u=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),C=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case v.ChainType.EvmChain:let P=new ut(g);p=async h=>P.redeem(h,C);break;case v.ChainType.SolanaChain:let A=new ht(g);p=async h=>A.redeem(h,C);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:u,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:v.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await v.mrl.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:u}=c,{payload:m}=u;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:u,sourceChain:m}=c,{payload:d,standarizedProperties:g}=u,p=this.getStatus(c),{tokenAddress:f}=g,C=this.chains.find(h=>v.Wormhole.isKnown(h)&&v.Wormhole.fromChain(h).getWormholeId()===d.tokenChain),P=this.chains.find(h=>v.Wormhole.isKnown(h)&&v.Wormhole.fromChain(h).getWormholeId()===d.toChain),A;if(p===1&&c.vaa){let{timestamp:h}=this.getVaaHeader(c.vaa.raw),B=c.vaa.raw;if(this.isStuck(h)){let k=new yt(P);A=async L=>k.redeemMrlViaXcm(L,B)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:C,to:t,toChain:n,status:p,redeem:A,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+Mn}getVaaHeader(t){let e=fn.encoding.b64.decode(t),s=(0,yn.deserialize)("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:(0,hn.keccak256)(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};0&&(module.exports={DISPATCH_ADDRESS,EvmClaim,EvmPlatform,EvmSigner,FeeSwap,PlatformAdapter,SolanaClaim,SolanaLilJit,SolanaPlatform,SolanaSigner,SubstrateClaim,SubstrateExec,SubstratePlatform,SubstrateService,SubstrateSigner,SuiClaim,SuiPlatform,SuiSigner,TransferBuilder,Wallet,WhStatus,WormholeScan,WormholeTransfer,chunkBySize,deserializeV0,ixToHuman,serializeV0});
3
+ `,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Vt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var mt=class{static get(t,e){return new Ot(t,e)}};var Pe=require("@galacticcouncil/xc-core"),Te=require("viem");function ae(u){return u.module==="Snowbridge"&&u.func==="v2_sendMessage"}function Be(u){if(!ae(u))return;let t=u.args[1];if(!t||t.length===0)return;let[e,s]=(0,Te.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Ee(u){let t=u.module==="Snowbridge"&&u.func==="v2_sendMessage"&&Array.isArray(u.args[1])&&u.args[1].length===0;return u.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(u.func)||t}function Ie(u){return Object.entries(Pe.Precompile).map(([e,s])=>s).includes(u.address)}var dt=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=mt.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:R.CallType.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),h=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:h}}};if(Ie(n)||Ee(n))return c;let l=ae(n)?Be(n):i,m=new R.Erc20Client(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return c;let g=m.approve(n.address,e);return{abi:JSON.stringify(R.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:R.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await mt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=kt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return R.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new _.Subject,n=s.pipe((0,_.shareReplay)(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe((0,_.finalize)(()=>i?.()),(0,_.distinctUntilChanged)((o,c)=>o.amount===c.amount))}};var Fe=require("@galacticcouncil/xc-core"),De=require("@galacticcouncil/common"),Re=require("polkadot-api"),re="0x0000000000000000000000000000000000000401",{H160:Fn}=De.h160,ie=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Fn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Fe.EvmParachain)try{let i=this.#t.client,o=Re.Binary.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:re}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:re})}else{let{data:i,to:o,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};var jt=require("@galacticcouncil/xc-core"),We=require("@solana/web3.js"),Ue=require("buffer"),N=require("rxjs");var Z=class{connection;config;constructor(t,e){this.validateConnection(t),this.validateConfig(e),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}validateConfig(t){if(!t.address)throw new Error("Solana address is required")}};var ke=require("@wormhole-foundation/sdk-solana");var Dn=9,_t=class extends Z{async getBalance(){let{address:t}=this.config,e=new ke.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Dn}};var Mt=require("@wormhole-foundation/sdk-solana");var Nt=class extends Z{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Mt.SolanaAddress(t).unwrap(),n=new Mt.SolanaAddress(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:i})=>{let o=i.data.parsed.info.tokenAmount;return r+=BigInt(o.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new Mt.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Wt=class{static get(t,e){switch(e.module){case"Native":return new _t(t,e);case"Token":return new Nt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var D=require("@solana/web3.js"),Oe=.5,Ve=2,_e=1,Me=1e6,Rn=25e4,Ut=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new D.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new D.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=Oe,s=Ve,n=_e,a=Me){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[D.ComputeBudgetProgram.setComputeUnitLimit({units:r}),D.ComputeBudgetProgram.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new D.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new D.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):Rn}async determinePriorityFee(t,e=Oe,s=Ve,n=_e,a=Me){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(c.length*e);if(c.length>l){let d=c[l]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var gt=class{static get(t,e){return new Ut(t,e)}};var Ne=require("@solana/web3.js");function M(u){return u.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function oe(u,t=1e3){let e=[],s=[],n=0;for(let a of u){let r=a.data?.length??0;s.length&&n+r>t&&(e.push(s),s=[],n=0),s.push(a),n+=r}return s.length&&e.push(s),e}function tt(u){let t=u.serialize();return Buffer.from(t).toString("hex")}function kn(u){let t=Buffer.from(u,"hex"),e=Uint8Array.from(t);return Ne.MessageV0.deserialize(e)}var pt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=gt.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=Ue.Buffer.from(i).toString("hex");return{from:t,data:o,ix:M(n.instructions),signers:n.signers,type:jt.CallType.Solana,dryRun:async()=>{let{err:c,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:l}}}}async estimateFee(t,e,s,n){let a=gt.get(this.#t,n),r=await a.estimateFee(t,e),i=await a.getPriorityMessage(t),{accounts:o}=await a.simulateTransaction(t,i),l=(o&&o[0])?.lamports;if(l){let m=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(m?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}async getBalance(t,e){let s=Wt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return jt.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new N.Subject,n=s.pipe((0,N.shareReplay)(1)),a=async()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let o=new We.PublicKey(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe((0,N.finalize)(()=>r?.()),(0,N.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var q=require("@galacticcouncil/xc-core"),S=require("@solana/web3.js"),C=require("@solana/spl-token"),je=require("@wormhole-foundation/sdk-solana"),ce=require("@wormhole-foundation/sdk-solana-core"),Ke=require("@wormhole-foundation/sdk-base"),ue=require("@wormhole-foundation/sdk-definitions"),ft=require("@wormhole-foundation/sdk-solana-tokenbridge");var Q=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var ht=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new Q(t)}async redeem(t,e,s){let n=q.Wormhole.fromChain(this.#t),a=Ke.encoding.b64.decode(e),r=(0,ue.deserialize)("TokenBridge:Transfer",a),i=(0,ue.deserialize)("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new S.PublicKey(t),l=s?new S.PublicKey(s):c,m=c.equals(l),d=[];if(!await this.#e.getAccountInfo(o)){let y=S.Keypair.generate(),B=await ce.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,y.publicKey),k=oe(B,1e3);for(let F=0;F<k.length;F++){let w=k[F],O=await this.getV0Message(c,w),V=tt(O);d.push({from:t,data:V,ix:M(w),signers:[y],type:q.CallType.Solana})}let L=ce.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,y.publicKey),ut=await this.getV0Message(c,[L]),b=tt(ut);d.push({from:t,data:b,ix:M([L]),type:q.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new S.PublicKey(r.payload.token.address.toUint8Array()),h=p&&f.equals(C.NATIVE_MINT),P=await this.#n.getTipAccount(),A=S.SystemProgram.transfer({fromPubkey:c,toPubkey:new S.PublicKey(P[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,c,r,A);d.push(y)}else{let y=await this.redeemToken(n,c,l,f,p,r,A);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?ft.createCompleteTransferNativeInstruction:ft.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=(0,C.getAssociatedTokenAddressSync)(n,s),m=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,l,s,n),d=await this.getV0Message(e,[m,c,i]),g=tt(d);return{from:e.toBase58(),data:g,ix:M([m,c]),type:q.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new S.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,C.getMint)(this.#e,C.NATIVE_MINT),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await(0,C.getMinimumBalanceForRentExemptAccount)(this.#e),c=S.Keypair.generate(),l=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,C.NATIVE_MINT),m=(0,ft.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=S.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:C.ACCOUNT_SIZE,programId:C.TOKEN_PROGRAM_ID}),g=(0,C.createInitializeAccountInstruction)(c.publicKey,C.NATIVE_MINT,e),p=(0,C.createTransferInstruction)(a,c.publicKey,e,i),f=(0,C.createCloseAccountInstruction)(c.publicKey,e,e),h=[l,m,d,g,p,f,n],P=await this.getV0Message(e,h),A=tt(P);return{from:e.toBase58(),data:A,ix:M(h),signers:[c],type:q.CallType.Solana}}derivePostedVaaKey(t,e){return je.utils.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new S.TransactionMessage({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};var X=require("@solana/web3.js"),Kt=require("buffer");var le=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new Q(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof X.Keypair){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let l=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof X.Keypair)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>Kt.Buffer.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(l=>Kt.Buffer.from(l.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Kt.Buffer.from(t,"hex"),n=Uint8Array.from(s),a=X.MessageV0.deserialize(n),r=new X.VersionedTransaction(a);return e&&r.sign(e),r}};var W=require("@galacticcouncil/xc-core"),me=require("@wormhole-foundation/sdk-base"),ze=require("viem"),de=require("polkadot-api"),yt=class{#t;constructor(t){this.#t=t,W.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=me.encoding.b64.decode(e),n=me.encoding.hex.encode(s),a=W.Abi.Gmp,r=(0,ze.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:W.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e);return{data:(await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],fee_payment:{type:"Auto",value:void 0},action:{type:"Call",value:de.Binary.fromHex(a.to)},value:[0n,0n,0n,0n],input:de.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData()).asHex(),from:t,type:W.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var Lt=require("@galacticcouncil/xc-core"),Ht=require("polkadot-api");var He=require("@galacticcouncil/common");async function ge(u,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:He.big.convertDecimals(u,a,n),decimals:n}}var Le=require("@galacticcouncil/common"),$e=u=>{let t=[];for(let e of u)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},et=u=>{let t=u.value.error;return t.type==="Module"?Le.enums.enumPath(t.value):JSON.stringify(t.value)};var zt=require("@galacticcouncil/common");function On(u){return{parents:0,interior:{type:"X1",value:u.startsWith("0x")?zt.xcm.toAccountKey20(u):zt.xcm.toAccountId32(u)}}}function Qe(u){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:u.parachainId}}}}}var Vn=(u,t)=>({id:zt.xcm.transform(u),fun:{type:"Fungible",value:t}}),qe=(u,t,e,s,n,a)=>{console.log(a);let r=On(u),i=Vn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[i]},{type:"BuyExecution",value:{fees:i,weight_limit:{type:"Unlimited"}}},{type:"Transact",value:{origin_kind:{type:"SovereignAccount"},require_weight_at_most:{ref_time:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var Ct=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),m=l.asset,d=l.decimals,g=c.getAssetXcmLocation(m),p=Ht.Binary.fromHex(s.data),h=await(await o.txFromCallData(p)).getPaymentInfo(e),P=BigInt(h.partial_fee)*120n/100n,A=Lt.AssetAmount.fromAsset(m,{amount:P,decimals:d}),y=h.weight.ref_time,B=h.weight.proof_size,k=Qe(c),L=qe(e,g,A,y,B,p),ut=r.tx.PolkadotXcm.send({dest:k,message:L}),b=[];try{let x=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,A,10),Et=Ht.Binary.fromHex(x),$=await r.txFromCallData(Et);b.push($)}catch{}let F=await n(A),w=Ht.Binary.fromHex(F.data),O=await r.txFromCallData(w);b.push(O),b.push(ut);let V=b.map(x=>x.decodedCall),Bt=r.tx.Utility.batch_all({calls:V}),ne=await Bt.getEncodedData();return{from:t,data:ne.asHex(),type:Lt.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let x=await this.#t.dryRun(t,Bt);return{call:"polkadotXcm.send",error:x.execution_result&&x.execution_result.success?void 0:et(x.execution_result),events:x.emitted_events||[],xcm:x.forwarded_xcms||[]}}catch(x){return{call:"polkadotXcm.send",error:x instanceof Error?x.message:"unknown"}}}:()=>{}}}};var J=require("@galacticcouncil/xc-core"),I=require("rxjs");var U=require("@galacticcouncil/xc-core"),$t=require("@galacticcouncil/common"),Qt=require("@polkadot-api/substrate-bindings"),At=require("@polkadot-api/utils"),pe=require("polkadot-api");var{Ss58Addr:Xe}=U.addr,T=class u{chain;_currency;constructor(t){this.chain=t}static async create(t){return new u(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return U.AssetAmount.fromAsset(e,{amount:t,decimals:s})}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Qt.u32.enc(a),i=l=>new TextEncoder().encode(l),o=new Uint8Array([...i(this.chain.parachainId.toString()),...(0,At.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,At.fromHex)(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=(0,Qt.Blake2256)(o);return(0,At.toHex)(c)}async dryRun(t,e){let s=(0,pe.Enum)("Signed",t),n=(0,pe.Enum)("system",s),a=await this.api.apis.DryRunApi.dry_run_call(n,e.decodedCall,4);if(!a.success)throw new Error("DryRun call failed");let r=a.value;if("type"in r&&"value"in r)throw new Error("DryRun call error: "+$t.enums.enumPath(r.value));return r}async estimateNetworkFee(t,e){let s=e.getTx(this.client);try{let n=await s.getPaymentInfo(t);return BigInt(n.partial_fee)}catch{console.warn("Can't estimate network fee.")}return 0n}async estimateDeliveryFee(t,e){if(this.chain.usesDeliveryFee){let s=await this.estimateDeliveryFeeWith(t,e);try{let n=e.getTx(this.client),a=await this.dryRun(s,n);if(a.execution_result?.success)return $e(a.emitted_events||[]);{let r=et(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
+ ${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=U.multiloc.findNestedKey(a,"interior"),i=U.multiloc.findParachain(a);if(U.multiloc.findGlobalConsensus(a))return t;if(i){let c=$t.acc.getSovereignAccounts(i);return this.chain.parachainId===0?Xe.encodePubKey(c.relay):Xe.encodePubKey(c.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var bt=class{#t;constructor(t){this.#t=T.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,i=await this.useSignerFee(s)?{asset:new J.Asset(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,l=await o.getEncodedData();return{from:t,data:l.asHex(),type:J.CallType.Substrate,txOptions:i,dryRun:a.isDryRunSupported()?async()=>{try{let m=n.getTx(a.client),d=await a.dryRun(t,m),g=d.execution_result&&d.execution_result.success?void 0:et(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await ge(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return(0,I.firstValueFrom)(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,"best").pipe((0,I.concatMap)(l=>i(l)),(0,I.distinctUntilChanged)((l,m)=>l===m),(0,I.concatMap)(async l=>{let m=await ge(l,t,s);return J.AssetAmount.fromAsset(t,m)}),(0,I.catchError)(l=>(console.error("subscribe fails for:",t),(0,I.throwError)(()=>l))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=J.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};var fe=require("@galacticcouncil/xc-core"),nt=require("polkadot-api"),he=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=nt.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=fe.multiloc.findPalletInstance(e),n=fe.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,nt.Enum)("X2",[(0,nt.Enum)("PalletInstance",Number(s)),(0,nt.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var Xt=require("@galacticcouncil/xc-core"),Ge=require("@mysten/sui/transactions"),Ye=require("@mysten/sui/utils"),Ze=require("@mysten/bcs"),st=require("@wormhole-foundation/sdk-connect"),tn=require("@wormhole-foundation/sdk-definitions"),ye=require("@wormhole-foundation/sdk-sui"),en=require("@wormhole-foundation/sdk-sui-tokenbridge");var Je=require("@mysten/bcs");function qt(u,t={}){let e=u.inputs??[],s=u.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),i=l=>{let m=(0,Je.fromBase64)(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return i(m.Pure.bytes);let d=m.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=m.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},c=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?o(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return l})}var Ce=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Xt.Wormhole.fromChain(this.#t),n=this.#t.client,a=st.encoding.b64.decode(e),r=(0,tn.deserialize)("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await(0,en.getTokenCoinType)(n,o,r.payload.token.address.toUint8Array(),(0,st.toChainId)(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([(0,ye.getPackageId)(n,i),(0,ye.getPackageId)(n,o)]),d=new Ge.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",(0,st.serialize)(r)),d.object(Ye.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[c]});let P=await d.build({client:n}),A=await d.toJSON(),y=qt(JSON.parse(A));return{from:t,commands:y,data:(0,Ze.toBase64)(P),type:Xt.CallType.Sui}}};var Zt=require("@galacticcouncil/xc-core"),sn=require("@mysten/bcs"),j=require("rxjs");var Jt=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No client found")}validateConfig(t){if(!t.address)throw new Error("Sui address is required")}};var nn=require("@mysten/sui/utils");var _n=9,Gt=class extends Jt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:nn.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return _n}};var Yt=class{static get(t,e){switch(e.module){case"Native":return new Gt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var wt=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=await a.toJSON(),o=qt(JSON.parse(i));return{from:t,commands:o,data:(0,sn.toBase64)(r),type:Zt.CallType.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),l=BigInt(o.storageCost),m=c+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=Yt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Zt.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new j.Subject,n=s.pipe((0,j.shareReplay)(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe((0,j.finalize)(()=>r?.()),(0,j.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var an=require("@mysten/sui/keypairs/ed25519"),rn=require("@mysten/sui/transactions"),Ae=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof an.Ed25519Keypair){let o=rn.Transaction.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var K=class{platform={};constructor(t){switch(t.getType()){case at.ChainType.EvmChain:this.registerEvm(t);break;case at.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case at.ChainType.Parachain:this.registerSubstrate(t);break;case at.ChainType.SolanaChain:this.registerSolana(t);break;case at.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new dt(e)}registerSolana(t){let e=t;this.platform.Solana=new pt(e)}registerSui(t){let e=t;this.platform.Sui=new wt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new bt(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};var H=require("@galacticcouncil/xc-core"),vt=require("@galacticcouncil/common");var on=require("@galacticcouncil/common"),rt=En(require("big.js"),1);function cn(u,t,e,s){let n=u.toBig().minus(e.toBig()).minus(u.isSame(t)?t.toBig():new rt.default(0));return s&&(n=n.minus(u.isSame(s)?s.toBig():new rt.default(0))),u.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function un(u,t,e,s){let a=u.copyWith({amount:0n}).toBig().plus(u.isSame(t)?t.toBig():new rt.default(0)).plus(u.toBig().lt(e.toBig())?e.toBig():new rt.default(0));return s&&(a=a.plus(u.isSame(s)&&u.toBig().lt(s.toBig())?s.toBig():new rt.default(0))),u.copyWith({amount:BigInt(a.toFixed())})}async function z(u,t){return t.isEvmParachain()?t.getDerivatedAddress(u):u}function ln(u,t){return t?on.big.toBigInt(t,u):0n}var G=require("@galacticcouncil/xc-core"),mn=require("@galacticcouncil/common");var{EvmAddr:Mn}=G.addr,it=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof G.Parachain)return(await T.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=Mn.isValid(r.toString())?await z(t,e):t,o=s.source.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=s.min;if(t instanceof G.Parachain&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}return this.getAssetMin()}async getAssetMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=t.getAssetMin(n),r=await this.getDecimals(n),i=0n;return a&&(i=mn.big.toBigInt(a,r)),G.AssetAmount.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:dn}=H.addr,xt=class extends it{constructor(t,e){super(t,e)}async getCall(t){let{amount:e,sender:s,source:n}=t,a=await this.getTransfer(t);return this.adapter.buildCall(s,e,n.feeBalance,a)}async getDestinationFee(){let{chain:t,route:e}=this.config,{source:s,destination:n,transact:a}=e,r=n.fee.amount,i=s.destinationFee.asset||n.fee.asset,o=await this.getDecimals(i);if(Number.isFinite(r))return{fee:H.AssetAmount.fromAsset(i,{amount:vt.big.toBigInt(r,o),decimals:o}),feeBreakdown:{}};let c=r,{amount:l,breakdown:m}=await c.build({feeAsset:i,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:H.AssetAmount.fromAsset(i,{amount:l,decimals:o}),feeBreakdown:m}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=dn.isValid(o.toString())?await z(t,e):t,l=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await z(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:l}=s.source,m=l?ln(c.decimals,l.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=dn.isValid(r.toString())?await z(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof H.Parachain&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:l,asset:m,sender:d}=t,p=await(await T.create(e)).buildMessageId(d,l,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||r||i;if(o)return o.build({...t});throw new Error("AssetRoute transfer config is invalid! Specify contract, extrinsic, move or program instructions.")}async getTransact(t){let{route:e}=this.config,{transact:s}=e;if(s){let n=Object.assign({transact:{chain:s.chain}}),a={...t,...n};return{...await this.getTransactData(s,a),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,a=await n.build(e),r=await T.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,l=vt.acc.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await i.getPaymentInfo(l),d=await i.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=vt.big.toBigInt(e.amount,s);return H.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){let{chain:s}=this.config,{fee:n}=t,a=n.balance.build({address:e.sender,asset:n.asset,chain:s});return this.adapter.getBalance(n.asset,a)}};var St=class extends it{constructor(t,e){super(t,e)}};var gn=require("@galacticcouncil/xc-core"),ot=class{ctx;constructor(t){this.ctx=t}get asset(){let{source:t}=this.ctx;return t.balance}get dex(){let{source:t}=this.ctx;return t.chain.dex}get destFee(){let{source:t,transact:e}=this.ctx;return e?e.fee:t.destinationFee}get destFeeBalance(){let{source:t,transact:e}=this.ctx;return e?e.feeBalance:t.destinationFeeBalance}get feeBalance(){let{source:t}=this.ctx;return t.feeBalance}async getSwap(t){let{asset:e,decimals:s}=await this.dex.chain.getCurrency(),{amount:n}=await this.dex.getQuote(e,t,t);return{aIn:t,aOut:gn.AssetAmount.fromAsset(e,{amount:n,decimals:s}),enabled:!0}}isSwapSupported(t){try{this.dex}catch{return!1}return!!(t&&t.swap)}async getDestinationSwap(t){let{amount:e,route:s}=await this.dex.getQuote(t,this.destFee,this.destFee),n=this.destFeeBalance.amount<this.destFee.amount,a=this.feeBalance.amount-t.amount>e*2n;return{aIn:t.copyWith({amount:e}),aOut:this.destFee,enabled:n&&a,route:s}}isDestinationSwapSupported(t){try{this.dex}catch{return!1}let e=!t.isSame(this.destFee),s=this.asset.isSame(this.destFee);return e&&!s}};var{EvmAddr:Nn}=ct.addr,te=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,ct.ConfigBuilder)(this.config).assets().asset(t).source(s).destination(a).build();return this.getTransferData(r,e,n)}async remoteXcm(t,e,s,n,a={}){let r=this.config.getChain(e),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([T.create(r),T.create(i)]),m=new Ct(c,l),d=Pt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let h=f.toDecimal();return p.buildCall(h)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new K(n.chain),i=new K(a.chain),o=new xt(r,n),c=new St(i,a),l=new ct.TransferValidator(...this.validations),[m,d,g,p,f,h,P]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:A,destination:y}=n.route,B=g.fee.copyWith(y.fee.asset),k=g.feeBreakdown,ut=A.asset.isEqual(B)&&B.amount>10n?B.amount+1n:10n,b={address:s,amount:ut,asset:A.asset,destination:{balance:h,chain:a.chain,fee:B,feeBreakdown:k},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};b.transact=await o.getTransact(b);let F=new ot(b),w=await o.getFee(b),O;F.isSwapSupported(A.fee)&&(O=await F.getSwap(w),b.source.feeSwap=O);let V;F.isDestinationSwapSupported(w)&&(V=await F.getDestinationSwap(w),b.source.destinationFeeSwap=V),(O||V)&&(w=await o.getFee(b),w=w.padByPct(5n));let Bt=await c.getEd(),ne=un(h,B,P,Bt),x=await o.getEd(),Et=cn(m,w,f,x);return b.amount=0n,b.source.fee=w,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:V,fee:w,feeBalance:d,feeSwap:O,max:Et,min:m.copyWith({amount:ne.amount})},destination:{balance:h,fee:B},async buildCall($){let E=Object.assign({},b);return E.amount=Pt.big.toBigInt($,m.decimals),E.transact=await o.getTransact(E),o.getCall(E)},async estimateFee($){let E=Object.assign({},b);return E.amount=Pt.big.toBigInt($,m.decimals),E.transact=await o.getTransact(E),o.getFee(E)},async validate($){let E=Object.assign({},b),wn=$||w.amount;return E.source.fee=w.copyWith({amount:wn}),l.validate(E)}}}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new K(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:l,balance:m}=c,d=n.chain.getBalanceAssetId(l),g=Nn.isValid(d.toString())?await z(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),i=await Promise.all(r);return(0,ee.combineLatest)(i).pipe((0,ee.debounceTime)(500)).subscribe(s)}};var pn=require("@galacticcouncil/xc-core");function fn(u){let t=(0,pn.ConfigBuilder)(u.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return u.getTransferData(h,d,g)}}}}}}}}}var hn=require("@galacticcouncil/xc-core"),Wn="https://api.wormholescan.io",Tt=class{_baseUrl;constructor(t){this._baseUrl=t||Wn}buildApi(t,e){return[this._baseUrl,t,"?"].join("")+new URLSearchParams(e).toString()}async getVaaBytes(t){let e=this.buildApi("/v1/signed_vaa/"+t,{});return await(await fetch(e)).json()}async getVaa(t){let e=this.buildApi("/api/v1/vaas/"+t,{});return(await(await fetch(e)).json()).data}async getVaaByTxHash(t){let e=this.buildApi("/api/v1/vaas/",{txHash:t}),n=await(await fetch(e)).json();if(n.data.length>0)return n.data[0];throw Error("Can't find VAA for given txHash: "+t)}async getOperations(t){let e=this.buildApi("/api/v1/operations/",t);return(await(await fetch(e)).json()).operations}async getOperation(t){let e=this.buildApi("/api/v1/operations/"+t,{});return await(await fetch(e)).json()}isMrlTransfer(t){let{payloadType:e,toAddress:s,toChain:n}=t,a="0x"+s.substring(26);return e===3&&n===16&&a===hn.Precompile.Bridge}};var yn=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),Cn=require("@wormhole-foundation/sdk-base"),An=require("@wormhole-foundation/sdk-connect"),bn=require("@wormhole-foundation/sdk-definitions");var be=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(be||{});var Un=300*1e3,we=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new Tt}get chains(){let t=this.config.chains.values();return Array.from(t)}get filters(){let t=new Date,e=new Date;e.setDate(t.getDate()-6);let s=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:s}}async getWithdraws(t){let e=yn.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),h=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case v.ChainType.EvmChain:let P=new lt(g);p=async y=>P.redeem(y,h);break;case v.ChainType.SolanaChain:let A=new ht(g);p=async y=>A.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:v.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await v.mrl.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:l}=c,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:l,sourceChain:m}=c,{payload:d,standarizedProperties:g}=l,p=this.getStatus(c),{tokenAddress:f}=g,h=this.chains.find(y=>v.Wormhole.isKnown(y)&&v.Wormhole.fromChain(y).getWormholeId()===d.tokenChain),P=this.chains.find(y=>v.Wormhole.isKnown(y)&&v.Wormhole.fromChain(y).getWormholeId()===d.toChain),A;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),B=c.vaa.raw;if(this.isStuck(y)){let k=new yt(P);A=async L=>k.redeemMrlViaXcm(L,B)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:A,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+Un}getVaaHeader(t){let e=Cn.encoding.b64.decode(t),s=(0,bn.deserialize)("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:(0,An.keccak256)(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};0&&(module.exports={DISPATCH_ADDRESS,EvmClaim,EvmPlatform,EvmSigner,FeeSwap,PlatformAdapter,SolanaClaim,SolanaLilJit,SolanaPlatform,SolanaSigner,SubstrateClaim,SubstrateExec,SubstratePlatform,SubstrateService,SubstrateSigner,SuiClaim,SuiPlatform,SuiSigner,TransferBuilder,Wallet,WhStatus,WormholeScan,WormholeTransfer,chunkBySize,deserializeV0,ixToHuman,serializeV0});
package/build/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{acc as ws,big as be}from"@galacticcouncil/common";import{addr as vs,ConfigBuilder as xs,TransferValidator as Ss}from"@galacticcouncil/xc-core";import{combineLatest as Ps,debounceTime as Ts}from"rxjs";import{ChainType as $}from"@galacticcouncil/xc-core";import{Abi as Pe,Wormhole as Te}from"@galacticcouncil/xc-core";import{encodeFunctionData as Be}from"viem";import{encoding as Rt}from"@wormhole-foundation/sdk-base";var Z=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Te.fromChain(this.#t),n=Rt.b64.decode(e),a=Rt.hex.encode(n),r=Pe.TokenBridge,i=Be({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};import{Abi as Re,AssetAmount as ke,CallType as _t,Erc20Client as Oe}from"@galacticcouncil/xc-core";import{distinctUntilChanged as _e,finalize as Ve,shareReplay as Me,Subject as Ne}from"rxjs";var _=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}validateConfig(t){if(!t.address)throw new Error("Contract address is required")}};import{Erc20Client as Ee}from"@galacticcouncil/xc-core";var tt=class extends _{erc20;constructor(t,e){super(t,e),this.erc20=new Ee(t,e.address)}async getBalance(){let{args:t}=this.config,[e]=t;return this.erc20.balanceOf(e)}async getDecimals(){return this.erc20.decimals()}};var et=class extends _{async getBalance(){let t=this.client.getProvider(),{address:e}=this.config;return t.getBalance({address:e})}async getDecimals(){return this.client.chain.nativeCurrency.decimals}};var nt=class{static get(t,e){switch(e.module){case"Erc20":return new tt(t,e);case"Native":return new et(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ContractFunctionExecutionError as Ie,decodeEventLog as Fe}from"viem";var st=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof Ie?console.log(`Can't estimate fees!
1
+ import{acc as Ss,big as ve}from"@galacticcouncil/common";import{addr as Ps,ConfigBuilder as Ts,TransferValidator as Bs}from"@galacticcouncil/xc-core";import{combineLatest as Es,debounceTime as Is}from"rxjs";import{ChainType as $}from"@galacticcouncil/xc-core";import{Abi as Be,Wormhole as Ee}from"@galacticcouncil/xc-core";import{encodeFunctionData as Ie}from"viem";import{encoding as kt}from"@wormhole-foundation/sdk-base";var Z=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Ee.fromChain(this.#t),n=kt.b64.decode(e),a=kt.hex.encode(n),r=Be.TokenBridge,i=Ie({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};import{Abi as Ve,AssetAmount as _e,CallType as Mt,Erc20Client as Me}from"@galacticcouncil/xc-core";import{distinctUntilChanged as Ne,finalize as We,shareReplay as Ue,Subject as je}from"rxjs";var V=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}validateConfig(t){if(!t.address)throw new Error("Contract address is required")}};import{Erc20Client as Fe}from"@galacticcouncil/xc-core";var tt=class extends V{erc20;constructor(t,e){super(t,e),this.erc20=new Fe(t,e.address)}async getBalance(){let{args:t}=this.config,[e]=t;return this.erc20.balanceOf(e)}async getDecimals(){return this.erc20.decimals()}};var et=class extends V{async getBalance(){let t=this.client.getProvider(),{address:e}=this.config;return t.getBalance({address:e})}async getDecimals(){return this.client.chain.nativeCurrency.decimals}};var nt=class{static get(t,e){switch(e.module){case"Erc20":return new tt(t,e);case"Native":return new et(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ContractFunctionExecutionError as De,decodeEventLog as Re}from"viem";var st=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof De?console.log(`Can't estimate fees!
2
2
  `,s.message):console.log(s),0n}}async getGasPrice(){return this.client.getProvider().getGasPrice()}async getNonce(t){return this.client.getProvider().getTransactionCount({address:t})}async simulateCall(t){let{address:e,args:s,value:n,func:a}=this.config,r=this.client.getProvider(),i=await this.getNonce(t);try{let{results:o}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:i}]}),[c]=o;return c}catch(o){return console.log(`Can't simulate call!
3
- `,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=Fe({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var K=class{static get(t,e){return new st(t,e)}};import{Precompile as De}from"@galacticcouncil/xc-core";function kt(m){let t=m.module==="Snowbridge"&&m.func==="sendToken"&&m.args[0]==="0x0000000000000000000000000000000000000000";return m.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(m.func)||t}function Ot(m){return Object.entries(De).map(([e,s])=>s).includes(m.address)}var at=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=K.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:_t.Evm,value:n.value,dryRun:async()=>{let{error:g,logs:p}=await a.simulateCall(t),f=a.decodeEvents(p);return{call:n.module+"."+n.func,error:g?.shortMessage,events:f}}};if(Ot(n)||kt(n))return c;let l=new Oe(this.#t,i),u=await l.allowance(t,n.address);if(u>=e)return c;let d=l.approve(n.address,e);return{abi:JSON.stringify(Re.Erc20),allowance:u,data:d,from:t,to:i,type:_t.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await K.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=nt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return ke.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new Ne,n=s.pipe(Me(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe(Ve(()=>i?.()),_e((o,c)=>o.amount===c.amount))}};import{EvmParachain as We}from"@galacticcouncil/xc-core";import{h160 as Ue}from"@galacticcouncil/common";import{Binary as je}from"polkadot-api";var Vt="0x0000000000000000000000000000000000000401",{H160:Ke}=Ue,Mt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Ke.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof We)try{let i=this.#t.client,o=je.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Vt}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:Vt})}else{let{data:i,to:o,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};import{AssetAmount as Xe,CallType as Je}from"@galacticcouncil/xc-core";import{PublicKey as Ge}from"@solana/web3.js";import{Buffer as Ye}from"buffer";import{distinctUntilChanged as Ze,finalize as tn,shareReplay as en,Subject as nn}from"rxjs";var V=class{connection;config;constructor(t,e){this.validateConnection(t),this.validateConfig(e),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}validateConfig(t){if(!t.address)throw new Error("Solana address is required")}};import{SolanaAddress as ze}from"@wormhole-foundation/sdk-solana";var He=9,rt=class extends V{async getBalance(){let{address:t}=this.config,e=new ze(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return He}};import{SolanaAddress as xt}from"@wormhole-foundation/sdk-solana";var it=class extends V{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new xt(t).unwrap(),n=new xt(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:i})=>{let o=i.data.parsed.info.tokenAmount;return r+=BigInt(o.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new xt(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var ot=class{static get(t,e){switch(e.module){case"Native":return new rt(t,e);case"Token":return new it(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Nt,PublicKey as Le,TransactionMessage as $e,VersionedTransaction as Wt}from"@solana/web3.js";var Ut=.5,jt=2,Kt=1,zt=1e6,Qe=25e4,ct=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new Le(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new $e({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=Ut,s=jt,n=Kt,a=zt){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Nt.setComputeUnitLimit({units:r}),Nt.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new Wt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Wt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):Qe}async determinePriorityFee(t,e=Ut,s=jt,n=Kt,a=zt){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(u=>u.prioritizationFee).filter(u=>u>0).sort((u,d)=>u-d),l=Math.ceil(c.length*e);if(c.length>l){let d=c[l]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var z=class{static get(t,e){return new ct(t,e)}};import{MessageV0 as qe}from"@solana/web3.js";function k(m){return m.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Ht(m,t=1e3){let e=[],s=[],n=0;for(let a of m){let r=a.data?.length??0;s.length&&n+r>t&&(e.push(s),s=[],n=0),s.push(a),n+=r}return s.length&&e.push(s),e}function H(m){let t=m.serialize();return Buffer.from(t).toString("hex")}function gr(m){let t=Buffer.from(m,"hex"),e=Uint8Array.from(t);return qe.deserialize(e)}var lt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=z.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=Ye.from(i).toString("hex");return{from:t,data:o,ix:k(n.instructions),signers:n.signers,type:Je.Solana,dryRun:async()=>{let{err:c,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:l}}}}async estimateFee(t,e,s,n){let a=z.get(this.#t,n),r=await a.estimateFee(t,e),i=await a.getPriorityMessage(t),{accounts:o}=await a.simulateTransaction(t,i),l=(o&&o[0])?.lamports;if(l){let u=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(u?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}async getBalance(t,e){let s=ot.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Xe.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new nn,n=s.pipe(en(1)),a=async()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let o=new Ge(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe(tn(()=>r?.()),Ze((i,o)=>i.amount===o.amount))}};import{CallType as ut,Wormhole as sn}from"@galacticcouncil/xc-core";import{Keypair as Lt,PublicKey as L,SystemProgram as $t,TransactionMessage as an}from"@solana/web3.js";import{ACCOUNT_SIZE as rn,NATIVE_MINT as mt,TOKEN_PROGRAM_ID as on,createAssociatedTokenAccountIdempotentInstruction as Qt,createCloseAccountInstruction as cn,createInitializeAccountInstruction as ln,createTransferInstruction as un,getAssociatedTokenAddressSync as mn,getMinimumBalanceForRentExemptAccount as dn,getMint as gn}from"@solana/spl-token";import{utils as pn}from"@wormhole-foundation/sdk-solana";import{utils as qt}from"@wormhole-foundation/sdk-solana-core";import{encoding as fn}from"@wormhole-foundation/sdk-base";import{deserialize as Xt}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as Jt,createCompleteTransferWrappedInstruction as hn}from"@wormhole-foundation/sdk-solana-tokenbridge";var M=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var dt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new M(t)}async redeem(t,e,s){let n=sn.fromChain(this.#t),a=fn.b64.decode(e),r=Xt("TokenBridge:Transfer",a),i=Xt("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new L(t),l=s?new L(s):c,u=c.equals(l),d=[];if(!await this.#e.getAccountInfo(o)){let h=Lt.generate(),x=await qt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,h.publicKey),B=Ht(x,1e3);for(let T=0;T<B.length;T++){let b=B[T],E=await this.getV0Message(c,b),I=H(E);d.push({from:t,data:I,ix:k(b),signers:[h],type:ut.Solana})}let D=qt.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,h.publicKey),j=await this.getV0Message(c,[D]),A=H(j);d.push({from:t,data:A,ix:k([D]),type:ut.Solana})}let p=r.payload.token.chain==="Solana",f=new L(r.payload.token.address.toUint8Array()),y=p&&f.equals(mt),v=await this.#n.getTipAccount(),C=$t.transfer({fromPubkey:c,toPubkey:new L(v[0]),lamports:1e3});if(y&&u){let h=await this.redeemAndUnwrap(n,c,r,C);d.push(h)}else{let h=await this.redeemToken(n,c,l,f,p,r,C);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?Jt:hn)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=mn(n,s),u=Qt(e,l,s,n),d=await this.getV0Message(e,[u,c,i]),g=H(d);return{from:e.toBase58(),data:g,ix:k([u,c]),type:ut.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new L(s.payload.to.address.toUint8Array()),r=await gn(this.#e,mt),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await dn(this.#e),c=Lt.generate(),l=Qt(e,a,e,mt),u=Jt(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=$t.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:rn,programId:on}),g=ln(c.publicKey,mt,e),p=un(a,c.publicKey,e,i),f=cn(c.publicKey,e,e),y=[l,u,d,g,p,f,n],v=await this.getV0Message(e,y),C=H(v);return{from:e.toBase58(),data:C,ix:k(y),signers:[c],type:ut.Solana}}derivePostedVaaKey(t,e){return pn.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new an({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as Gt,MessageV0 as yn,VersionedTransaction as Cn}from"@solana/web3.js";import{Buffer as St}from"buffer";var Yt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new M(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof Gt){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let l=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof Gt)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>St.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(l=>St.from(l.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=St.from(t,"hex"),n=Uint8Array.from(s),a=yn.deserialize(n),r=new Cn(a);return e&&r.sign(e),r}};import{Abi as An,CallType as bn,Precompile as wn,Wormhole as vn}from"@galacticcouncil/xc-core";import{encoding as Zt}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as xn}from"viem";import{Binary as te}from"polkadot-api";var gt=class{#t;constructor(t){this.#t=t,vn.fromChain(this.#t)}redeemMrl(t,e){let s=Zt.b64.decode(e),n=Zt.hex.encode(s),a=An.Gmp,r=xn({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:wn.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e);return{data:(await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],fee_payment:{type:"Auto",value:void 0},action:{type:"Call",value:te.fromHex(a.to)},value:[0n,0n,0n,0n],input:te.fromHex(a.data),access_list:void 0}}}).getEncodedData()).asHex(),from:t,type:bn.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as En,CallType as In}from"@galacticcouncil/xc-core";import{Binary as Bt}from"polkadot-api";import{big as Sn}from"@galacticcouncil/common";async function Pt(m,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:Sn.convertDecimals(m,a,n),decimals:n}}import{enums as Pn}from"@galacticcouncil/common";var ee=m=>{let t=[];for(let e of m)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},N=m=>{let t=m.value.error;return t.type==="Module"?Pn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as Tt}from"@galacticcouncil/common";function Tn(m){return{parents:0,interior:{type:"X1",value:m.startsWith("0x")?Tt.toAccountKey20(m):Tt.toAccountId32(m)}}}function ne(m){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:m.parachainId}}}}}var Bn=(m,t)=>({id:Tt.transform(m),fun:{type:"Fungible",value:t}}),se=(m,t,e,s,n,a)=>{console.log(a);let r=Tn(m),i=Bn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[i]},{type:"BuyExecution",value:{fees:i,weight_limit:{type:"Unlimited"}}},{type:"Transact",value:{origin_kind:{type:"SovereignAccount"},require_weight_at_most:{ref_time:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var pt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),u=l.asset,d=l.decimals,g=c.getAssetXcmLocation(u),p=Bt.fromHex(s.data),y=await(await o.txFromCallData(p)).getPaymentInfo(e),v=BigInt(y.partial_fee)*120n/100n,C=En.fromAsset(u,{amount:v,decimals:d}),h=y.weight.ref_time,x=y.weight.proof_size,B=ne(c),D=se(e,g,C,h,x,p),j=r.tx.PolkadotXcm.send({dest:B,message:D}),A=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,u,C,10),Y=Bt.fromHex(w),R=await r.txFromCallData(Y);A.push(R)}catch{}let T=await n(C),b=Bt.fromHex(T.data),E=await r.txFromCallData(b);A.push(E),A.push(j);let I=A.map(w=>w.decodedCall),G=r.tx.Utility.batch_all({calls:I}),vt=await G.getEncodedData();return{from:t,data:vt.asHex(),type:In.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,G);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:N(w.execution_result),events:w.emitted_events||[],xcm:w.forwarded_xcms||[]}}catch(w){return{call:"polkadotXcm.send",error:w instanceof Error?w.message:"unknown"}}}:()=>{}}}};import{Asset as Mn,AssetAmount as oe,CallType as Nn}from"@galacticcouncil/xc-core";import{concatMap as ce,catchError as Wn,distinctUntilChanged as Un,firstValueFrom as jn,throwError as Kn}from"rxjs";import{addr as Fn,multiloc as Et,AssetAmount as Dn}from"@galacticcouncil/xc-core";import{acc as Rn,enums as kn}from"@galacticcouncil/common";import{Blake2256 as On,u32 as _n}from"@polkadot-api/substrate-bindings";import{toHex as Vn,fromHex as ae}from"@polkadot-api/utils";import{Enum as re}from"polkadot-api";var{Ss58Addr:ie}=Fn,P=class m{chain;_currency;constructor(t){this.chain=t}static async create(t){return new m(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return Dn.fromAsset(e,{amount:t,decimals:s})}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=_n.enc(a),i=l=>new TextEncoder().encode(l),o=new Uint8Array([...i(this.chain.parachainId.toString()),...ae(t.startsWith("0x")?t.slice(2):t),...r,...ae(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=On(o);return Vn(c)}async dryRun(t,e){let s=re("Signed",t),n=re("system",s),a=await this.api.apis.DryRunApi.dry_run_call(n,e.decodedCall,4);if(!a.success)throw new Error("DryRun call failed");let r=a.value;if("type"in r&&"value"in r)throw new Error("DryRun call error: "+kn.enumPath(r.value));return r}async estimateNetworkFee(t,e){let s=e.getTx(this.client);try{let n=await s.getPaymentInfo(t);return BigInt(n.partial_fee)}catch{console.warn("Can't estimate network fee.")}return 0n}async estimateDeliveryFee(t,e){if(this.chain.usesDeliveryFee){let s=await this.estimateDeliveryFeeWith(t,e);try{let n=e.getTx(this.client),a=await this.dryRun(s,n);if(a.execution_result?.success)return ee(a.emitted_events||[]);{let r=N(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
- ${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=Et.findNestedKey(a,"interior"),i=Et.findParachain(a);if(Et.findGlobalConsensus(a))return t;if(i){let c=Rn.getSovereignAccounts(i);return this.chain.parachainId===0?ie.encodePubKey(c.relay):ie.encodePubKey(c.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var ft=class{#t;constructor(t){this.#t=P.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,i=await this.useSignerFee(s)?{asset:new Mn(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,l=await o.getEncodedData();return{from:t,data:l.asHex(),type:Nn.Substrate,txOptions:i,dryRun:a.isDryRunSupported()?async()=>{try{let u=n.getTx(a.client),d=await a.dryRun(t,u),g=d.execution_result&&d.execution_result.success?void 0:N(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(u){return{call:c,error:u instanceof Error?u.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await Pt(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return jn(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,"best").pipe(ce(l=>i(l)),Un((l,u)=>l===u),ce(async l=>{let u=await Pt(l,t,s);return oe.fromAsset(t,u)}),Wn(l=>(console.error("subscribe fails for:",t),Kn(()=>l))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=oe.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};import{multiloc as le}from"@galacticcouncil/xc-core";import{Binary as zn,Enum as It}from"polkadot-api";var ue=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=zn.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=le.findPalletInstance(e),n=le.findGeneralIndex(e);return{parents:0,interior:It("X2",[It("PalletInstance",Number(s)),It("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as Ln,Wormhole as $n}from"@galacticcouncil/xc-core";import{Transaction as Qn}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as qn}from"@mysten/sui/utils";import{toBase64 as Xn}from"@mysten/bcs";import{encoding as Jn,serialize as Gn,toChainId as Yn}from"@wormhole-foundation/sdk-connect";import{deserialize as Zn}from"@wormhole-foundation/sdk-definitions";import{getPackageId as me}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as ts}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as Hn}from"@mysten/bcs";function ht(m,t={}){let e=m.inputs??[],s=m.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),i=l=>{let u=Hn(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(u[f])<<8n*BigInt(f);return p};return u.length===1?{type:"pure",valueType:"u8",value:Number(u[0])}:u.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:u.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:u.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:u.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...u].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(u)}},o=l=>{let u=e[l];if(!u)return{Input:l};if(u.Pure?.bytes)return i(u.Pure.bytes);let d=u.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=u.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},c=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?o(l.Input):l;return s.map(l=>{if(l.MoveCall){let u=l.MoveCall;return{MoveCall:{...u,arguments:(u.arguments??[]).map(c)}}}if(l.SplitCoins){let u=l.SplitCoins,d=u.coin?.GasCoin?"GasCoin":c(u.coin),g=(u.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(l.MergeCoins){let u=l.MergeCoins;return{MergeCoins:{...u,destination:c(u.destination),sources:(u.sources??[]).map(c)}}}if(l.TransferObjects){let u=l.TransferObjects;return{TransferObjects:{...u,objects:(u.objects??[]).map(c),address:c(u.address)}}}return l})}var de=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=$n.fromChain(this.#t),n=this.#t.client,a=Jn.b64.decode(e),r=Zn("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await ts(n,o,r.payload.token.address.toUint8Array(),Yn(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,u]=await Promise.all([me(n,i),me(n,o)]),d=new Qn;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",Gn(r)),d.object(qn)]}),[p]=d.moveCall({target:`${u}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${u}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[y]=d.moveCall({target:`${u}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${u}::coin_utils::return_nonzero`,arguments:[y],typeArguments:[c]});let v=await d.build({client:n}),C=await d.toJSON(),h=ht(JSON.parse(C));return{from:t,commands:h,data:Xn(v),type:Ln.Sui}}};import{AssetAmount as ss,CallType as as}from"@galacticcouncil/xc-core";import{toBase64 as rs}from"@mysten/bcs";import{distinctUntilChanged as is,finalize as os,shareReplay as cs,Subject as ls}from"rxjs";var yt=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No client found")}validateConfig(t){if(!t.address)throw new Error("Sui address is required")}};import{SUI_TYPE_ARG as es}from"@mysten/sui/utils";var ns=9,Ct=class extends yt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:es});return BigInt(e.totalBalance)}async getDecimals(){return ns}};var At=class{static get(t,e){switch(e.module){case"Native":return new Ct(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var bt=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=await a.toJSON(),o=ht(JSON.parse(i));return{from:t,commands:o,data:rs(r),type:as.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),l=BigInt(o.storageCost),u=c+l;return s.copyWith({amount:u})}async getBalance(t,e){let s=At.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return ss.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new ls,n=s.pipe(cs(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe(os(()=>r?.()),is((i,o)=>i.amount===o.amount))}};import{Ed25519Keypair as us}from"@mysten/sui/keypairs/ed25519";import{Transaction as ms}from"@mysten/sui/transactions";var ge=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof us){let o=ms.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var O=class{platform={};constructor(t){switch(t.getType()){case $.EvmChain:this.registerEvm(t);break;case $.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case $.Parachain:this.registerSubstrate(t);break;case $.SolanaChain:this.registerSolana(t);break;case $.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new at(e)}registerSolana(t){let e=t;this.platform.Solana=new lt(e)}registerSui(t){let e=t;this.platform.Sui=new bt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new ft(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};import{addr as ys,AssetAmount as Ft,Parachain as Cs}from"@galacticcouncil/xc-core";import{acc as As,big as Ce}from"@galacticcouncil/common";import{big as ds}from"@galacticcouncil/common";import Q from"big.js";function pe(m,t,e,s){let n=m.toBig().minus(e.toBig()).minus(m.isSame(t)?t.toBig():new Q(0));return s&&(n=n.minus(m.isSame(s)?s.toBig():new Q(0))),m.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function fe(m,t,e,s){let a=m.copyWith({amount:0n}).toBig().plus(m.isSame(t)?t.toBig():new Q(0)).plus(m.toBig().lt(e.toBig())?e.toBig():new Q(0));return s&&(a=a.plus(m.isSame(s)&&m.toBig().lt(s.toBig())?s.toBig():new Q(0))),m.copyWith({amount:BigInt(a.toFixed())})}async function F(m,t){return t.isEvmParachain()?t.getDerivatedAddress(m):m}function he(m,t){return t?ds.toBigInt(t,m):0n}import{addr as gs,AssetAmount as ps,Parachain as ye}from"@galacticcouncil/xc-core";import{big as fs}from"@galacticcouncil/common";var{EvmAddr:hs}=gs,W=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof ye)return(await P.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=hs.isValid(r.toString())?await F(t,e):t,o=s.source.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=s.min;if(t instanceof ye&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}return this.getAssetMin()}async getAssetMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=t.getAssetMin(n),r=await this.getDecimals(n),i=0n;return a&&(i=fs.toBigInt(a,r)),ps.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:Ae}=ys,q=class extends W{constructor(t,e){super(t,e)}async getCall(t){let{amount:e,sender:s,source:n}=t,a=await this.getTransfer(t);return this.adapter.buildCall(s,e,n.feeBalance,a)}async getDestinationFee(){let{chain:t,route:e}=this.config,{source:s,destination:n,transact:a}=e,r=n.fee.amount,i=s.destinationFee.asset||n.fee.asset,o=await this.getDecimals(i);if(Number.isFinite(r))return{fee:Ft.fromAsset(i,{amount:Ce.toBigInt(r,o),decimals:o}),feeBreakdown:{}};let c=r,{amount:l,breakdown:u}=await c.build({feeAsset:i,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:Ft.fromAsset(i,{amount:l,decimals:o}),feeBreakdown:u}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=Ae.isValid(o.toString())?await F(t,e):t,l=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await F(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:l}=s.source,u=l?he(c.decimals,l.extra):0n,d=c.amount+u;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=Ae.isValid(r.toString())?await F(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof Cs&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:l,asset:u,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,l,u.originSymbol,c);return a.build({...t,messageId:p})}let o=n||r||i;if(o)return o.build({...t});throw new Error("AssetRoute transfer config is invalid! Specify contract, extrinsic, move or program instructions.")}async getTransact(t){let{route:e}=this.config,{transact:s}=e;if(s){let n=Object.assign({transact:{chain:s.chain}}),a={...t,...n};return{...await this.getTransactData(s,a),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,a=await n.build(e),r=await P.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,l=As.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),u=await i.getPaymentInfo(l),d=await i.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:u.weight.ref_time,proofSize:u.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=Ce.toBigInt(e.amount,s);return Ft.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){let{chain:s}=this.config,{fee:n}=t,a=n.balance.build({address:e.sender,asset:n.asset,chain:s});return this.adapter.getBalance(n.asset,a)}};var X=class extends W{constructor(t,e){super(t,e)}};import{AssetAmount as bs}from"@galacticcouncil/xc-core";var J=class{ctx;constructor(t){this.ctx=t}get asset(){let{source:t}=this.ctx;return t.balance}get dex(){let{source:t}=this.ctx;return t.chain.dex}get destFee(){let{source:t,transact:e}=this.ctx;return e?e.fee:t.destinationFee}get destFeeBalance(){let{source:t,transact:e}=this.ctx;return e?e.feeBalance:t.destinationFeeBalance}get feeBalance(){let{source:t}=this.ctx;return t.feeBalance}async getSwap(t){let{asset:e,decimals:s}=await this.dex.chain.getCurrency(),{amount:n}=await this.dex.getQuote(e,t,t);return{aIn:t,aOut:bs.fromAsset(e,{amount:n,decimals:s}),enabled:!0}}isSwapSupported(t){try{this.dex}catch{return!1}return!!(t&&t.swap)}async getDestinationSwap(t){let{amount:e,route:s}=await this.dex.getQuote(t,this.destFee,this.destFee),n=this.destFeeBalance.amount<this.destFee.amount,a=this.feeBalance.amount-t.amount>e*2n;return{aIn:t.copyWith({amount:e}),aOut:this.destFee,enabled:n&&a,route:s}}isDestinationSwapSupported(t){try{this.dex}catch{return!1}let e=!t.isSame(this.destFee),s=this.asset.isSame(this.destFee);return e&&!s}};var{EvmAddr:Bs}=vs,Dt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=xs(this.config).assets().asset(t).source(s).destination(a).build();return this.getTransferData(r,e,n)}async remoteXcm(t,e,s,n,a={}){let r=this.config.getChain(e),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([P.create(r),P.create(i)]),u=new pt(c,l),d=ws.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return u.remoteExec(t,d,n,f=>{let y=f.toDecimal();return p.buildCall(y)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new O(n.chain),i=new O(a.chain),o=new q(r,n),c=new X(i,a),l=new Ss(...this.validations),[u,d,g,p,f,y,v]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:C,destination:h}=n.route,x=g.fee.copyWith(h.fee.asset),B=g.feeBreakdown,j=C.asset.isEqual(x)&&x.amount>10n?x.amount+1n:10n,A={address:s,amount:j,asset:C.asset,destination:{balance:y,chain:a.chain,fee:x,feeBreakdown:B},sender:e,source:{balance:u,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};A.transact=await o.getTransact(A);let T=new J(A),b=await o.getFee(A),E;T.isSwapSupported(C.fee)&&(E=await T.getSwap(b),A.source.feeSwap=E);let I;T.isDestinationSwapSupported(b)&&(I=await T.getDestinationSwap(b),A.source.destinationFeeSwap=I),(E||I)&&(b=await o.getFee(A),b=b.padByPct(5n));let G=await c.getEd(),vt=fe(y,x,v,G),w=await o.getEd(),Y=pe(u,b,f,w);return A.amount=0n,A.source.fee=b,{source:{balance:u,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:I,fee:b,feeBalance:d,feeSwap:E,max:Y,min:u.copyWith({amount:vt.amount})},destination:{balance:y,fee:x},async buildCall(R){let S=Object.assign({},A);return S.amount=be.toBigInt(R,u.decimals),S.transact=await o.getTransact(S),o.getCall(S)},async estimateFee(R){let S=Object.assign({},A);return S.amount=be.toBigInt(R,u.decimals),S.transact=await o.getTransact(S),o.getFee(S)},async validate(R){let S=Object.assign({},A),Se=R||b.amount;return S.source.fee=b.copyWith({amount:Se}),l.validate(S)}}}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new O(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:l,balance:u}=c,d=n.chain.getBalanceAssetId(l),g=Bs.isValid(d.toString())?await F(t,n.chain):t,p=u.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),i=await Promise.all(r);return Ps(i).pipe(Ts(500)).subscribe(s)}};import{ConfigBuilder as Es}from"@galacticcouncil/xc-core";function Is(m){let t=Es(m.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build:u}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let y=u(p,f);return m.getTransferData(y,d,g)}}}}}}}}}import{Precompile as Fs}from"@galacticcouncil/xc-core";var Ds="https://api.wormholescan.io",wt=class{_baseUrl;constructor(t){this._baseUrl=t||Ds}buildApi(t,e){return[this._baseUrl,t,"?"].join("")+new URLSearchParams(e).toString()}async getVaaBytes(t){let e=this.buildApi("/v1/signed_vaa/"+t,{});return await(await fetch(e)).json()}async getVaa(t){let e=this.buildApi("/api/v1/vaas/"+t,{});return(await(await fetch(e)).json()).data}async getVaaByTxHash(t){let e=this.buildApi("/api/v1/vaas/",{txHash:t}),n=await(await fetch(e)).json();if(n.data.length>0)return n.data[0];throw Error("Can't find VAA for given txHash: "+t)}async getOperations(t){let e=this.buildApi("/api/v1/operations/",t);return(await(await fetch(e)).json()).operations}async getOperation(t){let e=this.buildApi("/api/v1/operations/"+t,{});return await(await fetch(e)).json()}isMrlTransfer(t){let{payloadType:e,toAddress:s,toChain:n}=t,a="0x"+s.substring(26);return e===3&&n===16&&a===Fs.Bridge}};import{acc as Rs}from"@galacticcouncil/common";import{mrl as ks,ChainType as ve,Parachain as Os,Precompile as _s,Wormhole as U}from"@galacticcouncil/xc-core";import{encoding as Vs}from"@wormhole-foundation/sdk-base";import{keccak256 as Ms}from"@wormhole-foundation/sdk-connect";import{deserialize as Ns}from"@wormhole-foundation/sdk-definitions";var we=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(we||{});var Ws=300*1e3,xe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new wt}get chains(){let t=this.config.chains.values();return Array.from(t)}get filters(){let t=new Date,e=new Date;e.setDate(t.getDate()-6);let s=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:s}}async getWithdraws(t){let e=Rs.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof Os&&f.parachainId===this.parachainId),{toAddress:u,tokenAddress:d}=o,g=this.chains.find(f=>U.isKnown(f)&&U.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),y=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case ve.EvmChain:let v=new Z(g);p=async h=>v.redeem(h,y);break;case ve.SolanaChain:let C=new dt(g);p=async h=>C.redeem(h,y);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:u,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:_s.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await ks.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:l}=c,{payload:u}=l;return u.payloadType===3&&u.toChain===16&&"0x"+u.payload===i}).map(async c=>{let{content:l,sourceChain:u}=c,{payload:d,standarizedProperties:g}=l,p=this.getStatus(c),{tokenAddress:f}=g,y=this.chains.find(h=>U.isKnown(h)&&U.fromChain(h).getWormholeId()===d.tokenChain),v=this.chains.find(h=>U.isKnown(h)&&U.fromChain(h).getWormholeId()===d.toChain),C;if(p===1&&c.vaa){let{timestamp:h}=this.getVaaHeader(c.vaa.raw),x=c.vaa.raw;if(this.isStuck(h)){let B=new gt(v);C=async D=>B.redeemMrlViaXcm(D,x)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:u.from,fromChain:y,to:t,toChain:n,status:p,redeem:C,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+Ws}getVaaHeader(t){let e=Vs.b64.decode(t),s=Ns("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Ms(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Vt as DISPATCH_ADDRESS,Z as EvmClaim,at as EvmPlatform,Mt as EvmSigner,J as FeeSwap,O as PlatformAdapter,dt as SolanaClaim,M as SolanaLilJit,lt as SolanaPlatform,Yt as SolanaSigner,gt as SubstrateClaim,pt as SubstrateExec,ft as SubstratePlatform,P as SubstrateService,ue as SubstrateSigner,de as SuiClaim,bt as SuiPlatform,ge as SuiSigner,Is as TransferBuilder,Dt as Wallet,we as WhStatus,wt as WormholeScan,xe as WormholeTransfer,Ht as chunkBySize,gr as deserializeV0,k as ixToHuman,H as serializeV0};
3
+ `,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=Re({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var K=class{static get(t,e){return new st(t,e)}};import{Precompile as ke}from"@galacticcouncil/xc-core";import{decodeAbiParameters as Oe}from"viem";function xt(u){return u.module==="Snowbridge"&&u.func==="v2_sendMessage"}function Ot(u){if(!xt(u))return;let t=u.args[1];if(!t||t.length===0)return;let[e,s]=Oe([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Vt(u){let t=u.module==="Snowbridge"&&u.func==="v2_sendMessage"&&Array.isArray(u.args[1])&&u.args[1].length===0;return u.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(u.func)||t}function _t(u){return Object.entries(ke).map(([e,s])=>s).includes(u.address)}var at=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=K.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:Mt.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),h=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:h}}};if(_t(n)||Vt(n))return c;let l=xt(n)?Ot(n):i,m=new Me(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return c;let g=m.approve(n.address,e);return{abi:JSON.stringify(Ve.Erc20),allowance:d,data:g,from:t,to:l,type:Mt.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await K.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=nt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return _e.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new je,n=s.pipe(Ue(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe(We(()=>i?.()),Ne((o,c)=>o.amount===c.amount))}};import{EvmParachain as Ke}from"@galacticcouncil/xc-core";import{h160 as ze}from"@galacticcouncil/common";import{Binary as He}from"polkadot-api";var Nt="0x0000000000000000000000000000000000000401",{H160:Le}=ze,Wt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Le.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Ke)try{let i=this.#t.client,o=He.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Nt}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:Nt})}else{let{data:i,to:o,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};import{AssetAmount as Ye,CallType as Ze}from"@galacticcouncil/xc-core";import{PublicKey as tn}from"@solana/web3.js";import{Buffer as en}from"buffer";import{distinctUntilChanged as nn,finalize as sn,shareReplay as an,Subject as rn}from"rxjs";var _=class{connection;config;constructor(t,e){this.validateConnection(t),this.validateConfig(e),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}validateConfig(t){if(!t.address)throw new Error("Solana address is required")}};import{SolanaAddress as $e}from"@wormhole-foundation/sdk-solana";var Qe=9,rt=class extends _{async getBalance(){let{address:t}=this.config,e=new $e(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Qe}};import{SolanaAddress as St}from"@wormhole-foundation/sdk-solana";var it=class extends _{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new St(t).unwrap(),n=new St(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:i})=>{let o=i.data.parsed.info.tokenAmount;return r+=BigInt(o.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new St(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var ot=class{static get(t,e){switch(e.module){case"Native":return new rt(t,e);case"Token":return new it(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Ut,PublicKey as qe,TransactionMessage as Xe,VersionedTransaction as jt}from"@solana/web3.js";var Kt=.5,zt=2,Ht=1,Lt=1e6,Je=25e4,ct=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new qe(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Xe({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=Kt,s=zt,n=Ht,a=Lt){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Ut.setComputeUnitLimit({units:r}),Ut.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new jt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new jt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):Je}async determinePriorityFee(t,e=Kt,s=zt,n=Ht,a=Lt){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(c.length*e);if(c.length>l){let d=c[l]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var z=class{static get(t,e){return new ct(t,e)}};import{MessageV0 as Ge}from"@solana/web3.js";function k(u){return u.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function $t(u,t=1e3){let e=[],s=[],n=0;for(let a of u){let r=a.data?.length??0;s.length&&n+r>t&&(e.push(s),s=[],n=0),s.push(a),n+=r}return s.length&&e.push(s),e}function H(u){let t=u.serialize();return Buffer.from(t).toString("hex")}function yr(u){let t=Buffer.from(u,"hex"),e=Uint8Array.from(t);return Ge.deserialize(e)}var ut=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=z.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=en.from(i).toString("hex");return{from:t,data:o,ix:k(n.instructions),signers:n.signers,type:Ze.Solana,dryRun:async()=>{let{err:c,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:l}}}}async estimateFee(t,e,s,n){let a=z.get(this.#t,n),r=await a.estimateFee(t,e),i=await a.getPriorityMessage(t),{accounts:o}=await a.simulateTransaction(t,i),l=(o&&o[0])?.lamports;if(l){let m=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(m?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}async getBalance(t,e){let s=ot.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Ye.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new rn,n=s.pipe(an(1)),a=async()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let o=new tn(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe(sn(()=>r?.()),nn((i,o)=>i.amount===o.amount))}};import{CallType as lt,Wormhole as on}from"@galacticcouncil/xc-core";import{Keypair as Qt,PublicKey as L,SystemProgram as qt,TransactionMessage as cn}from"@solana/web3.js";import{ACCOUNT_SIZE as un,NATIVE_MINT as mt,TOKEN_PROGRAM_ID as ln,createAssociatedTokenAccountIdempotentInstruction as Xt,createCloseAccountInstruction as mn,createInitializeAccountInstruction as dn,createTransferInstruction as gn,getAssociatedTokenAddressSync as pn,getMinimumBalanceForRentExemptAccount as fn,getMint as hn}from"@solana/spl-token";import{utils as yn}from"@wormhole-foundation/sdk-solana";import{utils as Jt}from"@wormhole-foundation/sdk-solana-core";import{encoding as Cn}from"@wormhole-foundation/sdk-base";import{deserialize as Gt}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as Yt,createCompleteTransferWrappedInstruction as An}from"@wormhole-foundation/sdk-solana-tokenbridge";var M=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var dt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new M(t)}async redeem(t,e,s){let n=on.fromChain(this.#t),a=Cn.b64.decode(e),r=Gt("TokenBridge:Transfer",a),i=Gt("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new L(t),l=s?new L(s):c,m=c.equals(l),d=[];if(!await this.#e.getAccountInfo(o)){let y=Qt.generate(),x=await Jt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,y.publicKey),B=$t(x,1e3);for(let T=0;T<B.length;T++){let b=B[T],E=await this.getV0Message(c,b),I=H(E);d.push({from:t,data:I,ix:k(b),signers:[y],type:lt.Solana})}let D=Jt.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,y.publicKey),j=await this.getV0Message(c,[D]),A=H(j);d.push({from:t,data:A,ix:k([D]),type:lt.Solana})}let p=r.payload.token.chain==="Solana",f=new L(r.payload.token.address.toUint8Array()),h=p&&f.equals(mt),v=await this.#n.getTipAccount(),C=qt.transfer({fromPubkey:c,toPubkey:new L(v[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,c,r,C);d.push(y)}else{let y=await this.redeemToken(n,c,l,f,p,r,C);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?Yt:An)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=pn(n,s),m=Xt(e,l,s,n),d=await this.getV0Message(e,[m,c,i]),g=H(d);return{from:e.toBase58(),data:g,ix:k([m,c]),type:lt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new L(s.payload.to.address.toUint8Array()),r=await hn(this.#e,mt),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await fn(this.#e),c=Qt.generate(),l=Xt(e,a,e,mt),m=Yt(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=qt.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:un,programId:ln}),g=dn(c.publicKey,mt,e),p=gn(a,c.publicKey,e,i),f=mn(c.publicKey,e,e),h=[l,m,d,g,p,f,n],v=await this.getV0Message(e,h),C=H(v);return{from:e.toBase58(),data:C,ix:k(h),signers:[c],type:lt.Solana}}derivePostedVaaKey(t,e){return yn.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new cn({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as Zt,MessageV0 as bn,VersionedTransaction as wn}from"@solana/web3.js";import{Buffer as Pt}from"buffer";var te=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new M(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof Zt){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let l=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof Zt)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>Pt.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(l=>Pt.from(l.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Pt.from(t,"hex"),n=Uint8Array.from(s),a=bn.deserialize(n),r=new wn(a);return e&&r.sign(e),r}};import{Abi as vn,CallType as xn,Precompile as Sn,Wormhole as Pn}from"@galacticcouncil/xc-core";import{encoding as ee}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as Tn}from"viem";import{Binary as ne}from"polkadot-api";var gt=class{#t;constructor(t){this.#t=t,Pn.fromChain(this.#t)}redeemMrl(t,e){let s=ee.b64.decode(e),n=ee.hex.encode(s),a=vn.Gmp,r=Tn({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Sn.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e);return{data:(await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],fee_payment:{type:"Auto",value:void 0},action:{type:"Call",value:ne.fromHex(a.to)},value:[0n,0n,0n,0n],input:ne.fromHex(a.data),access_list:void 0}}}).getEncodedData()).asHex(),from:t,type:xn.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as Dn,CallType as Rn}from"@galacticcouncil/xc-core";import{Binary as Et}from"polkadot-api";import{big as Bn}from"@galacticcouncil/common";async function Tt(u,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:Bn.convertDecimals(u,a,n),decimals:n}}import{enums as En}from"@galacticcouncil/common";var se=u=>{let t=[];for(let e of u)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},N=u=>{let t=u.value.error;return t.type==="Module"?En.enumPath(t.value):JSON.stringify(t.value)};import{xcm as Bt}from"@galacticcouncil/common";function In(u){return{parents:0,interior:{type:"X1",value:u.startsWith("0x")?Bt.toAccountKey20(u):Bt.toAccountId32(u)}}}function ae(u){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:u.parachainId}}}}}var Fn=(u,t)=>({id:Bt.transform(u),fun:{type:"Fungible",value:t}}),re=(u,t,e,s,n,a)=>{console.log(a);let r=In(u),i=Fn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[i]},{type:"BuyExecution",value:{fees:i,weight_limit:{type:"Unlimited"}}},{type:"Transact",value:{origin_kind:{type:"SovereignAccount"},require_weight_at_most:{ref_time:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var pt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),m=l.asset,d=l.decimals,g=c.getAssetXcmLocation(m),p=Et.fromHex(s.data),h=await(await o.txFromCallData(p)).getPaymentInfo(e),v=BigInt(h.partial_fee)*120n/100n,C=Dn.fromAsset(m,{amount:v,decimals:d}),y=h.weight.ref_time,x=h.weight.proof_size,B=ae(c),D=re(e,g,C,y,x,p),j=r.tx.PolkadotXcm.send({dest:B,message:D}),A=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,C,10),Y=Et.fromHex(w),R=await r.txFromCallData(Y);A.push(R)}catch{}let T=await n(C),b=Et.fromHex(T.data),E=await r.txFromCallData(b);A.push(E),A.push(j);let I=A.map(w=>w.decodedCall),G=r.tx.Utility.batch_all({calls:I}),vt=await G.getEncodedData();return{from:t,data:vt.asHex(),type:Rn.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,G);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:N(w.execution_result),events:w.emitted_events||[],xcm:w.forwarded_xcms||[]}}catch(w){return{call:"polkadotXcm.send",error:w instanceof Error?w.message:"unknown"}}}:()=>{}}}};import{Asset as Un,AssetAmount as ue,CallType as jn}from"@galacticcouncil/xc-core";import{concatMap as le,catchError as Kn,distinctUntilChanged as zn,firstValueFrom as Hn,throwError as Ln}from"rxjs";import{addr as kn,multiloc as It,AssetAmount as On}from"@galacticcouncil/xc-core";import{acc as Vn,enums as _n}from"@galacticcouncil/common";import{Blake2256 as Mn,u32 as Nn}from"@polkadot-api/substrate-bindings";import{toHex as Wn,fromHex as ie}from"@polkadot-api/utils";import{Enum as oe}from"polkadot-api";var{Ss58Addr:ce}=kn,P=class u{chain;_currency;constructor(t){this.chain=t}static async create(t){return new u(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return On.fromAsset(e,{amount:t,decimals:s})}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Nn.enc(a),i=l=>new TextEncoder().encode(l),o=new Uint8Array([...i(this.chain.parachainId.toString()),...ie(t.startsWith("0x")?t.slice(2):t),...r,...ie(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=Mn(o);return Wn(c)}async dryRun(t,e){let s=oe("Signed",t),n=oe("system",s),a=await this.api.apis.DryRunApi.dry_run_call(n,e.decodedCall,4);if(!a.success)throw new Error("DryRun call failed");let r=a.value;if("type"in r&&"value"in r)throw new Error("DryRun call error: "+_n.enumPath(r.value));return r}async estimateNetworkFee(t,e){let s=e.getTx(this.client);try{let n=await s.getPaymentInfo(t);return BigInt(n.partial_fee)}catch{console.warn("Can't estimate network fee.")}return 0n}async estimateDeliveryFee(t,e){if(this.chain.usesDeliveryFee){let s=await this.estimateDeliveryFeeWith(t,e);try{let n=e.getTx(this.client),a=await this.dryRun(s,n);if(a.execution_result?.success)return se(a.emitted_events||[]);{let r=N(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
+ ${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=It.findNestedKey(a,"interior"),i=It.findParachain(a);if(It.findGlobalConsensus(a))return t;if(i){let c=Vn.getSovereignAccounts(i);return this.chain.parachainId===0?ce.encodePubKey(c.relay):ce.encodePubKey(c.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var ft=class{#t;constructor(t){this.#t=P.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,i=await this.useSignerFee(s)?{asset:new Un(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,l=await o.getEncodedData();return{from:t,data:l.asHex(),type:jn.Substrate,txOptions:i,dryRun:a.isDryRunSupported()?async()=>{try{let m=n.getTx(a.client),d=await a.dryRun(t,m),g=d.execution_result&&d.execution_result.success?void 0:N(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await Tt(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return Hn(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,"best").pipe(le(l=>i(l)),zn((l,m)=>l===m),le(async l=>{let m=await Tt(l,t,s);return ue.fromAsset(t,m)}),Kn(l=>(console.error("subscribe fails for:",t),Ln(()=>l))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=ue.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};import{multiloc as me}from"@galacticcouncil/xc-core";import{Binary as $n,Enum as Ft}from"polkadot-api";var de=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=$n.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=me.findPalletInstance(e),n=me.findGeneralIndex(e);return{parents:0,interior:Ft("X2",[Ft("PalletInstance",Number(s)),Ft("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as qn,Wormhole as Xn}from"@galacticcouncil/xc-core";import{Transaction as Jn}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as Gn}from"@mysten/sui/utils";import{toBase64 as Yn}from"@mysten/bcs";import{encoding as Zn,serialize as ts,toChainId as es}from"@wormhole-foundation/sdk-connect";import{deserialize as ns}from"@wormhole-foundation/sdk-definitions";import{getPackageId as ge}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as ss}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as Qn}from"@mysten/bcs";function ht(u,t={}){let e=u.inputs??[],s=u.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),i=l=>{let m=Qn(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return i(m.Pure.bytes);let d=m.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=m.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},c=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?o(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return l})}var pe=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Xn.fromChain(this.#t),n=this.#t.client,a=Zn.b64.decode(e),r=ns("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await ss(n,o,r.payload.token.address.toUint8Array(),es(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([ge(n,i),ge(n,o)]),d=new Jn;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",ts(r)),d.object(Gn)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[c]});let v=await d.build({client:n}),C=await d.toJSON(),y=ht(JSON.parse(C));return{from:t,commands:y,data:Yn(v),type:qn.Sui}}};import{AssetAmount as is,CallType as os}from"@galacticcouncil/xc-core";import{toBase64 as cs}from"@mysten/bcs";import{distinctUntilChanged as us,finalize as ls,shareReplay as ms,Subject as ds}from"rxjs";var yt=class{client;config;constructor(t,e){this.validateClient(t),this.validateConfig(e),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No client found")}validateConfig(t){if(!t.address)throw new Error("Sui address is required")}};import{SUI_TYPE_ARG as as}from"@mysten/sui/utils";var rs=9,Ct=class extends yt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:as});return BigInt(e.totalBalance)}async getDecimals(){return rs}};var At=class{static get(t,e){switch(e.module){case"Native":return new Ct(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var bt=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=await a.toJSON(),o=ht(JSON.parse(i));return{from:t,commands:o,data:cs(r),type:os.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),l=BigInt(o.storageCost),m=c+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=At.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return is.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new ds,n=s.pipe(ms(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe(ls(()=>r?.()),us((i,o)=>i.amount===o.amount))}};import{Ed25519Keypair as gs}from"@mysten/sui/keypairs/ed25519";import{Transaction as ps}from"@mysten/sui/transactions";var fe=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof gs){let o=ps.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var O=class{platform={};constructor(t){switch(t.getType()){case $.EvmChain:this.registerEvm(t);break;case $.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case $.Parachain:this.registerSubstrate(t);break;case $.SolanaChain:this.registerSolana(t);break;case $.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new at(e)}registerSolana(t){let e=t;this.platform.Solana=new ut(e)}registerSui(t){let e=t;this.platform.Sui=new bt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new ft(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};import{addr as bs,AssetAmount as Dt,Parachain as ws}from"@galacticcouncil/xc-core";import{acc as vs,big as be}from"@galacticcouncil/common";import{big as fs}from"@galacticcouncil/common";import Q from"big.js";function he(u,t,e,s){let n=u.toBig().minus(e.toBig()).minus(u.isSame(t)?t.toBig():new Q(0));return s&&(n=n.minus(u.isSame(s)?s.toBig():new Q(0))),u.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function ye(u,t,e,s){let a=u.copyWith({amount:0n}).toBig().plus(u.isSame(t)?t.toBig():new Q(0)).plus(u.toBig().lt(e.toBig())?e.toBig():new Q(0));return s&&(a=a.plus(u.isSame(s)&&u.toBig().lt(s.toBig())?s.toBig():new Q(0))),u.copyWith({amount:BigInt(a.toFixed())})}async function F(u,t){return t.isEvmParachain()?t.getDerivatedAddress(u):u}function Ce(u,t){return t?fs.toBigInt(t,u):0n}import{addr as hs,AssetAmount as ys,Parachain as Ae}from"@galacticcouncil/xc-core";import{big as Cs}from"@galacticcouncil/common";var{EvmAddr:As}=hs,W=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof Ae)return(await P.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=As.isValid(r.toString())?await F(t,e):t,o=s.source.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=s.min;if(t instanceof Ae&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}return this.getAssetMin()}async getAssetMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=t.getAssetMin(n),r=await this.getDecimals(n),i=0n;return a&&(i=Cs.toBigInt(a,r)),ys.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:we}=bs,q=class extends W{constructor(t,e){super(t,e)}async getCall(t){let{amount:e,sender:s,source:n}=t,a=await this.getTransfer(t);return this.adapter.buildCall(s,e,n.feeBalance,a)}async getDestinationFee(){let{chain:t,route:e}=this.config,{source:s,destination:n,transact:a}=e,r=n.fee.amount,i=s.destinationFee.asset||n.fee.asset,o=await this.getDecimals(i);if(Number.isFinite(r))return{fee:Dt.fromAsset(i,{amount:be.toBigInt(r,o),decimals:o}),feeBreakdown:{}};let c=r,{amount:l,breakdown:m}=await c.build({feeAsset:i,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:Dt.fromAsset(i,{amount:l,decimals:o}),feeBreakdown:m}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=we.isValid(o.toString())?await F(t,e):t,l=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await F(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:l}=s.source,m=l?Ce(c.decimals,l.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=we.isValid(r.toString())?await F(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof ws&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:l,asset:m,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,l,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||r||i;if(o)return o.build({...t});throw new Error("AssetRoute transfer config is invalid! Specify contract, extrinsic, move or program instructions.")}async getTransact(t){let{route:e}=this.config,{transact:s}=e;if(s){let n=Object.assign({transact:{chain:s.chain}}),a={...t,...n};return{...await this.getTransactData(s,a),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,a=await n.build(e),r=await P.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,l=vs.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await i.getPaymentInfo(l),d=await i.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=be.toBigInt(e.amount,s);return Dt.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){let{chain:s}=this.config,{fee:n}=t,a=n.balance.build({address:e.sender,asset:n.asset,chain:s});return this.adapter.getBalance(n.asset,a)}};var X=class extends W{constructor(t,e){super(t,e)}};import{AssetAmount as xs}from"@galacticcouncil/xc-core";var J=class{ctx;constructor(t){this.ctx=t}get asset(){let{source:t}=this.ctx;return t.balance}get dex(){let{source:t}=this.ctx;return t.chain.dex}get destFee(){let{source:t,transact:e}=this.ctx;return e?e.fee:t.destinationFee}get destFeeBalance(){let{source:t,transact:e}=this.ctx;return e?e.feeBalance:t.destinationFeeBalance}get feeBalance(){let{source:t}=this.ctx;return t.feeBalance}async getSwap(t){let{asset:e,decimals:s}=await this.dex.chain.getCurrency(),{amount:n}=await this.dex.getQuote(e,t,t);return{aIn:t,aOut:xs.fromAsset(e,{amount:n,decimals:s}),enabled:!0}}isSwapSupported(t){try{this.dex}catch{return!1}return!!(t&&t.swap)}async getDestinationSwap(t){let{amount:e,route:s}=await this.dex.getQuote(t,this.destFee,this.destFee),n=this.destFeeBalance.amount<this.destFee.amount,a=this.feeBalance.amount-t.amount>e*2n;return{aIn:t.copyWith({amount:e}),aOut:this.destFee,enabled:n&&a,route:s}}isDestinationSwapSupported(t){try{this.dex}catch{return!1}let e=!t.isSame(this.destFee),s=this.asset.isSame(this.destFee);return e&&!s}};var{EvmAddr:Fs}=Ps,Rt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Ts(this.config).assets().asset(t).source(s).destination(a).build();return this.getTransferData(r,e,n)}async remoteXcm(t,e,s,n,a={}){let r=this.config.getChain(e),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([P.create(r),P.create(i)]),m=new pt(c,l),d=Ss.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let h=f.toDecimal();return p.buildCall(h)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new O(n.chain),i=new O(a.chain),o=new q(r,n),c=new X(i,a),l=new Bs(...this.validations),[m,d,g,p,f,h,v]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:C,destination:y}=n.route,x=g.fee.copyWith(y.fee.asset),B=g.feeBreakdown,j=C.asset.isEqual(x)&&x.amount>10n?x.amount+1n:10n,A={address:s,amount:j,asset:C.asset,destination:{balance:h,chain:a.chain,fee:x,feeBreakdown:B},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};A.transact=await o.getTransact(A);let T=new J(A),b=await o.getFee(A),E;T.isSwapSupported(C.fee)&&(E=await T.getSwap(b),A.source.feeSwap=E);let I;T.isDestinationSwapSupported(b)&&(I=await T.getDestinationSwap(b),A.source.destinationFeeSwap=I),(E||I)&&(b=await o.getFee(A),b=b.padByPct(5n));let G=await c.getEd(),vt=ye(h,x,v,G),w=await o.getEd(),Y=he(m,b,f,w);return A.amount=0n,A.source.fee=b,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:I,fee:b,feeBalance:d,feeSwap:E,max:Y,min:m.copyWith({amount:vt.amount})},destination:{balance:h,fee:x},async buildCall(R){let S=Object.assign({},A);return S.amount=ve.toBigInt(R,m.decimals),S.transact=await o.getTransact(S),o.getCall(S)},async estimateFee(R){let S=Object.assign({},A);return S.amount=ve.toBigInt(R,m.decimals),S.transact=await o.getTransact(S),o.getFee(S)},async validate(R){let S=Object.assign({},A),Te=R||b.amount;return S.source.fee=b.copyWith({amount:Te}),l.validate(S)}}}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new O(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:l,balance:m}=c,d=n.chain.getBalanceAssetId(l),g=Fs.isValid(d.toString())?await F(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),i=await Promise.all(r);return Es(i).pipe(Is(500)).subscribe(s)}};import{ConfigBuilder as Ds}from"@galacticcouncil/xc-core";function Rs(u){let t=Ds(u.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return u.getTransferData(h,d,g)}}}}}}}}}import{Precompile as ks}from"@galacticcouncil/xc-core";var Os="https://api.wormholescan.io",wt=class{_baseUrl;constructor(t){this._baseUrl=t||Os}buildApi(t,e){return[this._baseUrl,t,"?"].join("")+new URLSearchParams(e).toString()}async getVaaBytes(t){let e=this.buildApi("/v1/signed_vaa/"+t,{});return await(await fetch(e)).json()}async getVaa(t){let e=this.buildApi("/api/v1/vaas/"+t,{});return(await(await fetch(e)).json()).data}async getVaaByTxHash(t){let e=this.buildApi("/api/v1/vaas/",{txHash:t}),n=await(await fetch(e)).json();if(n.data.length>0)return n.data[0];throw Error("Can't find VAA for given txHash: "+t)}async getOperations(t){let e=this.buildApi("/api/v1/operations/",t);return(await(await fetch(e)).json()).operations}async getOperation(t){let e=this.buildApi("/api/v1/operations/"+t,{});return await(await fetch(e)).json()}isMrlTransfer(t){let{payloadType:e,toAddress:s,toChain:n}=t,a="0x"+s.substring(26);return e===3&&n===16&&a===ks.Bridge}};import{acc as Vs}from"@galacticcouncil/common";import{mrl as _s,ChainType as Se,Parachain as Ms,Precompile as Ns,Wormhole as U}from"@galacticcouncil/xc-core";import{encoding as Ws}from"@wormhole-foundation/sdk-base";import{keccak256 as Us}from"@wormhole-foundation/sdk-connect";import{deserialize as js}from"@wormhole-foundation/sdk-definitions";var xe=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(xe||{});var Ks=300*1e3,Pe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new wt}get chains(){let t=this.config.chains.values();return Array.from(t)}get filters(){let t=new Date,e=new Date;e.setDate(t.getDate()-6);let s=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:s}}async getWithdraws(t){let e=Vs.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof Ms&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>U.isKnown(f)&&U.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),h=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case Se.EvmChain:let v=new Z(g);p=async y=>v.redeem(y,h);break;case Se.SolanaChain:let C=new dt(g);p=async y=>C.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:Ns.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await _s.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:l}=c,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:l,sourceChain:m}=c,{payload:d,standarizedProperties:g}=l,p=this.getStatus(c),{tokenAddress:f}=g,h=this.chains.find(y=>U.isKnown(y)&&U.fromChain(y).getWormholeId()===d.tokenChain),v=this.chains.find(y=>U.isKnown(y)&&U.fromChain(y).getWormholeId()===d.toChain),C;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),x=c.vaa.raw;if(this.isStuck(y)){let B=new gt(v);C=async D=>B.redeemMrlViaXcm(D,x)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:C,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+Ks}getVaaHeader(t){let e=Ws.b64.decode(t),s=js("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Us(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Nt as DISPATCH_ADDRESS,Z as EvmClaim,at as EvmPlatform,Wt as EvmSigner,J as FeeSwap,O as PlatformAdapter,dt as SolanaClaim,M as SolanaLilJit,ut as SolanaPlatform,te as SolanaSigner,gt as SubstrateClaim,pt as SubstrateExec,ft as SubstratePlatform,P as SubstrateService,de as SubstrateSigner,pe as SuiClaim,bt as SuiPlatform,fe as SuiSigner,Rs as TransferBuilder,Rt as Wallet,xe as WhStatus,wt as WormholeScan,Pe as WormholeTransfer,$t as chunkBySize,yr as deserializeV0,k as ixToHuman,H as serializeV0};
@@ -1,3 +1,8 @@
1
1
  import { ContractConfig } from '@galacticcouncil/xc-core';
2
+ export declare function isSnowbridgeV2(config: ContractConfig): boolean;
3
+ /**
4
+ * Extract the ERC20 token address from Snowbridge V2 assets arg.
5
+ s */
6
+ export declare function getSnowbridgeV2TokenAddress(config: ContractConfig): string | undefined;
2
7
  export declare function isNativeEthBridge(config: ContractConfig): boolean;
3
8
  export declare function isPrecompile(config: ContractConfig): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/xc-sdk",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-pr297-1d367d1",
4
4
  "description": "Cross-chain sdk",
5
5
  "author": "GalacticCouncil",
6
6
  "type": "module",
@@ -33,6 +33,6 @@
33
33
  "link": "npm ln"
34
34
  },
35
35
  "dependencies": {
36
- "@galacticcouncil/xc-core": "^0.15.0"
36
+ "@galacticcouncil/xc-core": "0.16.0-pr297-1d367d1"
37
37
  }
38
38
  }