@galacticcouncil/xc-sdk 1.3.0 → 1.4.0-pr344-9e041f4

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/Wallet.d.ts CHANGED
@@ -15,5 +15,21 @@ export declare class Wallet {
15
15
  srcFeeAsset?: Asset;
16
16
  }): Promise<SubstrateCall>;
17
17
  getTransferData(configs: TransferConfigs, srcAddress: string, dstAddress: string): Promise<Transfer>;
18
- subscribeBalance(address: string, chain: string | AnyChain, observer: (balances: AssetAmount[]) => void): Promise<Subscription>;
18
+ /**
19
+ * One-shot snapshot of every asset configured on a chain.
20
+ *
21
+ * Intended for balance lists (asset/chain pickers) that should fetch once and
22
+ * re-fetch on demand rather than hold N live subscriptions open. Chains that
23
+ * can serve the whole set in a single read do so; the rest fall back to a
24
+ * per-asset read, where a single failing asset can't blank the snapshot.
25
+ */
26
+ getBalances(address: string, chain: string | AnyChain): Promise<AssetAmount[]>;
27
+ /**
28
+ * Live subscription for an explicit set of assets on a chain.
29
+ *
30
+ * Only the given assets are subscribed — callers should narrow this to the
31
+ * asset(s) actually in view (e.g. the selected transfer asset) rather than the
32
+ * whole chain, since each asset holds an open subscription.
33
+ */
34
+ subscribeBalance(address: string, chain: string | AnyChain, assets: (string | Asset)[], observer: (balances: AssetAmount[]) => void): Promise<Subscription>;
19
35
  }
package/build/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var sn=Object.create;var vt=Object.defineProperty;var an=Object.getOwnPropertyDescriptor;var rn=Object.getOwnPropertyNames;var on=Object.getPrototypeOf,cn=Object.prototype.hasOwnProperty;var un=(o,t)=>{for(var e in t)vt(o,e,{get:t[e],enumerable:!0})},re=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rn(t))!cn.call(o,n)&&n!==e&&vt(o,n,{get:()=>t[n],enumerable:!(s=an(t,n))||s.enumerable});return o};var mn=(o,t,e)=>(e=o!=null?sn(on(o)):{},re(t||!o||!o.__esModule?vt(e,"default",{value:o,enumerable:!0}):e,o)),ln=o=>re(vt({},"__esModule",{value:!0}),o);var An={};un(An,{DISPATCH_ADDRESS:()=>Ut,EvmClaim:()=>st,EvmPlatform:()=>rt,EvmSigner:()=>jt,FeeSwap:()=>et,PlatformAdapter:()=>L,SolanaClaim:()=>ut,SolanaLilJit:()=>H,SolanaPlatform:()=>ot,SolanaSigner:()=>Gt,SubstrateClaim:()=>mt,SubstrateExec:()=>dt,SubstratePlatform:()=>pt,SubstrateService:()=>B,SubstrateSigner:()=>Yt,SuiClaim:()=>te,SuiPlatform:()=>ft,SuiSigner:()=>ee,TransferBuilder:()=>qe,Wallet:()=>Vt,WhStatus:()=>se,WormholeScan:()=>xt,WormholeTransfer:()=>ae,chunk:()=>Lt,deserializeV0:()=>pn,ixToHuman:()=>_,serializeV0:()=>z});module.exports=ln(An);var nt=require("@galacticcouncil/common"),Ot=require("@galacticcouncil/xc-core");var Q=require("@galacticcouncil/xc-core");var St=require("@galacticcouncil/xc-core"),ie=require("viem"),Kt=require("@wormhole-foundation/sdk-base"),st=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=St.Wormhole.fromChain(this.#t),n=Kt.encoding.b64.decode(e),a=Kt.encoding.hex.encode(n),r=St.Abi.TokenBridge,c=(0,ie.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:c,from:t,to:s.getTokenBridge()}}};var K=require("@galacticcouncil/xc-core");var Tt=require("viem"),Pt=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 Tt.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(),c=await this.getNonce(t);try{let{results:m}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:c}]}),[i]=m;return i}catch(m){return console.log(`Can't simulate call!
3
- `,m.details),{error:m}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Tt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var at=class{static get(t,e){return new Pt(t,e)}};var oe=require("@galacticcouncil/xc-core"),ce=require("viem");function Ht(o){return o.module==="Snowbridge"&&o.func==="v2_sendMessage"}function ue(o){if(!Ht(o))return;let t=o.args[1];if(!t||t.length===0)return;let[e,s]=(0,ce.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function me(o){let t=o.module==="Snowbridge"&&o.func==="v2_sendMessage"&&Array.isArray(o.args[1])&&o.args[1].length===0,e=o.module==="Snowbridge"&&o.func==="sendToken"&&o.args[0]==="0x0000000000000000000000000000000000000000";return o.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(o.func)||t||e}function le(o){return Object.entries(oe.Precompile).map(([e,s])=>s).includes(o.address)}var rt=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=at.get(this.#t,n),{abi:r,asset:c,calldata:m}=a,i={abi:JSON.stringify(r),data:m,from:t,to:n.address,type:K.CallType.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),C=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:C}}};if(le(n)||me(n))return i;let l=Ht(n)?ue(n):c,u=new K.Erc20Client(this.#t,l),d=await u.allowance(t,n.address);if(d>=e)return i;let g=u.approve(n.address,e);return{abi:JSON.stringify(K.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:K.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await at.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}};var de=require("@galacticcouncil/xc-core"),ge=require("@galacticcouncil/common"),pe=require("polkadot-api"),Ut="0x0000000000000000000000000000000000000401",{H160:dn}=ge.h160,jt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=dn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof de.EvmParachain)try{let c=this.#t.client,m=pe.Binary.fromHex(t.data);await c.getUnsafeApi().txFromCallData(m),a=!0}catch{}let r;if(a){let[c,m]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Ut}),n.getGasPrice()]),i=m+m/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:i,maxFeePerGas:i,gas:c*11n/10n,to:Ut})}else{let{data:c,to:m,value:i}=t,[l,u]=await Promise.all([n.estimateGas({account:s,data:c,to:m,value:i}),n.getGasPrice()]),d=u+u*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:c,to:m,value:i,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(c=>e.onTransactionReceipt(c)).catch(c=>e.onError(c))}};var xe=require("@galacticcouncil/xc-core"),be=require("buffer");var F=require("@solana/web3.js"),fe=.5,he=2,ye=1,Ce=1e6,gn=25e4,Et=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 F.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new F.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=fe,s=he,n=ye,a=Ce){let[r,c]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[F.ComputeBudgetProgram.setComputeUnitLimit({units:r}),F.ComputeBudgetProgram.setComputeUnitPrice({microLamports:c})]}async simulateTransaction(t,e){let s=new F.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new F.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):gn}async determinePriorityFee(t,e=fe,s=he,n=ye,a=Ce){let r=n,c=await this.getTxAccounts(t),m=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:c});if(m){let i=m.map(u=>u.prioritizationFee).filter(u=>u>0).sort((u,d)=>u-d),l=Math.ceil(i.length*e);if(i.length>l){let d=i[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 it=class{static get(t,e){return new Et(t,e)}};var Ae=require("@solana/web3.js");function _(o){return o.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Lt(o,t){let e=[];for(let s=0;s<o.length;s+=t)e.push(o.slice(s,s+t));return e}function z(o){let t=o.serialize();return Buffer.from(t).toString("hex")}function pn(o){let t=Buffer.from(o,"hex"),e=Uint8Array.from(t);return Ae.MessageV0.deserialize(e)}var ot=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=it.get(this.#t,n),r=await a.getPriorityMessage(t),c=r.serialize(),m=be.Buffer.from(c).toString("hex");return{from:t,data:m,ix:_(n.instructions),signers:n.signers,type:xe.CallType.Solana,dryRun:async()=>{let{err:i,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:i,events:l}}}}async estimateFee(t,e,s,n){let a=it.get(this.#t,n),r=await a.estimateFee(t,e),c=await a.getPriorityMessage(t),{accounts:m}=await a.simulateTransaction(t,c),l=(m&&m[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})}};var U=require("@galacticcouncil/xc-core"),T=require("@solana/web3.js"),y=require("@solana/spl-token"),we=require("@wormhole-foundation/sdk-solana"),zt=require("@wormhole-foundation/sdk-solana-core"),ve=require("@wormhole-foundation/sdk-base"),$t=require("@wormhole-foundation/sdk-definitions"),ct=require("@wormhole-foundation/sdk-solana-tokenbridge");var H=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 ut=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new H(t)}async redeem(t,e,s){let n=U.Wormhole.fromChain(this.#t),a=ve.encoding.b64.decode(e),r=(0,$t.deserialize)("TokenBridge:Transfer",a),c=(0,$t.deserialize)("Uint8Array",a),m=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),i=new T.PublicKey(t),l=s?new T.PublicKey(s):i,u=i.equals(l),d=[];if(!await this.#e.getAccountInfo(m)){let h=T.Keypair.generate(),O=await zt.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),i,c,h.publicKey),E=Lt(O,2);for(let A=0;A<E.length;A++){let I=E[A],v=await this.getV0Message(i,I),k=z(v);d.push({from:t,data:k,ix:_(I),signers:[h],type:U.CallType.Solana})}let D=zt.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),i,c,h.publicKey),bt=await this.getV0Message(i,[D]),R=z(bt);d.push({from:t,data:R,ix:_([D]),type:U.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new T.PublicKey(r.payload.token.address.toUint8Array()),C=p&&f.equals(y.NATIVE_MINT),w=await this.#n.getTipAccount(),x=T.SystemProgram.transfer({fromPubkey:i,toPubkey:new T.PublicKey(w[0]),lamports:1e3});if(C&&u){let h=await this.redeemAndUnwrap(n,i,r,x);d.push(h)}else{let h=await this.redeemToken(n,i,l,f,p,r,x);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,c){let i=(a?ct.createCompleteTransferNativeInstruction:ct.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=(0,y.getAssociatedTokenAddressSync)(n,s),u=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,l,s,n),d=await this.getV0Message(e,[u,i,c]),g=z(d);return{from:e.toBase58(),data:g,ix:_([u,i]),type:U.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new T.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,y.getMint)(this.#e,y.NATIVE_MINT),c=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),m=await(0,y.getMinimumBalanceForRentExemptAccount)(this.#e),i=T.Keypair.generate(),l=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,y.NATIVE_MINT),u=(0,ct.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=T.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:i.publicKey,lamports:m,space:y.ACCOUNT_SIZE,programId:y.TOKEN_PROGRAM_ID}),g=(0,y.createInitializeAccountInstruction)(i.publicKey,y.NATIVE_MINT,e),p=(0,y.createTransferInstruction)(a,i.publicKey,e,c),f=(0,y.createCloseAccountInstruction)(i.publicKey,e,e),C=[l,u,d,g,p,f,n],w=await this.getV0Message(e,C),x=z(w);return{from:e.toBase58(),data:x,ix:_(C),signers:[i],type:U.CallType.Solana}}derivePostedVaaKey(t,e){return we.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"),Bt=require("buffer");var Gt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new H(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 i=await this.#t.connection.sendTransaction(a);e.onTransactionSend(i);let l=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:c}=await r.signAndSendTransaction(a);e.onTransactionSend(c);let m=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(m)}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(m=>m.sign([this.#e])),n=s.map(m=>Bt.Buffer.from(m.serialize()).toString("base64"));else{let m=this.#e;await m.connect(),n=(await m.signAllTransactions(s)).map(l=>Bt.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 c=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(c.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Bt.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 V=require("@galacticcouncil/xc-core"),Xt=require("@wormhole-foundation/sdk-base"),Se=require("viem"),Jt=require("polkadot-api"),mt=class{#t;constructor(t){this.#t=t,V.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=Xt.encoding.b64.decode(e),n=Xt.encoding.hex.encode(s),a=V.Abi.Gmp,r=(0,Se.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:V.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),c=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:Jt.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Jt.Binary.toHex(c),from:t,type:V.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var It=require("@galacticcouncil/xc-core"),lt=require("polkadot-api");var Pe=require("@galacticcouncil/common");async function Te(o,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:Pe.big.convertDecimals(o,a,n),decimals:n}}var Ee=require("@galacticcouncil/common"),Be=o=>{let t=[];for(let e of o)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)},$=o=>{let t=o.value.error;return t.type==="Module"?Ee.enums.enumPath(t.value):JSON.stringify(t.value)};var Ft=require("@galacticcouncil/common");function fn(o){return{parents:0,interior:{type:"X1",value:o.startsWith("0x")?Ft.xcm.toAccountKey20(o):Ft.xcm.toAccountId32(o)}}}function Fe(o){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:o.parachainId}}}}}var hn=(o,t)=>({id:Ft.xcm.transform(o),fun:{type:"Fungible",value:t}}),Ie=(o,t,e,s,n,a)=>{console.log(a);let r=fn(o),c=hn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[c]},{type:"BuyExecution",value:{fees:c,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 dt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,c=await this.#t.getAsset(),m=this.#e.api,i=this.#e.chain,l=await i.getCurrency(),u=l.asset,d=l.decimals,g=i.getAssetXcmLocation(u),p=lt.Binary.fromHex(s.data),C=await(await m.txFromCallData(p)).getPaymentInfo(e),w=BigInt(C.partial_fee)*120n/100n,x=It.AssetAmount.fromAsset(u,{amount:w,decimals:d}),h=C.weight.ref_time,O=C.weight.proof_size,E=Fe(i),D=Ie(e,g,x,h,O,p),bt=r.tx.PolkadotXcm.send({dest:E,message:D}),R=[];try{let S=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||c,u,x,10),wt=lt.Binary.fromHex(S),Wt=await r.txFromCallData(wt);R.push(Wt)}catch{}let A=await n(x),I=lt.Binary.fromHex(A.data),v=await r.txFromCallData(I);R.push(v),R.push(bt);let k=R.map(S=>S.decodedCall),M=r.tx.Utility.batch_all({calls:k}),Mt=await M.getEncodedData();return{from:t,data:lt.Binary.toHex(Mt),type:It.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let S=await this.#t.dryRun(t,M);return{call:"polkadotXcm.send",error:S.execution_result&&S.execution_result.success?void 0:$(S.execution_result),events:S.emitted_events||[],xcm:S.forwarded_xcms||[]}}catch(S){return{call:"polkadotXcm.send",error:S instanceof Error?S.message:"unknown"}}}:()=>{}}}};var X=require("@galacticcouncil/xc-core"),Re=require("polkadot-api");var G=require("@galacticcouncil/xc-core"),Dt=require("@galacticcouncil/common"),Rt=require("@polkadot-api/substrate-bindings"),gt=require("@polkadot-api/utils"),qt=require("polkadot-api");var{Ss58Addr:De}=G.addr,B=class o{chain;_currency;constructor(t){this.chain=t}static async create(t){return new o(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}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Rt.u32.enc(a),c=l=>new TextEncoder().encode(l),m=new Uint8Array([...c(this.chain.parachainId.toString()),...(0,gt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,gt.fromHex)(s.startsWith("0x")?s.slice(2):s),...c(n),...c(e.toString())]),i=(0,Rt.Blake2256)(m);return(0,gt.toHex)(i)}async dryRun(t,e){let s=(0,qt.Enum)("Signed",t),n=(0,qt.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: "+Dt.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 Be(a.emitted_events||[]);{let r=$(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=G.multiloc.findNestedKey(a,"interior"),c=G.multiloc.findParachain(a);if(G.multiloc.findGlobalConsensus(a))return t;if(c){let l=Dt.acc.getSovereignAccounts(c);return this.chain.parachainId===0?De.encodePubKey(l.relay):De.encodePubKey(l.generic)}let i=r&&r.interior;if(i==="Here"||i?.type==="Here")return this.chain.treasury||t}return t}};var pt=class{#t;constructor(t){this.#t=B.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,c=await this.useSignerFee(s)?{asset:new X.Asset(s)}:void 0,m=n.getTx(a.client),i=n.module+"."+n.func,l=await m.getEncodedData();return{from:t,data:Re.Binary.toHex(l),type:X.CallType.Substrate,txOptions:c,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:$(d.execution_result);return{call:i,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(u){return{call:i,error:u instanceof Error?u.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),c=await a.estimateDeliveryFee(t,n),m=await this.exchangeFee(r+c,s),i=await Te(m,s,a);return s.copyWith(i)}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,c=X.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,c,!0)).amount}catch{}return t}};var Qt=require("@galacticcouncil/xc-core"),J=require("polkadot-api"),Yt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=J.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(c=>{c.signSubmitAndWatch(this.#e,r).subscribe({next:m=>{m.type==="broadcasted"&&e.onTransactionSend(m.txHash),m.type==="finalized"&&e.onFinalized(m)},error:m=>{e.onError(m)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=Qt.multiloc.findPalletInstance(e),n=Qt.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,J.Enum)("X2",[(0,J.Enum)("PalletInstance",Number(s)),(0,J.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var _t=require("@galacticcouncil/xc-core"),_e=require("@mysten/sui/transactions"),Ve=require("@mysten/sui/utils"),Oe=require("@mysten/bcs"),q=require("@wormhole-foundation/sdk-connect"),Me=require("@wormhole-foundation/sdk-definitions"),Zt=require("@wormhole-foundation/sdk-sui"),We=require("@wormhole-foundation/sdk-sui-tokenbridge");var ke=require("@mysten/bcs");function kt(o,t={}){let e=o.inputs??[],s=o.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),c=l=>{let u=(0,ke.fromBase64)(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)}},m=l=>{let u=e[l];if(!u)return{Input:l};if(u.Pure?.bytes)return c(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}},i=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?m(l.Input):l;return s.map(l=>{if(l.MoveCall){let u=l.MoveCall;return{MoveCall:{...u,arguments:(u.arguments??[]).map(i)}}}if(l.SplitCoins){let u=l.SplitCoins,d=u.coin?.GasCoin?"GasCoin":i(u.coin),g=(u.amounts??[]).map(i);return{SplitCoins:[d,g]}}if(l.MergeCoins){let u=l.MergeCoins;return{MergeCoins:{...u,destination:i(u.destination),sources:(u.sources??[]).map(i)}}}if(l.TransferObjects){let u=l.TransferObjects;return{TransferObjects:{...u,objects:(u.objects??[]).map(i),address:i(u.address)}}}return l})}var te=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=_t.Wormhole.fromChain(this.#t),n=this.#t.client,a=q.encoding.b64.decode(e),r=(0,Me.deserialize)("TokenBridge:Transfer",a),c=s.getCoreBridge(),m=s.getTokenBridge(),i=await(0,We.getTokenCoinType)(n,m,r.payload.token.address.toUint8Array(),(0,q.toChainId)(r.payload.token.chain));if(!i)throw new Error("Unable to fetch token coinType");let[l,u]=await Promise.all([(0,Zt.getPackageId)(n,c),(0,Zt.getPackageId)(n,m)]),d=new _e.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(c),d.pure.vector("u8",(0,q.serialize)(r)),d.object(Ve.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${u}::vaa::verify_only_once`,arguments:[d.object(m),g]}),[f]=d.moveCall({target:`${u}::complete_transfer::authorize_transfer`,arguments:[d.object(m),p],typeArguments:[i]}),[C]=d.moveCall({target:`${u}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[i]});d.moveCall({target:`${u}::coin_utils::return_nonzero`,arguments:[C],typeArguments:[i]});let w=await d.build({client:n}),x=await d.toJSON(),h=kt(JSON.parse(x));return{from:t,commands:h,data:(0,Oe.toBase64)(w),type:_t.CallType.Sui}}};var Ne=require("@galacticcouncil/xc-core"),Ke=require("@mysten/bcs");var ft=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}),c=await a.toJSON(),m=kt(JSON.parse(c));return{from:t,commands:m,data:(0,Ke.toBase64)(r),type:Ne.CallType.Sui,dryRun:async()=>{let i=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:i.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),m=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,i=BigInt(m.computationCost),l=BigInt(m.storageCost),u=i+l;return s.copyWith({amount:u})}};var He=require("@mysten/sui/keypairs/ed25519"),Ue=require("@mysten/sui/transactions"),ee=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 He.Ed25519Keypair){let m=Ue.Transaction.from(n),i=await a.signAndExecuteTransaction({signer:this.#e,transaction:m,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),c=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest)}catch(r){e.onError(r)}}};var L=class{platform={};constructor(t){switch(t.getType()){case Q.ChainType.EvmChain:this.registerEvm(t);break;case Q.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case Q.ChainType.Parachain:this.registerSubstrate(t);break;case Q.ChainType.SolanaChain:this.registerSolana(t);break;case Q.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new rt(e)}registerSolana(t){let e=t;this.platform.Solana=new ot(e)}registerSui(t){let e=t;this.platform.Sui=new ft(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new pt(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)}};var tt=require("@galacticcouncil/xc-core"),yt=require("@galacticcouncil/common");var je=require("@galacticcouncil/common"),Y=mn(require("big.js"),1);function Le(o,t,e,s){let n=o.toBig().minus(e.toBig()).minus(o.isSame(t)?t.toBig():new Y.default(0));return s&&(n=n.minus(o.isSame(s)?s.toBig():new Y.default(0))),o.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function ze(o,t,e,s){let a=o.copyWith({amount:0n}).toBig().plus(o.isSame(t)?t.toBig():new Y.default(0)).plus(o.toBig().lt(e.toBig())?e.toBig():new Y.default(0));return s&&(a=a.plus(o.isSame(s)&&o.toBig().lt(s.toBig())?s.toBig():new Y.default(0))),o.copyWith({amount:BigInt(a.toFixed())})}async function $e(o,t){return t.isEvmParachain()?t.getDerivatedAddress(o):o}function Ge(o,t){return t?je.big.toBigInt(t,o):0n}async function ne(o,t){let e=o.getAssetDecimals(t);return e||(await o.getCurrency()).decimals}var ht=require("@galacticcouncil/xc-core");var Z=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof ht.Parachain?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof ht.Parachain)return this.chain.getMin(this.asset);let t=await ne(this.chain,this.asset);return ht.AssetAmount.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return ne(this.chain,t)}};var Ct=class extends Z{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,c=a.fee.amount,m=n.destinationFee??a.fee.asset,i=await this.getDecimals(m);if(Number.isFinite(c))return{fee:tt.AssetAmount.fromAsset(m,{amount:yt.big.toBigInt(c,i),decimals:i}),feeBreakdown:{}};let l=c,{amount:u,breakdown:d}=await l.build({feeAsset:m,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:tt.AssetAmount.fromAsset(m,{amount:u,decimals:i}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,a=e.destinationFee??s.fee.asset;return n.isEqual(a)?this.getBalance(t):this.config.chain.getBalance(a,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,c=await this.getTransfer(t),m=s.contract?await $e(a,e):a,i=await this.adapter.estimateFee(m,n,r.feeBalance,c),{fee:l}=s.source,u=l?Ge(i.decimals,l.extra):0n,d=i.amount+u;return i.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let c=a.asset;return e instanceof tt.Parachain&&"build"in c?await c.build({chain:e,address:t}):c}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:c}=s;if(a){let{address:i,amount:l,asset:u,sender:d}=t,p=await(await B.create(e)).buildMessageId(d,l,u.originSymbol,i);return a.build({...t,messageId:p})}let m=n||r||c;if(m)return m.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 B.create(s),c=a.getTx(r.client),m=e.source.chain,i=e.sender,l=yt.acc.getMultilocationDerivatedAccount(m.parachainId,i,s.parachainId===0?0:1,s.usesH160Acc),u=await c.getPaymentInfo(l),d=await c.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=yt.big.toBigInt(e.amount,s);return tt.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var At=class extends Z{};var Xe=require("@galacticcouncil/xc-core"),et=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:Xe.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 Vt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,Ot.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),c=this.config.getChain(s);if(!(r.isSubstrate()&&c.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[i,l]=await Promise.all([B.create(r),B.create(c)]),u=new dt(i,l),d=nt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,c.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return u.remoteExec(t,d,n,f=>{let C=f.toDecimal();return p.buildCall(C)},a)}async getTransferData(t,e,s){let n=t.origin,{chain:a,asset:r}=n.route.destination,c=new L(n.chain),m=new L(a),i=new Ct(c,n),l=new At(m,a,r),u=new Ot.TransferValidator(...this.validations),[d,g,p,f,C,w,x]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),l.getBalance(s),l.getMin()]),{source:h,destination:O}=n.route,E=p.fee.copyWith(O.fee.asset),D=p.feeBreakdown,R=h.asset.isEqual(E)&&E.amount>10n?E.amount+1n:10n,A={address:s,amount:R,asset:h.asset,destination:{balance:w,chain:a,fee:E,feeBreakdown:D},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:p.fee,destinationFeeBalance:f}};A.transact=await i.getTransact(A);let I=new et(A),v=await i.getFee(A),k;I.isSwapSupported(h.fee)&&(k=await I.getSwap(v),A.source.feeSwap=k);let M;I.isDestinationSwapSupported(v)&&(M=await I.getDestinationSwap(v),A.source.destinationFeeSwap=M),(k||M)&&(v=await i.getFee(A),v=v.padByPct(5n));let Mt=await l.getEd(),S=ze(w,E,x,Mt),wt=await i.getEd(),Wt=Le(d,v,C,wt);A.amount=0n,A.source.fee=v;let Nt={source:{balance:d,destinationFee:p.fee,destinationFeeBalance:f,destinationFeeSwap:M,fee:v,feeBalance:g,feeSwap:k,max:Wt,min:d.copyWith({amount:S.amount})},destination:{balance:w,fee:E},reversible:t.reversible,async buildCall(W){let P=Object.assign({},A);return P.amount=nt.big.toBigInt(W,d.decimals),P.transact=await i.getTransact(P),i.getCall(P)},async estimateFee(W){let P=Object.assign({},A);return P.amount=nt.big.toBigInt(W,d.decimals),P.transact=await i.getTransact(P),i.getFee(P)},async estimateDestinationFee(W){let P=nt.big.toBigInt(W,d.decimals),{fee:N,feeBreakdown:nn}=await i.getDestinationFee(P);return A.destination.fee=N,A.destination.feeBreakdown=nn,A.source.destinationFee=N,Nt.destination.fee=N,Nt.source.destinationFee=N,N},async validate(W){let P=Object.assign({},A),N=W||v.amount;return P.source.fee=v.copyWith({amount:N}),u.validate(P)}};return Nt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=n.getUniqueRoutes().map(r=>r.source.asset);return n.chain.subscribeBalances(a,t).subscribe(s)}};var Je=require("@galacticcouncil/xc-core");function qe(o){let t=(0,Je.ConfigBuilder)(o.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:c,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build:u}=a.destination(r);return{routes:c,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let C=u(p,f);return o.getTransferData(C,d,g)}}}}}}}}}var Qe=require("@galacticcouncil/xc-core"),yn="https://api.wormholescan.io",xt=class{_baseUrl;constructor(t){this._baseUrl=t||yn}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===Qe.Precompile.Bridge}};var Ye=require("@galacticcouncil/common"),b=require("@galacticcouncil/xc-core"),Ze=require("@wormhole-foundation/sdk-base"),tn=require("@wormhole-foundation/sdk-connect"),en=require("@wormhole-foundation/sdk-definitions");var se=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(se||{});var Cn=300*1e3,ae=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=Ye.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:c,standarizedProperties:m}=r,i=this.getStatus(a),l=this.chains.find(f=>f instanceof b.Parachain&&f.parachainId===this.parachainId),{toAddress:u,tokenAddress:d}=m,g=this.chains.find(f=>b.Wormhole.isKnown(f)&&b.Wormhole.fromChain(f).getWormholeId()===c.tokenChain),p;if(i===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),C=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case b.ChainType.EvmChain:let w=new st(g);p=async h=>w.redeem(h,C);break;case b.ChainType.SolanaChain:let x=new ut(g);p=async h=>x.redeem(h,C);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:u,toChain:g,status:i,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:b.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,c=(await b.mrl.createPayload(a,t)).toHex(),m=s.filter(i=>{let{content:l}=i,{payload:u}=l;return u.payloadType===3&&u.toChain===16&&"0x"+u.payload===c}).map(async i=>{let{content:l,sourceChain:u}=i,{payload:d,standarizedProperties:g}=l,p=this.getStatus(i),{tokenAddress:f}=g,C=this.chains.find(h=>b.Wormhole.isKnown(h)&&b.Wormhole.fromChain(h).getWormholeId()===d.tokenChain),w=this.chains.find(h=>b.Wormhole.isKnown(h)&&b.Wormhole.fromChain(h).getWormholeId()===d.toChain),x;if(p===1&&i.vaa){let{timestamp:h}=this.getVaaHeader(i.vaa.raw),O=i.vaa.raw;if(this.isStuck(h)){let E=new mt(w);x=async D=>E.redeemMrlViaXcm(D,O)}}return{asset:f,assetSymbol:i.data.symbol,amount:i.data.tokenAmount,from:u.from,fromChain:C,to:t,toChain:n,status:p,redeem:x,operation:i}});return Promise.all(m)}isStuck(t){return Date.now()>=t*1e3+Cn}getVaaHeader(t){let e=Ze.encoding.b64.decode(t),s=(0,en.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,tn.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,chunk,deserializeV0,ixToHuman,serializeV0});
1
+ "use strict";var sn=Object.create;var vt=Object.defineProperty;var an=Object.getOwnPropertyDescriptor;var rn=Object.getOwnPropertyNames;var on=Object.getPrototypeOf,cn=Object.prototype.hasOwnProperty;var un=(o,t)=>{for(var e in t)vt(o,e,{get:t[e],enumerable:!0})},re=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rn(t))!cn.call(o,n)&&n!==e&&vt(o,n,{get:()=>t[n],enumerable:!(s=an(t,n))||s.enumerable});return o};var mn=(o,t,e)=>(e=o!=null?sn(on(o)):{},re(t||!o||!o.__esModule?vt(e,"default",{value:o,enumerable:!0}):e,o)),ln=o=>re(vt({},"__esModule",{value:!0}),o);var xn={};un(xn,{DISPATCH_ADDRESS:()=>jt,EvmClaim:()=>st,EvmPlatform:()=>rt,EvmSigner:()=>Ut,FeeSwap:()=>nt,PlatformAdapter:()=>z,SolanaClaim:()=>ut,SolanaLilJit:()=>j,SolanaPlatform:()=>ot,SolanaSigner:()=>Gt,SubstrateClaim:()=>mt,SubstrateExec:()=>dt,SubstratePlatform:()=>pt,SubstrateService:()=>E,SubstrateSigner:()=>Yt,SuiClaim:()=>te,SuiPlatform:()=>ft,SuiSigner:()=>ee,TransferBuilder:()=>qe,Wallet:()=>Vt,WhStatus:()=>se,WormholeScan:()=>xt,WormholeTransfer:()=>ae,chunk:()=>Lt,deserializeV0:()=>pn,ixToHuman:()=>_,serializeV0:()=>$});module.exports=ln(xn);var O=require("@galacticcouncil/common"),Ot=require("@galacticcouncil/xc-core");var Y=require("@galacticcouncil/xc-core");var St=require("@galacticcouncil/xc-core"),ie=require("viem"),Kt=require("@wormhole-foundation/sdk-base"),st=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=St.Wormhole.fromChain(this.#t),n=Kt.encoding.b64.decode(e),a=Kt.encoding.hex.encode(n),r=St.Abi.TokenBridge,c=(0,ie.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:c,from:t,to:s.getTokenBridge()}}};var H=require("@galacticcouncil/xc-core");var Tt=require("viem"),Pt=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 Tt.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(),c=await this.getNonce(t);try{let{results:u}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:c}]}),[i]=u;return i}catch(u){return console.log(`Can't simulate call!
3
+ `,u.details),{error:u}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Tt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var at=class{static get(t,e){return new Pt(t,e)}};var oe=require("@galacticcouncil/xc-core"),ce=require("viem");function Ht(o){return o.module==="Snowbridge"&&o.func==="v2_sendMessage"}function ue(o){if(!Ht(o))return;let t=o.args[1];if(!t||t.length===0)return;let[e,s]=(0,ce.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function me(o){let t=o.module==="Snowbridge"&&o.func==="v2_sendMessage"&&Array.isArray(o.args[1])&&o.args[1].length===0,e=o.module==="Snowbridge"&&o.func==="sendToken"&&o.args[0]==="0x0000000000000000000000000000000000000000";return o.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(o.func)||t||e}function le(o){return Object.entries(oe.Precompile).map(([e,s])=>s).includes(o.address)}var rt=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=at.get(this.#t,n),{abi:r,asset:c,calldata:u}=a,i={abi:JSON.stringify(r),data:u,from:t,to:n.address,type:H.CallType.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),C=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:C}}};if(le(n)||me(n))return i;let l=Ht(n)?ue(n):c,m=new H.Erc20Client(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return i;let g=m.approve(n.address,e);return{abi:JSON.stringify(H.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:H.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await at.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}};var de=require("@galacticcouncil/xc-core"),ge=require("@galacticcouncil/common"),pe=require("polkadot-api"),jt="0x0000000000000000000000000000000000000401",{H160:dn}=ge.h160,Ut=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=dn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof de.EvmParachain)try{let c=this.#t.client,u=pe.Binary.fromHex(t.data);await c.getUnsafeApi().txFromCallData(u),a=!0}catch{}let r;if(a){let[c,u]=await Promise.all([n.estimateGas({account:s,data:t.data,to:jt}),n.getGasPrice()]),i=u+u/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:i,maxFeePerGas:i,gas:c*11n/10n,to:jt})}else{let{data:c,to:u,value:i}=t,[l,m]=await Promise.all([n.estimateGas({account:s,data:c,to:u,value:i}),n.getGasPrice()]),d=m+m*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:c,to:u,value:i,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(c=>e.onTransactionReceipt(c)).catch(c=>e.onError(c))}};var xe=require("@galacticcouncil/xc-core"),be=require("buffer");var F=require("@solana/web3.js"),fe=.5,he=2,ye=1,Ce=1e6,gn=25e4,Bt=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 F.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new F.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=fe,s=he,n=ye,a=Ce){let[r,c]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[F.ComputeBudgetProgram.setComputeUnitLimit({units:r}),F.ComputeBudgetProgram.setComputeUnitPrice({microLamports:c})]}async simulateTransaction(t,e){let s=new F.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new F.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):gn}async determinePriorityFee(t,e=fe,s=he,n=ye,a=Ce){let r=n,c=await this.getTxAccounts(t),u=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:c});if(u){let i=u.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(i.length*e);if(i.length>l){let d=i[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 it=class{static get(t,e){return new Bt(t,e)}};var Ae=require("@solana/web3.js");function _(o){return o.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Lt(o,t){let e=[];for(let s=0;s<o.length;s+=t)e.push(o.slice(s,s+t));return e}function $(o){let t=o.serialize();return Buffer.from(t).toString("hex")}function pn(o){let t=Buffer.from(o,"hex"),e=Uint8Array.from(t);return Ae.MessageV0.deserialize(e)}var ot=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=it.get(this.#t,n),r=await a.getPriorityMessage(t),c=r.serialize(),u=be.Buffer.from(c).toString("hex");return{from:t,data:u,ix:_(n.instructions),signers:n.signers,type:xe.CallType.Solana,dryRun:async()=>{let{err:i,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:i,events:l}}}}async estimateFee(t,e,s,n){let a=it.get(this.#t,n),r=await a.estimateFee(t,e),c=await a.getPriorityMessage(t),{accounts:u}=await a.simulateTransaction(t,c),l=(u&&u[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})}};var U=require("@galacticcouncil/xc-core"),T=require("@solana/web3.js"),y=require("@solana/spl-token"),we=require("@wormhole-foundation/sdk-solana"),zt=require("@wormhole-foundation/sdk-solana-core"),ve=require("@wormhole-foundation/sdk-base"),$t=require("@wormhole-foundation/sdk-definitions"),ct=require("@wormhole-foundation/sdk-solana-tokenbridge");var j=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 ut=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new j(t)}async redeem(t,e,s){let n=U.Wormhole.fromChain(this.#t),a=ve.encoding.b64.decode(e),r=(0,$t.deserialize)("TokenBridge:Transfer",a),c=(0,$t.deserialize)("Uint8Array",a),u=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),i=new T.PublicKey(t),l=s?new T.PublicKey(s):i,m=i.equals(l),d=[];if(!await this.#e.getAccountInfo(u)){let h=T.Keypair.generate(),M=await zt.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),i,c,h.publicKey),B=Lt(M,2);for(let A=0;A<B.length;A++){let I=B[A],v=await this.getV0Message(i,I),k=$(v);d.push({from:t,data:k,ix:_(I),signers:[h],type:U.CallType.Solana})}let D=zt.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),i,c,h.publicKey),bt=await this.getV0Message(i,[D]),R=$(bt);d.push({from:t,data:R,ix:_([D]),type:U.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new T.PublicKey(r.payload.token.address.toUint8Array()),C=p&&f.equals(y.NATIVE_MINT),w=await this.#n.getTipAccount(),x=T.SystemProgram.transfer({fromPubkey:i,toPubkey:new T.PublicKey(w[0]),lamports:1e3});if(C&&m){let h=await this.redeemAndUnwrap(n,i,r,x);d.push(h)}else{let h=await this.redeemToken(n,i,l,f,p,r,x);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,c){let i=(a?ct.createCompleteTransferNativeInstruction:ct.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=(0,y.getAssociatedTokenAddressSync)(n,s),m=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,l,s,n),d=await this.getV0Message(e,[m,i,c]),g=$(d);return{from:e.toBase58(),data:g,ix:_([m,i]),type:U.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new T.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,y.getMint)(this.#e,y.NATIVE_MINT),c=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),u=await(0,y.getMinimumBalanceForRentExemptAccount)(this.#e),i=T.Keypair.generate(),l=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,y.NATIVE_MINT),m=(0,ct.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=T.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:i.publicKey,lamports:u,space:y.ACCOUNT_SIZE,programId:y.TOKEN_PROGRAM_ID}),g=(0,y.createInitializeAccountInstruction)(i.publicKey,y.NATIVE_MINT,e),p=(0,y.createTransferInstruction)(a,i.publicKey,e,c),f=(0,y.createCloseAccountInstruction)(i.publicKey,e,e),C=[l,m,d,g,p,f,n],w=await this.getV0Message(e,C),x=$(w);return{from:e.toBase58(),data:x,ix:_(C),signers:[i],type:U.CallType.Solana}}derivePostedVaaKey(t,e){return we.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 L=require("@solana/web3.js"),Et=require("buffer");var Gt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new j(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof L.Keypair){a.sign([this.#e]);let i=await this.#t.connection.sendTransaction(a);e.onTransactionSend(i);let l=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:c}=await r.signAndSendTransaction(a);e.onTransactionSend(c);let u=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(u)}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 L.Keypair)s.forEach(u=>u.sign([this.#e])),n=s.map(u=>Et.Buffer.from(u.serialize()).toString("base64"));else{let u=this.#e;await u.connect(),n=(await u.signAllTransactions(s)).map(l=>Et.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 c=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(c.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Et.Buffer.from(t,"hex"),n=Uint8Array.from(s),a=L.MessageV0.deserialize(n),r=new L.VersionedTransaction(a);return e&&r.sign(e),r}};var V=require("@galacticcouncil/xc-core"),Xt=require("@wormhole-foundation/sdk-base"),Se=require("viem"),Jt=require("polkadot-api"),mt=class{#t;constructor(t){this.#t=t,V.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=Xt.encoding.b64.decode(e),n=Xt.encoding.hex.encode(s),a=V.Abi.Gmp,r=(0,Se.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:V.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),c=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:Jt.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Jt.Binary.toHex(c),from:t,type:V.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var It=require("@galacticcouncil/xc-core"),lt=require("polkadot-api");var Pe=require("@galacticcouncil/common");async function Te(o,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:Pe.big.convertDecimals(o,a,n),decimals:n}}var Be=require("@galacticcouncil/common"),Ee=o=>{let t=[];for(let e of o)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)},G=o=>{let t=o.value.error;return t.type==="Module"?Be.enums.enumPath(t.value):JSON.stringify(t.value)};var Ft=require("@galacticcouncil/common");function fn(o){return{parents:0,interior:{type:"X1",value:o.startsWith("0x")?Ft.xcm.toAccountKey20(o):Ft.xcm.toAccountId32(o)}}}function Fe(o){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:o.parachainId}}}}}var hn=(o,t)=>({id:Ft.xcm.transform(o),fun:{type:"Fungible",value:t}}),Ie=(o,t,e,s,n,a)=>{console.log(a);let r=fn(o),c=hn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[c]},{type:"BuyExecution",value:{fees:c,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 dt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,c=await this.#t.getAsset(),u=this.#e.api,i=this.#e.chain,l=await i.getCurrency(),m=l.asset,d=l.decimals,g=i.getAssetXcmLocation(m),p=lt.Binary.fromHex(s.data),C=await(await u.txFromCallData(p)).getPaymentInfo(e),w=BigInt(C.partial_fee)*120n/100n,x=It.AssetAmount.fromAsset(m,{amount:w,decimals:d}),h=C.weight.ref_time,M=C.weight.proof_size,B=Fe(i),D=Ie(e,g,x,h,M,p),bt=r.tx.PolkadotXcm.send({dest:B,message:D}),R=[];try{let S=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||c,m,x,10),wt=lt.Binary.fromHex(S),Wt=await r.txFromCallData(wt);R.push(Wt)}catch{}let A=await n(x),I=lt.Binary.fromHex(A.data),v=await r.txFromCallData(I);R.push(v),R.push(bt);let k=R.map(S=>S.decodedCall),W=r.tx.Utility.batch_all({calls:k}),Mt=await W.getEncodedData();return{from:t,data:lt.Binary.toHex(Mt),type:It.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let S=await this.#t.dryRun(t,W);return{call:"polkadotXcm.send",error:S.execution_result&&S.execution_result.success?void 0:G(S.execution_result),events:S.emitted_events||[],xcm:S.forwarded_xcms||[]}}catch(S){return{call:"polkadotXcm.send",error:S instanceof Error?S.message:"unknown"}}}:()=>{}}}};var J=require("@galacticcouncil/xc-core"),Re=require("polkadot-api");var X=require("@galacticcouncil/xc-core"),Dt=require("@galacticcouncil/common"),Rt=require("@polkadot-api/substrate-bindings"),gt=require("@polkadot-api/utils"),qt=require("polkadot-api");var{Ss58Addr:De}=X.addr,E=class o{chain;_currency;constructor(t){this.chain=t}static async create(t){return new o(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}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Rt.u32.enc(a),c=l=>new TextEncoder().encode(l),u=new Uint8Array([...c(this.chain.parachainId.toString()),...(0,gt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,gt.fromHex)(s.startsWith("0x")?s.slice(2):s),...c(n),...c(e.toString())]),i=(0,Rt.Blake2256)(u);return(0,gt.toHex)(i)}async dryRun(t,e){let s=(0,qt.Enum)("Signed",t),n=(0,qt.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: "+Dt.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 Ee(a.emitted_events||[]);{let r=G(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=X.multiloc.findNestedKey(a,"interior"),c=X.multiloc.findParachain(a);if(X.multiloc.findGlobalConsensus(a))return t;if(c){let l=Dt.acc.getSovereignAccounts(c);return this.chain.parachainId===0?De.encodePubKey(l.relay):De.encodePubKey(l.generic)}let i=r&&r.interior;if(i==="Here"||i?.type==="Here")return this.chain.treasury||t}return t}};var pt=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,c=await this.useSignerFee(s)?{asset:new J.Asset(s)}:void 0,u=n.getTx(a.client),i=n.module+"."+n.func,l=await u.getEncodedData();return{from:t,data:Re.Binary.toHex(l),type:J.CallType.Substrate,txOptions:c,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:G(d.execution_result);return{call:i,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:i,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),c=await a.estimateDeliveryFee(t,n),u=await this.exchangeFee(r+c,s),i=await Te(u,s,a);return s.copyWith(i)}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,c=J.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,c,!0)).amount}catch{}return t}};var Qt=require("@galacticcouncil/xc-core"),q=require("polkadot-api"),Yt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=q.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(c=>{c.signSubmitAndWatch(this.#e,r).subscribe({next:u=>{u.type==="broadcasted"&&e.onTransactionSend(u.txHash),u.type==="finalized"&&e.onFinalized(u)},error:u=>{e.onError(u)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=Qt.multiloc.findPalletInstance(e),n=Qt.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,q.Enum)("X2",[(0,q.Enum)("PalletInstance",Number(s)),(0,q.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var _t=require("@galacticcouncil/xc-core"),_e=require("@mysten/sui/transactions"),Ve=require("@mysten/sui/utils"),Oe=require("@mysten/bcs"),Q=require("@wormhole-foundation/sdk-connect"),Me=require("@wormhole-foundation/sdk-definitions"),Zt=require("@wormhole-foundation/sdk-sui"),We=require("@wormhole-foundation/sdk-sui-tokenbridge");var ke=require("@mysten/bcs");function kt(o,t={}){let e=o.inputs??[],s=o.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),c=l=>{let m=(0,ke.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)}},u=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return c(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}},i=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?u(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(i)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":i(m.coin),g=(m.amounts??[]).map(i);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:i(m.destination),sources:(m.sources??[]).map(i)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(i),address:i(m.address)}}}return l})}var te=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=_t.Wormhole.fromChain(this.#t),n=this.#t.client,a=Q.encoding.b64.decode(e),r=(0,Me.deserialize)("TokenBridge:Transfer",a),c=s.getCoreBridge(),u=s.getTokenBridge(),i=await(0,We.getTokenCoinType)(n,u,r.payload.token.address.toUint8Array(),(0,Q.toChainId)(r.payload.token.chain));if(!i)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([(0,Zt.getPackageId)(n,c),(0,Zt.getPackageId)(n,u)]),d=new _e.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(c),d.pure.vector("u8",(0,Q.serialize)(r)),d.object(Ve.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(u),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(u),p],typeArguments:[i]}),[C]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[i]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[C],typeArguments:[i]});let w=await d.build({client:n}),x=await d.toJSON(),h=kt(JSON.parse(x));return{from:t,commands:h,data:(0,Oe.toBase64)(w),type:_t.CallType.Sui}}};var Ne=require("@galacticcouncil/xc-core"),Ke=require("@mysten/bcs");var ft=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}),c=await a.toJSON(),u=kt(JSON.parse(c));return{from:t,commands:u,data:(0,Ke.toBase64)(r),type:Ne.CallType.Sui,dryRun:async()=>{let i=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:i.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),u=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,i=BigInt(u.computationCost),l=BigInt(u.storageCost),m=i+l;return s.copyWith({amount:m})}};var He=require("@mysten/sui/keypairs/ed25519"),je=require("@mysten/sui/transactions"),ee=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 He.Ed25519Keypair){let u=je.Transaction.from(n),i=await a.signAndExecuteTransaction({signer:this.#e,transaction:u,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),c=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest)}catch(r){e.onError(r)}}};var z=class{platform={};constructor(t){switch(t.getType()){case Y.ChainType.EvmChain:this.registerEvm(t);break;case Y.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case Y.ChainType.Parachain:this.registerSubstrate(t);break;case Y.ChainType.SolanaChain:this.registerSolana(t);break;case Y.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new rt(e)}registerSolana(t){let e=t;this.platform.Solana=new ot(e)}registerSui(t){let e=t;this.platform.Sui=new ft(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new pt(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)}};var et=require("@galacticcouncil/xc-core"),yt=require("@galacticcouncil/common");var Ue=require("@galacticcouncil/common"),Z=mn(require("big.js"),1);function Le(o,t,e,s){let n=o.toBig().minus(e.toBig()).minus(o.isSame(t)?t.toBig():new Z.default(0));return s&&(n=n.minus(o.isSame(s)?s.toBig():new Z.default(0))),o.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function ze(o,t,e,s){let a=o.copyWith({amount:0n}).toBig().plus(o.isSame(t)?t.toBig():new Z.default(0)).plus(o.toBig().lt(e.toBig())?e.toBig():new Z.default(0));return s&&(a=a.plus(o.isSame(s)&&o.toBig().lt(s.toBig())?s.toBig():new Z.default(0))),o.copyWith({amount:BigInt(a.toFixed())})}async function $e(o,t){return t.isEvmParachain()?t.getDerivatedAddress(o):o}function Ge(o,t){return t?Ue.big.toBigInt(t,o):0n}async function ne(o,t){let e=o.getAssetDecimals(t);return e||(await o.getCurrency()).decimals}var ht=require("@galacticcouncil/xc-core");var tt=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof ht.Parachain?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof ht.Parachain)return this.chain.getMin(this.asset);let t=await ne(this.chain,this.asset);return ht.AssetAmount.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return ne(this.chain,t)}};var Ct=class extends tt{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,c=a.fee.amount,u=n.destinationFee??a.fee.asset,i=await this.getDecimals(u);if(Number.isFinite(c))return{fee:et.AssetAmount.fromAsset(u,{amount:yt.big.toBigInt(c,i),decimals:i}),feeBreakdown:{}};let l=c,{amount:m,breakdown:d}=await l.build({feeAsset:u,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:et.AssetAmount.fromAsset(u,{amount:m,decimals:i}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,a=e.destinationFee??s.fee.asset;return n.isEqual(a)?this.getBalance(t):this.config.chain.getBalance(a,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,c=await this.getTransfer(t),u=s.contract?await $e(a,e):a,i=await this.adapter.estimateFee(u,n,r.feeBalance,c),{fee:l}=s.source,m=l?Ge(i.decimals,l.extra):0n,d=i.amount+m;return i.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let c=a.asset;return e instanceof et.Parachain&&"build"in c?await c.build({chain:e,address:t}):c}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:c}=s;if(a){let{address:i,amount:l,asset:m,sender:d}=t,p=await(await E.create(e)).buildMessageId(d,l,m.originSymbol,i);return a.build({...t,messageId:p})}let u=n||r||c;if(u)return u.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),c=a.getTx(r.client),u=e.source.chain,i=e.sender,l=yt.acc.getMultilocationDerivatedAccount(u.parachainId,i,s.parachainId===0?0:1,s.usesH160Acc),m=await c.getPaymentInfo(l),d=await c.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=yt.big.toBigInt(e.amount,s);return et.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var At=class extends tt{};var Xe=require("@galacticcouncil/xc-core"),nt=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:Xe.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{logger:yn}=O.log,Vt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,Ot.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),c=this.config.getChain(s);if(!(r.isSubstrate()&&c.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[i,l]=await Promise.all([E.create(r),E.create(c)]),m=new dt(i,l),d=O.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,c.usesH160Acc),g=await l.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,{chain:a,asset:r}=n.route.destination,c=new z(n.chain),u=new z(a),i=new Ct(c,n),l=new At(u,a,r),m=new Ot.TransferValidator(...this.validations),[d,g,p,f,C,w,x]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),l.getBalance(s),l.getMin()]),{source:h,destination:M}=n.route,B=p.fee.copyWith(M.fee.asset),D=p.feeBreakdown,R=h.asset.isEqual(B)&&B.amount>10n?B.amount+1n:10n,A={address:s,amount:R,asset:h.asset,destination:{balance:w,chain:a,fee:B,feeBreakdown:D},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:p.fee,destinationFeeBalance:f}};A.transact=await i.getTransact(A);let I=new nt(A),v=await i.getFee(A),k;I.isSwapSupported(h.fee)&&(k=await I.getSwap(v),A.source.feeSwap=k);let W;I.isDestinationSwapSupported(v)&&(W=await I.getDestinationSwap(v),A.source.destinationFeeSwap=W),(k||W)&&(v=await i.getFee(A),v=v.padByPct(5n));let Mt=await l.getEd(),S=ze(w,B,x,Mt),wt=await i.getEd(),Wt=Le(d,v,C,wt);A.amount=0n,A.source.fee=v;let Nt={source:{balance:d,destinationFee:p.fee,destinationFeeBalance:f,destinationFeeSwap:W,fee:v,feeBalance:g,feeSwap:k,max:Wt,min:d.copyWith({amount:S.amount})},destination:{balance:w,fee:B},reversible:t.reversible,async buildCall(N){let P=Object.assign({},A);return P.amount=O.big.toBigInt(N,d.decimals),P.transact=await i.getTransact(P),i.getCall(P)},async estimateFee(N){let P=Object.assign({},A);return P.amount=O.big.toBigInt(N,d.decimals),P.transact=await i.getTransact(P),i.getFee(P)},async estimateDestinationFee(N){let P=O.big.toBigInt(N,d.decimals),{fee:K,feeBreakdown:nn}=await i.getDestinationFee(P);return A.destination.fee=K,A.destination.feeBreakdown=nn,A.source.destinationFee=K,Nt.destination.fee=K,Nt.source.destinationFee=K,K},async validate(N){let P=Object.assign({},A),K=N||v.amount;return P.source.fee=v.copyWith({amount:K}),m.validate(P)}};return Nt}async getBalances(t,e){let s=this.config.getChain(e);return s.getBalances(s.getAssets(),t)}async subscribeBalance(t,e,s,n){let a=this.config.getChain(e),r=s.flatMap(c=>{let u=typeof c=="string"?c:c.key,i=a.getAsset(u);return i?[i]:(yn.warn(`Asset ${u} not configured on ${a.key}, skipping balance subscription`),[])});if(s.length>0&&r.length===0)throw new Error(`No assets configured on ${a.key} for any requested: `+s.map(c=>typeof c=="string"?c:c.key).join(", "));return a.subscribeBalances(r,t).subscribe(n)}};var Je=require("@galacticcouncil/xc-core");function qe(o){let t=(0,Je.ConfigBuilder)(o.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:c,destinationAssets:u,isAssetSelect:i,isTagSelect:l,build:m}=a.destination(r);return{routes:c,destinationAssets:u,isAssetSelect:i,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let C=m(p,f);return o.getTransferData(C,d,g)}}}}}}}}}var Qe=require("@galacticcouncil/xc-core"),Cn="https://api.wormholescan.io",xt=class{_baseUrl;constructor(t){this._baseUrl=t||Cn}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===Qe.Precompile.Bridge}};var Ye=require("@galacticcouncil/common"),b=require("@galacticcouncil/xc-core"),Ze=require("@wormhole-foundation/sdk-base"),tn=require("@wormhole-foundation/sdk-connect"),en=require("@wormhole-foundation/sdk-definitions");var se=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(se||{});var An=300*1e3,ae=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=Ye.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:c,standarizedProperties:u}=r,i=this.getStatus(a),l=this.chains.find(f=>f instanceof b.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=u,g=this.chains.find(f=>b.Wormhole.isKnown(f)&&b.Wormhole.fromChain(f).getWormholeId()===c.tokenChain),p;if(i===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),C=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case b.ChainType.EvmChain:let w=new st(g);p=async h=>w.redeem(h,C);break;case b.ChainType.SolanaChain:let x=new ut(g);p=async h=>x.redeem(h,C);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:i,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:b.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,c=(await b.mrl.createPayload(a,t)).toHex(),u=s.filter(i=>{let{content:l}=i,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===c}).map(async i=>{let{content:l,sourceChain:m}=i,{payload:d,standarizedProperties:g}=l,p=this.getStatus(i),{tokenAddress:f}=g,C=this.chains.find(h=>b.Wormhole.isKnown(h)&&b.Wormhole.fromChain(h).getWormholeId()===d.tokenChain),w=this.chains.find(h=>b.Wormhole.isKnown(h)&&b.Wormhole.fromChain(h).getWormholeId()===d.toChain),x;if(p===1&&i.vaa){let{timestamp:h}=this.getVaaHeader(i.vaa.raw),M=i.vaa.raw;if(this.isStuck(h)){let B=new mt(w);x=async D=>B.redeemMrlViaXcm(D,M)}}return{asset:f,assetSymbol:i.data.symbol,amount:i.data.tokenAmount,from:m.from,fromChain:C,to:t,toChain:n,status:p,redeem:x,operation:i}});return Promise.all(u)}isStuck(t){return Date.now()>=t*1e3+An}getVaaHeader(t){let e=Ze.encoding.b64.decode(t),s=(0,en.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,tn.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,chunk,deserializeV0,ixToHuman,serializeV0});
package/build/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{acc as Nn,big as wt}from"@galacticcouncil/common";import{ConfigBuilder as Kn,TransferValidator as Hn}from"@galacticcouncil/xc-core";import{ChainType as L}from"@galacticcouncil/xc-core";import{Abi as he,Wormhole as ye}from"@galacticcouncil/xc-core";import{encodeFunctionData as Ce}from"viem";import{encoding as St}from"@wormhole-foundation/sdk-base";var Q=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=ye.fromChain(this.#t),n=St.b64.decode(e),a=St.hex.encode(n),r=he.TokenBridge,o=Ce({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,from:t,to:s.getTokenBridge()}}};import{Abi as ve,CallType as Bt,Erc20Client as Se}from"@galacticcouncil/xc-core";import{ContractFunctionExecutionError as Ae,decodeEventLog as xe}from"viem";var Y=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 Ae?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:m}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[i]=m;return i}catch(m){return console.log(`Can't simulate call!
3
- `,m.details),{error:m}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=xe({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 Y(t,e)}};import{Precompile as be}from"@galacticcouncil/xc-core";import{decodeAbiParameters as we}from"viem";function ft(c){return c.module==="Snowbridge"&&c.func==="v2_sendMessage"}function Pt(c){if(!ft(c))return;let t=c.args[1];if(!t||t.length===0)return;let[e,s]=we([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Tt(c){let t=c.module==="Snowbridge"&&c.func==="v2_sendMessage"&&Array.isArray(c.args[1])&&c.args[1].length===0,e=c.module==="Snowbridge"&&c.func==="sendToken"&&c.args[0]==="0x0000000000000000000000000000000000000000";return c.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(c.func)||t||e}function Et(c){return Object.entries(be).map(([e,s])=>s).includes(c.address)}var Z=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:m}=a,i={abi:JSON.stringify(r),data:m,from:t,to:n.address,type:Bt.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),y=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:y}}};if(Et(n)||Tt(n))return i;let l=ft(n)?Pt(n):o,u=new Se(this.#t,l),d=await u.allowance(t,n.address);if(d>=e)return i;let g=u.approve(n.address,e);return{abi:JSON.stringify(ve.Erc20),allowance:d,data:g,from:t,to:l,type:Bt.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await K.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}};import{EvmParachain as Pe}from"@galacticcouncil/xc-core";import{h160 as Te}from"@galacticcouncil/common";import{Binary as Ee}from"polkadot-api";var Ft="0x0000000000000000000000000000000000000401",{H160:Be}=Te,It=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Be.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Pe)try{let o=this.#t.client,m=Ee.fromHex(t.data);await o.getUnsafeApi().txFromCallData(m),a=!0}catch{}let r;if(a){let[o,m]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Ft}),n.getGasPrice()]),i=m+m/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:i,maxFeePerGas:i,gas:o*11n/10n,to:Ft})}else{let{data:o,to:m,value:i}=t,[l,u]=await Promise.all([n.estimateGas({account:s,data:o,to:m,value:i}),n.getGasPrice()]),d=u+u*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:m,value:i,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};import{CallType as ke}from"@galacticcouncil/xc-core";import{Buffer as _e}from"buffer";import{ComputeBudgetProgram as Dt,PublicKey as Fe,TransactionMessage as Ie,VersionedTransaction as Rt}from"@solana/web3.js";var kt=.5,_t=2,Vt=1,Ot=1e6,De=25e4,tt=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 Fe(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Ie({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=kt,s=_t,n=Vt,a=Ot){let[r,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Dt.setComputeUnitLimit({units:r}),Dt.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new Rt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Rt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):De}async determinePriorityFee(t,e=kt,s=_t,n=Vt,a=Ot){let r=n,o=await this.getTxAccounts(t),m=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(m){let i=m.map(u=>u.prioritizationFee).filter(u=>u>0).sort((u,d)=>u-d),l=Math.ceil(i.length*e);if(i.length>l){let d=i[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 H=class{static get(t,e){return new tt(t,e)}};import{MessageV0 as Re}from"@solana/web3.js";function _(c){return c.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Mt(c,t){let e=[];for(let s=0;s<c.length;s+=t)e.push(c.slice(s,s+t));return e}function U(c){let t=c.serialize();return Buffer.from(t).toString("hex")}function Ys(c){let t=Buffer.from(c,"hex"),e=Uint8Array.from(t);return Re.deserialize(e)}var et=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=H.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),m=_e.from(o).toString("hex");return{from:t,data:m,ix:_(n.instructions),signers:n.signers,type:ke.Solana,dryRun:async()=>{let{err:i,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:i,events:l}}}}async estimateFee(t,e,s,n){let a=H.get(this.#t,n),r=await a.estimateFee(t,e),o=await a.getPriorityMessage(t),{accounts:m}=await a.simulateTransaction(t,o),l=(m&&m[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})}};import{CallType as nt,Wormhole as Ve}from"@galacticcouncil/xc-core";import{Keypair as Wt,PublicKey as j,SystemProgram as Nt,TransactionMessage as Oe}from"@solana/web3.js";import{ACCOUNT_SIZE as Me,NATIVE_MINT as st,TOKEN_PROGRAM_ID as We,createAssociatedTokenAccountIdempotentInstruction as Kt,createCloseAccountInstruction as Ne,createInitializeAccountInstruction as Ke,createTransferInstruction as He,getAssociatedTokenAddressSync as Ue,getMinimumBalanceForRentExemptAccount as je,getMint as Le}from"@solana/spl-token";import{utils as ze}from"@wormhole-foundation/sdk-solana";import{utils as Ht}from"@wormhole-foundation/sdk-solana-core";import{encoding as $e}from"@wormhole-foundation/sdk-base";import{deserialize as Ut}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as jt,createCompleteTransferWrappedInstruction as Ge}from"@wormhole-foundation/sdk-solana-tokenbridge";var V=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 at=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new V(t)}async redeem(t,e,s){let n=Ve.fromChain(this.#t),a=$e.b64.decode(e),r=Ut("TokenBridge:Transfer",a),o=Ut("Uint8Array",a),m=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),i=new j(t),l=s?new j(s):i,u=i.equals(l),d=[];if(!await this.#e.getAccountInfo(m)){let h=Wt.generate(),I=await Ht.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),i,o,h.publicKey),S=Mt(I,2);for(let C=0;C<S.length;C++){let T=S[C],b=await this.getV0Message(i,T),F=U(b);d.push({from:t,data:F,ix:_(T),signers:[h],type:nt.Solana})}let E=Ht.createPostVaaInstruction(this.#e,n.getCoreBridge(),i,o,h.publicKey),J=await this.getV0Message(i,[E]),B=U(J);d.push({from:t,data:B,ix:_([E]),type:nt.Solana})}let p=r.payload.token.chain==="Solana",f=new j(r.payload.token.address.toUint8Array()),y=p&&f.equals(st),x=await this.#n.getTipAccount(),A=Nt.transfer({fromPubkey:i,toPubkey:new j(x[0]),lamports:1e3});if(y&&u){let h=await this.redeemAndUnwrap(n,i,r,A);d.push(h)}else{let h=await this.redeemToken(n,i,l,f,p,r,A);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,o){let i=(a?jt:Ge)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=Ue(n,s),u=Kt(e,l,s,n),d=await this.getV0Message(e,[u,i,o]),g=U(d);return{from:e.toBase58(),data:g,ix:_([u,i]),type:nt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new j(s.payload.to.address.toUint8Array()),r=await Le(this.#e,st),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),m=await je(this.#e),i=Wt.generate(),l=Kt(e,a,e,st),u=jt(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Nt.createAccount({fromPubkey:e,newAccountPubkey:i.publicKey,lamports:m,space:Me,programId:We}),g=Ke(i.publicKey,st,e),p=He(a,i.publicKey,e,o),f=Ne(i.publicKey,e,e),y=[l,u,d,g,p,f,n],x=await this.getV0Message(e,y),A=U(x);return{from:e.toBase58(),data:A,ix:_(y),signers:[i],type:nt.Solana}}derivePostedVaaKey(t,e){return ze.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new Oe({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as Lt,MessageV0 as Xe,VersionedTransaction as Je}from"@solana/web3.js";import{Buffer as ht}from"buffer";var zt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new V(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof Lt){a.sign([this.#e]);let i=await this.#t.connection.sendTransaction(a);e.onTransactionSend(i);let l=await this.#t.connection.getSignatureStatus(i);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 m=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(m)}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 Lt)s.forEach(m=>m.sign([this.#e])),n=s.map(m=>ht.from(m.serialize()).toString("base64"));else{let m=this.#e;await m.connect(),n=(await m.signAllTransactions(s)).map(l=>ht.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=ht.from(t,"hex"),n=Uint8Array.from(s),a=Xe.deserialize(n),r=new Je(a);return e&&r.sign(e),r}};import{Abi as qe,CallType as Qe,Precompile as Ye,Wormhole as Ze}from"@galacticcouncil/xc-core";import{encoding as $t}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as tn}from"viem";import{Binary as Gt}from"polkadot-api";var rt=class{#t;constructor(t){this.#t=t,Ze.fromChain(this.#t)}redeemMrl(t,e){let s=$t.b64.decode(e),n=$t.hex.encode(s),a=qe.Gmp,r=tn({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Ye.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],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:Gt.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Gt.toHex(o),from:t,type:Qe.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as rn,CallType as on}from"@galacticcouncil/xc-core";import{Binary as it}from"polkadot-api";import{big as en}from"@galacticcouncil/common";async function Xt(c,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:en.convertDecimals(c,a,n),decimals:n}}import{enums as nn}from"@galacticcouncil/common";var Jt=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)},O=c=>{let t=c.value.error;return t.type==="Module"?nn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as yt}from"@galacticcouncil/common";function sn(c){return{parents:0,interior:{type:"X1",value:c.startsWith("0x")?yt.toAccountKey20(c):yt.toAccountId32(c)}}}function qt(c){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:c.parachainId}}}}}var an=(c,t)=>({id:yt.transform(c),fun:{type:"Fungible",value:t}}),Qt=(c,t,e,s,n,a)=>{console.log(a);let r=sn(c),o=an(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 ot=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(),m=this.#e.api,i=this.#e.chain,l=await i.getCurrency(),u=l.asset,d=l.decimals,g=i.getAssetXcmLocation(u),p=it.fromHex(s.data),y=await(await m.txFromCallData(p)).getPaymentInfo(e),x=BigInt(y.partial_fee)*120n/100n,A=rn.fromAsset(u,{amount:x,decimals:d}),h=y.weight.ref_time,I=y.weight.proof_size,S=qt(i),E=Qt(e,g,A,h,I,p),J=r.tx.PolkadotXcm.send({dest:S,message:E}),B=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,u,A,10),q=it.fromHex(w),gt=await r.txFromCallData(q);B.push(gt)}catch{}let C=await n(A),T=it.fromHex(C.data),b=await r.txFromCallData(T);B.push(b),B.push(J);let F=B.map(w=>w.decodedCall),D=r.tx.Utility.batch_all({calls:F}),dt=await D.getEncodedData();return{from:t,data:it.toHex(dt),type:on.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,D);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:O(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 pn,AssetAmount as fn,CallType as hn}from"@galacticcouncil/xc-core";import{Binary as yn}from"polkadot-api";import{addr as cn,multiloc as Ct}from"@galacticcouncil/xc-core";import{acc as un,enums as mn}from"@galacticcouncil/common";import{Blake2256 as ln,u32 as dn}from"@polkadot-api/substrate-bindings";import{toHex as gn,fromHex as Yt}from"@polkadot-api/utils";import{Enum as Zt}from"polkadot-api";var{Ss58Addr:te}=cn,P=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}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=dn.enc(a),o=l=>new TextEncoder().encode(l),m=new Uint8Array([...o(this.chain.parachainId.toString()),...Yt(t.startsWith("0x")?t.slice(2):t),...r,...Yt(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),i=ln(m);return gn(i)}async dryRun(t,e){let s=Zt("Signed",t),n=Zt("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: "+mn.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 Jt(a.emitted_events||[]);{let r=O(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=Ct.findNestedKey(a,"interior"),o=Ct.findParachain(a);if(Ct.findGlobalConsensus(a))return t;if(o){let l=un.getSovereignAccounts(o);return this.chain.parachainId===0?te.encodePubKey(l.relay):te.encodePubKey(l.generic)}let i=r&&r.interior;if(i==="Here"||i?.type==="Here")return this.chain.treasury||t}return t}};var ct=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 pn(s)}:void 0,m=n.getTx(a.client),i=n.module+"."+n.func,l=await m.getEncodedData();return{from:t,data:yn.toHex(l),type:hn.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:O(d.execution_result);return{call:i,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(u){return{call:i,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),m=await this.exchangeFee(r+o,s),i=await Xt(m,s,a);return s.copyWith(i)}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=fn.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};import{multiloc as ee}from"@galacticcouncil/xc-core";import{Binary as Cn,Enum as At}from"polkadot-api";var ne=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=Cn.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:m=>{m.type==="broadcasted"&&e.onTransactionSend(m.txHash),m.type==="finalized"&&e.onFinalized(m)},error:m=>{e.onError(m)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=ee.findPalletInstance(e),n=ee.findGeneralIndex(e);return{parents:0,interior:At("X2",[At("PalletInstance",Number(s)),At("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as xn,Wormhole as bn}from"@galacticcouncil/xc-core";import{Transaction as wn}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as vn}from"@mysten/sui/utils";import{toBase64 as Sn}from"@mysten/bcs";import{encoding as Pn,serialize as Tn,toChainId as En}from"@wormhole-foundation/sdk-connect";import{deserialize as Bn}from"@wormhole-foundation/sdk-definitions";import{getPackageId as se}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as Fn}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as An}from"@mysten/bcs";function ut(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 u=An(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)}},m=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}},i=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?m(l.Input):l;return s.map(l=>{if(l.MoveCall){let u=l.MoveCall;return{MoveCall:{...u,arguments:(u.arguments??[]).map(i)}}}if(l.SplitCoins){let u=l.SplitCoins,d=u.coin?.GasCoin?"GasCoin":i(u.coin),g=(u.amounts??[]).map(i);return{SplitCoins:[d,g]}}if(l.MergeCoins){let u=l.MergeCoins;return{MergeCoins:{...u,destination:i(u.destination),sources:(u.sources??[]).map(i)}}}if(l.TransferObjects){let u=l.TransferObjects;return{TransferObjects:{...u,objects:(u.objects??[]).map(i),address:i(u.address)}}}return l})}var ae=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=bn.fromChain(this.#t),n=this.#t.client,a=Pn.b64.decode(e),r=Bn("TokenBridge:Transfer",a),o=s.getCoreBridge(),m=s.getTokenBridge(),i=await Fn(n,m,r.payload.token.address.toUint8Array(),En(r.payload.token.chain));if(!i)throw new Error("Unable to fetch token coinType");let[l,u]=await Promise.all([se(n,o),se(n,m)]),d=new wn;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",Tn(r)),d.object(vn)]}),[p]=d.moveCall({target:`${u}::vaa::verify_only_once`,arguments:[d.object(m),g]}),[f]=d.moveCall({target:`${u}::complete_transfer::authorize_transfer`,arguments:[d.object(m),p],typeArguments:[i]}),[y]=d.moveCall({target:`${u}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[i]});d.moveCall({target:`${u}::coin_utils::return_nonzero`,arguments:[y],typeArguments:[i]});let x=await d.build({client:n}),A=await d.toJSON(),h=ut(JSON.parse(A));return{from:t,commands:h,data:Sn(x),type:xn.Sui}}};import{CallType as In}from"@galacticcouncil/xc-core";import{toBase64 as Dn}from"@mysten/bcs";var mt=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(),m=ut(JSON.parse(o));return{from:t,commands:m,data:Dn(r),type:In.Sui,dryRun:async()=>{let i=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:i.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),m=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,i=BigInt(m.computationCost),l=BigInt(m.storageCost),u=i+l;return s.copyWith({amount:u})}};import{Ed25519Keypair as Rn}from"@mysten/sui/keypairs/ed25519";import{Transaction as kn}from"@mysten/sui/transactions";var re=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 Rn){let m=kn.from(n),i=await a.signAndExecuteTransaction({signer:this.#e,transaction:m,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.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 M=class{platform={};constructor(t){switch(t.getType()){case L.EvmChain:this.registerEvm(t);break;case L.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case L.Parachain:this.registerSubstrate(t);break;case L.SolanaChain:this.registerSolana(t);break;case L.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new Z(e)}registerSolana(t){let e=t;this.platform.Solana=new et(e)}registerSui(t){let e=t;this.platform.Sui=new mt(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)}};import{AssetAmount as bt,Parachain as On}from"@galacticcouncil/xc-core";import{acc as Mn,big as le}from"@galacticcouncil/common";import{big as _n}from"@galacticcouncil/common";import z from"big.js";function ie(c,t,e,s){let n=c.toBig().minus(e.toBig()).minus(c.isSame(t)?t.toBig():new z(0));return s&&(n=n.minus(c.isSame(s)?s.toBig():new z(0))),c.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function oe(c,t,e,s){let a=c.copyWith({amount:0n}).toBig().plus(c.isSame(t)?t.toBig():new z(0)).plus(c.toBig().lt(e.toBig())?e.toBig():new z(0));return s&&(a=a.plus(c.isSame(s)&&c.toBig().lt(s.toBig())?s.toBig():new z(0))),c.copyWith({amount:BigInt(a.toFixed())})}async function ce(c,t){return t.isEvmParachain()?t.getDerivatedAddress(c):c}function ue(c,t){return t?_n.toBigInt(t,c):0n}async function xt(c,t){let e=c.getAssetDecimals(t);return e||(await c.getCurrency()).decimals}import{AssetAmount as Vn,Parachain as me}from"@galacticcouncil/xc-core";var W=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof me?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof me)return this.chain.getMin(this.asset);let t=await xt(this.chain,this.asset);return Vn.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return xt(this.chain,t)}};var $=class extends W{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,o=a.fee.amount,m=n.destinationFee??a.fee.asset,i=await this.getDecimals(m);if(Number.isFinite(o))return{fee:bt.fromAsset(m,{amount:le.toBigInt(o,i),decimals:i}),feeBreakdown:{}};let l=o,{amount:u,breakdown:d}=await l.build({feeAsset:m,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:bt.fromAsset(m,{amount:u,decimals:i}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,a=e.destinationFee??s.fee.asset;return n.isEqual(a)?this.getBalance(t):this.config.chain.getBalance(a,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),m=s.contract?await ce(a,e):a,i=await this.adapter.estimateFee(m,n,r.feeBalance,o),{fee:l}=s.source,u=l?ue(i.decimals,l.extra):0n,d=i.amount+u;return i.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}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 On&&"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:i,amount:l,asset:u,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,l,u.originSymbol,i);return a.build({...t,messageId:p})}let m=n||r||o;if(m)return m.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),m=e.source.chain,i=e.sender,l=Mn.getMultilocationDerivatedAccount(m.parachainId,i,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=le.toBigInt(e.amount,s);return bt.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var G=class extends W{};import{AssetAmount as Wn}from"@galacticcouncil/xc-core";var X=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:Wn.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 vt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Kn(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[i,l]=await Promise.all([P.create(r),P.create(o)]),u=new ot(i,l),d=Nn.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,{chain:a,asset:r}=n.route.destination,o=new M(n.chain),m=new M(a),i=new $(o,n),l=new G(m,a,r),u=new Hn(...this.validations),[d,g,p,f,y,x,A]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),l.getBalance(s),l.getMin()]),{source:h,destination:I}=n.route,S=p.fee.copyWith(I.fee.asset),E=p.feeBreakdown,B=h.asset.isEqual(S)&&S.amount>10n?S.amount+1n:10n,C={address:s,amount:B,asset:h.asset,destination:{balance:x,chain:a,fee:S,feeBreakdown:E},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:p.fee,destinationFeeBalance:f}};C.transact=await i.getTransact(C);let T=new X(C),b=await i.getFee(C),F;T.isSwapSupported(h.fee)&&(F=await T.getSwap(b),C.source.feeSwap=F);let D;T.isDestinationSwapSupported(b)&&(D=await T.getDestinationSwap(b),C.source.destinationFeeSwap=D),(F||D)&&(b=await i.getFee(C),b=b.padByPct(5n));let dt=await l.getEd(),w=oe(x,S,A,dt),q=await i.getEd(),gt=ie(d,b,y,q);C.amount=0n,C.source.fee=b;let pt={source:{balance:d,destinationFee:p.fee,destinationFeeBalance:f,destinationFeeSwap:D,fee:b,feeBalance:g,feeSwap:F,max:gt,min:d.copyWith({amount:w.amount})},destination:{balance:x,fee:S},reversible:t.reversible,async buildCall(R){let v=Object.assign({},C);return v.amount=wt.toBigInt(R,d.decimals),v.transact=await i.getTransact(v),i.getCall(v)},async estimateFee(R){let v=Object.assign({},C);return v.amount=wt.toBigInt(R,d.decimals),v.transact=await i.getTransact(v),i.getFee(v)},async estimateDestinationFee(R){let v=wt.toBigInt(R,d.decimals),{fee:k,feeBreakdown:fe}=await i.getDestinationFee(v);return C.destination.fee=k,C.destination.feeBreakdown=fe,C.source.destinationFee=k,pt.destination.fee=k,pt.source.destinationFee=k,k},async validate(R){let v=Object.assign({},C),k=R||b.amount;return v.source.fee=b.copyWith({amount:k}),u.validate(v)}};return pt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=n.getUniqueRoutes().map(r=>r.source.asset);return n.chain.subscribeBalances(a,t).subscribe(s)}};import{ConfigBuilder as Un}from"@galacticcouncil/xc-core";function jn(c){let t=Un(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:m,isAssetSelect:i,isTagSelect:l,build:u}=a.destination(r);return{routes:o,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let y=u(p,f);return c.getTransferData(y,d,g)}}}}}}}}}import{Precompile as Ln}from"@galacticcouncil/xc-core";var zn="https://api.wormholescan.io",lt=class{_baseUrl;constructor(t){this._baseUrl=t||zn}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===Ln.Bridge}};import{acc as $n}from"@galacticcouncil/common";import{mrl as Gn,ChainType as ge,Parachain as Xn,Precompile as Jn,Wormhole as N}from"@galacticcouncil/xc-core";import{encoding as qn}from"@wormhole-foundation/sdk-base";import{keccak256 as Qn}from"@wormhole-foundation/sdk-connect";import{deserialize as Yn}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 Zn=300*1e3,pe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new lt}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=$n.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:m}=r,i=this.getStatus(a),l=this.chains.find(f=>f instanceof Xn&&f.parachainId===this.parachainId),{toAddress:u,tokenAddress:d}=m,g=this.chains.find(f=>N.isKnown(f)&&N.fromChain(f).getWormholeId()===o.tokenChain),p;if(i===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),y=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case ge.EvmChain:let x=new Q(g);p=async h=>x.redeem(h,y);break;case ge.SolanaChain:let A=new at(g);p=async h=>A.redeem(h,y);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:u,toChain:g,status:i,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:Jn.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,o=(await Gn.createPayload(a,t)).toHex(),m=s.filter(i=>{let{content:l}=i,{payload:u}=l;return u.payloadType===3&&u.toChain===16&&"0x"+u.payload===o}).map(async i=>{let{content:l,sourceChain:u}=i,{payload:d,standarizedProperties:g}=l,p=this.getStatus(i),{tokenAddress:f}=g,y=this.chains.find(h=>N.isKnown(h)&&N.fromChain(h).getWormholeId()===d.tokenChain),x=this.chains.find(h=>N.isKnown(h)&&N.fromChain(h).getWormholeId()===d.toChain),A;if(p===1&&i.vaa){let{timestamp:h}=this.getVaaHeader(i.vaa.raw),I=i.vaa.raw;if(this.isStuck(h)){let S=new rt(x);A=async E=>S.redeemMrlViaXcm(E,I)}}return{asset:f,assetSymbol:i.data.symbol,amount:i.data.tokenAmount,from:u.from,fromChain:y,to:t,toChain:n,status:p,redeem:A,operation:i}});return Promise.all(m)}isStuck(t){return Date.now()>=t*1e3+Zn}getVaaHeader(t){let e=qn.b64.decode(t),s=Yn("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Qn(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Ft as DISPATCH_ADDRESS,Q as EvmClaim,Z as EvmPlatform,It as EvmSigner,X as FeeSwap,M as PlatformAdapter,at as SolanaClaim,V as SolanaLilJit,et as SolanaPlatform,zt as SolanaSigner,rt as SubstrateClaim,ot as SubstrateExec,ct as SubstratePlatform,P as SubstrateService,ne as SubstrateSigner,ae as SuiClaim,mt as SuiPlatform,re as SuiSigner,jn as TransferBuilder,vt as Wallet,de as WhStatus,lt as WormholeScan,pe as WormholeTransfer,Mt as chunk,Ys as deserializeV0,_ as ixToHuman,U as serializeV0};
1
+ import{acc as Nn,big as wt,log as Kn}from"@galacticcouncil/common";import{ConfigBuilder as Hn,TransferValidator as jn}from"@galacticcouncil/xc-core";import{ChainType as L}from"@galacticcouncil/xc-core";import{Abi as he,Wormhole as ye}from"@galacticcouncil/xc-core";import{encodeFunctionData as Ce}from"viem";import{encoding as St}from"@wormhole-foundation/sdk-base";var Q=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=ye.fromChain(this.#t),n=St.b64.decode(e),a=St.hex.encode(n),r=he.TokenBridge,o=Ce({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,from:t,to:s.getTokenBridge()}}};import{Abi as ve,CallType as Et,Erc20Client as Se}from"@galacticcouncil/xc-core";import{ContractFunctionExecutionError as Ae,decodeEventLog as xe}from"viem";var Y=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 Ae?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:u}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[i]=u;return i}catch(u){return console.log(`Can't simulate call!
3
+ `,u.details),{error:u}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=xe({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 Y(t,e)}};import{Precompile as be}from"@galacticcouncil/xc-core";import{decodeAbiParameters as we}from"viem";function ft(c){return c.module==="Snowbridge"&&c.func==="v2_sendMessage"}function Pt(c){if(!ft(c))return;let t=c.args[1];if(!t||t.length===0)return;let[e,s]=we([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Tt(c){let t=c.module==="Snowbridge"&&c.func==="v2_sendMessage"&&Array.isArray(c.args[1])&&c.args[1].length===0,e=c.module==="Snowbridge"&&c.func==="sendToken"&&c.args[0]==="0x0000000000000000000000000000000000000000";return c.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(c.func)||t||e}function Bt(c){return Object.entries(be).map(([e,s])=>s).includes(c.address)}var Z=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:u}=a,i={abi:JSON.stringify(r),data:u,from:t,to:n.address,type:Et.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),y=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:y}}};if(Bt(n)||Tt(n))return i;let l=ft(n)?Pt(n):o,m=new Se(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return i;let g=m.approve(n.address,e);return{abi:JSON.stringify(ve.Erc20),allowance:d,data:g,from:t,to:l,type:Et.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await K.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}};import{EvmParachain as Pe}from"@galacticcouncil/xc-core";import{h160 as Te}from"@galacticcouncil/common";import{Binary as Be}from"polkadot-api";var Ft="0x0000000000000000000000000000000000000401",{H160:Ee}=Te,It=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Ee.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Pe)try{let o=this.#t.client,u=Be.fromHex(t.data);await o.getUnsafeApi().txFromCallData(u),a=!0}catch{}let r;if(a){let[o,u]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Ft}),n.getGasPrice()]),i=u+u/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:i,maxFeePerGas:i,gas:o*11n/10n,to:Ft})}else{let{data:o,to:u,value:i}=t,[l,m]=await Promise.all([n.estimateGas({account:s,data:o,to:u,value:i}),n.getGasPrice()]),d=m+m*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:u,value:i,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};import{CallType as ke}from"@galacticcouncil/xc-core";import{Buffer as _e}from"buffer";import{ComputeBudgetProgram as Dt,PublicKey as Fe,TransactionMessage as Ie,VersionedTransaction as Rt}from"@solana/web3.js";var kt=.5,_t=2,Vt=1,Ot=1e6,De=25e4,tt=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 Fe(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Ie({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=kt,s=_t,n=Vt,a=Ot){let[r,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Dt.setComputeUnitLimit({units:r}),Dt.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new Rt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Rt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):De}async determinePriorityFee(t,e=kt,s=_t,n=Vt,a=Ot){let r=n,o=await this.getTxAccounts(t),u=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(u){let i=u.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(i.length*e);if(i.length>l){let d=i[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 H=class{static get(t,e){return new tt(t,e)}};import{MessageV0 as Re}from"@solana/web3.js";function _(c){return c.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Mt(c,t){let e=[];for(let s=0;s<c.length;s+=t)e.push(c.slice(s,s+t));return e}function j(c){let t=c.serialize();return Buffer.from(t).toString("hex")}function ta(c){let t=Buffer.from(c,"hex"),e=Uint8Array.from(t);return Re.deserialize(e)}var et=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=H.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),u=_e.from(o).toString("hex");return{from:t,data:u,ix:_(n.instructions),signers:n.signers,type:ke.Solana,dryRun:async()=>{let{err:i,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:i,events:l}}}}async estimateFee(t,e,s,n){let a=H.get(this.#t,n),r=await a.estimateFee(t,e),o=await a.getPriorityMessage(t),{accounts:u}=await a.simulateTransaction(t,o),l=(u&&u[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})}};import{CallType as nt,Wormhole as Ve}from"@galacticcouncil/xc-core";import{Keypair as Wt,PublicKey as U,SystemProgram as Nt,TransactionMessage as Oe}from"@solana/web3.js";import{ACCOUNT_SIZE as Me,NATIVE_MINT as st,TOKEN_PROGRAM_ID as We,createAssociatedTokenAccountIdempotentInstruction as Kt,createCloseAccountInstruction as Ne,createInitializeAccountInstruction as Ke,createTransferInstruction as He,getAssociatedTokenAddressSync as je,getMinimumBalanceForRentExemptAccount as Ue,getMint as Le}from"@solana/spl-token";import{utils as ze}from"@wormhole-foundation/sdk-solana";import{utils as Ht}from"@wormhole-foundation/sdk-solana-core";import{encoding as $e}from"@wormhole-foundation/sdk-base";import{deserialize as jt}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as Ut,createCompleteTransferWrappedInstruction as Ge}from"@wormhole-foundation/sdk-solana-tokenbridge";var V=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 at=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new V(t)}async redeem(t,e,s){let n=Ve.fromChain(this.#t),a=$e.b64.decode(e),r=jt("TokenBridge:Transfer",a),o=jt("Uint8Array",a),u=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),i=new U(t),l=s?new U(s):i,m=i.equals(l),d=[];if(!await this.#e.getAccountInfo(u)){let h=Wt.generate(),I=await Ht.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),i,o,h.publicKey),S=Mt(I,2);for(let C=0;C<S.length;C++){let T=S[C],b=await this.getV0Message(i,T),F=j(b);d.push({from:t,data:F,ix:_(T),signers:[h],type:nt.Solana})}let B=Ht.createPostVaaInstruction(this.#e,n.getCoreBridge(),i,o,h.publicKey),J=await this.getV0Message(i,[B]),E=j(J);d.push({from:t,data:E,ix:_([B]),type:nt.Solana})}let p=r.payload.token.chain==="Solana",f=new U(r.payload.token.address.toUint8Array()),y=p&&f.equals(st),x=await this.#n.getTipAccount(),A=Nt.transfer({fromPubkey:i,toPubkey:new U(x[0]),lamports:1e3});if(y&&m){let h=await this.redeemAndUnwrap(n,i,r,A);d.push(h)}else{let h=await this.redeemToken(n,i,l,f,p,r,A);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,o){let i=(a?Ut:Ge)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=je(n,s),m=Kt(e,l,s,n),d=await this.getV0Message(e,[m,i,o]),g=j(d);return{from:e.toBase58(),data:g,ix:_([m,i]),type:nt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new U(s.payload.to.address.toUint8Array()),r=await Le(this.#e,st),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),u=await Ue(this.#e),i=Wt.generate(),l=Kt(e,a,e,st),m=Ut(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Nt.createAccount({fromPubkey:e,newAccountPubkey:i.publicKey,lamports:u,space:Me,programId:We}),g=Ke(i.publicKey,st,e),p=He(a,i.publicKey,e,o),f=Ne(i.publicKey,e,e),y=[l,m,d,g,p,f,n],x=await this.getV0Message(e,y),A=j(x);return{from:e.toBase58(),data:A,ix:_(y),signers:[i],type:nt.Solana}}derivePostedVaaKey(t,e){return ze.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new Oe({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as Lt,MessageV0 as Xe,VersionedTransaction as Je}from"@solana/web3.js";import{Buffer as ht}from"buffer";var zt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new V(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof Lt){a.sign([this.#e]);let i=await this.#t.connection.sendTransaction(a);e.onTransactionSend(i);let l=await this.#t.connection.getSignatureStatus(i);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 u=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(u)}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 Lt)s.forEach(u=>u.sign([this.#e])),n=s.map(u=>ht.from(u.serialize()).toString("base64"));else{let u=this.#e;await u.connect(),n=(await u.signAllTransactions(s)).map(l=>ht.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=ht.from(t,"hex"),n=Uint8Array.from(s),a=Xe.deserialize(n),r=new Je(a);return e&&r.sign(e),r}};import{Abi as qe,CallType as Qe,Precompile as Ye,Wormhole as Ze}from"@galacticcouncil/xc-core";import{encoding as $t}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as tn}from"viem";import{Binary as Gt}from"polkadot-api";var rt=class{#t;constructor(t){this.#t=t,Ze.fromChain(this.#t)}redeemMrl(t,e){let s=$t.b64.decode(e),n=$t.hex.encode(s),a=qe.Gmp,r=tn({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Ye.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],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:Gt.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Gt.toHex(o),from:t,type:Qe.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as rn,CallType as on}from"@galacticcouncil/xc-core";import{Binary as it}from"polkadot-api";import{big as en}from"@galacticcouncil/common";async function Xt(c,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:en.convertDecimals(c,a,n),decimals:n}}import{enums as nn}from"@galacticcouncil/common";var Jt=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)},O=c=>{let t=c.value.error;return t.type==="Module"?nn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as yt}from"@galacticcouncil/common";function sn(c){return{parents:0,interior:{type:"X1",value:c.startsWith("0x")?yt.toAccountKey20(c):yt.toAccountId32(c)}}}function qt(c){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:c.parachainId}}}}}var an=(c,t)=>({id:yt.transform(c),fun:{type:"Fungible",value:t}}),Qt=(c,t,e,s,n,a)=>{console.log(a);let r=sn(c),o=an(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 ot=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(),u=this.#e.api,i=this.#e.chain,l=await i.getCurrency(),m=l.asset,d=l.decimals,g=i.getAssetXcmLocation(m),p=it.fromHex(s.data),y=await(await u.txFromCallData(p)).getPaymentInfo(e),x=BigInt(y.partial_fee)*120n/100n,A=rn.fromAsset(m,{amount:x,decimals:d}),h=y.weight.ref_time,I=y.weight.proof_size,S=qt(i),B=Qt(e,g,A,h,I,p),J=r.tx.PolkadotXcm.send({dest:S,message:B}),E=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,m,A,10),q=it.fromHex(w),gt=await r.txFromCallData(q);E.push(gt)}catch{}let C=await n(A),T=it.fromHex(C.data),b=await r.txFromCallData(T);E.push(b),E.push(J);let F=E.map(w=>w.decodedCall),D=r.tx.Utility.batch_all({calls:F}),dt=await D.getEncodedData();return{from:t,data:it.toHex(dt),type:on.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,D);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:O(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 pn,AssetAmount as fn,CallType as hn}from"@galacticcouncil/xc-core";import{Binary as yn}from"polkadot-api";import{addr as cn,multiloc as Ct}from"@galacticcouncil/xc-core";import{acc as un,enums as mn}from"@galacticcouncil/common";import{Blake2256 as ln,u32 as dn}from"@polkadot-api/substrate-bindings";import{toHex as gn,fromHex as Yt}from"@polkadot-api/utils";import{Enum as Zt}from"polkadot-api";var{Ss58Addr:te}=cn,P=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}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=dn.enc(a),o=l=>new TextEncoder().encode(l),u=new Uint8Array([...o(this.chain.parachainId.toString()),...Yt(t.startsWith("0x")?t.slice(2):t),...r,...Yt(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),i=ln(u);return gn(i)}async dryRun(t,e){let s=Zt("Signed",t),n=Zt("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: "+mn.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 Jt(a.emitted_events||[]);{let r=O(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=Ct.findNestedKey(a,"interior"),o=Ct.findParachain(a);if(Ct.findGlobalConsensus(a))return t;if(o){let l=un.getSovereignAccounts(o);return this.chain.parachainId===0?te.encodePubKey(l.relay):te.encodePubKey(l.generic)}let i=r&&r.interior;if(i==="Here"||i?.type==="Here")return this.chain.treasury||t}return t}};var ct=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 pn(s)}:void 0,u=n.getTx(a.client),i=n.module+"."+n.func,l=await u.getEncodedData();return{from:t,data:yn.toHex(l),type:hn.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:O(d.execution_result);return{call:i,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:i,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),u=await this.exchangeFee(r+o,s),i=await Xt(u,s,a);return s.copyWith(i)}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=fn.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};import{multiloc as ee}from"@galacticcouncil/xc-core";import{Binary as Cn,Enum as At}from"polkadot-api";var ne=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=Cn.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:u=>{u.type==="broadcasted"&&e.onTransactionSend(u.txHash),u.type==="finalized"&&e.onFinalized(u)},error:u=>{e.onError(u)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=ee.findPalletInstance(e),n=ee.findGeneralIndex(e);return{parents:0,interior:At("X2",[At("PalletInstance",Number(s)),At("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as xn,Wormhole as bn}from"@galacticcouncil/xc-core";import{Transaction as wn}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as vn}from"@mysten/sui/utils";import{toBase64 as Sn}from"@mysten/bcs";import{encoding as Pn,serialize as Tn,toChainId as Bn}from"@wormhole-foundation/sdk-connect";import{deserialize as En}from"@wormhole-foundation/sdk-definitions";import{getPackageId as se}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as Fn}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as An}from"@mysten/bcs";function ut(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=An(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)}},u=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}},i=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?u(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(i)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":i(m.coin),g=(m.amounts??[]).map(i);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:i(m.destination),sources:(m.sources??[]).map(i)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(i),address:i(m.address)}}}return l})}var ae=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=bn.fromChain(this.#t),n=this.#t.client,a=Pn.b64.decode(e),r=En("TokenBridge:Transfer",a),o=s.getCoreBridge(),u=s.getTokenBridge(),i=await Fn(n,u,r.payload.token.address.toUint8Array(),Bn(r.payload.token.chain));if(!i)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([se(n,o),se(n,u)]),d=new wn;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",Tn(r)),d.object(vn)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(u),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(u),p],typeArguments:[i]}),[y]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[i]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[y],typeArguments:[i]});let x=await d.build({client:n}),A=await d.toJSON(),h=ut(JSON.parse(A));return{from:t,commands:h,data:Sn(x),type:xn.Sui}}};import{CallType as In}from"@galacticcouncil/xc-core";import{toBase64 as Dn}from"@mysten/bcs";var mt=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(),u=ut(JSON.parse(o));return{from:t,commands:u,data:Dn(r),type:In.Sui,dryRun:async()=>{let i=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:i.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),u=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,i=BigInt(u.computationCost),l=BigInt(u.storageCost),m=i+l;return s.copyWith({amount:m})}};import{Ed25519Keypair as Rn}from"@mysten/sui/keypairs/ed25519";import{Transaction as kn}from"@mysten/sui/transactions";var re=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 Rn){let u=kn.from(n),i=await a.signAndExecuteTransaction({signer:this.#e,transaction:u,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.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 M=class{platform={};constructor(t){switch(t.getType()){case L.EvmChain:this.registerEvm(t);break;case L.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case L.Parachain:this.registerSubstrate(t);break;case L.SolanaChain:this.registerSolana(t);break;case L.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new Z(e)}registerSolana(t){let e=t;this.platform.Solana=new et(e)}registerSui(t){let e=t;this.platform.Sui=new mt(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)}};import{AssetAmount as bt,Parachain as On}from"@galacticcouncil/xc-core";import{acc as Mn,big as le}from"@galacticcouncil/common";import{big as _n}from"@galacticcouncil/common";import z from"big.js";function ie(c,t,e,s){let n=c.toBig().minus(e.toBig()).minus(c.isSame(t)?t.toBig():new z(0));return s&&(n=n.minus(c.isSame(s)?s.toBig():new z(0))),c.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function oe(c,t,e,s){let a=c.copyWith({amount:0n}).toBig().plus(c.isSame(t)?t.toBig():new z(0)).plus(c.toBig().lt(e.toBig())?e.toBig():new z(0));return s&&(a=a.plus(c.isSame(s)&&c.toBig().lt(s.toBig())?s.toBig():new z(0))),c.copyWith({amount:BigInt(a.toFixed())})}async function ce(c,t){return t.isEvmParachain()?t.getDerivatedAddress(c):c}function ue(c,t){return t?_n.toBigInt(t,c):0n}async function xt(c,t){let e=c.getAssetDecimals(t);return e||(await c.getCurrency()).decimals}import{AssetAmount as Vn,Parachain as me}from"@galacticcouncil/xc-core";var W=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof me?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof me)return this.chain.getMin(this.asset);let t=await xt(this.chain,this.asset);return Vn.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return xt(this.chain,t)}};var $=class extends W{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,o=a.fee.amount,u=n.destinationFee??a.fee.asset,i=await this.getDecimals(u);if(Number.isFinite(o))return{fee:bt.fromAsset(u,{amount:le.toBigInt(o,i),decimals:i}),feeBreakdown:{}};let l=o,{amount:m,breakdown:d}=await l.build({feeAsset:u,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:bt.fromAsset(u,{amount:m,decimals:i}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,a=e.destinationFee??s.fee.asset;return n.isEqual(a)?this.getBalance(t):this.config.chain.getBalance(a,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),u=s.contract?await ce(a,e):a,i=await this.adapter.estimateFee(u,n,r.feeBalance,o),{fee:l}=s.source,m=l?ue(i.decimals,l.extra):0n,d=i.amount+m;return i.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}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 On&&"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:i,amount:l,asset:m,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,l,m.originSymbol,i);return a.build({...t,messageId:p})}let u=n||r||o;if(u)return u.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),u=e.source.chain,i=e.sender,l=Mn.getMultilocationDerivatedAccount(u.parachainId,i,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=le.toBigInt(e.amount,s);return bt.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var G=class extends W{};import{AssetAmount as Wn}from"@galacticcouncil/xc-core";var X=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:Wn.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{logger:Un}=Kn,vt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Hn(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[i,l]=await Promise.all([P.create(r),P.create(o)]),m=new ot(i,l),d=Nn.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 y=f.toDecimal();return p.buildCall(y)},a)}async getTransferData(t,e,s){let n=t.origin,{chain:a,asset:r}=n.route.destination,o=new M(n.chain),u=new M(a),i=new $(o,n),l=new G(u,a,r),m=new jn(...this.validations),[d,g,p,f,y,x,A]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),l.getBalance(s),l.getMin()]),{source:h,destination:I}=n.route,S=p.fee.copyWith(I.fee.asset),B=p.feeBreakdown,E=h.asset.isEqual(S)&&S.amount>10n?S.amount+1n:10n,C={address:s,amount:E,asset:h.asset,destination:{balance:x,chain:a,fee:S,feeBreakdown:B},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:p.fee,destinationFeeBalance:f}};C.transact=await i.getTransact(C);let T=new X(C),b=await i.getFee(C),F;T.isSwapSupported(h.fee)&&(F=await T.getSwap(b),C.source.feeSwap=F);let D;T.isDestinationSwapSupported(b)&&(D=await T.getDestinationSwap(b),C.source.destinationFeeSwap=D),(F||D)&&(b=await i.getFee(C),b=b.padByPct(5n));let dt=await l.getEd(),w=oe(x,S,A,dt),q=await i.getEd(),gt=ie(d,b,y,q);C.amount=0n,C.source.fee=b;let pt={source:{balance:d,destinationFee:p.fee,destinationFeeBalance:f,destinationFeeSwap:D,fee:b,feeBalance:g,feeSwap:F,max:gt,min:d.copyWith({amount:w.amount})},destination:{balance:x,fee:S},reversible:t.reversible,async buildCall(R){let v=Object.assign({},C);return v.amount=wt.toBigInt(R,d.decimals),v.transact=await i.getTransact(v),i.getCall(v)},async estimateFee(R){let v=Object.assign({},C);return v.amount=wt.toBigInt(R,d.decimals),v.transact=await i.getTransact(v),i.getFee(v)},async estimateDestinationFee(R){let v=wt.toBigInt(R,d.decimals),{fee:k,feeBreakdown:fe}=await i.getDestinationFee(v);return C.destination.fee=k,C.destination.feeBreakdown=fe,C.source.destinationFee=k,pt.destination.fee=k,pt.source.destinationFee=k,k},async validate(R){let v=Object.assign({},C),k=R||b.amount;return v.source.fee=b.copyWith({amount:k}),m.validate(v)}};return pt}async getBalances(t,e){let s=this.config.getChain(e);return s.getBalances(s.getAssets(),t)}async subscribeBalance(t,e,s,n){let a=this.config.getChain(e),r=s.flatMap(o=>{let u=typeof o=="string"?o:o.key,i=a.getAsset(u);return i?[i]:(Un.warn(`Asset ${u} not configured on ${a.key}, skipping balance subscription`),[])});if(s.length>0&&r.length===0)throw new Error(`No assets configured on ${a.key} for any requested: `+s.map(o=>typeof o=="string"?o:o.key).join(", "));return a.subscribeBalances(r,t).subscribe(n)}};import{ConfigBuilder as Ln}from"@galacticcouncil/xc-core";function zn(c){let t=Ln(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:u,isAssetSelect:i,isTagSelect:l,build:m}=a.destination(r);return{routes:o,destinationAssets:u,isAssetSelect:i,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let y=m(p,f);return c.getTransferData(y,d,g)}}}}}}}}}import{Precompile as $n}from"@galacticcouncil/xc-core";var Gn="https://api.wormholescan.io",lt=class{_baseUrl;constructor(t){this._baseUrl=t||Gn}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===$n.Bridge}};import{acc as Xn}from"@galacticcouncil/common";import{mrl as Jn,ChainType as ge,Parachain as qn,Precompile as Qn,Wormhole as N}from"@galacticcouncil/xc-core";import{encoding as Yn}from"@wormhole-foundation/sdk-base";import{keccak256 as Zn}from"@wormhole-foundation/sdk-connect";import{deserialize as ts}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 es=300*1e3,pe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new lt}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=Xn.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:u}=r,i=this.getStatus(a),l=this.chains.find(f=>f instanceof qn&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=u,g=this.chains.find(f=>N.isKnown(f)&&N.fromChain(f).getWormholeId()===o.tokenChain),p;if(i===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),y=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case ge.EvmChain:let x=new Q(g);p=async h=>x.redeem(h,y);break;case ge.SolanaChain:let A=new at(g);p=async h=>A.redeem(h,y);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:i,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:Qn.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,o=(await Jn.createPayload(a,t)).toHex(),u=s.filter(i=>{let{content:l}=i,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===o}).map(async i=>{let{content:l,sourceChain:m}=i,{payload:d,standarizedProperties:g}=l,p=this.getStatus(i),{tokenAddress:f}=g,y=this.chains.find(h=>N.isKnown(h)&&N.fromChain(h).getWormholeId()===d.tokenChain),x=this.chains.find(h=>N.isKnown(h)&&N.fromChain(h).getWormholeId()===d.toChain),A;if(p===1&&i.vaa){let{timestamp:h}=this.getVaaHeader(i.vaa.raw),I=i.vaa.raw;if(this.isStuck(h)){let S=new rt(x);A=async B=>S.redeemMrlViaXcm(B,I)}}return{asset:f,assetSymbol:i.data.symbol,amount:i.data.tokenAmount,from:m.from,fromChain:y,to:t,toChain:n,status:p,redeem:A,operation:i}});return Promise.all(u)}isStuck(t){return Date.now()>=t*1e3+es}getVaaHeader(t){let e=Yn.b64.decode(t),s=ts("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Zn(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Ft as DISPATCH_ADDRESS,Q as EvmClaim,Z as EvmPlatform,It as EvmSigner,X as FeeSwap,M as PlatformAdapter,at as SolanaClaim,V as SolanaLilJit,et as SolanaPlatform,zt as SolanaSigner,rt as SubstrateClaim,ot as SubstrateExec,ct as SubstratePlatform,P as SubstrateService,ne as SubstrateSigner,ae as SuiClaim,mt as SuiPlatform,re as SuiSigner,zn as TransferBuilder,vt as Wallet,de as WhStatus,lt as WormholeScan,pe as WormholeTransfer,Mt as chunk,ta as deserializeV0,_ as ixToHuman,j as serializeV0};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/xc-sdk",
3
- "version": "1.3.0",
3
+ "version": "1.4.0-pr344-9e041f4",
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.3.0"
36
+ "@galacticcouncil/xc-core": "1.4.0-pr344-9e041f4"
37
37
  }
38
38
  }