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