@galacticcouncil/xc-sdk 0.6.2-pr290-ff766a3 → 0.7.0

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