@galacticcouncil/xc-sdk 0.6.0 → 0.6.1
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 At=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)At(i,e,{get:t[e],enumerable:!0})},
|
|
1
|
+
"use strict";var Ke=Object.create;var At=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)At(i,e,{get:t[e],enumerable:!0})},re=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Xe(t))!Ge.call(i,n)&&n!==e&&At(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)):{},re(t||!i||!i.__esModule?At(e,"default",{value:i,enumerable:!0}):e,i)),Ze=i=>re(At({},"__esModule",{value:!0}),i);var ln={};Je(ln,{EvmClaim:()=>et,EvmPlatform:()=>st,FeeSwap:()=>tt,PlatformAdapter:()=>W,SolanaClaim:()=>ct,SolanaLilJit:()=>ot,SolanaPlatform:()=>it,SubstrateClaim:()=>ut,SubstrateExec:()=>mt,SubstratePlatform:()=>dt,SubstrateService:()=>S,SuiPlatform:()=>gt,TransferBuilder:()=>je,Wallet:()=>Ut,WhStatus:()=>se,WormholeScan:()=>Ct,WormholeTransfer:()=>ae,chunkBySize:()=>Gt,deserializeV0:()=>nn,ixToHuman:()=>z,serializeV0:()=>rt});module.exports=Ze(ln);var yt=require("@galacticcouncil/common"),H=require("@galacticcouncil/xc-core"),zt=require("rxjs");var J=require("@galacticcouncil/xc-core");var vt=require("@galacticcouncil/xc-core"),ie=require("viem"),$t=require("@wormhole-foundation/sdk-base"),et=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=vt.Wormhole.fromChain(this.#t),n=$t.encoding.b64.decode(e),a=$t.encoding.hex.encode(n),r=vt.Abi.TokenBridge,o=(0,ie.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 oe=require("@galacticcouncil/xc-core");var wt=class extends q{erc20;constructor(t,e){super(t,e),this.erc20=new oe.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 xt=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 St=class{static get(t,e){switch(e.module){case"Erc20":return new wt(t,e);case"Native":return new xt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Bt=require("viem"),Pt=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 Bt.ContractFunctionExecutionError?console.log(`Can't estimate fees!
|
|
2
2
|
`,s.message):console.log(s),0n}}async getGasPrice(){return this.client.getProvider().getGasPrice()}async getNonce(t){return this.client.getProvider().getTransactionCount({address:t})}async simulateCall(t){let{address:e,args:s,value:n,func:a}=this.config,r=this.client.getProvider(),o=await this.getNonce(t);try{let{results:c}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[u]=c;return u}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,Bt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var nt=class{static get(t,e){return new Pt(t,e)}};var oe=require("@galacticcouncil/xc-core");function ce(i){let t=i.module==="Snowbridge"&&i.func==="sendToken"&&i.args[0]==="0x0000000000000000000000000000000000000000";return i.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(i.func)||t}function ue(i){return Object.entries(oe.Precompile).map(([e,s])=>s).includes(i.address)}var st=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=nt.get(this.#t,n),{abi:r,asset:o,calldata:c}=a,u={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(ue(n)||ce(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 nt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=St.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 u=a.watchBlocks({onBlock:()=>c()});return()=>u()},o;return r().then(c=>o=c),n.pipe((0,V.finalize)(()=>o?.()),(0,V.distinctUntilChanged)((c,u)=>c.amount===u.amount))}};var Rt=require("@galacticcouncil/xc-core"),he=require("@solana/web3.js"),ye=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 me=require("@wormhole-foundation/sdk-solana");var tn=9,Tt=class extends X{async getBalance(){let{address:t}=this.config,e=new me.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return tn}};var Et=require("@wormhole-foundation/sdk-solana");var Ft=class extends X{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Et.SolanaAddress(t).unwrap(),n=new Et.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 Et.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Dt=class{static get(t,e){switch(e.module){case"Native":return new Tt(t,e);case"Token":return new Ft(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var F=require("@solana/web3.js"),le=.5,de=2,ge=1,pe=1e6,en=25e4,It=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new 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=le,s=de,n=ge,a=pe){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=le,s=de,n=ge,a=pe){let r=n,o=await this.getTxAccounts(t),c=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(c){let u=c.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 at=class{static get(t,e){return new It(t,e)}};var fe=require("@solana/web3.js");function H(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 rt(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 fe.MessageV0.deserialize(e)}var it=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=at.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),c=ye.Buffer.from(o).toString("hex");return{from:t,data:c,ix:H(n.instructions),signers:n.signers,type:Rt.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=at.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 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=Dt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Rt.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 he.PublicKey(e.address),u=this.#t.onAccountChange(c,()=>o());return()=>{this.#t.removeAccountChangeListener(u)}},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"),Ce=require("@wormhole-foundation/sdk-solana"),Jt=require("@wormhole-foundation/sdk-solana-core"),be=require("@wormhole-foundation/sdk-base"),Yt=require("@wormhole-foundation/sdk-definitions"),kt=require("@wormhole-foundation/sdk-solana-tokenbridge");var ot=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 ct=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new ot(t)}async redeem(t,e){let s=$.Wormhole.fromChain(this.#t),n=be.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),u=[];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),y=Gt(x,1e3);for(let E=0;E<y.length;E++){let h=y[E],R=await this.getV0Message(c,h),k=rt(R);u.push({from:t,data:k,ix:H(h),signers:[P],type:$.CallType.Solana})}let T=Jt.utils.createPostVaaInstruction(this.#e,s.getCoreBridge(),c,r,P.publicKey),z=await this.getV0Message(c,[T]),C=rt(z);u.push({from:t,data:C,ix:H([T]),type:$.CallType.Solana})}let d=(a.payload.token.chain==="Solana"?kt.createCompleteTransferNativeInstruction:kt.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=rt(f);return u.push({from:t,data:A,ix:H([d]),type:$.CallType.Solana}),u}derivePostedVaaKey(t,e){return Ce.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"),Ae=require("viem"),ut=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,Ae.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:n.tx.EthereumXcm.transact({V2:{gas_limit:5000000n,action:{Call:a.to},value:0n,input:a.data}}).decodedCall,from:t,type:O.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var Ot=require("@galacticcouncil/xc-core"),Mt=require("polkadot-api");var ve=require("@galacticcouncil/common");async function te(i,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:ve.big.convertDecimals(i,a,n),decimals:n}}var we=require("@galacticcouncil/common"),xe=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"?we.enums.enumPath(t.value):JSON.stringify(t.value)};var Vt=require("@galacticcouncil/common");function sn(i){return{parents:0,interior:{type:"X1",value:[i.startsWith("0x")?Vt.xcm.toAccountKey20(i):Vt.xcm.toAccountId32(i)]}}}function Pe(i){return{type:"V4",value:{parents:1,interior:{type:"X1",value:[{type:"Parachain",value:i.parachainId}]}}}}var Se=(i,t)=>({id:Vt.xcm.transform(i),fun:{type:"Fungible",value:t}}),Be=(i,t,e,s,n,a)=>{console.log(a);let r=sn(i);return{type:"V4",value:[{type:"WithdrawAsset",value:Se(t,e.amount)},{type:"BuyExecution",value:{fees:Se(t,e.amount),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"},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var mt=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,u=this.#e.chain,l=await u.getCurrency(),m=l.asset,d=l.decimals,g=u.getAssetXcmLocation(m),p=Mt.Binary.fromHex(s.data),A=await(await c.txFromCallData(p)).getPaymentInfo(e),P=BigInt(A.partial_fee)*120n/100n,x=Ot.AssetAmount.fromAsset(m,{amount:P,decimals:d}),y=A.weight.ref_time,T=A.weight.proof_size,z=Pe(u),C=Be(e,g,x,y,T,p),E=r.tx.PolkadotXcm.send({dest:z,message:C}),h=[];try{let b=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,m,x,10),w=Mt.Binary.fromHex(b),Xt=await r.txFromCallData(w);h.push(Xt)}catch{}let R=await n(x),k=Mt.Binary.fromHex(R.data),Qt=await r.txFromCallData(k);h.push(Qt),h.push(E);let Kt=h.map(b=>b.decodedCall),bt=r.tx.Utility.batch_all({calls:Kt}),qt=await bt.getEncodedData();return{from:t,data:qt.asHex(),type:Ot.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let b=await this.#t.dryRun(t,bt);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 Q=require("@galacticcouncil/xc-core"),B=require("rxjs");var _=require("@galacticcouncil/xc-core"),_t=require("@galacticcouncil/common"),Nt=require("@polkadot-api/substrate-bindings"),lt=require("@polkadot-api/utils"),ee=require("polkadot-api");var{Ss58Addr:Te}=_.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=Nt.u32.enc(a),o=l=>new TextEncoder().encode(l),c=new Uint8Array([...o(this.chain.parachainId.toString()),...(0,lt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,lt.fromHex)(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),u=(0,Nt.Blake2256)(c);return(0,lt.toHex)(u)}async dryRun(t,e){let s=(0,ee.Enum)("Signed",t),n=(0,ee.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: "+_t.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 xe(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 u=_t.acc.getSovereignAccounts(o);return this.chain.parachainId===0?Te.encodePubKey(u.relay):Te.encodePubKey(u.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var dt=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,c=n.getTx(a.client),u=n.module+"."+n.func,l=await c.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:G(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),c=await this.exchangeFee(r+o,s),u=await te(c,s,a);return s.copyWith(u)}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,m)=>l===m),(0,B.concatMap)(async l=>{let m=await te(l,t,s);return Q.AssetAmount.fromAsset(t,m)}),(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=Q.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"),Ie=require("@mysten/bcs"),N=require("rxjs");var Wt=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 Ee=require("@mysten/sui/utils");var an=9,jt=class extends Wt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:Ee.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return an}};var Lt=class{static get(t,e){switch(e.module){case"Native":return new jt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Fe=require("@mysten/bcs");function De(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 m=(0,Fe.fromBase64)(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},c=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"?c(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 gt=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=De(JSON.parse(o));return{from:t,commands:c,data:(0,Ie.toBase64)(r),type:Ut.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}),c=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,u=BigInt(c.computationCost),l=BigInt(c.storageCost),m=u+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=Lt.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 u=await this.getBalance(t,e);s.next(u)})();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 st(e)}registerSolana(t){let e=t;this.platform.Solana=new it(e)}registerSui(t){let e=t;this.platform.Sui=new gt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new dt(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"),pt=require("@galacticcouncil/common");var Re=require("@galacticcouncil/common"),Y=Ye(require("big.js"),1);function ke(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?Re.big.toBigInt(t,i):0n}var K=require("@galacticcouncil/xc-core"),Oe=require("@galacticcouncil/common");var{EvmAddr:rn}=K.addr,Z=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof K.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=rn.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 K.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)),K.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,ft=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:pt.big.toBigInt(r,c),decimals:c}),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:c}),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 c=e.getBalanceAssetId(o),u=_e.isValid(c.toString())?await j(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),c=s.contract?await j(a,e):a,u=await this.adapter.estimateFee(c,n,r.feeBalance,o),{fee:l}=s.source,m=l?Me(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=_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:u,amount:l,asset:m,sender:d}=t,p=await(await S.create(e)).buildMessageId(d,l,m.originSymbol,u);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,u=e.sender,l=pt.acc.getMultilocationDerivatedAccount(c.parachainId,u,s.parachainId===0?0:1,s.usesH160Acc),m=await o.getPaymentInfo(l),d=await o.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=pt.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 ht=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:on}=U.addr,zt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}registerDex(...t){t.forEach(e=>U.DexFactory.getInstance().register(e))}async transfer(t,e,s,n,a){let r=(0,U.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 mt(u,l),d=yt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,o.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let 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 ft(r,n),u=new ht(o,a),l=new U.TransferValidator(...this.validations),[m,d,g,p,f,A,P]=await Promise.all([c.getBalance(e),c.getFeeBalance(e),c.getDestinationFee(),c.getDestinationFeeBalance(e),c.getMin(),u.getBalance(s),u.getMin()]),{source:x,destination:y}=n.route,T=g.fee.copyWith(y.fee.asset),z=g.feeBreakdown,C={address:s,amount:10n,asset:x.asset,destination:{balance:A,chain:a.chain,fee:T,feeBreakdown:z},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};C.transact=await c.getTransact(C);let E=new tt(C),h=await c.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 c.getFee(C),h=h.padByPct(5n));let Qt=await u.getEd(),Kt=Ve(A,T,P,Qt),bt=await c.getEd(),qt=ke(m,h,f,bt);return C.amount=0n,C.source.fee=h,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:k,fee:h,feeBalance:d,feeSwap:R,max:qt,min:m.copyWith({amount:Kt.amount})},destination:{balance:A,fee:T},async buildCall(b){let w=Object.assign({},C);return w.amount=yt.big.toBigInt(b,m.decimals),w.transact=await c.getTransact(w),c.getCall(w)},async estimateFee(b){let w=Object.assign({},C);return w.amount=yt.big.toBigInt(b,m.decimals),w.transact=await c.getTransact(w),c.getFee(w)},async validate(b){let w=Object.assign({},C),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:u})=>{let{asset:l,balance:m}=u,d=n.chain.getBalanceAssetId(l),g=on.isValid(d.toString())?await j(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),o=await Promise.all(r);return(0,Ht.combineLatest)(o).pipe((0,Ht.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:u,dstAddress:l,dstAsset:m}){let d=c(m);return i.getTransferData(d,u,l)}}}}}}}}}var Le=require("@galacticcouncil/xc-core"),cn="https://api.wormholescan.io",Ct=class{_baseUrl;constructor(t){this._baseUrl=t||cn}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 Ue=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),ze=require("@wormhole-foundation/sdk-base"),He=require("@wormhole-foundation/sdk-connect"),Qe=require("@wormhole-foundation/sdk-definitions");var ne=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(ne||{});var un=300*1e3,se=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new Ct}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=Ue.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,u=this.getStatus(a),l=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=c,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===o.tokenChain),p;if(u===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 et(g);p=async y=>P.redeem(y,A);break;case v.ChainType.SolanaChain:let x=new ct(g);p=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: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(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,p=this.getStatus(u),{tokenAddress:f}=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(p===1&&u.vaa){let{timestamp:y}=this.getVaaHeader(u.vaa.raw),T=u.vaa.raw;if(this.isStuck(y)){let z=new ut(P);x=async C=>z.redeemMrlViaXcm(C,T)}}return{asset:f,assetSymbol:u.data.symbol,amount:u.data.tokenAmount,from:m.from,fromChain:A,to:t,toChain:n,status:p,redeem:x,operation:u}});return Promise.all(c)}isStuck(t){return Date.now()>=t*1e3+un}getVaaHeader(t){let e=ze.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,He.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});
|
|
3
|
+
`,c.details),{error:c}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Bt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var nt=class{static get(t,e){return new Pt(t,e)}};var ce=require("@galacticcouncil/xc-core");function ue(i){let t=i.module==="Snowbridge"&&i.func==="sendToken"&&i.args[0]==="0x0000000000000000000000000000000000000000";return i.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(i.func)||t}function me(i){return Object.entries(ce.Precompile).map(([e,s])=>s).includes(i.address)}var st=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=nt.get(this.#t,n),{abi:r,asset:o,calldata:c}=a,u={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(me(n)||ue(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 nt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=St.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 u=a.watchBlocks({onBlock:()=>c()});return()=>u()},o;return r().then(c=>o=c),n.pipe((0,V.finalize)(()=>o?.()),(0,V.distinctUntilChanged)((c,u)=>c.amount===u.amount))}};var Rt=require("@galacticcouncil/xc-core"),ye=require("@solana/web3.js"),Ce=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 le=require("@wormhole-foundation/sdk-solana");var tn=9,Tt=class extends X{async getBalance(){let{address:t}=this.config,e=new le.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return tn}};var Et=require("@wormhole-foundation/sdk-solana");var Ft=class extends X{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Et.SolanaAddress(t).unwrap(),n=new Et.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 Et.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Dt=class{static get(t,e){switch(e.module){case"Native":return new Tt(t,e);case"Token":return new Ft(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var F=require("@solana/web3.js"),de=.5,ge=2,pe=1,fe=1e6,en=25e4,It=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new F.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new F.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=de,s=ge,n=pe,a=fe){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=de,s=ge,n=pe,a=fe){let r=n,o=await this.getTxAccounts(t),c=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(c){let u=c.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 at=class{static get(t,e){return new It(t,e)}};var he=require("@solana/web3.js");function z(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 rt(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 he.MessageV0.deserialize(e)}var it=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=at.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),c=Ce.Buffer.from(o).toString("hex");return{from:t,data:c,ix:z(n.instructions),signers:n.signers,type:Rt.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=at.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 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=Dt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Rt.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 ye.PublicKey(e.address),u=this.#t.onAccountChange(c,()=>o());return()=>{this.#t.removeAccountChangeListener(u)}},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"),be=require("@wormhole-foundation/sdk-solana"),Jt=require("@wormhole-foundation/sdk-solana-core"),Ae=require("@wormhole-foundation/sdk-base"),Yt=require("@wormhole-foundation/sdk-definitions"),kt=require("@wormhole-foundation/sdk-solana-tokenbridge");var ot=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 ct=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new ot(t)}async redeem(t,e){let s=$.Wormhole.fromChain(this.#t),n=Ae.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),u=[];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),y=Gt(x,1e3);for(let E=0;E<y.length;E++){let h=y[E],R=await this.getV0Message(c,h),k=rt(R);u.push({from:t,data:k,ix:z(h),signers:[P],type:$.CallType.Solana})}let T=Jt.utils.createPostVaaInstruction(this.#e,s.getCoreBridge(),c,r,P.publicKey),U=await this.getV0Message(c,[T]),C=rt(U);u.push({from:t,data:C,ix:z([T]),type:$.CallType.Solana})}let d=(a.payload.token.chain==="Solana"?kt.createCompleteTransferNativeInstruction:kt.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=rt(f);return u.push({from:t,data:A,ix:z([d]),type:$.CallType.Solana}),u}derivePostedVaaKey(t,e){return be.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"),ve=require("viem"),te=require("polkadot-api"),ut=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,ve.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 Ot=require("@galacticcouncil/xc-core"),Mt=require("polkadot-api");var we=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:we.big.convertDecimals(i,a,n),decimals:n}}var xe=require("@galacticcouncil/common"),Se=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"?xe.enums.enumPath(t.value):JSON.stringify(t.value)};var Vt=require("@galacticcouncil/common");function sn(i){return{parents:0,interior:{type:"X1",value:i.startsWith("0x")?Vt.xcm.toAccountKey20(i):Vt.xcm.toAccountId32(i)}}}function Pe(i){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:i.parachainId}}}}}var an=(i,t)=>({id:Vt.xcm.transform(i),fun:{type:"Fungible",value:t}}),Be=(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 mt=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,u=this.#e.chain,l=await u.getCurrency(),m=l.asset,d=l.decimals,g=u.getAssetXcmLocation(m),p=Mt.Binary.fromHex(s.data),A=await(await c.txFromCallData(p)).getPaymentInfo(e),P=BigInt(A.partial_fee)*120n/100n,x=Ot.AssetAmount.fromAsset(m,{amount:P,decimals:d}),y=A.weight.ref_time,T=A.weight.proof_size,U=Pe(u),C=Be(e,g,x,y,T,p),E=r.tx.PolkadotXcm.send({dest:U,message:C}),h=[];try{let b=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,m,x,10),w=Mt.Binary.fromHex(b),Xt=await r.txFromCallData(w);h.push(Xt)}catch{}let R=await n(x),k=Mt.Binary.fromHex(R.data),Qt=await r.txFromCallData(k);h.push(Qt),h.push(E);let Kt=h.map(b=>b.decodedCall),bt=r.tx.Utility.batch_all({calls:Kt}),qt=await bt.getEncodedData();return{from:t,data:qt.asHex(),type:Ot.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let b=await this.#t.dryRun(t,bt);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 Q=require("@galacticcouncil/xc-core"),B=require("rxjs");var _=require("@galacticcouncil/xc-core"),_t=require("@galacticcouncil/common"),Nt=require("@polkadot-api/substrate-bindings"),lt=require("@polkadot-api/utils"),ne=require("polkadot-api");var{Ss58Addr:Te}=_.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=Nt.u32.enc(a),o=l=>new TextEncoder().encode(l),c=new Uint8Array([...o(this.chain.parachainId.toString()),...(0,lt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,lt.fromHex)(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),u=(0,Nt.Blake2256)(c);return(0,lt.toHex)(u)}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: "+_t.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 Se(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 u=_t.acc.getSovereignAccounts(o);return this.chain.parachainId===0?Te.encodePubKey(u.relay):Te.encodePubKey(u.generic)}if(r&&r.interior==="Here")return this.chain.treasury||t}return t}};var dt=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,c=n.getTx(a.client),u=n.module+"."+n.func,l=await c.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:G(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),c=await this.exchangeFee(r+o,s),u=await ee(c,s,a);return s.copyWith(u)}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,m)=>l===m),(0,B.concatMap)(async l=>{let m=await ee(l,t,s);return Q.AssetAmount.fromAsset(t,m)}),(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=Q.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};var Ht=require("@galacticcouncil/xc-core"),Ie=require("@mysten/bcs"),N=require("rxjs");var Wt=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 Ee=require("@mysten/sui/utils");var rn=9,jt=class extends Wt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:Ee.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return rn}};var Lt=class{static get(t,e){switch(e.module){case"Native":return new jt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Fe=require("@mysten/bcs");function De(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 m=(0,Fe.fromBase64)(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},c=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"?c(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 gt=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=De(JSON.parse(o));return{from:t,commands:c,data:(0,Ie.toBase64)(r),type:Ht.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}),c=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,u=BigInt(c.computationCost),l=BigInt(c.storageCost),m=u+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=Lt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Ht.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 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 st(e)}registerSolana(t){let e=t;this.platform.Solana=new it(e)}registerSui(t){let e=t;this.platform.Sui=new gt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new dt(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"),pt=require("@galacticcouncil/common");var Re=require("@galacticcouncil/common"),Y=Ye(require("big.js"),1);function ke(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?Re.big.toBigInt(t,i):0n}var K=require("@galacticcouncil/xc-core"),Oe=require("@galacticcouncil/common");var{EvmAddr:on}=K.addr,Z=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof K.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 K.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)),K.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,ft=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:pt.big.toBigInt(r,c),decimals:c}),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:c}),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 c=e.getBalanceAssetId(o),u=_e.isValid(c.toString())?await j(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),c=s.contract?await j(a,e):a,u=await this.adapter.estimateFee(c,n,r.feeBalance,o),{fee:l}=s.source,m=l?Me(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=_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:u,amount:l,asset:m,sender:d}=t,p=await(await S.create(e)).buildMessageId(d,l,m.originSymbol,u);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,u=e.sender,l=pt.acc.getMultilocationDerivatedAccount(c.parachainId,u,s.parachainId===0?0:1,s.usesH160Acc),m=await o.getPaymentInfo(l),d=await o.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=pt.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 ht=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}=H.addr,Ut=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}registerDex(...t){t.forEach(e=>H.DexFactory.getInstance().register(e))}async transfer(t,e,s,n,a){let r=(0,H.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 mt(u,l),d=yt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,o.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let 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 ft(r,n),u=new ht(o,a),l=new H.TransferValidator(...this.validations),[m,d,g,p,f,A,P]=await Promise.all([c.getBalance(e),c.getFeeBalance(e),c.getDestinationFee(),c.getDestinationFeeBalance(e),c.getMin(),u.getBalance(s),u.getMin()]),{source:x,destination:y}=n.route,T=g.fee.copyWith(y.fee.asset),U=g.feeBreakdown,C={address:s,amount:10n,asset:x.asset,destination:{balance:A,chain:a.chain,fee:T,feeBreakdown:U},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};C.transact=await c.getTransact(C);let E=new tt(C),h=await c.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 c.getFee(C),h=h.padByPct(5n));let Qt=await u.getEd(),Kt=Ve(A,T,P,Qt),bt=await c.getEd(),qt=ke(m,h,f,bt);return C.amount=0n,C.source.fee=h,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:k,fee:h,feeBalance:d,feeSwap:R,max:qt,min:m.copyWith({amount:Kt.amount})},destination:{balance:A,fee:T},async buildCall(b){let w=Object.assign({},C);return w.amount=yt.big.toBigInt(b,m.decimals),w.transact=await c.getTransact(w),c.getCall(w)},async estimateFee(b){let w=Object.assign({},C);return w.amount=yt.big.toBigInt(b,m.decimals),w.transact=await c.getTransact(w),c.getFee(w)},async validate(b){let w=Object.assign({},C),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:u})=>{let{asset:l,balance:m}=u,d=n.chain.getBalanceAssetId(l),g=cn.isValid(d.toString())?await j(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),o=await Promise.all(r);return(0,zt.combineLatest)(o).pipe((0,zt.debounceTime)(500)).subscribe(s)}};var 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:u,dstAddress:l,dstAsset:m}){let d=c(m);return i.getTransferData(d,u,l)}}}}}}}}}var Le=require("@galacticcouncil/xc-core"),un="https://api.wormholescan.io",Ct=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 se=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(se||{});var mn=300*1e3,ae=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new Ct}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,u=this.getStatus(a),l=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=c,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===o.tokenChain),p;if(u===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 et(g);p=async y=>P.redeem(y,A);break;case v.ChainType.SolanaChain:let x=new ct(g);p=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: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(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,p=this.getStatus(u),{tokenAddress:f}=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(p===1&&u.vaa){let{timestamp:y}=this.getVaaHeader(u.vaa.raw),T=u.vaa.raw;if(this.isStuck(y)){let U=new ut(P);x=async C=>U.redeemMrlViaXcm(C,T)}}return{asset:f,assetSymbol:u.data.symbol,amount:u.data.tokenAmount,from:m.from,fromChain:A,to:t,toChain:n,status:p,redeem:x,operation:u}});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});
|
package/build/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{acc as
|
|
1
|
+
import{acc as kn,big as se}from"@galacticcouncil/common";import{addr as Vn,ConfigBuilder as Mn,DexFactory as On,TransferValidator as _n}from"@galacticcouncil/xc-core";import{combineLatest as Nn,debounceTime as Wn}from"rxjs";import{ChainType as j}from"@galacticcouncil/xc-core";import{Abi as oe,Wormhole as ce}from"@galacticcouncil/xc-core";import{encodeFunctionData as ue}from"viem";import{encoding as Bt}from"@wormhole-foundation/sdk-base";var K=class{#t;constructor(t){this.#t=t}redeem(t,e){let n=ce.fromChain(this.#t),s=Bt.b64.decode(e),a=Bt.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 Ft,Erc20Client as he}from"@galacticcouncil/xc-core";import{distinctUntilChanged as ye,finalize as Ce,shareReplay as be,Subject as Ae}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 me}from"@galacticcouncil/xc-core";var q=class extends R{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 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 $=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 le,decodeEventLog as de}from"viem";var G=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
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}]}),[u]=o;return u}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 N=class{static get(t,e){return new G(t,e)}};import{Precompile as ge}from"@galacticcouncil/xc-core";function Tt(c){let t=c.module==="Snowbridge"&&c.func==="sendToken"&&c.args[0]==="0x0000000000000000000000000000000000000000";return c.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(c.func)||t}function Et(c){return Object.entries(ge).map(([e,n])=>n).includes(c.address)}var J=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,n,s){let a=N.get(this.#t,s),{abi:r,asset:i,calldata:o}=a,u={abi:JSON.stringify(r),data:o,from:t,to:s.address,type:Ft.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(Et(s)||Tt(s))return u;let l=new he(this.#t,i),m=await l.allowance(t,s.address);if(m>=e)return u;let d=l.approve(s.address,e);return{abi:JSON.stringify(pe.Erc20),allowance:m,data:d,from:t,to:i,type:Ft.Evm,dryRun:()=>{}}}async estimateFee(t,e,n,s){let r=await N.get(this.#t,s).estimateFee(t,e);return n.copyWith({amount:r})}async getBalance(t,e){let n=$.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 u=a.watchBlocks({onBlock:()=>o()});return()=>u()},i;return r().then(o=>i=o),s.pipe(Ce(()=>i?.()),ye((o,u)=>o.amount===u.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 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 ve}from"@wormhole-foundation/sdk-solana";var we=9,Y=class extends k{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 Z=class extends k{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 tt=class{static get(t,e){switch(e.module){case"Native":return new Y(t,e);case"Token":return new Z(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Dt,PublicKey as xe,TransactionMessage as Se,VersionedTransaction as It}from"@solana/web3.js";var Rt=.5,kt=2,Vt=1,Mt=1e6,Pe=25e4,et=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=Rt,n=kt,s=Vt,a=Mt){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,n,s,a)]);return[Dt.setComputeUnitLimit({units:r}),Dt.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let n=new It(e);return(await this.connection.simulateTransaction(n,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new It(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=Rt,n=kt,s=Vt,a=Mt){let r=s,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let u=o.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]*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 W=class{static get(t,e){return new et(t,e)}};import{MessageV0 as Be}from"@solana/web3.js";function V(c){return c.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Ot(c,t=1e3){let e=[],n=[],s=0;for(let a of c){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 nt(c){let t=c.serialize();return Buffer.from(t).toString("hex")}function Ca(c){let t=Buffer.from(c,"hex"),e=Uint8Array.from(t);return Be.deserialize(e)}var st=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,n,s){let a=W.get(this.#t,s),r=await a.getPriorityMessage(t),i=r.serialize(),o=De.from(i).toString("hex");return{from:t,data:o,ix:V(s.instructions),signers:s.signers,type:Ee.Solana,dryRun:async()=>{let{err:u,logs:l}=await a.simulateTransaction(t,r);return{call:s.module+"."+s.func,error:u,events:l}}}}async estimateFee(t,e,n,s){let a=W.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 m=s.module==="TokenBridge"&&s.func==="TransferNativeWithPayload";return n.copyWith({amount:n.amount-BigInt(l)-(m?e:0n)+s.rentReserve})}return n.copyWith({amount:r+s.rentReserve})}async getBalance(t,e){let n=tt.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),u=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(u)}},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 _t,SystemProgram as _e,TransactionMessage as Ne}from"@solana/web3.js";import{utils as We}from"@wormhole-foundation/sdk-solana";import{utils as Nt}from"@wormhole-foundation/sdk-solana-core";import{encoding as je}from"@wormhole-foundation/sdk-base";import{deserialize as Wt}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as Le,createCompleteTransferWrappedInstruction as Ue}from"@wormhole-foundation/sdk-solana-tokenbridge";var at=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 rt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new at(t)}async redeem(t,e){let n=Me.fromChain(this.#t),s=je.b64.decode(e),a=Wt("TokenBridge:Transfer",s),r=Wt("Uint8Array",s),i=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(a.hash)),o=new _t(t),u=[];if(!await this.#e.getAccountInfo(i)){let S=Oe.generate(),w=await Nt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),o,r,S.publicKey),y=Ot(w,1e3);for(let B=0;B<y.length;B++){let h=y[B],T=await this.getV0Message(o,h),E=nt(T);u.push({from:t,data:E,ix:V(h),signers:[S],type:bt.Solana})}let P=Nt.createPostVaaInstruction(this.#e,n.getCoreBridge(),o,r,S.publicKey),D=await this.getV0Message(o,[P]),C=nt(D);u.push({from:t,data:C,ix:V([P]),type:bt.Solana})}let d=(a.payload.token.chain==="Solana"?Le:Ue)(this.#e,n.getTokenBridge(),n.getCoreBridge(),o,a),g=await this.#n.getTipAccount(),p=_e.transfer({fromPubkey:o,toPubkey:new _t(g[0]),lamports:1e3}),f=await this.getV0Message(o,[d,p]),A=nt(f);return u.push({from:t,data:A,ix:V([d]),type:bt.Solana}),u}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 ze,CallType as He,Precompile as Qe,Wormhole as Ke}from"@galacticcouncil/xc-core";import{encoding as jt}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as qe}from"viem";var it=class{#t;constructor(t){this.#t=t,Ke.fromChain(this.#t)}redeemMrl(t,e){let n=jt.b64.decode(e),s=jt.hex.encode(n),a=ze.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:s.tx.EthereumXcm.transact({V2:{gas_limit:5000000n,action:{Call:a.to},value:0n,input:a.data}}).decodedCall,from:t,type:He.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as Je,CallType as Ye}from"@galacticcouncil/xc-core";import{Binary as wt}from"polkadot-api";import{big as Xe}from"@galacticcouncil/common";async function At(c,t,e){let n=await e.getDecimals(),s=e.chain.getAssetDecimals(t)??n,a=e.chain.usesChainDecimals?n:s;return{amount:Xe.convertDecimals(c,a,s),decimals:s}}import{enums as $e}from"@galacticcouncil/common";var Lt=c=>{let t=[];for(let e of c)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)},M=c=>{let t=c.value.error;return t.type==="Module"?$e.enumPath(t.value):JSON.stringify(t.value)};import{xcm as vt}from"@galacticcouncil/common";function Ge(c){return{parents:0,interior:{type:"X1",value:[c.startsWith("0x")?vt.toAccountKey20(c):vt.toAccountId32(c)]}}}function zt(c){return{type:"V4",value:{parents:1,interior:{type:"X1",value:[{type:"Parachain",value:c.parachainId}]}}}}var Ut=(c,t)=>({id:vt.transform(c),fun:{type:"Fungible",value:t}}),Ht=(c,t,e,n,s,a)=>{console.log(a);let r=Ge(c);return{type:"V4",value:[{type:"WithdrawAsset",value:Ut(t,e.amount)},{type:"BuyExecution",value:{fees:Ut(t,e.amount),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"},{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,n,s,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,u=this.#e.chain,l=await u.getCurrency(),m=l.asset,d=l.decimals,g=u.getAssetXcmLocation(m),p=wt.fromHex(n.data),A=await(await o.txFromCallData(p)).getPaymentInfo(e),S=BigInt(A.partial_fee)*120n/100n,w=Je.fromAsset(m,{amount:S,decimals:d}),y=A.weight.ref_time,P=A.weight.proof_size,D=zt(u),C=Ht(e,g,w,y,P,p),B=r.tx.PolkadotXcm.send({dest:D,message:C}),h=[];try{let b=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,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),pt=await r.txFromCallData(E);h.push(pt),h.push(B);let ft=h.map(b=>b.decodedCall),Q=r.tx.Utility.batch_all({calls:ft}),ht=await Q.getEncodedData();return{from:t,data:ht.asHex(),type:Ye.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 on,AssetAmount as Xt,CallType as cn}from"@galacticcouncil/xc-core";import{concatMap as $t,catchError as un,distinctUntilChanged as mn,firstValueFrom as ln,throwError as dn}from"rxjs";import{addr as Ze,multiloc as xt,AssetAmount as tn}from"@galacticcouncil/xc-core";import{acc as en,enums as nn}from"@galacticcouncil/common";import{Blake2256 as sn,u32 as an}from"@polkadot-api/substrate-bindings";import{toHex as rn,fromHex as Qt}from"@polkadot-api/utils";import{Enum as Kt}from"polkadot-api";var{Ss58Addr:qt}=Ze,x=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 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 tn.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=an.enc(a),i=l=>new TextEncoder().encode(l),o=new Uint8Array([...i(this.chain.parachainId.toString()),...Qt(t.startsWith("0x")?t.slice(2):t),...r,...Qt(n.startsWith("0x")?n.slice(2):n),...i(s),...i(e.toString())]),u=sn(o);return rn(u)}async dryRun(t,e){let n=Kt("Signed",t),s=Kt("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: "+nn.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 Lt(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 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 u=en.getSovereignAccounts(i);return this.chain.parachainId===0?qt.encodePubKey(u.relay):qt.encodePubKey(u.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,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 on(n)}:void 0,o=s.getTx(a.client),u=s.module+"."+s.func,l=await o.getEncodedData();return{from:t,data:l.asHex(),type:cn.Substrate,txOptions:i,dryRun:a.isDryRunSupported()?async()=>{try{let m=s.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: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,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),u=await At(o,n,a);return n.copyWith(u)}async getBalance(t,e){let n=await this.subscribeBalance(t,e);return ln(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($t(l=>i(l)),mn((l,m)=>l===m),$t(async l=>{let m=await At(l,t,n);return Xt.fromAsset(t,m)}),un(l=>(console.error("subscribe fails for:",t),dn(()=>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=Xt.fromAsset(s,{amount:t,decimals:a});return(await r.getQuote(e,s,i,!0)).amount}catch{}return t}};import{AssetAmount as hn,CallType as yn}from"@galacticcouncil/xc-core";import{toBase64 as Cn}from"@mysten/bcs";import{distinctUntilChanged as bn,finalize as An,shareReplay as vn,Subject as wn}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 gn}from"@mysten/sui/utils";var pn=9,mt=class extends ut{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:gn});return BigInt(e.totalBalance)}async getDecimals(){return pn}};var lt=class{static get(t,e){switch(e.module){case"Native":return new mt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{fromBase64 as fn}from"@mysten/bcs";function Gt(c,t={}){let e=c.inputs??[],n=c.commands??[],s=t.numbers??"string",a=t.decode32As??"address",r=l=>s==="bigint"?l:s==="number"?Number(l):l.toString(),i=l=>{let m=fn(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return i(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"?o(l.Input):l;return n.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 dt=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=Gt(JSON.parse(i));return{from:t,commands:o,data:Cn(r),type:yn.Sui,dryRun:async()=>{let u=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:s.module+"."+s.func,error:u.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,u=BigInt(o.computationCost),l=BigInt(o.storageCost),m=u+l;return n.copyWith({amount:m})}async getBalance(t,e){let n=lt.get(this.#t,e),[s,a]=await Promise.all([n.getBalance(),n.getDecimals()]);return hn.fromAsset(t,{amount:s,decimals:a})}async subscribeBalance(t,e){let n=new wn,s=n.pipe(vn(1)),a=async()=>{await(async()=>{let u=await this.getBalance(t,e);n.next(u)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),s.pipe(An(()=>r?.()),bn((i,o)=>i.amount===o.amount))}};var I=class{platform={};constructor(t){switch(t.getType()){case j.EvmChain:this.registerEvm(t);break;case j.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case j.Parachain:this.registerSubstrate(t);break;case j.SolanaChain:this.registerSolana(t);break;case j.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new J(e)}registerSolana(t){let e=t;this.platform.Solana=new st(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,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 En,AssetAmount as St,Parachain as Fn}from"@galacticcouncil/xc-core";import{acc as Dn,big as ee}from"@galacticcouncil/common";import{big as xn}from"@galacticcouncil/common";import L from"big.js";function Jt(c,t,e,n){let s=c.toBig().minus(e.toBig()).minus(c.isSame(t)?t.toBig():new L(0));return n&&(s=s.minus(c.isSame(n)?n.toBig():new L(0))),c.copyWith({amount:s.lt(0)?0n:BigInt(s.toFixed())})}function Yt(c,t,e,n){let a=c.copyWith({amount:0n}).toBig().plus(c.isSame(t)?t.toBig():new L(0)).plus(c.toBig().lt(e.toBig())?e.toBig():new L(0));return n&&(a=a.plus(c.isSame(n)&&c.toBig().lt(n.toBig())?n.toBig():new L(0))),c.copyWith({amount:BigInt(a.toFixed())})}async function F(c,t){return t.isEvmParachain()?t.getDerivatedAddress(c):c}function Zt(c,t){return t?xn.toBigInt(t,c):0n}import{addr as Sn,AssetAmount as Pn,Parachain as te}from"@galacticcouncil/xc-core";import{big as Bn}from"@galacticcouncil/common";var{EvmAddr:Tn}=Sn,O=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=Tn.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=Bn.toBigInt(a,r)),Pn.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}=En,U=class extends O{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:St.fromAsset(i,{amount:ee.toBigInt(r,o),decimals:o}),feeBreakdown:{}};let u=r,{amount:l,breakdown:m}=await u.build({feeAsset:i,transferAsset:n.asset,source:a?a.chain:t,destination:s.chain});return{fee:St.fromAsset(i,{amount:l,decimals:o}),feeBreakdown:m}}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),u=ne.isValid(o.toString())?await F(t,e):t,l=s.destinationFee.balance.build({address:u,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,u=await this.adapter.estimateFee(o,s,r.feeBalance,i),{fee:l}=n.source,m=l?Zt(u.decimals,l.extra):0n,d=u.amount+m;return u.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 Fn&&"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:u,amount:l,asset:m,sender:d}=t,p=await(await x.create(e)).buildMessageId(d,l,m.originSymbol,u);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,u=e.sender,l=Dn.getMultilocationDerivatedAccount(o.parachainId,u,n.parachainId===0?0:1,n.usesH160Acc),m=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:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,n=await this.getDecimals(e.asset),s=ee.toBigInt(e.amount,n);return St.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 z=class extends O{constructor(t,e){super(t,e)}};import{AssetAmount as In}from"@galacticcouncil/xc-core";var H=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:In.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}=kn,Pt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}registerDex(...t){t.forEach(e=>Mn.getInstance().register(e))}async transfer(t,e,n,s,a){let r=Vn(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[u,l]=await Promise.all([x.create(r),x.create(i)]),m=new ot(u,l),d=Rn.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,n);return m.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 U(r,s),u=new z(i,a),l=new On(...this.validations),[m,d,g,p,f,A,S]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),u.getBalance(n),u.getMin()]),{source:w,destination:y}=s.route,P=g.fee.copyWith(y.fee.asset),D=g.feeBreakdown,C={address:n,amount:10n,asset:w.asset,destination:{balance:A,chain:a.chain,fee:P,feeBreakdown:D},sender:e,source:{balance:m,chain:s.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};C.transact=await o.getTransact(C);let B=new H(C),h=await o.getFee(C),T;B.isSwapSupported(w.fee)&&(T=await B.getSwap(h),C.source.feeSwap=T);let E;B.isDestinationSwapSupported(h)&&(E=await B.getDestinationSwap(h),C.source.destinationFeeSwap=E),(T||E)&&(h=await o.getFee(C),h=h.padByPct(5n));let pt=await u.getEd(),ft=Yt(A,P,S,pt),Q=await o.getEd(),ht=Jt(m,h,f,Q);return C.amount=0n,C.source.fee=h,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:E,fee:h,feeBalance:d,feeSwap:T,max:ht,min:m.copyWith({amount:ft.amount})},destination:{balance:A,fee:P},async buildCall(b){let v=Object.assign({},C);return v.amount=se.toBigInt(b,m.decimals),v.transact=await o.getTransact(v),o.getCall(v)},async estimateFee(b){let v=Object.assign({},C);return v.amount=se.toBigInt(b,m.decimals),v.transact=await o.getTransact(v),o.getFee(v)},async validate(b){let v=Object.assign({},C),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:u})=>{let{asset:l,balance:m}=u,d=s.chain.getBalanceAssetId(l),g=Wn.isValid(d.toString())?await F(t,s.chain):t,p=m.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(c){let t=jn(c.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:u,dstAddress:l,dstAsset:m}){let d=o(m);return c.getTransferData(d,u,l)}}}}}}}}}import{Precompile as Un}from"@galacticcouncil/xc-core";var zn="https://api.wormholescan.io",gt=class{_baseUrl;constructor(t){this._baseUrl=t||zn}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===Un.Bridge}};import{acc as Hn}from"@galacticcouncil/common";import{mrl as Qn,ChainType as re,Parachain as Kn,Precompile as qn,Wormhole as _}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 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 n=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:n}}async getWithdraws(t){let e=Hn.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,u=this.getStatus(a),l=this.chains.find(f=>f instanceof Kn&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>_.isKnown(f)&&_.fromChain(f).getWormholeId()===i.tokenChain),p;if(u===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 K(g);p=async y=>S.redeem(y,A);break;case re.SolanaChain:let w=new rt(g);p=async y=>w.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: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(u=>{let{content:l}=u,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async u=>{let{content:l,sourceChain:m}=u,{payload:d,standarizedProperties:g}=l,p=this.getStatus(u),{tokenAddress:f}=g,A=this.chains.find(y=>_.isKnown(y)&&_.fromChain(y).getWormholeId()===d.tokenChain),S=this.chains.find(y=>_.isKnown(y)&&_.fromChain(y).getWormholeId()===d.toChain),w;if(p===1&&u.vaa){let{timestamp:y}=this.getVaaHeader(u.vaa.raw),P=u.vaa.raw;if(this.isStuck(y)){let D=new it(S);w=async C=>D.redeemMrlViaXcm(C,P)}}return{asset:f,assetSymbol:u.data.symbol,amount:u.data.tokenAmount,from:m.from,fromChain:A,to:t,toChain:s,status:p,redeem:w,operation:u}});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{K as EvmClaim,J as EvmPlatform,H as FeeSwap,I as PlatformAdapter,rt as SolanaClaim,at as SolanaLilJit,st as SolanaPlatform,it as SubstrateClaim,ot as SubstrateExec,ct as SubstratePlatform,x as SubstrateService,dt as SuiPlatform,Ln as TransferBuilder,Pt as Wallet,ae as WhStatus,gt as WormholeScan,ie as WormholeTransfer,Ot as chunkBySize,Ca as deserializeV0,V as ixToHuman,nt as serializeV0};
|
|
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 N=class{static get(t,e){return new G(t,e)}};import{Precompile as ge}from"@galacticcouncil/xc-core";function Tt(c){let t=c.module==="Snowbridge"&&c.func==="sendToken"&&c.args[0]==="0x0000000000000000000000000000000000000000";return c.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(c.func)||t}function Et(c){return Object.entries(ge).map(([e,n])=>n).includes(c.address)}var J=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,n,s){let a=N.get(this.#t,s),{abi:r,asset:i,calldata:o}=a,u={abi:JSON.stringify(r),data:o,from:t,to:s.address,type:Ft.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(Et(s)||Tt(s))return u;let l=new he(this.#t,i),m=await l.allowance(t,s.address);if(m>=e)return u;let d=l.approve(s.address,e);return{abi:JSON.stringify(pe.Erc20),allowance:m,data:d,from:t,to:i,type:Ft.Evm,dryRun:()=>{}}}async estimateFee(t,e,n,s){let r=await N.get(this.#t,s).estimateFee(t,e);return n.copyWith({amount:r})}async getBalance(t,e){let n=$.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 u=a.watchBlocks({onBlock:()=>o()});return()=>u()},i;return r().then(o=>i=o),s.pipe(Ce(()=>i?.()),ye((o,u)=>o.amount===u.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 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 ve}from"@wormhole-foundation/sdk-solana";var we=9,Y=class extends k{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 Z=class extends k{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 tt=class{static get(t,e){switch(e.module){case"Native":return new Y(t,e);case"Token":return new Z(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Dt,PublicKey as xe,TransactionMessage as Se,VersionedTransaction as It}from"@solana/web3.js";var Rt=.5,kt=2,Vt=1,Mt=1e6,Pe=25e4,et=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=Rt,n=kt,s=Vt,a=Mt){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,n,s,a)]);return[Dt.setComputeUnitLimit({units:r}),Dt.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let n=new It(e);return(await this.connection.simulateTransaction(n,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new It(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=Rt,n=kt,s=Vt,a=Mt){let r=s,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let u=o.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]*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 W=class{static get(t,e){return new et(t,e)}};import{MessageV0 as Be}from"@solana/web3.js";function V(c){return c.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Ot(c,t=1e3){let e=[],n=[],s=0;for(let a of c){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 nt(c){let t=c.serialize();return Buffer.from(t).toString("hex")}function ba(c){let t=Buffer.from(c,"hex"),e=Uint8Array.from(t);return Be.deserialize(e)}var st=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,n,s){let a=W.get(this.#t,s),r=await a.getPriorityMessage(t),i=r.serialize(),o=De.from(i).toString("hex");return{from:t,data:o,ix:V(s.instructions),signers:s.signers,type:Ee.Solana,dryRun:async()=>{let{err:u,logs:l}=await a.simulateTransaction(t,r);return{call:s.module+"."+s.func,error:u,events:l}}}}async estimateFee(t,e,n,s){let a=W.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 m=s.module==="TokenBridge"&&s.func==="TransferNativeWithPayload";return n.copyWith({amount:n.amount-BigInt(l)-(m?e:0n)+s.rentReserve})}return n.copyWith({amount:r+s.rentReserve})}async getBalance(t,e){let n=tt.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),u=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(u)}},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 _t,SystemProgram as _e,TransactionMessage as Ne}from"@solana/web3.js";import{utils as We}from"@wormhole-foundation/sdk-solana";import{utils as Nt}from"@wormhole-foundation/sdk-solana-core";import{encoding as je}from"@wormhole-foundation/sdk-base";import{deserialize as Wt}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as Le,createCompleteTransferWrappedInstruction as He}from"@wormhole-foundation/sdk-solana-tokenbridge";var at=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 rt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new at(t)}async redeem(t,e){let n=Me.fromChain(this.#t),s=je.b64.decode(e),a=Wt("TokenBridge:Transfer",s),r=Wt("Uint8Array",s),i=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(a.hash)),o=new _t(t),u=[];if(!await this.#e.getAccountInfo(i)){let S=Oe.generate(),w=await Nt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),o,r,S.publicKey),y=Ot(w,1e3);for(let B=0;B<y.length;B++){let h=y[B],T=await this.getV0Message(o,h),E=nt(T);u.push({from:t,data:E,ix:V(h),signers:[S],type:bt.Solana})}let P=Nt.createPostVaaInstruction(this.#e,n.getCoreBridge(),o,r,S.publicKey),D=await this.getV0Message(o,[P]),C=nt(D);u.push({from:t,data:C,ix:V([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 _t(g[0]),lamports:1e3}),f=await this.getV0Message(o,[d,p]),A=nt(f);return u.push({from:t,data:A,ix:V([d]),type:bt.Solana}),u}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 jt}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as qe}from"viem";import{Binary as Lt}from"polkadot-api";var it=class{#t;constructor(t){this.#t=t,Ke.fromChain(this.#t)}redeemMrl(t,e){let n=jt.b64.decode(e),s=jt.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:Lt.fromHex(a.to)},value:[0n,0n,0n,0n],input:Lt.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(c,t,e){let n=await e.getDecimals(),s=e.chain.getAssetDecimals(t)??n,a=e.chain.usesChainDecimals?n:s;return{amount:Xe.convertDecimals(c,a,s),decimals:s}}import{enums as $e}from"@galacticcouncil/common";var Ht=c=>{let t=[];for(let e of c)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)},M=c=>{let t=c.value.error;return t.type==="Module"?$e.enumPath(t.value):JSON.stringify(t.value)};import{xcm as vt}from"@galacticcouncil/common";function Ge(c){return{parents:0,interior:{type:"X1",value:c.startsWith("0x")?vt.toAccountKey20(c):vt.toAccountId32(c)}}}function Ut(c){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:c.parachainId}}}}}var Je=(c,t)=>({id:vt.transform(c),fun:{type:"Fungible",value:t}}),zt=(c,t,e,n,s,a)=>{console.log(a);let r=Ge(c),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 ot=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,u=this.#e.chain,l=await u.getCurrency(),m=l.asset,d=l.decimals,g=u.getAssetXcmLocation(m),p=wt.fromHex(n.data),A=await(await o.txFromCallData(p)).getPaymentInfo(e),S=BigInt(A.partial_fee)*120n/100n,w=Ye.fromAsset(m,{amount:S,decimals:d}),y=A.weight.ref_time,P=A.weight.proof_size,D=Ut(u),C=zt(e,g,w,y,P,p),B=r.tx.PolkadotXcm.send({dest:D,message:C}),h=[];try{let b=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,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),pt=await r.txFromCallData(E);h.push(pt),h.push(B);let ft=h.map(b=>b.decodedCall),Q=r.tx.Utility.batch_all({calls:ft}),ht=await Q.getEncodedData();return{from:t,data:ht.asHex(),type:Ze.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 cn,AssetAmount as Xt,CallType as un}from"@galacticcouncil/xc-core";import{concatMap as $t,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 Qt}from"@polkadot-api/utils";import{Enum as Kt}from"polkadot-api";var{Ss58Addr:qt}=tn,x=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 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()),...Qt(t.startsWith("0x")?t.slice(2):t),...r,...Qt(n.startsWith("0x")?n.slice(2):n),...i(s),...i(e.toString())]),u=an(o);return on(u)}async dryRun(t,e){let n=Kt("Signed",t),s=Kt("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 Ht(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 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 u=nn.getSovereignAccounts(i);return this.chain.parachainId===0?qt.encodePubKey(u.relay):qt.encodePubKey(u.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,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),u=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 m=s.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: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,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),u=await At(o,n,a);return n.copyWith(u)}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($t(l=>i(l)),ln((l,m)=>l===m),$t(async l=>{let m=await At(l,t,n);return Xt.fromAsset(t,m)}),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=Xt.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 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 pn}from"@mysten/sui/utils";var fn=9,mt=class extends ut{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 lt=class{static get(t,e){switch(e.module){case"Native":return new mt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{fromBase64 as hn}from"@mysten/bcs";function Gt(c,t={}){let e=c.inputs??[],n=c.commands??[],s=t.numbers??"string",a=t.decode32As??"address",r=l=>s==="bigint"?l:s==="number"?Number(l):l.toString(),i=l=>{let m=hn(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=l=>{let m=e[l];if(!m)return{Input:l};if(m.Pure?.bytes)return i(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"?o(l.Input):l;return n.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 dt=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=Gt(JSON.parse(i));return{from:t,commands:o,data:bn(r),type:Cn.Sui,dryRun:async()=>{let u=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:s.module+"."+s.func,error:u.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,u=BigInt(o.computationCost),l=BigInt(o.storageCost),m=u+l;return n.copyWith({amount:m})}async getBalance(t,e){let n=lt.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 u=await this.getBalance(t,e);n.next(u)})();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 j.EvmChain:this.registerEvm(t);break;case j.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case j.Parachain:this.registerSubstrate(t);break;case j.SolanaChain:this.registerSolana(t);break;case j.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new J(e)}registerSolana(t){let e=t;this.platform.Solana=new st(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,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 St,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 L from"big.js";function Jt(c,t,e,n){let s=c.toBig().minus(e.toBig()).minus(c.isSame(t)?t.toBig():new L(0));return n&&(s=s.minus(c.isSame(n)?n.toBig():new L(0))),c.copyWith({amount:s.lt(0)?0n:BigInt(s.toFixed())})}function Yt(c,t,e,n){let a=c.copyWith({amount:0n}).toBig().plus(c.isSame(t)?t.toBig():new L(0)).plus(c.toBig().lt(e.toBig())?e.toBig():new L(0));return n&&(a=a.plus(c.isSame(n)&&c.toBig().lt(n.toBig())?n.toBig():new L(0))),c.copyWith({amount:BigInt(a.toFixed())})}async function F(c,t){return t.isEvmParachain()?t.getDerivatedAddress(c):c}function Zt(c,t){return t?Sn.toBigInt(t,c):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,O=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,H=class extends O{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:St.fromAsset(i,{amount:ee.toBigInt(r,o),decimals:o}),feeBreakdown:{}};let u=r,{amount:l,breakdown:m}=await u.build({feeAsset:i,transferAsset:n.asset,source:a?a.chain:t,destination:s.chain});return{fee:St.fromAsset(i,{amount:l,decimals:o}),feeBreakdown:m}}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),u=ne.isValid(o.toString())?await F(t,e):t,l=s.destinationFee.balance.build({address:u,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,u=await this.adapter.estimateFee(o,s,r.feeBalance,i),{fee:l}=n.source,m=l?Zt(u.decimals,l.extra):0n,d=u.amount+m;return u.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:u,amount:l,asset:m,sender:d}=t,p=await(await x.create(e)).buildMessageId(d,l,m.originSymbol,u);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,u=e.sender,l=In.getMultilocationDerivatedAccount(o.parachainId,u,n.parachainId===0?0:1,n.usesH160Acc),m=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:m.weight.ref_time,proofSize:m.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,n=await this.getDecimals(e.asset),s=ee.toBigInt(e.amount,n);return St.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 U=class extends O{constructor(t,e){super(t,e)}};import{AssetAmount as Rn}from"@galacticcouncil/xc-core";var z=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:jn}=Vn,Pt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}registerDex(...t){t.forEach(e=>On.getInstance().register(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[u,l]=await Promise.all([x.create(r),x.create(i)]),m=new ot(u,l),d=kn.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,n);return m.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 H(r,s),u=new U(i,a),l=new _n(...this.validations),[m,d,g,p,f,A,S]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),u.getBalance(n),u.getMin()]),{source:w,destination:y}=s.route,P=g.fee.copyWith(y.fee.asset),D=g.feeBreakdown,C={address:n,amount:10n,asset:w.asset,destination:{balance:A,chain:a.chain,fee:P,feeBreakdown:D},sender:e,source:{balance:m,chain:s.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};C.transact=await o.getTransact(C);let B=new z(C),h=await o.getFee(C),T;B.isSwapSupported(w.fee)&&(T=await B.getSwap(h),C.source.feeSwap=T);let E;B.isDestinationSwapSupported(h)&&(E=await B.getDestinationSwap(h),C.source.destinationFeeSwap=E),(T||E)&&(h=await o.getFee(C),h=h.padByPct(5n));let pt=await u.getEd(),ft=Yt(A,P,S,pt),Q=await o.getEd(),ht=Jt(m,h,f,Q);return C.amount=0n,C.source.fee=h,{source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:E,fee:h,feeBalance:d,feeSwap:T,max:ht,min:m.copyWith({amount:ft.amount})},destination:{balance:A,fee:P},async buildCall(b){let v=Object.assign({},C);return v.amount=se.toBigInt(b,m.decimals),v.transact=await o.getTransact(v),o.getCall(v)},async estimateFee(b){let v=Object.assign({},C);return v.amount=se.toBigInt(b,m.decimals),v.transact=await o.getTransact(v),o.getFee(v)},async validate(b){let v=Object.assign({},C),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:u})=>{let{asset:l,balance:m}=u,d=s.chain.getBalanceAssetId(l),g=jn.isValid(d.toString())?await F(t,s.chain):t,p=m.build({address:g,asset:l,chain:s.chain});return a.subscribeBalance(l,p)}),i=await Promise.all(r);return Nn(i).pipe(Wn(500)).subscribe(n)}};import{ConfigBuilder as Ln}from"@galacticcouncil/xc-core";function Hn(c){let t=Ln(c.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:u,dstAddress:l,dstAsset:m}){let d=o(m);return c.getTransferData(d,u,l)}}}}}}}}}import{Precompile as Un}from"@galacticcouncil/xc-core";var zn="https://api.wormholescan.io",gt=class{_baseUrl;constructor(t){this._baseUrl=t||zn}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===Un.Bridge}};import{acc as Qn}from"@galacticcouncil/common";import{mrl as Kn,ChainType as re,Parachain as qn,Precompile as Xn,Wormhole as _}from"@galacticcouncil/xc-core";import{encoding as $n}from"@wormhole-foundation/sdk-base";import{keccak256 as Gn}from"@wormhole-foundation/sdk-connect";import{deserialize as Jn}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 Yn=300*1e3,ie=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 n=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:n}}async getWithdraws(t){let e=Qn.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,u=this.getStatus(a),l=this.chains.find(f=>f instanceof qn&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>_.isKnown(f)&&_.fromChain(f).getWormholeId()===i.tokenChain),p;if(u===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 K(g);p=async y=>S.redeem(y,A);break;case re.SolanaChain:let w=new rt(g);p=async y=>w.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:p,operation:a}});return Promise.all(s)}async getDeposits(t,e="hydration"){let n=await this.whScan.getOperations({...this.filters,address:Xn.Bridge,pageSize:"100"}),s=this.config.chains.get(e);if(!s)return[];let a=s,i=(await Kn.createPayload(a,t)).toHex(),o=n.filter(u=>{let{content:l}=u,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async u=>{let{content:l,sourceChain:m}=u,{payload:d,standarizedProperties:g}=l,p=this.getStatus(u),{tokenAddress:f}=g,A=this.chains.find(y=>_.isKnown(y)&&_.fromChain(y).getWormholeId()===d.tokenChain),S=this.chains.find(y=>_.isKnown(y)&&_.fromChain(y).getWormholeId()===d.toChain),w;if(p===1&&u.vaa){let{timestamp:y}=this.getVaaHeader(u.vaa.raw),P=u.vaa.raw;if(this.isStuck(y)){let D=new it(S);w=async C=>D.redeemMrlViaXcm(C,P)}}return{asset:f,assetSymbol:u.data.symbol,amount:u.data.tokenAmount,from:m.from,fromChain:A,to:t,toChain:s,status:p,redeem:w,operation:u}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+Yn}getVaaHeader(t){let e=$n.b64.decode(t),n=Jn("Uint8Array",e);return{timestamp:n.timestamp,emitterChain:n.emitterChain,emitterAddress:n.emitterAddress.toString(),sequence:n.sequence,payload:n.payload,hash:n.hash,id:Gn(n.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{K as EvmClaim,J as EvmPlatform,z as FeeSwap,I as PlatformAdapter,rt as SolanaClaim,at as SolanaLilJit,st as SolanaPlatform,it as SubstrateClaim,ot as SubstrateExec,ct as SubstratePlatform,x as SubstrateService,dt as SuiPlatform,Hn as TransferBuilder,Pt as Wallet,ae as WhStatus,gt as WormholeScan,ie as WormholeTransfer,Ot as chunkBySize,ba as deserializeV0,V as ixToHuman,nt as serializeV0};
|
|
@@ -4,7 +4,7 @@ export declare function buildBeneficiary(dstAccount: string): {
|
|
|
4
4
|
parents: number;
|
|
5
5
|
interior: {
|
|
6
6
|
type: string;
|
|
7
|
-
value:
|
|
7
|
+
value: {
|
|
8
8
|
type: string;
|
|
9
9
|
value: {
|
|
10
10
|
network: undefined;
|
|
@@ -16,7 +16,7 @@ export declare function buildBeneficiary(dstAccount: string): {
|
|
|
16
16
|
network: undefined;
|
|
17
17
|
id: Binary;
|
|
18
18
|
};
|
|
19
|
-
}
|
|
19
|
+
};
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
22
|
export declare function buildXcmDest(dstChain: AnyParachain): {
|
|
@@ -28,7 +28,7 @@ export declare function buildXcmDest(dstChain: AnyParachain): {
|
|
|
28
28
|
value: {
|
|
29
29
|
type: string;
|
|
30
30
|
value: number;
|
|
31
|
-
}
|
|
31
|
+
};
|
|
32
32
|
};
|
|
33
33
|
};
|
|
34
34
|
};
|
|
@@ -42,7 +42,7 @@ export declare const buildXcmMessage: (dstAccount: string, dstFeeLocation: any,
|
|
|
42
42
|
type: string;
|
|
43
43
|
value: any;
|
|
44
44
|
};
|
|
45
|
-
};
|
|
45
|
+
}[];
|
|
46
46
|
} | {
|
|
47
47
|
type: string;
|
|
48
48
|
value: {
|
|
@@ -80,7 +80,7 @@ export declare const buildXcmMessage: (dstAccount: string, dstFeeLocation: any,
|
|
|
80
80
|
};
|
|
81
81
|
} | {
|
|
82
82
|
type: string;
|
|
83
|
-
value
|
|
83
|
+
value: undefined;
|
|
84
84
|
} | {
|
|
85
85
|
type: string;
|
|
86
86
|
value: {
|
|
@@ -95,7 +95,7 @@ export declare const buildXcmMessage: (dstAccount: string, dstFeeLocation: any,
|
|
|
95
95
|
parents: number;
|
|
96
96
|
interior: {
|
|
97
97
|
type: string;
|
|
98
|
-
value:
|
|
98
|
+
value: {
|
|
99
99
|
type: string;
|
|
100
100
|
value: {
|
|
101
101
|
network: undefined;
|
|
@@ -107,7 +107,7 @@ export declare const buildXcmMessage: (dstAccount: string, dstFeeLocation: any,
|
|
|
107
107
|
network: undefined;
|
|
108
108
|
id: Binary;
|
|
109
109
|
};
|
|
110
|
-
}
|
|
110
|
+
};
|
|
111
111
|
};
|
|
112
112
|
};
|
|
113
113
|
fees?: undefined;
|