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