@galacticcouncil/xc-sdk 1.0.0 → 1.1.0-pr297-8b9bc60

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 bn=Object.create;var Ft=Object.defineProperty;var wn=Object.getOwnPropertyDescriptor;var vn=Object.getOwnPropertyNames;var xn=Object.getPrototypeOf,Sn=Object.prototype.hasOwnProperty;var Pn=(l,t)=>{for(var e in t)Ft(l,e,{get:t[e],enumerable:!0})},we=(l,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of vn(t))!Sn.call(l,n)&&n!==e&&Ft(l,n,{get:()=>t[n],enumerable:!(s=wn(t,n))||s.enumerable});return l};var Tn=(l,t,e)=>(e=l!=null?bn(xn(l)):{},we(t||!l||!l.__esModule?Ft(e,"default",{value:l,enumerable:!0}):e,l)),Bn=l=>we(Ft({},"__esModule",{value:!0}),l);var Wn={};Pn(Wn,{DISPATCH_ADDRESS:()=>re,EvmClaim:()=>ut,EvmPlatform:()=>dt,EvmSigner:()=>oe,FeeSwap:()=>it,PlatformAdapter:()=>K,SolanaClaim:()=>ht,SolanaLilJit:()=>Q,SolanaPlatform:()=>pt,SolanaSigner:()=>ue,SubstrateClaim:()=>yt,SubstrateExec:()=>At,SubstratePlatform:()=>wt,SubstrateService:()=>T,SubstrateSigner:()=>fe,SuiClaim:()=>ye,SuiPlatform:()=>vt,SuiSigner:()=>Ce,TransferBuilder:()=>gn,Wallet:()=>ee,WhStatus:()=>Ae,WormholeScan:()=>Bt,WormholeTransfer:()=>be,chunkBySize:()=>ie,deserializeV0:()=>Dn,ixToHuman:()=>M,serializeV0:()=>tt});module.exports=Bn(Wn);var Tt=require("@galacticcouncil/common"),ct=require("@galacticcouncil/xc-core"),ne=require("rxjs");var at=require("@galacticcouncil/xc-core");var Dt=require("@galacticcouncil/xc-core"),ve=require("viem"),ae=require("@wormhole-foundation/sdk-base"),ut=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Dt.Wormhole.fromChain(this.#t),n=ae.encoding.b64.decode(e),a=ae.encoding.hex.encode(n),r=Dt.Abi.TokenBridge,o=(0,ve.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,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 xe=require("@galacticcouncil/xc-core");var Rt=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 kt=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 Ot=class{static get(t,e){switch(e.module){case"Erc20":return new Rt(t,e);case"Native":return new kt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var _t=require("viem"),Vt=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!
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(),o=await this.getNonce(t);try{let{results:i}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[c]=i;return c}catch(i){return console.log(`Can't simulate call!
3
- `,i.details),{error:i}}}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 Vt(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:o,calldata:i}=a,c={abi:JSON.stringify(r),data:i,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,o),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:o,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=Ot.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 i=async()=>{let u=await this.getBalance(t,e);s.next(u)};await i();let c=a.watchBlocks({onBlock:()=>i()});return()=>c()},o;return r().then(i=>o=i),n.pipe((0,_.finalize)(()=>o?.()),(0,_.distinctUntilChanged)((i,c)=>i.amount===c.amount))}};var Be=require("@galacticcouncil/xc-core"),Ee=require("@galacticcouncil/common"),Ie=require("polkadot-api"),re="0x0000000000000000000000000000000000000401",{H160:En}=Ee.h160,oe=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=En.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Be.EvmParachain)try{let o=this.#t.client,i=Ie.Binary.fromHex(t.data);await o.getUnsafeApi().txFromCallData(i),a=!0}catch{}let r;if(a){let[o,i]=await Promise.all([n.estimateGas({account:s,data:t.data,to:re}),n.getGasPrice()]),c=i+i/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:o*11n/10n,to:re})}else{let{data:o,to:i,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:i,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};var Kt=require("@galacticcouncil/xc-core"),_e=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 In=9,Mt=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 In}};var Nt=require("@wormhole-foundation/sdk-solana");var Wt=class extends Z{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Nt.SolanaAddress(t).unwrap(),n=new Nt.SolanaAddress(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:o})=>{let i=o.data.parsed.info.tokenAmount;return r+=BigInt(i.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new Nt.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Ut=class{static get(t,e){switch(e.module){case"Native":return new Mt(t,e);case"Token":return new Wt(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,Fn=25e4,jt=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,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[D.ComputeBudgetProgram.setComputeUnitLimit({units:r}),D.ComputeBudgetProgram.setComputeUnitPrice({microLamports:o})]}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):Fn}async determinePriorityFee(t,e=De,s=Re,n=ke,a=Oe){let r=n,o=await this.getTxAccounts(t),i=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(i){let c=i.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 jt(t,e)}};var Ve=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 Dn(l){let t=Buffer.from(l,"hex"),e=Uint8Array.from(t);return Ve.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),o=r.serialize(),i=Me.Buffer.from(o).toString("hex");return{from:t,data:i,ix:M(n.instructions),signers:n.signers,type:Kt.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),o=await a.getPriorityMessage(t),{accounts:i}=await a.simulateTransaction(t,o),u=(i&&i[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=Ut.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Kt.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 o=async()=>{let u=await this.getBalance(t,e);s.next(u)};await o();let i=new _e.PublicKey(e.address),c=this.#t.onAccountChange(i,()=>o());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(o=>r=o),n.pipe((0,N.finalize)(()=>r?.()),(0,N.distinctUntilChanged)((o,i)=>o.amount===i.amount))}};var q=require("@galacticcouncil/xc-core"),S=require("@solana/web3.js"),y=require("@solana/spl-token"),Ne=require("@wormhole-foundation/sdk-solana"),ce=require("@wormhole-foundation/sdk-solana-core"),We=require("@wormhole-foundation/sdk-base"),le=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,le.deserialize)("TokenBridge:Transfer",a),o=(0,le.deserialize)("Uint8Array",a),i=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(i)){let h=S.Keypair.generate(),E=await ce.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,o,h.publicKey),k=ie(E,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:[h],type:q.CallType.Solana})}let L=ce.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,o,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,o){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,o]),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),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),i=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:i,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,o),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"),zt=require("buffer");var ue=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:o}=await r.signAndSendTransaction(a);e.onTransactionSend(o);let i=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(i)}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(i=>i.sign([this.#e])),n=s.map(i=>zt.Buffer.from(i.serialize()).toString("base64"));else{let i=this.#e;await i.connect(),n=(await i.signAllTransactions(s)).map(u=>zt.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 o=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(o.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=zt.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"),Ue=require("viem"),Ht=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,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),o=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:Ht.Binary.fromHex(a.to)},value:[0n,0n,0n,0n],input:Ht.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Ht.Binary.toHex(o),from:t,type:W.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var $t=require("@galacticcouncil/xc-core"),Ct=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 Lt=require("@galacticcouncil/common");function Rn(l){return{parents:0,interior:{type:"X1",value:l.startsWith("0x")?Lt.xcm.toAccountKey20(l):Lt.xcm.toAccountId32(l)}}}function He(l){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:l.parachainId}}}}}var kn=(l,t)=>({id:Lt.xcm.transform(l),fun:{type:"Fungible",value:t}}),Le=(l,t,e,s,n,a)=>{console.log(a);let r=Rn(l),o=kn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[o]},{type:"BuyExecution",value:{fees:o,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 At=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,o=await this.#t.getAsset(),i=this.#e.api,c=this.#e.chain,u=await c.getCurrency(),m=u.asset,d=u.decimals,g=c.getAssetXcmLocation(m),p=Ct.Binary.fromHex(s.data),C=await(await i.txFromCallData(p)).getPaymentInfo(e),P=BigInt(C.partial_fee)*120n/100n,A=$t.AssetAmount.fromAsset(m,{amount:P,decimals:d}),h=C.weight.ref_time,E=C.weight.proof_size,k=He(c),L=Le(e,g,A,h,E,p),lt=r.tx.PolkadotXcm.send({dest:k,message:L}),b=[];try{let x=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,m,A,10),It=Ct.Binary.fromHex(x),$=await r.txFromCallData(It);b.push($)}catch{}let F=await n(A),w=Ct.Binary.fromHex(F.data),O=await r.txFromCallData(w);b.push(O),b.push(lt);let V=b.map(x=>x.decodedCall),Et=r.tx.Utility.batch_all({calls:V}),se=await Et.getEncodedData();return{from:t,data:Ct.Binary.toHex(se),type:$t.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let x=await this.#t.dryRun(t,Et);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"),Qe=require("polkadot-api"),B=require("rxjs");var U=require("@galacticcouncil/xc-core"),Qt=require("@galacticcouncil/common"),qt=require("@polkadot-api/substrate-bindings"),bt=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),o=u=>new TextEncoder().encode(u),i=new Uint8Array([...o(this.chain.parachainId.toString()),...(0,bt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,bt.fromHex)(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),c=(0,qt.Blake2256)(i);return(0,bt.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: "+Qt.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"),o=U.multiloc.findParachain(a);if(U.multiloc.findGlobalConsensus(a))return t;if(o){let c=Qt.acc.getSovereignAccounts(o);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 wt=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,o=await this.useSignerFee(s)?{asset:new J.Asset(s)}:void 0,i=n.getTx(a.client),c=n.module+"."+n.func,u=await i.getEncodedData();return{from:t,data:Qe.Binary.toHex(u),type:J.CallType.Substrate,txOptions:o,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),o=await a.estimateDeliveryFee(t,n),i=await this.exchangeFee(r+o,s),c=await de(i,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return(0,B.firstValueFrom)(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:o}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe((0,B.map)(({value:u})=>u)).pipe((0,B.concatMap)(u=>o(u)),(0,B.distinctUntilChanged)((u,m)=>u===m),(0,B.concatMap)(async u=>{let m=await de(u,t,s);return J.AssetAmount.fromAsset(t,m)}),(0,B.catchError)(u=>(console.error("subscribe fails for:",t),(0,B.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,o=J.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!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(o=>{o.signSubmitAndWatch(this.#e,r).subscribe({next:i=>{i.type==="broadcasted"&&e.onTransactionSend(i.txHash),i.type==="finalized"&&e.onFinalized(i)},error:i=>{e.onError(i)}})})}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 Jt=require("@galacticcouncil/xc-core"),Xe=require("@mysten/sui/transactions"),Je=require("@mysten/sui/utils"),Ge=require("@mysten/bcs"),st=require("@wormhole-foundation/sdk-connect"),Ye=require("@wormhole-foundation/sdk-definitions"),he=require("@wormhole-foundation/sdk-sui"),Ze=require("@wormhole-foundation/sdk-sui-tokenbridge");var qe=require("@mysten/bcs");function Xt(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(),o=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)}},i=u=>{let m=e[u];if(!m)return{Input:u};if(m.Pure?.bytes)return o(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"?i(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=Jt.Wormhole.fromChain(this.#t),n=this.#t.client,a=st.encoding.b64.decode(e),r=(0,Ye.deserialize)("TokenBridge:Transfer",a),o=s.getCoreBridge(),i=s.getTokenBridge(),c=await(0,Ze.getTokenCoinType)(n,i,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,o),(0,he.getPackageId)(n,i)]),d=new Xe.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${u}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",(0,st.serialize)(r)),d.object(Je.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(i),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(i),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=Xt(JSON.parse(A));return{from:t,commands:h,data:(0,Ge.toBase64)(P),type:Jt.CallType.Sui}}};var te=require("@galacticcouncil/xc-core"),en=require("@mysten/bcs"),j=require("rxjs");var Gt=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 tn=require("@mysten/sui/utils");var On=9,Yt=class extends Gt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:tn.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return On}};var Zt=class{static get(t,e){switch(e.module){case"Native":return new Yt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var vt=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}),o=await a.toJSON(),i=Xt(JSON.parse(o));return{from:t,commands:i,data:(0,en.toBase64)(r),type:te.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}),i=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(i.computationCost),u=BigInt(i.storageCost),m=c+u;return s.copyWith({amount:m})}async getBalance(t,e){let s=Zt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return te.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 i=setInterval(()=>{},3e3);return()=>clearInterval(i)},r;return a().then(o=>r=o),n.pipe((0,j.finalize)(()=>r?.()),(0,j.distinctUntilChanged)((o,i)=>o.amount===i.amount))}};var nn=require("@mysten/sui/keypairs/ed25519"),sn=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 nn.Ed25519Keypair){let i=sn.Transaction.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:i,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"}),o=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(o.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 vt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new wt(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"),xt=require("@galacticcouncil/common");var an=require("@galacticcouncil/common"),rt=Tn(require("big.js"),1);function rn(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 on(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 cn(l,t){return t?an.big.toBigInt(t,l):0n}var G=require("@galacticcouncil/xc-core"),ln=require("@galacticcouncil/common");var{EvmAddr:Vn}=G.addr,ot=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),o=Vn.isValid(r.toString())?await z(t,e):t,i=s.source.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}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),o=a.build({asset:r});return this.adapter.getBalance(n,o)}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),o=0n;return a&&(o=ln.big.toBigInt(a,r)),G.AssetAmount.fromAsset(n,{amount:o,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:un}=H.addr,St=class extends ot{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,o=s.destinationFee.asset||n.fee.asset,i=await this.getDecimals(o);if(Number.isFinite(r))return{fee:H.AssetAmount.fromAsset(o,{amount:xt.big.toBigInt(r,i),decimals:i}),feeBreakdown:{}};let c=r,{amount:u,breakdown:m}=await c.build({feeAsset:o,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:H.AssetAmount.fromAsset(o,{amount:u,decimals:i}),feeBreakdown:m}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,o=n.destinationFee.asset||a.fee.asset;if(r.isEqual(o))return this.getBalance(t);let i=e.getBalanceAssetId(o),c=un.isValid(i.toString())?await z(t,e):t,u=n.destinationFee.balance.build({address:c,asset:o,chain:e});return this.adapter.getBalance(o,u)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),i=s.contract?await z(a,e):a,c=await this.adapter.estimateFee(i,n,r.feeBalance,o),{fee:u}=s.source,m=u?cn(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),o=un.isValid(r.toString())?await z(t,e):t,i=n.fee.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let o=a.asset;return e instanceof H.Parachain&&"build"in o?await o.build({chain:e,address:t}):o}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:o}=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 i=n||r||o;if(i)return i.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),o=a.getTx(r.client),i=e.source.chain,c=e.sender,u=xt.acc.getMultilocationDerivatedAccount(i.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await o.getPaymentInfo(u),d=await o.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=xt.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 Pt=class extends ot{constructor(t,e){super(t,e)}};var mn=require("@galacticcouncil/xc-core"),it=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:mn.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,ee=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),o=this.config.getChain(s);if(!(r.isSubstrate()&&o.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,u]=await Promise.all([T.create(r),T.create(o)]),m=new At(c,u),d=Tt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,o.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),o=new K(a.chain),i=new St(r,n),c=new Pt(o,a),u=new ct.TransferValidator(...this.validations),[m,d,g,p,f,C,P]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),c.getBalance(s),c.getMin()]),{source:A,destination:h}=n.route,E=g.fee.copyWith(h.fee.asset),k=g.feeBreakdown,lt=A.asset.isEqual(E)&&E.amount>10n?E.amount+1n:10n,b={address:s,amount:lt,asset:A.asset,destination:{balance:C,chain:a.chain,fee:E,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 i.getTransact(b);let F=new it(b),w=await i.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 i.getFee(b),w=w.padByPct(5n));let Et=await c.getEd(),se=on(C,E,P,Et),x=await i.getEd(),It=rn(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:It,min:m.copyWith({amount:se.amount})},destination:{balance:C,fee:E},async buildCall($){let I=Object.assign({},b);return I.amount=Tt.big.toBigInt($,m.decimals),I.transact=await i.getTransact(I),i.getCall(I)},async estimateFee($){let I=Object.assign({},b);return I.amount=Tt.big.toBigInt($,m.decimals),I.transact=await i.getTransact(I),i.getFee(I)},async validate($){let I=Object.assign({},b),An=$||w.amount;return I.source.fee=w.copyWith({amount:An}),u.validate(I)}}}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)}),o=await Promise.all(r);return(0,ne.combineLatest)(o).pipe((0,ne.debounceTime)(500)).subscribe(s)}};var dn=require("@galacticcouncil/xc-core");function gn(l){let t=(0,dn.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:o,destinationAssets:i,isAssetSelect:c,isTagSelect:u,build:m}=a.destination(r);return{routes:o,destinationAssets:i,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 pn=require("@galacticcouncil/xc-core"),Mn="https://api.wormholescan.io",Bt=class{_baseUrl;constructor(t){this._baseUrl=t||Mn}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===pn.Precompile.Bridge}};var fn=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),hn=require("@wormhole-foundation/sdk-base"),yn=require("@wormhole-foundation/sdk-connect"),Cn=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 Nn=300*1e3,be=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new Bt}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=fn.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:o,standarizedProperties:i}=r,c=this.getStatus(a),u=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=i,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===o.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,o=(await v.mrl.createPayload(a,t)).toHex(),i=s.filter(c=>{let{content:u}=c,{payload:m}=u;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===o}).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),E=c.vaa.raw;if(this.isStuck(h)){let k=new yt(P);A=async L=>k.redeemMrlViaXcm(L,E)}}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(i)}isStuck(t){return Date.now()>=t*1e3+Nn}getVaaHeader(t){let e=hn.encoding.b64.decode(t),s=(0,Cn.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,yn.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});
1
+ "use strict";var Fn=Object.create;var kt=Object.defineProperty;var Dn=Object.getOwnPropertyDescriptor;var Rn=Object.getOwnPropertyNames;var kn=Object.getPrototypeOf,_n=Object.prototype.hasOwnProperty;var Vn=(c,t)=>{for(var e in t)kt(c,e,{get:t[e],enumerable:!0})},Pe=(c,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Rn(t))!_n.call(c,n)&&n!==e&&kt(c,n,{get:()=>t[n],enumerable:!(s=Dn(t,n))||s.enumerable});return c};var On=(c,t,e)=>(e=c!=null?Fn(kn(c)):{},Pe(t||!c||!c.__esModule?kt(e,"default",{value:c,enumerable:!0}):e,c)),Mn=c=>Pe(kt({},"__esModule",{value:!0}),c);var Jn={};Vn(Jn,{DISPATCH_ADDRESS:()=>le,EvmClaim:()=>dt,EvmPlatform:()=>pt,EvmSigner:()=>me,FeeSwap:()=>ut,PlatformAdapter:()=>L,SolanaClaim:()=>Ct,SolanaLilJit:()=>q,SolanaPlatform:()=>ht,SolanaSigner:()=>fe,SubstrateClaim:()=>At,SubstrateExec:()=>wt,SubstratePlatform:()=>St,SubstrateService:()=>E,SubstrateSigner:()=>be,SuiClaim:()=>ve,SuiPlatform:()=>xt,SuiSigner:()=>Se,TransferBuilder:()=>xn,Wallet:()=>ae,WhStatus:()=>xe,WormholeScan:()=>It,WormholeTransfer:()=>Te,chunkBySize:()=>de,deserializeV0:()=>jn,ixToHuman:()=>N,serializeV0:()=>nt});module.exports=Mn(Jn);var Et=require("@galacticcouncil/common"),lt=require("@galacticcouncil/xc-core"),re=require("rxjs");var ot=require("@galacticcouncil/xc-core");var _t=require("@galacticcouncil/xc-core"),Be=require("viem"),ce=require("@wormhole-foundation/sdk-base"),dt=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=_t.Wormhole.fromChain(this.#t),n=ce.encoding.b64.decode(e),a=ce.encoding.hex.encode(n),r=_t.Abi.TokenBridge,o=(0,Be.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,from:t,to:s.getTokenBridge()}}};var _=require("@galacticcouncil/xc-core"),W=require("rxjs");var tt=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 Ee=require("@galacticcouncil/xc-core");var Vt=class extends tt{erc20;constructor(t,e){super(t,e),this.erc20=new Ee.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 Ot=class extends tt{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 Mt=class{static get(t,e){switch(e.module){case"Erc20":return new Vt(t,e);case"Native":return new Ot(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Nt=require("viem"),Wt=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 Nt.ContractFunctionExecutionError?console.log(`Can't estimate fees!
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(),o=await this.getNonce(t);try{let{results:i}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[u]=i;return u}catch(i){return console.log(`Can't simulate call!
3
+ `,i.details),{error:i}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Nt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var gt=class{static get(t,e){return new Wt(t,e)}};var Ie=require("@galacticcouncil/xc-core"),Fe=require("viem");function ue(c){return c.module==="Snowbridge"&&c.func==="v2_sendMessage"}function De(c){if(!ue(c))return;let t=c.args[1];if(!t||t.length===0)return;let[e,s]=(0,Fe.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Re(c){let t=c.module==="Snowbridge"&&c.func==="v2_sendMessage"&&Array.isArray(c.args[1])&&c.args[1].length===0;return c.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(c.func)||t}function ke(c){return Object.entries(Ie.Precompile).map(([e,s])=>s).includes(c.address)}var pt=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=gt.get(this.#t,n),{abi:r,asset:o,calldata:i}=a,u={abi:JSON.stringify(r),data:i,from:t,to:n.address,type:_.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(ke(n)||Re(n))return u;let l=ue(n)?De(n):o,m=new _.Erc20Client(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return u;let g=m.approve(n.address,e);return{abi:JSON.stringify(_.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:_.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await gt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=Mt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return _.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new W.Subject,n=s.pipe((0,W.shareReplay)(1)),a=this.#t.getProvider(),r=async()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let u=a.watchBlocks({onBlock:()=>i()});return()=>u()},o;return r().then(i=>o=i),n.pipe((0,W.finalize)(()=>o?.()),(0,W.distinctUntilChanged)((i,u)=>i.amount===u.amount))}};var _e=require("@galacticcouncil/xc-core"),Ve=require("@galacticcouncil/common"),Oe=require("polkadot-api"),le="0x0000000000000000000000000000000000000401",{H160:Wn}=Ve.h160,me=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Wn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof _e.EvmParachain)try{let o=this.#t.client,i=Oe.Binary.fromHex(t.data);await o.getUnsafeApi().txFromCallData(i),a=!0}catch{}let r;if(a){let[o,i]=await Promise.all([n.estimateGas({account:s,data:t.data,to:le}),n.getGasPrice()]),u=i+i/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:u,maxFeePerGas:u,gas:o*11n/10n,to:le})}else{let{data:o,to:i,value:u}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:i,value:u})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};var zt=require("@galacticcouncil/xc-core"),He=require("@solana/web3.js"),Le=require("buffer"),U=require("rxjs");var et=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 Me=require("@wormhole-foundation/sdk-solana");var Nn=9,Ut=class extends et{async getBalance(){let{address:t}=this.config,e=new Me.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Nn}};var jt=require("@wormhole-foundation/sdk-solana");var Kt=class extends et{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new jt.SolanaAddress(t).unwrap(),n=new jt.SolanaAddress(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:o})=>{let i=o.data.parsed.info.tokenAmount;return r+=BigInt(i.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new jt.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Ht=class{static get(t,e){switch(e.module){case"Native":return new Ut(t,e);case"Token":return new Kt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var R=require("@solana/web3.js"),We=.5,Ne=2,Ue=1,je=1e6,Un=25e4,Lt=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 R.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new R.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=We,s=Ne,n=Ue,a=je){let[r,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[R.ComputeBudgetProgram.setComputeUnitLimit({units:r}),R.ComputeBudgetProgram.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new R.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new R.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):Un}async determinePriorityFee(t,e=We,s=Ne,n=Ue,a=je){let r=n,o=await this.getTxAccounts(t),i=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(i){let u=i.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(u.length*e);if(u.length>l){let d=u[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 ft=class{static get(t,e){return new Lt(t,e)}};var Ke=require("@solana/web3.js");function N(c){return c.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function de(c,t=1e3){let e=[],s=[],n=0;for(let a of c){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 nt(c){let t=c.serialize();return Buffer.from(t).toString("hex")}function jn(c){let t=Buffer.from(c,"hex"),e=Uint8Array.from(t);return Ke.MessageV0.deserialize(e)}var ht=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=ft.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),i=Le.Buffer.from(o).toString("hex");return{from:t,data:i,ix:N(n.instructions),signers:n.signers,type:zt.CallType.Solana,dryRun:async()=>{let{err:u,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:u,events:l}}}}async estimateFee(t,e,s,n){let a=ft.get(this.#t,n),r=await a.estimateFee(t,e),o=await a.getPriorityMessage(t),{accounts:i}=await a.simulateTransaction(t,o),l=(i&&i[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=Ht.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 U.Subject,n=s.pipe((0,U.shareReplay)(1)),a=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let i=new He.PublicKey(e.address),u=this.#t.onAccountChange(i,()=>o());return()=>{this.#t.removeAccountChangeListener(u)}},r;return a().then(o=>r=o),n.pipe((0,U.finalize)(()=>r?.()),(0,U.distinctUntilChanged)((o,i)=>o.amount===i.amount))}};var X=require("@galacticcouncil/xc-core"),T=require("@solana/web3.js"),C=require("@solana/spl-token"),ze=require("@wormhole-foundation/sdk-solana"),ge=require("@wormhole-foundation/sdk-solana-core"),Ge=require("@wormhole-foundation/sdk-base"),pe=require("@wormhole-foundation/sdk-definitions"),yt=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 Ct=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=X.Wormhole.fromChain(this.#t),a=Ge.encoding.b64.decode(e),r=(0,pe.deserialize)("TokenBridge:Transfer",a),o=(0,pe.deserialize)("Uint8Array",a),i=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),u=new T.PublicKey(t),l=s?new T.PublicKey(s):u,m=u.equals(l),d=[];if(!await this.#e.getAccountInfo(i)){let y=T.Keypair.generate(),B=await ge.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),u,o,y.publicKey),k=de(B,1e3);for(let D=0;D<k.length;D++){let w=k[D],V=await this.getV0Message(u,w),O=nt(V);d.push({from:t,data:O,ix:N(w),signers:[y],type:X.CallType.Solana})}let $=ge.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),u,o,y.publicKey),mt=await this.getV0Message(u,[$]),A=nt(mt);d.push({from:t,data:A,ix:N([$]),type:X.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new T.PublicKey(r.payload.token.address.toUint8Array()),h=p&&f.equals(C.NATIVE_MINT),P=await this.#n.getTipAccount(),b=T.SystemProgram.transfer({fromPubkey:u,toPubkey:new T.PublicKey(P[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,u,r,b);d.push(y)}else{let y=await this.redeemToken(n,u,l,f,p,r,b);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,o){let u=(a?yt.createCompleteTransferNativeInstruction:yt.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,u,o]),g=nt(d);return{from:e.toBase58(),data:g,ix:N([m,u]),type:X.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new T.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,C.getMint)(this.#e,C.NATIVE_MINT),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),i=await(0,C.getMinimumBalanceForRentExemptAccount)(this.#e),u=T.Keypair.generate(),l=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,C.NATIVE_MINT),m=(0,yt.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=T.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:u.publicKey,lamports:i,space:C.ACCOUNT_SIZE,programId:C.TOKEN_PROGRAM_ID}),g=(0,C.createInitializeAccountInstruction)(u.publicKey,C.NATIVE_MINT,e),p=(0,C.createTransferInstruction)(a,u.publicKey,e,o),f=(0,C.createCloseAccountInstruction)(u.publicKey,e,e),h=[l,m,d,g,p,f,n],P=await this.getV0Message(e,h),b=nt(P);return{from:e.toBase58(),data:b,ix:N(h),signers:[u],type:X.CallType.Solana}}derivePostedVaaKey(t,e){return ze.utils.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new T.TransactionMessage({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};var J=require("@solana/web3.js"),Gt=require("buffer");var fe=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 J.Keypair){a.sign([this.#e]);let u=await this.#t.connection.sendTransaction(a);e.onTransactionSend(u);let l=await this.#t.connection.getSignatureStatus(u);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:o}=await r.signAndSendTransaction(a);e.onTransactionSend(o);let i=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(i)}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 J.Keypair)s.forEach(i=>i.sign([this.#e])),n=s.map(i=>Gt.Buffer.from(i.serialize()).toString("base64"));else{let i=this.#e;await i.connect(),n=(await i.signAllTransactions(s)).map(l=>Gt.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 o=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(o.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Gt.Buffer.from(t,"hex"),n=Uint8Array.from(s),a=J.MessageV0.deserialize(n),r=new J.VersionedTransaction(a);return e&&r.sign(e),r}};var j=require("@galacticcouncil/xc-core"),he=require("@wormhole-foundation/sdk-base"),$e=require("viem"),$t=require("polkadot-api"),At=class{#t;constructor(t){this.#t=t,j.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=he.encoding.b64.decode(e),n=he.encoding.hex.encode(s),a=j.Abi.Gmp,r=(0,$e.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:j.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),o=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:$t.Binary.fromHex(a.to)},value:[0n,0n,0n,0n],input:$t.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:$t.Binary.toHex(o),from:t,type:j.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var qt=require("@galacticcouncil/xc-core"),bt=require("polkadot-api");var Qe=require("@galacticcouncil/common");async function ye(c,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:Qe.big.convertDecimals(c,a,n),decimals:n}}var qe=require("@galacticcouncil/common"),Xe=c=>{let t=[];for(let e of c)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)},st=c=>{let t=c.value.error;return t.type==="Module"?qe.enums.enumPath(t.value):JSON.stringify(t.value)};var Qt=require("@galacticcouncil/common");function Kn(c){return{parents:0,interior:{type:"X1",value:c.startsWith("0x")?Qt.xcm.toAccountKey20(c):Qt.xcm.toAccountId32(c)}}}function Je(c){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:c.parachainId}}}}}var Hn=(c,t)=>({id:Qt.xcm.transform(c),fun:{type:"Fungible",value:t}}),Ye=(c,t,e,s,n,a)=>{console.log(a);let r=Kn(c),o=Hn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[o]},{type:"BuyExecution",value:{fees:o,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 wt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,o=await this.#t.getAsset(),i=this.#e.api,u=this.#e.chain,l=await u.getCurrency(),m=l.asset,d=l.decimals,g=u.getAssetXcmLocation(m),p=bt.Binary.fromHex(s.data),h=await(await i.txFromCallData(p)).getPaymentInfo(e),P=BigInt(h.partial_fee)*120n/100n,b=qt.AssetAmount.fromAsset(m,{amount:P,decimals:d}),y=h.weight.ref_time,B=h.weight.proof_size,k=Je(u),$=Ye(e,g,b,y,B,p),mt=r.tx.PolkadotXcm.send({dest:k,message:$}),A=[];try{let x=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,m,b,10),Dt=bt.Binary.fromHex(x),Q=await r.txFromCallData(Dt);A.push(Q)}catch{}let D=await n(b),w=bt.Binary.fromHex(D.data),V=await r.txFromCallData(w);A.push(V),A.push(mt);let O=A.map(x=>x.decodedCall),Ft=r.tx.Utility.batch_all({calls:O}),oe=await Ft.getEncodedData();return{from:t,data:bt.Binary.toHex(oe),type:qt.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let x=await this.#t.dryRun(t,Ft);return{call:"polkadotXcm.send",error:x.execution_result&&x.execution_result.success?void 0:st(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 Y=require("@galacticcouncil/xc-core"),tn=require("polkadot-api"),I=require("rxjs");var K=require("@galacticcouncil/xc-core"),Xt=require("@galacticcouncil/common"),Jt=require("@polkadot-api/substrate-bindings"),vt=require("@polkadot-api/utils"),Ce=require("polkadot-api");var{Ss58Addr:Ze}=K.addr,E=class c{chain;_currency;constructor(t){this.chain=t}static async create(t){return new c(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 K.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=Jt.u32.enc(a),o=l=>new TextEncoder().encode(l),i=new Uint8Array([...o(this.chain.parachainId.toString()),...(0,vt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,vt.fromHex)(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),u=(0,Jt.Blake2256)(i);return(0,vt.toHex)(u)}async dryRun(t,e){let s=(0,Ce.Enum)("Signed",t),n=(0,Ce.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: "+Xt.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 Xe(a.emitted_events||[]);{let r=st(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=K.multiloc.findNestedKey(a,"interior"),o=K.multiloc.findParachain(a);if(K.multiloc.findGlobalConsensus(a))return t;if(o){let u=Xt.acc.getSovereignAccounts(o);return this.chain.parachainId===0?Ze.encodePubKey(u.relay):Ze.encodePubKey(u.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var St=class{#t;constructor(t){this.#t=E.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,o=await this.useSignerFee(s)?{asset:new Y.Asset(s)}:void 0,i=n.getTx(a.client),u=n.module+"."+n.func,l=await i.getEncodedData();return{from:t,data:tn.Binary.toHex(l),type:Y.CallType.Substrate,txOptions:o,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:st(d.execution_result);return{call:u,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:u,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),o=await a.estimateDeliveryFee(t,n),i=await this.exchangeFee(r+o,s),u=await ye(i,s,a);return s.copyWith(u)}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:o}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe((0,I.map)(({value:l})=>l)).pipe((0,I.concatMap)(l=>o(l)),(0,I.distinctUntilChanged)((l,m)=>l===m),(0,I.concatMap)(async l=>{let m=await ye(l,t,s);return Y.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,o=Y.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};var Ae=require("@galacticcouncil/xc-core"),at=require("polkadot-api"),be=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=at.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(o=>{o.signSubmitAndWatch(this.#e,r).subscribe({next:i=>{i.type==="broadcasted"&&e.onTransactionSend(i.txHash),i.type==="finalized"&&e.onFinalized(i)},error:i=>{e.onError(i)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=Ae.multiloc.findPalletInstance(e),n=Ae.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,at.Enum)("X2",[(0,at.Enum)("PalletInstance",Number(s)),(0,at.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var Zt=require("@galacticcouncil/xc-core"),nn=require("@mysten/sui/transactions"),sn=require("@mysten/sui/utils"),an=require("@mysten/bcs"),rt=require("@wormhole-foundation/sdk-connect"),rn=require("@wormhole-foundation/sdk-definitions"),we=require("@wormhole-foundation/sdk-sui"),on=require("@wormhole-foundation/sdk-sui-tokenbridge");var en=require("@mysten/bcs");function Yt(c,t={}){let e=c.inputs??[],s=c.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),o=l=>{let m=(0,en.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)}},i=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return o(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}},u=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?i(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(u)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":u(m.coin),g=(m.amounts??[]).map(u);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:u(m.destination),sources:(m.sources??[]).map(u)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(u),address:u(m.address)}}}return l})}var ve=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Zt.Wormhole.fromChain(this.#t),n=this.#t.client,a=rt.encoding.b64.decode(e),r=(0,rn.deserialize)("TokenBridge:Transfer",a),o=s.getCoreBridge(),i=s.getTokenBridge(),u=await(0,on.getTokenCoinType)(n,i,r.payload.token.address.toUint8Array(),(0,rt.toChainId)(r.payload.token.chain));if(!u)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([(0,we.getPackageId)(n,o),(0,we.getPackageId)(n,i)]),d=new nn.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",(0,rt.serialize)(r)),d.object(sn.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(i),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(i),p],typeArguments:[u]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[u]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[u]});let P=await d.build({client:n}),b=await d.toJSON(),y=Yt(JSON.parse(b));return{from:t,commands:y,data:(0,an.toBase64)(P),type:Zt.CallType.Sui}}};var se=require("@galacticcouncil/xc-core"),un=require("@mysten/bcs"),H=require("rxjs");var te=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 cn=require("@mysten/sui/utils");var Ln=9,ee=class extends te{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:cn.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return Ln}};var ne=class{static get(t,e){switch(e.module){case"Native":return new ee(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var xt=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}),o=await a.toJSON(),i=Yt(JSON.parse(o));return{from:t,commands:i,data:(0,un.toBase64)(r),type:se.CallType.Sui,dryRun:async()=>{let u=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:u.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,u=BigInt(i.computationCost),l=BigInt(i.storageCost),m=u+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=ne.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return se.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new H.Subject,n=s.pipe((0,H.shareReplay)(1)),a=async()=>{await(async()=>{let u=await this.getBalance(t,e);s.next(u)})();let i=setInterval(()=>{},3e3);return()=>clearInterval(i)},r;return a().then(o=>r=o),n.pipe((0,H.finalize)(()=>r?.()),(0,H.distinctUntilChanged)((o,i)=>o.amount===i.amount))}};var ln=require("@mysten/sui/keypairs/ed25519"),mn=require("@mysten/sui/transactions"),Se=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 ln.Ed25519Keypair){let i=mn.Transaction.from(n),u=await a.signAndExecuteTransaction({signer:this.#e,transaction:i,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(u.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),o=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(o.digest)}catch(r){e.onError(r)}}};var L=class{platform={};constructor(t){switch(t.getType()){case ot.ChainType.EvmChain:this.registerEvm(t);break;case ot.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case ot.ChainType.Parachain:this.registerSubstrate(t);break;case ot.ChainType.SolanaChain:this.registerSolana(t);break;case ot.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new pt(e)}registerSolana(t){let e=t;this.platform.Solana=new ht(e)}registerSui(t){let e=t;this.platform.Sui=new xt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new St(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 G=require("@galacticcouncil/xc-core"),Tt=require("@galacticcouncil/common");var dn=require("@galacticcouncil/common"),it=On(require("big.js"),1);function gn(c,t,e,s){let n=c.toBig().minus(e.toBig()).minus(c.isSame(t)?t.toBig():new it.default(0));return s&&(n=n.minus(c.isSame(s)?s.toBig():new it.default(0))),c.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function pn(c,t,e,s){let a=c.copyWith({amount:0n}).toBig().plus(c.isSame(t)?t.toBig():new it.default(0)).plus(c.toBig().lt(e.toBig())?e.toBig():new it.default(0));return s&&(a=a.plus(c.isSame(s)&&c.toBig().lt(s.toBig())?s.toBig():new it.default(0))),c.copyWith({amount:BigInt(a.toFixed())})}async function z(c,t){return t.isEvmParachain()?t.getDerivatedAddress(c):c}function fn(c,t){return t?dn.big.toBigInt(t,c):0n}var Z=require("@galacticcouncil/xc-core"),hn=require("@galacticcouncil/common");var{EvmAddr:zn}=Z.addr,ct=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof Z.Parachain)return(await E.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),o=zn.isValid(r.toString())?await z(t,e):t,i=s.source.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}async getMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=s.min;if(t instanceof Z.Parachain&&a){let r=t.getMinAssetId(n),o=a.build({asset:r});return this.adapter.getBalance(n,o)}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),o=0n;return a&&(o=hn.big.toBigInt(a,r)),Z.AssetAmount.fromAsset(n,{amount:o,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:yn}=G.addr,Pt=class extends ct{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,o=s.destinationFee.asset||n.fee.asset,i=await this.getDecimals(o);if(Number.isFinite(r))return{fee:G.AssetAmount.fromAsset(o,{amount:Tt.big.toBigInt(r,i),decimals:i}),feeBreakdown:{}};let u=r,{amount:l,breakdown:m}=await u.build({feeAsset:o,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:G.AssetAmount.fromAsset(o,{amount:l,decimals:i}),feeBreakdown:m}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,o=n.destinationFee.asset||a.fee.asset;if(r.isEqual(o))return this.getBalance(t);let i=e.getBalanceAssetId(o),u=yn.isValid(i.toString())?await z(t,e):t,l=n.destinationFee.balance.build({address:u,asset:o,chain:e});return this.adapter.getBalance(o,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),i=s.contract?await z(a,e):a,u=await this.adapter.estimateFee(i,n,r.feeBalance,o),{fee:l}=s.source,m=l?fn(u.decimals,l.extra):0n,d=u.amount+m;return u.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),o=yn.isValid(r.toString())?await z(t,e):t,i=n.fee.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let o=a.asset;return e instanceof G.Parachain&&"build"in o?await o.build({chain:e,address:t}):o}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:o}=s;if(a){let{address:u,amount:l,asset:m,sender:d}=t,p=await(await E.create(e)).buildMessageId(d,l,m.originSymbol,u);return a.build({...t,messageId:p})}let i=n||r||o;if(i)return i.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 E.create(s),o=a.getTx(r.client),i=e.source.chain,u=e.sender,l=Tt.acc.getMultilocationDerivatedAccount(i.parachainId,u,s.parachainId===0?0:1,s.usesH160Acc),m=await o.getPaymentInfo(l),d=await o.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=Tt.big.toBigInt(e.amount,s);return G.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 Bt=class extends ct{constructor(t,e){super(t,e)}};var F=require("@galacticcouncil/xc-core"),Gn=F.SNOWBRIDGE_SUBMIT_GAS+F.SNOWBRIDGE_BASE_VERIFICATION_GAS+F.SNOWBRIDGE_BASE_DISPATCH_GAS,$n=F.SNOWBRIDGE_FIAT_SHAMIR_GAS-F.SNOWBRIDGE_SUBMIT_GAS;function An(c,t,e,s,n,a){s.volumeTipWei=(0,F.calculateVolumeTipInWei)(a),wn(c,t,e,s,n)}function bn(c,t,e,s,n,a){if(n==="outbound"){if(a){let r=e.breakdown.etherFeeAmount;s.accelerationTipWei=r*$n/Gn}else s.accelerationTipWei=0n;wn(c,t,e,s,n)}}function wn(c,t,e,s,n){let a=s.accelerationTipWei+s.volumeTipWei,r=t.destination.fee;if(n==="inbound"){let d={...e.breakdown,relayerFee:e.breakdown.relayerFee+a,volumeTip:s.volumeTipWei,accelerationTip:s.accelerationTipWei},g=r.copyWith({amount:e.amount+a});Cn(c,t,g,d);return}let o=e.breakdown.etherFeeAmount,i=e.breakdown.dotToEtherSwapAmount,u=a*i/o,l={...e.breakdown,etherFeeAmount:o+a,dotToEtherSwapAmount:i+u,volumeTip:s.volumeTipWei,accelerationTip:s.accelerationTipWei},m=r.copyWith({amount:e.amount+u});Cn(c,t,m,l)}function Cn(c,t,e,s){t.destination.feeBreakdown=s,t.destination.fee=e,t.source.destinationFee=e,c.destination.fee=e,c.source.destinationFee=e}var vn=require("@galacticcouncil/xc-core"),ut=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:vn.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:Qn}=lt.addr,ae=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,lt.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),o=this.config.getChain(s);if(!(r.isSubstrate()&&o.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[u,l]=await Promise.all([E.create(r),E.create(o)]),m=new wt(u,l),d=Et.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,o.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 L(n.chain),o=new L(a.chain),i=new Pt(r,n),u=new Bt(o,a),l=new lt.TransferValidator(...this.validations),[m,d,g,p,f,h,P]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),u.getBalance(s),u.getMin()]),{source:b,destination:y}=n.route,B=g.fee.copyWith(y.fee.asset),k=g.feeBreakdown,mt=b.asset.isEqual(B)&&B.amount>10n?B.amount+1n:10n,A={address:s,amount:mt,asset:b.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}};A.transact=await i.getTransact(A);let D=new ut(A),w=await i.getFee(A),V;D.isSwapSupported(b.fee)&&(V=await D.getSwap(w),A.source.feeSwap=V);let O;D.isDestinationSwapSupported(w)&&(O=await D.getDestinationSwap(w),A.source.destinationFeeSwap=O),(V||O)&&(w=await i.getFee(A),w=w.padByPct(5n));let Ft=await u.getEd(),oe=pn(h,B,P,Ft),x=await i.getEd(),Dt=gn(m,w,f,x);A.amount=0n,A.source.fee=w;let Q={source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:O,fee:w,feeBalance:d,feeSwap:V,max:Dt,min:m.copyWith({amount:oe.amount})},destination:{balance:h,fee:B},async buildCall(M){let S=Object.assign({},A);return S.amount=Et.big.toBigInt(M,m.decimals),S.transact=await i.getTransact(S),i.getCall(S)},async estimateFee(M){let S=Object.assign({},A);return S.amount=Et.big.toBigInt(M,m.decimals),S.transact=await i.getTransact(S),i.getFee(S)},async validate(M){let S=Object.assign({},A),Rt=M||w.amount;return S.source.fee=w.copyWith({amount:Rt}),l.validate(S)}};if(n.route.tags?.includes("Snowbridge")){let M=n.chain.isEvmChain()?"inbound":"outbound",S={amount:B.amount,breakdown:{...k}},Rt={accelerationTipWei:0n,volumeTipWei:0n};Q.applySnowbridgeVolumeFee=ie=>{An(Q,A,S,Rt,M,ie)},Q.applySnowbridgeAcceleration=ie=>{bn(Q,A,S,Rt,M,ie)}}return Q}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new L(n.chain),r=n.getUniqueRoutes().map(async({source:u})=>{let{asset:l,balance:m}=u,d=n.chain.getBalanceAssetId(l),g=Qn.isValid(d.toString())?await z(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),o=await Promise.all(r);return(0,re.combineLatest)(o).pipe((0,re.debounceTime)(500)).subscribe(s)}};var Sn=require("@galacticcouncil/xc-core");function xn(c){let t=(0,Sn.ConfigBuilder)(c.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:o,destinationAssets:i,isAssetSelect:u,isTagSelect:l,build:m}=a.destination(r);return{routes:o,destinationAssets:i,isAssetSelect:u,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return c.getTransferData(h,d,g)}}}}}}}}}var Tn=require("@galacticcouncil/xc-core"),qn="https://api.wormholescan.io",It=class{_baseUrl;constructor(t){this._baseUrl=t||qn}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===Tn.Precompile.Bridge}};var Pn=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),Bn=require("@wormhole-foundation/sdk-base"),En=require("@wormhole-foundation/sdk-connect"),In=require("@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 Xn=300*1e3,Te=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new It}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:o,standarizedProperties:i}=r,u=this.getStatus(a),l=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=i,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===o.tokenChain),p;if(u===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 dt(g);p=async y=>P.redeem(y,h);break;case v.ChainType.SolanaChain:let b=new Ct(g);p=async y=>b.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:u,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,o=(await v.mrl.createPayload(a,t)).toHex(),i=s.filter(u=>{let{content:l}=u,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===o}).map(async u=>{let{content:l,sourceChain:m}=u,{payload:d,standarizedProperties:g}=l,p=this.getStatus(u),{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),b;if(p===1&&u.vaa){let{timestamp:y}=this.getVaaHeader(u.vaa.raw),B=u.vaa.raw;if(this.isStuck(y)){let k=new At(P);b=async $=>k.redeemMrlViaXcm($,B)}}return{asset:f,assetSymbol:u.data.symbol,amount:u.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:b,operation:u}});return Promise.all(i)}isStuck(t){return Date.now()>=t*1e3+Xn}getVaaHeader(t){let e=Bn.encoding.b64.decode(t),s=(0,In.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,En.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 xs,big as be}from"@galacticcouncil/common";import{addr as Ss,ConfigBuilder as Ps,TransferValidator as Ts}from"@galacticcouncil/xc-core";import{combineLatest as Bs,debounceTime as Es}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 kt}from"@wormhole-foundation/sdk-base";var Z=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Te.fromChain(this.#t),n=kt.b64.decode(e),a=kt.hex.encode(n),r=Pe.TokenBridge,o=Be({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,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 Ve,finalize as _e,shareReplay as Me,Subject as Ne}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 Ee}from"@galacticcouncil/xc-core";var tt=class extends V{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 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 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 Ns,big as Fe}from"@galacticcouncil/common";import{addr as Us,ConfigBuilder as js,TransferValidator as Ks}from"@galacticcouncil/xc-core";import{combineLatest as Hs,debounceTime as Ls}from"rxjs";import{ChainType as $}from"@galacticcouncil/xc-core";import{Abi as _e,Wormhole as Ve}from"@galacticcouncil/xc-core";import{encodeFunctionData as Oe}from"viem";import{encoding as Mt}from"@wormhole-foundation/sdk-base";var et=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Ve.fromChain(this.#t),n=Mt.b64.decode(e),a=Mt.hex.encode(n),r=_e.TokenBridge,o=Oe({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,from:t,to:s.getTokenBridge()}}};import{Abi as Ke,AssetAmount as He,CallType as jt,Erc20Client as Le}from"@galacticcouncil/xc-core";import{distinctUntilChanged as ze,finalize as Ge,shareReplay as $e,Subject as Qe}from"rxjs";var O=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 Me}from"@galacticcouncil/xc-core";var nt=class extends O{erc20;constructor(t,e){super(t,e),this.erc20=new Me(t,e.address)}async getBalance(){let{args:t}=this.config,[e]=t;return this.erc20.balanceOf(e)}async getDecimals(){return this.erc20.decimals()}};var st=class extends O{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 at=class{static get(t,e){switch(e.module){case"Erc20":return new nt(t,e);case"Native":return new st(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ContractFunctionExecutionError as We,decodeEventLog as Ne}from"viem";var rt=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 We?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(),o=await this.getNonce(t);try{let{results:i}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[c]=i;return c}catch(i){return console.log(`Can't simulate call!
3
- `,i.details),{error:i}}}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 Ot(m){let t=m.module==="Snowbridge"&&m.func==="sendToken"&&m.args[0]==="0x0000000000000000000000000000000000000000";return m.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(m.func)||t}function Vt(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:o,calldata:i}=a,c={abi:JSON.stringify(r),data:i,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(Vt(n)||Ot(n))return c;let l=new Oe(this.#t,o),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:o,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 i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let c=a.watchBlocks({onBlock:()=>i()});return()=>c()},o;return r().then(i=>o=i),n.pipe(_e(()=>o?.()),Ve((i,c)=>i.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 Mt="0x0000000000000000000000000000000000000401",{H160:Ke}=Ue,Nt=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 o=this.#t.client,i=je.fromHex(t.data);await o.getUnsafeApi().txFromCallData(i),a=!0}catch{}let r;if(a){let[o,i]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Mt}),n.getGasPrice()]),c=i+i/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:o*11n/10n,to:Mt})}else{let{data:o,to:i,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:i,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};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 _=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 _{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 St}from"@wormhole-foundation/sdk-solana";var ot=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:o})=>{let i=o.data.parsed.info.tokenAmount;return r+=BigInt(i.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 it=class{static get(t,e){switch(e.module){case"Native":return new rt(t,e);case"Token":return new ot(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Wt,PublicKey as Le,TransactionMessage as $e,VersionedTransaction as Ut}from"@solana/web3.js";var jt=.5,Kt=2,zt=1,Ht=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=jt,s=Kt,n=zt,a=Ht){let[r,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Wt.setComputeUnitLimit({units:r}),Wt.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new Ut(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Ut(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=jt,s=Kt,n=zt,a=Ht){let r=n,o=await this.getTxAccounts(t),i=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(i){let c=i.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 Lt(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 fr(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),o=r.serialize(),i=Ye.from(o).toString("hex");return{from:t,data:i,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),o=await a.getPriorityMessage(t),{accounts:i}=await a.simulateTransaction(t,o),l=(i&&i[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=it.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 o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let i=new Ge(e.address),c=this.#t.onAccountChange(i,()=>o());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(o=>r=o),n.pipe(tn(()=>r?.()),Ze((o,i)=>o.amount===i.amount))}};import{CallType as ut,Wormhole as sn}from"@galacticcouncil/xc-core";import{Keypair as $t,PublicKey as L,SystemProgram as Qt,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 Xt}from"@wormhole-foundation/sdk-solana-core";import{encoding as fn}from"@wormhole-foundation/sdk-base";import{deserialize as Jt}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as Gt,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=Jt("TokenBridge:Transfer",a),o=Jt("Uint8Array",a),i=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(i)){let h=$t.generate(),x=await Xt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,o,h.publicKey),B=Lt(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=Xt.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,o,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=Qt.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,o){let c=(a?Gt: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,o]),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),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),i=await dn(this.#e),c=$t.generate(),l=qt(e,a,e,mt),u=Gt(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Qt.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:i,space:rn,programId:on}),g=ln(c.publicKey,mt,e),p=un(a,c.publicKey,e,o),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 Yt,MessageV0 as yn,VersionedTransaction as Cn}from"@solana/web3.js";import{Buffer as Pt}from"buffer";var Zt=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 Yt){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:o}=await r.signAndSendTransaction(a);e.onTransactionSend(o);let i=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(i)}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 Yt)s.forEach(i=>i.sign([this.#e])),n=s.map(i=>Pt.from(i.serialize()).toString("base64"));else{let i=this.#e;await i.connect(),n=(await i.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 o=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(o.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Pt.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 te}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as xn}from"viem";import{Binary as Tt}from"polkadot-api";var gt=class{#t;constructor(t){this.#t=t,vn.fromChain(this.#t)}redeemMrl(t,e){let s=te.b64.decode(e),n=te.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),o=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:Tt.fromHex(a.to)},value:[0n,0n,0n,0n],input:Tt.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Tt.toHex(o),from:t,type:bn.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as En,CallType as In}from"@galacticcouncil/xc-core";import{Binary as pt}from"polkadot-api";import{big as Sn}from"@galacticcouncil/common";async function Bt(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 Et}from"@galacticcouncil/common";function Tn(m){return{parents:0,interior:{type:"X1",value:m.startsWith("0x")?Et.toAccountKey20(m):Et.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:Et.transform(m),fun:{type:"Fungible",value:t}}),se=(m,t,e,s,n,a)=>{console.log(a);let r=Tn(m),o=Bn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[o]},{type:"BuyExecution",value:{fees:o,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 ft=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,o=await this.#t.getAsset(),i=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),u=l.asset,d=l.decimals,g=c.getAssetXcmLocation(u),p=pt.fromHex(s.data),y=await(await i.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||o,u,C,10),Y=pt.fromHex(w),R=await r.txFromCallData(Y);A.push(R)}catch{}let T=await n(C),b=pt.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}),xt=await G.getEncodedData();return{from:t,data:pt.toHex(xt),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 ie,CallType as Nn}from"@galacticcouncil/xc-core";import{Binary as Wn}from"polkadot-api";import{concatMap as ce,catchError as Un,distinctUntilChanged as jn,firstValueFrom as Kn,map as zn,throwError as Hn}from"rxjs";import{addr as Fn,multiloc as It,AssetAmount as Dn}from"@galacticcouncil/xc-core";import{acc as Rn,enums as kn}from"@galacticcouncil/common";import{Blake2256 as On,u32 as Vn}from"@polkadot-api/substrate-bindings";import{toHex as _n,fromHex as ae}from"@polkadot-api/utils";import{Enum as re}from"polkadot-api";var{Ss58Addr:oe}=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=Vn.enc(a),o=l=>new TextEncoder().encode(l),i=new Uint8Array([...o(this.chain.parachainId.toString()),...ae(t.startsWith("0x")?t.slice(2):t),...r,...ae(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),c=On(i);return _n(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=It.findNestedKey(a,"interior"),o=It.findParachain(a);if(It.findGlobalConsensus(a))return t;if(o){let c=Rn.getSovereignAccounts(o);return this.chain.parachainId===0?oe.encodePubKey(c.relay):oe.encodePubKey(c.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var ht=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,o=await this.useSignerFee(s)?{asset:new Mn(s)}:void 0,i=n.getTx(a.client),c=n.module+"."+n.func,l=await i.getEncodedData();return{from:t,data:Wn.toHex(l),type:Nn.Substrate,txOptions:o,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),o=await a.estimateDeliveryFee(t,n),i=await this.exchangeFee(r+o,s),c=await Bt(i,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return Kn(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:o}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe(zn(({value:l})=>l)).pipe(ce(l=>o(l)),jn((l,u)=>l===u),ce(async l=>{let u=await Bt(l,t,s);return ie.fromAsset(t,u)}),Un(l=>(console.error("subscribe fails for:",t),Hn(()=>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,o=ie.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};import{multiloc as le}from"@galacticcouncil/xc-core";import{Binary as Ln,Enum as Ft}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=Ln.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(o=>{o.signSubmitAndWatch(this.#e,r).subscribe({next:i=>{i.type==="broadcasted"&&e.onTransactionSend(i.txHash),i.type==="finalized"&&e.onFinalized(i)},error:i=>{e.onError(i)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=le.findPalletInstance(e),n=le.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 qn}from"@galacticcouncil/xc-core";import{Transaction as Xn}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as Jn}from"@mysten/sui/utils";import{toBase64 as Gn}from"@mysten/bcs";import{encoding as Yn,serialize as Zn,toChainId as ts}from"@wormhole-foundation/sdk-connect";import{deserialize as es}from"@wormhole-foundation/sdk-definitions";import{getPackageId as me}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as ns}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as $n}from"@mysten/bcs";function yt(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(),o=l=>{let u=$n(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)}},i=l=>{let u=e[l];if(!u)return{Input:l};if(u.Pure?.bytes)return o(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"?i(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=qn.fromChain(this.#t),n=this.#t.client,a=Yn.b64.decode(e),r=es("TokenBridge:Transfer",a),o=s.getCoreBridge(),i=s.getTokenBridge(),c=await ns(n,i,r.payload.token.address.toUint8Array(),ts(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,u]=await Promise.all([me(n,o),me(n,i)]),d=new Xn;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",Zn(r)),d.object(Jn)]}),[p]=d.moveCall({target:`${u}::vaa::verify_only_once`,arguments:[d.object(i),g]}),[f]=d.moveCall({target:`${u}::complete_transfer::authorize_transfer`,arguments:[d.object(i),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=yt(JSON.parse(C));return{from:t,commands:h,data:Gn(v),type:Qn.Sui}}};import{AssetAmount as rs,CallType as os}from"@galacticcouncil/xc-core";import{toBase64 as is}from"@mysten/bcs";import{distinctUntilChanged as cs,finalize as ls,shareReplay as us,Subject as ms}from"rxjs";var Ct=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 ss}from"@mysten/sui/utils";var as=9,At=class extends Ct{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:ss});return BigInt(e.totalBalance)}async getDecimals(){return as}};var bt=class{static get(t,e){switch(e.module){case"Native":return new At(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}),o=await a.toJSON(),i=yt(JSON.parse(o));return{from:t,commands:i,data:is(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}),i=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(i.computationCost),l=BigInt(i.storageCost),u=c+l;return s.copyWith({amount:u})}async getBalance(t,e){let s=bt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return rs.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new ms,n=s.pipe(us(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let i=setInterval(()=>{},3e3);return()=>clearInterval(i)},r;return a().then(o=>r=o),n.pipe(ls(()=>r?.()),cs((o,i)=>o.amount===i.amount))}};import{Ed25519Keypair as ds}from"@mysten/sui/keypairs/ed25519";import{Transaction as gs}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 ds){let i=gs.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:i,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"}),o=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(o.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 wt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new ht(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 As,AssetAmount as Dt,Parachain as bs}from"@galacticcouncil/xc-core";import{acc as ws,big as Ce}from"@galacticcouncil/common";import{big as ps}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?ps.toBigInt(t,m):0n}import{addr as fs,AssetAmount as hs,Parachain as ye}from"@galacticcouncil/xc-core";import{big as ys}from"@galacticcouncil/common";var{EvmAddr:Cs}=fs,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),o=Cs.isValid(r.toString())?await F(t,e):t,i=s.source.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}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),o=a.build({asset:r});return this.adapter.getBalance(n,o)}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),o=0n;return a&&(o=ys.toBigInt(a,r)),hs.fromAsset(n,{amount:o,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:Ae}=As,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,o=s.destinationFee.asset||n.fee.asset,i=await this.getDecimals(o);if(Number.isFinite(r))return{fee:Dt.fromAsset(o,{amount:Ce.toBigInt(r,i),decimals:i}),feeBreakdown:{}};let c=r,{amount:l,breakdown:u}=await c.build({feeAsset:o,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:Dt.fromAsset(o,{amount:l,decimals:i}),feeBreakdown:u}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,o=n.destinationFee.asset||a.fee.asset;if(r.isEqual(o))return this.getBalance(t);let i=e.getBalanceAssetId(o),c=Ae.isValid(i.toString())?await F(t,e):t,l=n.destinationFee.balance.build({address:c,asset:o,chain:e});return this.adapter.getBalance(o,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),i=s.contract?await F(a,e):a,c=await this.adapter.estimateFee(i,n,r.feeBalance,o),{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),o=Ae.isValid(r.toString())?await F(t,e):t,i=n.fee.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let o=a.asset;return e instanceof bs&&"build"in o?await o.build({chain:e,address:t}):o}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:o}=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 i=n||r||o;if(i)return i.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),o=a.getTx(r.client),i=e.source.chain,c=e.sender,l=ws.getMultilocationDerivatedAccount(i.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),u=await o.getPaymentInfo(l),d=await o.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 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 vs}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:vs.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:Is}=Ss,Rt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Ps(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),o=this.config.getChain(s);if(!(r.isSubstrate()&&o.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([P.create(r),P.create(o)]),u=new ft(c,l),d=xs.getMultilocationDerivatedAccount(r.parachainId,t,1,o.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),o=new O(a.chain),i=new q(r,n),c=new X(o,a),l=new Ts(...this.validations),[u,d,g,p,f,y,v]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.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 i.getTransact(A);let T=new J(A),b=await i.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 i.getFee(A),b=b.padByPct(5n));let G=await c.getEd(),xt=fe(y,x,v,G),w=await i.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:xt.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 i.getTransact(S),i.getCall(S)},async estimateFee(R){let S=Object.assign({},A);return S.amount=be.toBigInt(R,u.decimals),S.transact=await i.getTransact(S),i.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=Is.isValid(d.toString())?await F(t,n.chain):t,p=u.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),o=await Promise.all(r);return Bs(o).pipe(Es(500)).subscribe(s)}};import{ConfigBuilder as Fs}from"@galacticcouncil/xc-core";function Ds(m){let t=Fs(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:o,destinationAssets:i,isAssetSelect:c,isTagSelect:l,build:u}=a.destination(r);return{routes:o,destinationAssets:i,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 Rs}from"@galacticcouncil/xc-core";var ks="https://api.wormholescan.io",vt=class{_baseUrl;constructor(t){this._baseUrl=t||ks}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===Rs.Bridge}};import{acc as Os}from"@galacticcouncil/common";import{mrl as Vs,ChainType as ve,Parachain as _s,Precompile as Ms,Wormhole as U}from"@galacticcouncil/xc-core";import{encoding as Ns}from"@wormhole-foundation/sdk-base";import{keccak256 as Ws}from"@wormhole-foundation/sdk-connect";import{deserialize as Us}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 js=300*1e3,xe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new vt}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=Os.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:o,standarizedProperties:i}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof _s&&f.parachainId===this.parachainId),{toAddress:u,tokenAddress:d}=i,g=this.chains.find(f=>U.isKnown(f)&&U.fromChain(f).getWormholeId()===o.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:Ms.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,o=(await Vs.createPayload(a,t)).toHex(),i=s.filter(c=>{let{content:l}=c,{payload:u}=l;return u.payloadType===3&&u.toChain===16&&"0x"+u.payload===o}).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(i)}isStuck(t){return Date.now()>=t*1e3+js}getVaaHeader(t){let e=Ns.b64.decode(t),s=Us("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Ws(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Mt as DISPATCH_ADDRESS,Z as EvmClaim,at as EvmPlatform,Nt as EvmSigner,J as FeeSwap,O as PlatformAdapter,dt as SolanaClaim,M as SolanaLilJit,lt as SolanaPlatform,Zt as SolanaSigner,gt as SubstrateClaim,ft as SubstrateExec,ht as SubstratePlatform,P as SubstrateService,ue as SubstrateSigner,de as SuiClaim,wt as SuiPlatform,ge as SuiSigner,Ds as TransferBuilder,Rt as Wallet,we as WhStatus,vt as WormholeScan,xe as WormholeTransfer,Lt as chunkBySize,fr as deserializeV0,k as ixToHuman,H as serializeV0};
3
+ `,i.details),{error:i}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=Ne({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var H=class{static get(t,e){return new rt(t,e)}};import{Precompile as Ue}from"@galacticcouncil/xc-core";import{decodeAbiParameters as je}from"viem";function Bt(u){return u.module==="Snowbridge"&&u.func==="v2_sendMessage"}function Wt(u){if(!Bt(u))return;let t=u.args[1];if(!t||t.length===0)return;let[e,s]=je([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Nt(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 Ut(u){return Object.entries(Ue).map(([e,s])=>s).includes(u.address)}var ot=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=H.get(this.#t,n),{abi:r,asset:o,calldata:i}=a,c={abi:JSON.stringify(r),data:i,from:t,to:n.address,type:jt.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(Ut(n)||Nt(n))return c;let l=Bt(n)?Wt(n):o,m=new Le(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(Ke.Erc20),allowance:d,data:g,from:t,to:l,type:jt.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await H.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=at.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return He.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new Qe,n=s.pipe($e(1)),a=this.#t.getProvider(),r=async()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let c=a.watchBlocks({onBlock:()=>i()});return()=>c()},o;return r().then(i=>o=i),n.pipe(Ge(()=>o?.()),ze((i,c)=>i.amount===c.amount))}};import{EvmParachain as qe}from"@galacticcouncil/xc-core";import{h160 as Xe}from"@galacticcouncil/common";import{Binary as Je}from"polkadot-api";var Kt="0x0000000000000000000000000000000000000401",{H160:Ye}=Xe,Ht=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Ye.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof qe)try{let o=this.#t.client,i=Je.fromHex(t.data);await o.getUnsafeApi().txFromCallData(i),a=!0}catch{}let r;if(a){let[o,i]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Kt}),n.getGasPrice()]),c=i+i/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:o*11n/10n,to:Kt})}else{let{data:o,to:i,value:c}=t;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:i,value:c})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};import{AssetAmount as rn,CallType as on}from"@galacticcouncil/xc-core";import{PublicKey as cn}from"@solana/web3.js";import{Buffer as un}from"buffer";import{distinctUntilChanged as ln,finalize as mn,shareReplay as dn,Subject as gn}from"rxjs";var M=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 tn=9,it=class extends M{async getBalance(){let{address:t}=this.config,e=new Ze(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return tn}};import{SolanaAddress as Et}from"@wormhole-foundation/sdk-solana";var ct=class extends M{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Et(t).unwrap(),n=new Et(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).value.reduce((r,{account:o})=>{let i=o.data.parsed.info.tokenAmount;return r+=BigInt(i.amount),r},0n)}async getDecimals(){let{token:t}=this.config,e=new Et(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var ut=class{static get(t,e){switch(e.module){case"Native":return new it(t,e);case"Token":return new ct(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Lt,PublicKey as en,TransactionMessage as nn,VersionedTransaction as zt}from"@solana/web3.js";var Gt=.5,$t=2,Qt=1,qt=1e6,sn=25e4,lt=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 en(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new nn({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=Gt,s=$t,n=Qt,a=qt){let[r,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Lt.setComputeUnitLimit({units:r}),Lt.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new zt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new zt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):sn}async determinePriorityFee(t,e=Gt,s=$t,n=Qt,a=qt){let r=n,o=await this.getTxAccounts(t),i=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(i){let c=i.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 L=class{static get(t,e){return new lt(t,e)}};import{MessageV0 as an}from"@solana/web3.js";function _(u){return u.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Xt(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 z(u){let t=u.serialize();return Buffer.from(t).toString("hex")}function Rr(u){let t=Buffer.from(u,"hex"),e=Uint8Array.from(t);return an.deserialize(e)}var mt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=L.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),i=un.from(o).toString("hex");return{from:t,data:i,ix:_(n.instructions),signers:n.signers,type:on.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=L.get(this.#t,n),r=await a.estimateFee(t,e),o=await a.getPriorityMessage(t),{accounts:i}=await a.simulateTransaction(t,o),l=(i&&i[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=ut.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return rn.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new gn,n=s.pipe(dn(1)),a=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let i=new cn(e.address),c=this.#t.onAccountChange(i,()=>o());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(o=>r=o),n.pipe(mn(()=>r?.()),ln((o,i)=>o.amount===i.amount))}};import{CallType as dt,Wormhole as pn}from"@galacticcouncil/xc-core";import{Keypair as Jt,PublicKey as G,SystemProgram as Yt,TransactionMessage as fn}from"@solana/web3.js";import{ACCOUNT_SIZE as hn,NATIVE_MINT as gt,TOKEN_PROGRAM_ID as yn,createAssociatedTokenAccountIdempotentInstruction as Zt,createCloseAccountInstruction as Cn,createInitializeAccountInstruction as An,createTransferInstruction as bn,getAssociatedTokenAddressSync as wn,getMinimumBalanceForRentExemptAccount as vn,getMint as Sn}from"@solana/spl-token";import{utils as xn}from"@wormhole-foundation/sdk-solana";import{utils as te}from"@wormhole-foundation/sdk-solana-core";import{encoding as Tn}from"@wormhole-foundation/sdk-base";import{deserialize as ee}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as ne,createCompleteTransferWrappedInstruction as Pn}from"@wormhole-foundation/sdk-solana-tokenbridge";var W=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 pt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new W(t)}async redeem(t,e,s){let n=pn.fromChain(this.#t),a=Tn.b64.decode(e),r=ee("TokenBridge:Transfer",a),o=ee("Uint8Array",a),i=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new G(t),l=s?new G(s):c,m=c.equals(l),d=[];if(!await this.#e.getAccountInfo(i)){let y=Jt.generate(),x=await te.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,o,y.publicKey),B=Xt(x,1e3);for(let P=0;P<B.length;P++){let b=B[P],E=await this.getV0Message(c,b),I=z(E);d.push({from:t,data:I,ix:_(b),signers:[y],type:dt.Solana})}let R=te.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,o,y.publicKey),K=await this.getV0Message(c,[R]),C=z(K);d.push({from:t,data:C,ix:_([R]),type:dt.Solana})}let p=r.payload.token.chain==="Solana",f=new G(r.payload.token.address.toUint8Array()),h=p&&f.equals(gt),S=await this.#n.getTipAccount(),A=Yt.transfer({fromPubkey:c,toPubkey:new G(S[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,o){let c=(a?ne:Pn)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=wn(n,s),m=Zt(e,l,s,n),d=await this.getV0Message(e,[m,c,o]),g=z(d);return{from:e.toBase58(),data:g,ix:_([m,c]),type:dt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new G(s.payload.to.address.toUint8Array()),r=await Sn(this.#e,gt),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),i=await vn(this.#e),c=Jt.generate(),l=Zt(e,a,e,gt),m=ne(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Yt.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:i,space:hn,programId:yn}),g=An(c.publicKey,gt,e),p=bn(a,c.publicKey,e,o),f=Cn(c.publicKey,e,e),h=[l,m,d,g,p,f,n],S=await this.getV0Message(e,h),A=z(S);return{from:e.toBase58(),data:A,ix:_(h),signers:[c],type:dt.Solana}}derivePostedVaaKey(t,e){return xn.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new fn({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as se,MessageV0 as Bn,VersionedTransaction as En}from"@solana/web3.js";import{Buffer as It}from"buffer";var ae=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new W(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof se){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:o}=await r.signAndSendTransaction(a);e.onTransactionSend(o);let i=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(i)}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 se)s.forEach(i=>i.sign([this.#e])),n=s.map(i=>It.from(i.serialize()).toString("base64"));else{let i=this.#e;await i.connect(),n=(await i.signAllTransactions(s)).map(l=>It.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 o=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(o.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=It.from(t,"hex"),n=Uint8Array.from(s),a=Bn.deserialize(n),r=new En(a);return e&&r.sign(e),r}};import{Abi as In,CallType as Fn,Precompile as Dn,Wormhole as Rn}from"@galacticcouncil/xc-core";import{encoding as re}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as kn}from"viem";import{Binary as Ft}from"polkadot-api";var ft=class{#t;constructor(t){this.#t=t,Rn.fromChain(this.#t)}redeemMrl(t,e){let s=re.b64.decode(e),n=re.hex.encode(s),a=In.Gmp,r=kn({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Dn.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),o=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:Ft.fromHex(a.to)},value:[0n,0n,0n,0n],input:Ft.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Ft.toHex(o),from:t,type:Fn.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as Wn,CallType as Nn}from"@galacticcouncil/xc-core";import{Binary as ht}from"polkadot-api";import{big as _n}from"@galacticcouncil/common";async function Dt(u,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:_n.convertDecimals(u,a,n),decimals:n}}import{enums as Vn}from"@galacticcouncil/common";var oe=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"?Vn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as Rt}from"@galacticcouncil/common";function On(u){return{parents:0,interior:{type:"X1",value:u.startsWith("0x")?Rt.toAccountKey20(u):Rt.toAccountId32(u)}}}function ie(u){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:u.parachainId}}}}}var Mn=(u,t)=>({id:Rt.transform(u),fun:{type:"Fungible",value:t}}),ce=(u,t,e,s,n,a)=>{console.log(a);let r=On(u),o=Mn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[o]},{type:"BuyExecution",value:{fees:o,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 yt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,o=await this.#t.getAsset(),i=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),m=l.asset,d=l.decimals,g=c.getAssetXcmLocation(m),p=ht.fromHex(s.data),h=await(await i.txFromCallData(p)).getPaymentInfo(e),S=BigInt(h.partial_fee)*120n/100n,A=Wn.fromAsset(m,{amount:S,decimals:d}),y=h.weight.ref_time,x=h.weight.proof_size,B=ie(c),R=ce(e,g,A,y,x,p),K=r.tx.PolkadotXcm.send({dest:B,message:R}),C=[];try{let v=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,m,A,10),Z=ht.fromHex(v),k=await r.txFromCallData(Z);C.push(k)}catch{}let P=await n(A),b=ht.fromHex(P.data),E=await r.txFromCallData(b);C.push(E),C.push(K);let I=C.map(v=>v.decodedCall),Y=r.tx.Utility.batch_all({calls:I}),Tt=await Y.getEncodedData();return{from:t,data:ht.toHex(Tt),type:Nn.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let v=await this.#t.dryRun(t,Y);return{call:"polkadotXcm.send",error:v.execution_result&&v.execution_result.success?void 0:N(v.execution_result),events:v.emitted_events||[],xcm:v.forwarded_xcms||[]}}catch(v){return{call:"polkadotXcm.send",error:v instanceof Error?v.message:"unknown"}}}:()=>{}}}};import{Asset as $n,AssetAmount as de,CallType as Qn}from"@galacticcouncil/xc-core";import{Binary as qn}from"polkadot-api";import{concatMap as ge,catchError as Xn,distinctUntilChanged as Jn,firstValueFrom as Yn,map as Zn,throwError as ts}from"rxjs";import{addr as Un,multiloc as kt,AssetAmount as jn}from"@galacticcouncil/xc-core";import{acc as Kn,enums as Hn}from"@galacticcouncil/common";import{Blake2256 as Ln,u32 as zn}from"@polkadot-api/substrate-bindings";import{toHex as Gn,fromHex as ue}from"@polkadot-api/utils";import{Enum as le}from"polkadot-api";var{Ss58Addr:me}=Un,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 jn.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=zn.enc(a),o=l=>new TextEncoder().encode(l),i=new Uint8Array([...o(this.chain.parachainId.toString()),...ue(t.startsWith("0x")?t.slice(2):t),...r,...ue(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),c=Ln(i);return Gn(c)}async dryRun(t,e){let s=le("Signed",t),n=le("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: "+Hn.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 oe(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=kt.findNestedKey(a,"interior"),o=kt.findParachain(a);if(kt.findGlobalConsensus(a))return t;if(o){let c=Kn.getSovereignAccounts(o);return this.chain.parachainId===0?me.encodePubKey(c.relay):me.encodePubKey(c.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var Ct=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,o=await this.useSignerFee(s)?{asset:new $n(s)}:void 0,i=n.getTx(a.client),c=n.module+"."+n.func,l=await i.getEncodedData();return{from:t,data:qn.toHex(l),type:Qn.Substrate,txOptions:o,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),o=await a.estimateDeliveryFee(t,n),i=await this.exchangeFee(r+o,s),c=await Dt(i,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return Yn(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:o}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe(Zn(({value:l})=>l)).pipe(ge(l=>o(l)),Jn((l,m)=>l===m),ge(async l=>{let m=await Dt(l,t,s);return de.fromAsset(t,m)}),Xn(l=>(console.error("subscribe fails for:",t),ts(()=>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,o=de.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};import{multiloc as pe}from"@galacticcouncil/xc-core";import{Binary as es,Enum as _t}from"polkadot-api";var fe=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=es.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(o=>{o.signSubmitAndWatch(this.#e,r).subscribe({next:i=>{i.type==="broadcasted"&&e.onTransactionSend(i.txHash),i.type==="finalized"&&e.onFinalized(i)},error:i=>{e.onError(i)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=pe.findPalletInstance(e),n=pe.findGeneralIndex(e);return{parents:0,interior:_t("X2",[_t("PalletInstance",Number(s)),_t("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as ss,Wormhole as as}from"@galacticcouncil/xc-core";import{Transaction as rs}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as os}from"@mysten/sui/utils";import{toBase64 as is}from"@mysten/bcs";import{encoding as cs,serialize as us,toChainId as ls}from"@wormhole-foundation/sdk-connect";import{deserialize as ms}from"@wormhole-foundation/sdk-definitions";import{getPackageId as he}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as ds}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as ns}from"@mysten/bcs";function At(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(),o=l=>{let m=ns(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)}},i=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return o(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"?i(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 ye=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=as.fromChain(this.#t),n=this.#t.client,a=cs.b64.decode(e),r=ms("TokenBridge:Transfer",a),o=s.getCoreBridge(),i=s.getTokenBridge(),c=await ds(n,i,r.payload.token.address.toUint8Array(),ls(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([he(n,o),he(n,i)]),d=new rs;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",us(r)),d.object(os)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(i),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(i),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 S=await d.build({client:n}),A=await d.toJSON(),y=At(JSON.parse(A));return{from:t,commands:y,data:is(S),type:ss.Sui}}};import{AssetAmount as fs,CallType as hs}from"@galacticcouncil/xc-core";import{toBase64 as ys}from"@mysten/bcs";import{distinctUntilChanged as Cs,finalize as As,shareReplay as bs,Subject as ws}from"rxjs";var bt=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 gs}from"@mysten/sui/utils";var ps=9,wt=class extends bt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:gs});return BigInt(e.totalBalance)}async getDecimals(){return ps}};var vt=class{static get(t,e){switch(e.module){case"Native":return new wt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var St=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}),o=await a.toJSON(),i=At(JSON.parse(o));return{from:t,commands:i,data:ys(r),type:hs.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}),i=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(i.computationCost),l=BigInt(i.storageCost),m=c+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=vt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return fs.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new ws,n=s.pipe(bs(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let i=setInterval(()=>{},3e3);return()=>clearInterval(i)},r;return a().then(o=>r=o),n.pipe(As(()=>r?.()),Cs((o,i)=>o.amount===i.amount))}};import{Ed25519Keypair as vs}from"@mysten/sui/keypairs/ed25519";import{Transaction as Ss}from"@mysten/sui/transactions";var 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 vs){let i=Ss.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:i,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"}),o=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(o.digest)}catch(r){e.onError(r)}}};var V=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 ot(e)}registerSolana(t){let e=t;this.platform.Solana=new mt(e)}registerSui(t){let e=t;this.platform.Sui=new St(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new Ct(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 Is,AssetAmount as Vt,Parachain as Fs}from"@galacticcouncil/xc-core";import{acc as Ds,big as Se}from"@galacticcouncil/common";import{big as xs}from"@galacticcouncil/common";import Q from"big.js";function Ae(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 be(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 D(u,t){return t.isEvmParachain()?t.getDerivatedAddress(u):u}function we(u,t){return t?xs.toBigInt(t,u):0n}import{addr as Ts,AssetAmount as Ps,Parachain as ve}from"@galacticcouncil/xc-core";import{big as Bs}from"@galacticcouncil/common";var{EvmAddr:Es}=Ts,U=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof ve)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),o=Es.isValid(r.toString())?await D(t,e):t,i=s.source.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}async getMin(){let{chain:t,route:e}=this.config,{source:s}=e,n=s.asset,a=s.min;if(t instanceof ve&&a){let r=t.getMinAssetId(n),o=a.build({asset:r});return this.adapter.getBalance(n,o)}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),o=0n;return a&&(o=Bs.toBigInt(a,r)),Ps.fromAsset(n,{amount:o,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:xe}=Is,q=class extends U{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,o=s.destinationFee.asset||n.fee.asset,i=await this.getDecimals(o);if(Number.isFinite(r))return{fee:Vt.fromAsset(o,{amount:Se.toBigInt(r,i),decimals:i}),feeBreakdown:{}};let c=r,{amount:l,breakdown:m}=await c.build({feeAsset:o,transferAsset:s.asset,source:a?a.chain:t,destination:n.chain});return{fee:Vt.fromAsset(o,{amount:l,decimals:i}),feeBreakdown:m}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,o=n.destinationFee.asset||a.fee.asset;if(r.isEqual(o))return this.getBalance(t);let i=e.getBalanceAssetId(o),c=xe.isValid(i.toString())?await D(t,e):t,l=n.destinationFee.balance.build({address:c,asset:o,chain:e});return this.adapter.getBalance(o,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),i=s.contract?await D(a,e):a,c=await this.adapter.estimateFee(i,n,r.feeBalance,o),{fee:l}=s.source,m=l?we(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),o=xe.isValid(r.toString())?await D(t,e):t,i=n.fee.balance.build({address:o,asset:a,chain:e});return this.adapter.getBalance(a,i)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let o=a.asset;return e instanceof Fs&&"build"in o?await o.build({chain:e,address:t}):o}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:o}=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 i=n||r||o;if(i)return i.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),o=a.getTx(r.client),i=e.source.chain,c=e.sender,l=Ds.getMultilocationDerivatedAccount(i.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await o.getPaymentInfo(l),d=await o.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=Se.toBigInt(e.amount,s);return Vt.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 U{constructor(t,e){super(t,e)}};import{SNOWBRIDGE_BASE_DISPATCH_GAS as Rs,SNOWBRIDGE_BASE_VERIFICATION_GAS as ks,SNOWBRIDGE_FIAT_SHAMIR_GAS as _s,SNOWBRIDGE_SUBMIT_GAS as Pe,calculateVolumeTipInWei as Vs}from"@galacticcouncil/xc-core";var Os=Pe+ks+Rs,Ms=_s-Pe;function Be(u,t,e,s,n,a){s.volumeTipWei=Vs(a),Ie(u,t,e,s,n)}function Ee(u,t,e,s,n,a){if(n==="outbound"){if(a){let r=e.breakdown.etherFeeAmount;s.accelerationTipWei=r*Ms/Os}else s.accelerationTipWei=0n;Ie(u,t,e,s,n)}}function Ie(u,t,e,s,n){let a=s.accelerationTipWei+s.volumeTipWei,r=t.destination.fee;if(n==="inbound"){let d={...e.breakdown,relayerFee:e.breakdown.relayerFee+a,volumeTip:s.volumeTipWei,accelerationTip:s.accelerationTipWei},g=r.copyWith({amount:e.amount+a});Te(u,t,g,d);return}let o=e.breakdown.etherFeeAmount,i=e.breakdown.dotToEtherSwapAmount,c=a*i/o,l={...e.breakdown,etherFeeAmount:o+a,dotToEtherSwapAmount:i+c,volumeTip:s.volumeTipWei,accelerationTip:s.accelerationTipWei},m=r.copyWith({amount:e.amount+c});Te(u,t,m,l)}function Te(u,t,e,s){t.destination.feeBreakdown=s,t.destination.fee=e,t.source.destinationFee=e,u.destination.fee=e,u.source.destinationFee=e}import{AssetAmount as Ws}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:Ws.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:zs}=Us,Ot=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=js(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),o=this.config.getChain(s);if(!(r.isSubstrate()&&o.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([T.create(r),T.create(o)]),m=new yt(c,l),d=Ns.getMultilocationDerivatedAccount(r.parachainId,t,1,o.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 V(n.chain),o=new V(a.chain),i=new q(r,n),c=new X(o,a),l=new Ks(...this.validations),[m,d,g,p,f,h,S]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),c.getBalance(s),c.getMin()]),{source:A,destination:y}=n.route,x=g.fee.copyWith(y.fee.asset),B=g.feeBreakdown,K=A.asset.isEqual(x)&&x.amount>10n?x.amount+1n:10n,C={address:s,amount:K,asset:A.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}};C.transact=await i.getTransact(C);let P=new J(C),b=await i.getFee(C),E;P.isSwapSupported(A.fee)&&(E=await P.getSwap(b),C.source.feeSwap=E);let I;P.isDestinationSwapSupported(b)&&(I=await P.getDestinationSwap(b),C.source.destinationFeeSwap=I),(E||I)&&(b=await i.getFee(C),b=b.padByPct(5n));let Y=await c.getEd(),Tt=be(h,x,S,Y),v=await i.getEd(),Z=Ae(m,b,f,v);C.amount=0n,C.source.fee=b;let k={source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:I,fee:b,feeBalance:d,feeSwap:E,max:Z,min:m.copyWith({amount:Tt.amount})},destination:{balance:h,fee:x},async buildCall(F){let w=Object.assign({},C);return w.amount=Fe.toBigInt(F,m.decimals),w.transact=await i.getTransact(w),i.getCall(w)},async estimateFee(F){let w=Object.assign({},C);return w.amount=Fe.toBigInt(F,m.decimals),w.transact=await i.getTransact(w),i.getFee(w)},async validate(F){let w=Object.assign({},C),tt=F||b.amount;return w.source.fee=b.copyWith({amount:tt}),l.validate(w)}};if(n.route.tags?.includes("Snowbridge")){let F=n.chain.isEvmChain()?"inbound":"outbound",w={amount:x.amount,breakdown:{...B}},tt={accelerationTipWei:0n,volumeTipWei:0n};k.applySnowbridgeVolumeFee=Pt=>{Be(k,C,w,tt,F,Pt)},k.applySnowbridgeAcceleration=Pt=>{Ee(k,C,w,tt,F,Pt)}}return k}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new V(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:l,balance:m}=c,d=n.chain.getBalanceAssetId(l),g=zs.isValid(d.toString())?await D(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),o=await Promise.all(r);return Hs(o).pipe(Ls(500)).subscribe(s)}};import{ConfigBuilder as Gs}from"@galacticcouncil/xc-core";function $s(u){let t=Gs(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:o,destinationAssets:i,isAssetSelect:c,isTagSelect:l,build:m}=a.destination(r);return{routes:o,destinationAssets:i,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 Qs}from"@galacticcouncil/xc-core";var qs="https://api.wormholescan.io",xt=class{_baseUrl;constructor(t){this._baseUrl=t||qs}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===Qs.Bridge}};import{acc as Xs}from"@galacticcouncil/common";import{mrl as Js,ChainType as Re,Parachain as Ys,Precompile as Zs,Wormhole as j}from"@galacticcouncil/xc-core";import{encoding as ta}from"@wormhole-foundation/sdk-base";import{keccak256 as ea}from"@wormhole-foundation/sdk-connect";import{deserialize as na}from"@wormhole-foundation/sdk-definitions";var De=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(De||{});var sa=300*1e3,ke=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new xt}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=Xs.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:o,standarizedProperties:i}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof Ys&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=i,g=this.chains.find(f=>j.isKnown(f)&&j.fromChain(f).getWormholeId()===o.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 Re.EvmChain:let S=new et(g);p=async y=>S.redeem(y,h);break;case Re.SolanaChain:let A=new pt(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:Zs.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,o=(await Js.createPayload(a,t)).toHex(),i=s.filter(c=>{let{content:l}=c,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===o}).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=>j.isKnown(y)&&j.fromChain(y).getWormholeId()===d.tokenChain),S=this.chains.find(y=>j.isKnown(y)&&j.fromChain(y).getWormholeId()===d.toChain),A;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),x=c.vaa.raw;if(this.isStuck(y)){let B=new ft(S);A=async R=>B.redeemMrlViaXcm(R,x)}}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(i)}isStuck(t){return Date.now()>=t*1e3+sa}getVaaHeader(t){let e=ta.b64.decode(t),s=na("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:ea(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Kt as DISPATCH_ADDRESS,et as EvmClaim,ot as EvmPlatform,Ht as EvmSigner,J as FeeSwap,V as PlatformAdapter,pt as SolanaClaim,W as SolanaLilJit,mt as SolanaPlatform,ae as SolanaSigner,ft as SubstrateClaim,yt as SubstrateExec,Ct as SubstratePlatform,T as SubstrateService,fe as SubstrateSigner,ye as SuiClaim,St as SuiPlatform,Ce as SuiSigner,$s as TransferBuilder,Ot as Wallet,De as WhStatus,xt as WormholeScan,ke as WormholeTransfer,Xt as chunkBySize,Rr as deserializeV0,_ as ixToHuman,z 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
+ */
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;
@@ -0,0 +1,26 @@
1
+ import { TransferCtx } from '@galacticcouncil/xc-core';
2
+ import { Transfer, VolumeFeeOpts } from '../types';
3
+ export type SnowbridgeDirection = 'inbound' | 'outbound';
4
+ export type VolumeFeeBase = {
5
+ amount: bigint;
6
+ breakdown: {
7
+ [key: string]: bigint;
8
+ };
9
+ };
10
+ export type SnowbridgeFeeState = {
11
+ accelerationTipWei: bigint;
12
+ volumeTipWei: bigint;
13
+ };
14
+ /**
15
+ * Apply the Snowbridge V2 volume-based fee tip. This is the standard relayer
16
+ * fee in V2 — must be called after every Snowbridge transfer build. Replaces
17
+ * any prior volume tip; composes with acceleration.
18
+ */
19
+ export declare function applySnowbridgeVolumeFee(transfer: Transfer, ctx: TransferCtx, base: VolumeFeeBase, state: SnowbridgeFeeState, direction: SnowbridgeDirection, opts: VolumeFeeOpts): void;
20
+ /**
21
+ * Toggle Snowbridge V2 acceleration. When enabled, the destination fee is
22
+ * bumped by the gas delta needed to pay a relayer for Fiat-Shamir submission
23
+ * instead of two-phase. Outbound only — inbound is paid as native Ethereum
24
+ * gas on the user's wallet at submission time.
25
+ */
26
+ export declare function applySnowbridgeAcceleration(transfer: Transfer, ctx: TransferCtx, base: VolumeFeeBase, state: SnowbridgeFeeState, direction: SnowbridgeDirection, enabled: boolean): void;
package/build/types.d.ts CHANGED
@@ -1,5 +1,13 @@
1
1
  import { AssetAmount, SwapCtx, TransferValidationReport } from '@galacticcouncil/xc-core';
2
2
  import { Call } from './platforms';
3
+ /**
4
+ * Volume-based fee inputs (Snowbridge V2).
5
+ */
6
+ export interface VolumeFeeOpts {
7
+ txValueUsd: bigint;
8
+ ethToUsdNumerator: bigint;
9
+ ethToUsdDenominator: bigint;
10
+ }
3
11
  /**
4
12
  * Transfer source data
5
13
  *
@@ -48,4 +56,6 @@ export interface Transfer {
48
56
  buildCall(amount: bigint | number | string): Promise<Call>;
49
57
  estimateFee(amount: bigint | number | string): Promise<AssetAmount>;
50
58
  validate(fee?: bigint): Promise<TransferValidationReport[]>;
59
+ applySnowbridgeVolumeFee?(opts: VolumeFeeOpts): void;
60
+ applySnowbridgeAcceleration?(enabled: boolean): void;
51
61
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/xc-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.1.0-pr297-8b9bc60",
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": "^1.0.0"
36
+ "@galacticcouncil/xc-core": "1.1.0-pr297-8b9bc60"
37
37
  }
38
38
  }