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