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