@galacticcouncil/xc-sdk 1.2.1-pr336-0937e27 → 1.2.2
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 +3 -3
- package/build/index.mjs +3 -3
- package/build/index.mjs.map +7 -0
- package/build/platforms/solana/utils.d.ts +1 -1
- package/package.json +2 -2
package/build/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Pn=Object.create;var Rt=Object.defineProperty;var Tn=Object.getOwnPropertyDescriptor;var Bn=Object.getOwnPropertyNames;var En=Object.getPrototypeOf,In=Object.prototype.hasOwnProperty;var Fn=(u,t)=>{for(var e in t)Rt(u,e,{get:t[e],enumerable:!0})},Se=(u,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Bn(t))!In.call(u,n)&&n!==e&&Rt(u,n,{get:()=>t[n],enumerable:!(s=Tn(t,n))||s.enumerable});return u};var Dn=(u,t,e)=>(e=u!=null?Pn(En(u)):{},Se(t||!u||!u.__esModule?Rt(e,"default",{value:u,enumerable:!0}):e,u)),Rn=u=>Se(Rt({},"__esModule",{value:!0}),u);var
|
|
1
|
+
"use strict";var Pn=Object.create;var Rt=Object.defineProperty;var Tn=Object.getOwnPropertyDescriptor;var Bn=Object.getOwnPropertyNames;var En=Object.getPrototypeOf,In=Object.prototype.hasOwnProperty;var Fn=(u,t)=>{for(var e in t)Rt(u,e,{get:t[e],enumerable:!0})},Se=(u,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Bn(t))!In.call(u,n)&&n!==e&&Rt(u,n,{get:()=>t[n],enumerable:!(s=Tn(t,n))||s.enumerable});return u};var Dn=(u,t,e)=>(e=u!=null?Pn(En(u)):{},Se(t||!u||!u.__esModule?Rt(e,"default",{value:u,enumerable:!0}):e,u)),Rn=u=>Se(Rt({},"__esModule",{value:!0}),u);var Ln={};Fn(Ln,{DISPATCH_ADDRESS:()=>oe,EvmClaim:()=>gt,EvmPlatform:()=>ft,EvmSigner:()=>ce,FeeSwap:()=>ct,PlatformAdapter:()=>K,SolanaClaim:()=>At,SolanaLilJit:()=>q,SolanaPlatform:()=>yt,SolanaSigner:()=>de,SubstrateClaim:()=>bt,SubstrateExec:()=>vt,SubstratePlatform:()=>St,SubstrateService:()=>B,SubstrateSigner:()=>Ce,SuiClaim:()=>be,SuiPlatform:()=>Pt,SuiSigner:()=>we,TransferBuilder:()=>Cn,Wallet:()=>ne,WhStatus:()=>ve,WormholeScan:()=>It,WormholeTransfer:()=>xe,chunk:()=>ue,deserializeV0:()=>_n,ixToHuman:()=>M,serializeV0:()=>et});module.exports=Rn(Ln);var ut=require("@galacticcouncil/common"),lt=require("@galacticcouncil/xc-core"),se=require("rxjs");var rt=require("@galacticcouncil/xc-core");var kt=require("@galacticcouncil/xc-core"),Pe=require("viem"),re=require("@wormhole-foundation/sdk-base"),gt=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=kt.Wormhole.fromChain(this.#t),n=re.encoding.b64.decode(e),a=re.encoding.hex.encode(n),r=kt.Abi.TokenBridge,i=(0,Pe.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};var R=require("@galacticcouncil/xc-core"),_=require("rxjs");var Z=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 Te=require("@galacticcouncil/xc-core");var Vt=class extends Z{erc20;constructor(t,e){super(t,e),this.erc20=new Te.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 Ot=class extends Z{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 _t=class{static get(t,e){switch(e.module){case"Erc20":return new Vt(t,e);case"Native":return new Ot(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Nt=require("viem"),Mt=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 Nt.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(),i=await this.getNonce(t);try{let{results:o}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:i}]}),[c]=o;return c}catch(o){return console.log(`Can't simulate call!
|
|
3
|
-
`,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Nt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var pt=class{static get(t,e){return new Mt(t,e)}};var Be=require("@galacticcouncil/xc-core"),Ee=require("viem");function ie(u){return u.module==="Snowbridge"&&u.func==="v2_sendMessage"}function Ie(u){if(!ie(u))return;let t=u.args[1];if(!t||t.length===0)return;let[e,s]=(0,Ee.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Fe(u){let t=u.module==="Snowbridge"&&u.func==="v2_sendMessage"&&Array.isArray(u.args[1])&&u.args[1].length===0,e=u.module==="Snowbridge"&&u.func==="sendToken"&&u.args[0]==="0x0000000000000000000000000000000000000000";return u.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(u.func)||t||e}function De(u){return Object.entries(Be.Precompile).map(([e,s])=>s).includes(u.address)}var ft=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=pt.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:R.CallType.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),h=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:h}}};if(De(n)||Fe(n))return c;let l=ie(n)?Ie(n):i,m=new R.Erc20Client(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return c;let g=m.approve(n.address,e);return{abi:JSON.stringify(R.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:R.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await pt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=_t.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return R.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new _.Subject,n=s.pipe((0,_.shareReplay)(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe((0,_.finalize)(()=>i?.()),(0,_.distinctUntilChanged)((o,c)=>o.amount===c.amount))}};var Re=require("@galacticcouncil/xc-core"),ke=require("@galacticcouncil/common"),Ve=require("polkadot-api"),oe="0x0000000000000000000000000000000000000401",{H160:kn}=ke.h160,ce=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=kn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Re.EvmParachain)try{let i=this.#t.client,o=Ve.Binary.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:oe}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:oe})}else{let{data:i,to:o,value:c}=t,[l,m]=await Promise.all([n.estimateGas({account:s,data:i,to:o,value:c}),n.getGasPrice()]),d=m+m*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};var Ht=require("@galacticcouncil/xc-core"),je=require("@solana/web3.js"),Ke=require("buffer"),N=require("rxjs");var tt=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 Oe=require("@wormhole-foundation/sdk-solana");var Vn=9,Wt=class extends tt{async getBalance(){let{address:t}=this.config,e=new Oe.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Vn}};var Ut=require("@wormhole-foundation/sdk-solana");var jt=class extends tt{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Ut.SolanaAddress(t).unwrap(),n=new Ut.SolanaAddress(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).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 Ut.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Kt=class{static get(t,e){switch(e.module){case"Native":return new Wt(t,e);case"Token":return new jt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var D=require("@solana/web3.js"),_e=.5,Me=2,Ne=1,We=1e6,On=25e4,zt=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 D.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new D.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=_e,s=Me,n=Ne,a=We){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[D.ComputeBudgetProgram.setComputeUnitLimit({units:r}),D.ComputeBudgetProgram.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new D.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new D.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):On}async determinePriorityFee(t,e=_e,s=Me,n=Ne,a=We){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(c.length*e);if(c.length>l){let d=c[l]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var ht=class{static get(t,e){return new zt(t,e)}};var Ue=require("@solana/web3.js");function M(u){return u.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function ue(u,t=1e3){let e=[],s=[],n=0;for(let a of u){let r=a.data?.length??0;s.length&&n+r>t&&(e.push(s),s=[],n=0),s.push(a),n+=r}return s.length&&e.push(s),e}function et(u){let t=u.serialize();return Buffer.from(t).toString("hex")}function _n(u){let t=Buffer.from(u,"hex"),e=Uint8Array.from(t);return Ue.MessageV0.deserialize(e)}var yt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=ht.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=Ke.Buffer.from(i).toString("hex");return{from:t,data:o,ix:M(n.instructions),signers:n.signers,type:Ht.CallType.Solana,dryRun:async()=>{let{err:c,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:l}}}}async estimateFee(t,e,s,n){let a=ht.get(this.#t,n),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=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=Kt.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()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let o=new je.PublicKey(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe((0,N.finalize)(()=>r?.()),(0,N.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var G=require("@galacticcouncil/xc-core"),P=require("@solana/web3.js"),C=require("@solana/spl-token"),ze=require("@wormhole-foundation/sdk-solana"),le=require("@wormhole-foundation/sdk-solana-core"),He=require("@wormhole-foundation/sdk-base"),me=require("@wormhole-foundation/sdk-definitions"),Ct=require("@wormhole-foundation/sdk-solana-tokenbridge");var q=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var At=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new q(t)}async redeem(t,e,s){let n=G.Wormhole.fromChain(this.#t),a=He.encoding.b64.decode(e),r=(0,me.deserialize)("TokenBridge:Transfer",a),i=(0,me.deserialize)("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new P.PublicKey(t),l=s?new P.PublicKey(s):c,m=c.equals(l),d=[];if(!await this.#e.getAccountInfo(o)){let y=P.Keypair.generate(),I=await le.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,y.publicKey),k=ue(I,1e3);for(let F=0;F<k.length;F++){let w=k[F],V=await this.getV0Message(c,w),O=et(V);d.push({from:t,data:O,ix:M(w),signers:[y],type:G.CallType.Solana})}let L=le.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,y.publicKey),mt=await this.getV0Message(c,[L]),A=et(mt);d.push({from:t,data:A,ix:M([L]),type:G.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new P.PublicKey(r.payload.token.address.toUint8Array()),h=p&&f.equals(C.NATIVE_MINT),T=await this.#n.getTipAccount(),b=P.SystemProgram.transfer({fromPubkey:c,toPubkey:new P.PublicKey(T[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,c,r,b);d.push(y)}else{let y=await this.redeemToken(n,c,l,f,p,r,b);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?Ct.createCompleteTransferNativeInstruction:Ct.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=(0,C.getAssociatedTokenAddressSync)(n,s),m=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,l,s,n),d=await this.getV0Message(e,[m,c,i]),g=et(d);return{from:e.toBase58(),data:g,ix:M([m,c]),type:G.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new P.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,C.getMint)(this.#e,C.NATIVE_MINT),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await(0,C.getMinimumBalanceForRentExemptAccount)(this.#e),c=P.Keypair.generate(),l=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,C.NATIVE_MINT),m=(0,Ct.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=P.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:C.ACCOUNT_SIZE,programId:C.TOKEN_PROGRAM_ID}),g=(0,C.createInitializeAccountInstruction)(c.publicKey,C.NATIVE_MINT,e),p=(0,C.createTransferInstruction)(a,c.publicKey,e,i),f=(0,C.createCloseAccountInstruction)(c.publicKey,e,e),h=[l,m,d,g,p,f,n],T=await this.getV0Message(e,h),b=et(T);return{from:e.toBase58(),data:b,ix:M(h),signers:[c],type:G.CallType.Solana}}derivePostedVaaKey(t,e){return ze.utils.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new P.TransactionMessage({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};var X=require("@solana/web3.js"),Lt=require("buffer");var de=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new q(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof X.Keypair){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let l=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof X.Keypair)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>Lt.Buffer.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(l=>Lt.Buffer.from(l.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Lt.Buffer.from(t,"hex"),n=Uint8Array.from(s),a=X.MessageV0.deserialize(n),r=new X.VersionedTransaction(a);return e&&r.sign(e),r}};var W=require("@galacticcouncil/xc-core"),ge=require("@wormhole-foundation/sdk-base"),Le=require("viem"),pe=require("polkadot-api"),bt=class{#t;constructor(t){this.#t=t,W.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=ge.encoding.b64.decode(e),n=ge.encoding.hex.encode(s),a=W.Abi.Gmp,r=(0,Le.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:W.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),i=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:pe.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:pe.Binary.toHex(i),from:t,type:W.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var Qt=require("@galacticcouncil/xc-core"),wt=require("polkadot-api");var $e=require("@galacticcouncil/common");async function fe(u,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:$e.big.convertDecimals(u,a,n),decimals:n}}var Qe=require("@galacticcouncil/common"),qe=u=>{let t=[];for(let e of u)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},nt=u=>{let t=u.value.error;return t.type==="Module"?Qe.enums.enumPath(t.value):JSON.stringify(t.value)};var $t=require("@galacticcouncil/common");function Mn(u){return{parents:0,interior:{type:"X1",value:u.startsWith("0x")?$t.xcm.toAccountKey20(u):$t.xcm.toAccountId32(u)}}}function Ge(u){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:u.parachainId}}}}}var Nn=(u,t)=>({id:$t.xcm.transform(u),fun:{type:"Fungible",value:t}}),Xe=(u,t,e,s,n,a)=>{console.log(a);let r=Mn(u),i=Nn(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: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 vt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),m=l.asset,d=l.decimals,g=c.getAssetXcmLocation(m),p=wt.Binary.fromHex(s.data),h=await(await o.txFromCallData(p)).getPaymentInfo(e),T=BigInt(h.partial_fee)*120n/100n,b=Qt.AssetAmount.fromAsset(m,{amount:T,decimals:d}),y=h.weight.ref_time,I=h.weight.proof_size,k=Ge(c),L=Xe(e,g,b,y,I,p),mt=r.tx.PolkadotXcm.send({dest:k,message:L}),A=[];try{let x=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,b,10),Dt=wt.Binary.fromHex(x),dt=await r.txFromCallData(Dt);A.push(dt)}catch{}let F=await n(b),w=wt.Binary.fromHex(F.data),V=await r.txFromCallData(w);A.push(V),A.push(mt);let O=A.map(x=>x.decodedCall),Ft=r.tx.Utility.batch_all({calls:O}),ae=await Ft.getEncodedData();return{from:t,data:wt.Binary.toHex(ae),type:Qt.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let x=await this.#t.dryRun(t,Ft);return{call:"polkadotXcm.send",error:x.execution_result&&x.execution_result.success?void 0:nt(x.execution_result),events:x.emitted_events||[],xcm:x.forwarded_xcms||[]}}catch(x){return{call:"polkadotXcm.send",error:x instanceof Error?x.message:"unknown"}}}:()=>{}}}};var J=require("@galacticcouncil/xc-core"),Ye=require("polkadot-api"),E=require("rxjs");var U=require("@galacticcouncil/xc-core"),qt=require("@galacticcouncil/common"),Gt=require("@polkadot-api/substrate-bindings"),xt=require("@polkadot-api/utils"),he=require("polkadot-api");var{Ss58Addr:Je}=U.addr,B=class u{chain;_currency;constructor(t){this.chain=t}static async create(t){return new u(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return U.AssetAmount.fromAsset(e,{amount:t,decimals:s})}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Gt.u32.enc(a),i=l=>new TextEncoder().encode(l),o=new Uint8Array([...i(this.chain.parachainId.toString()),...(0,xt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,xt.fromHex)(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=(0,Gt.Blake2256)(o);return(0,xt.toHex)(c)}async dryRun(t,e){let s=(0,he.Enum)("Signed",t),n=(0,he.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: "+qt.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 qe(a.emitted_events||[]);{let r=nt(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
|
|
4
|
-
${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=U.multiloc.findNestedKey(a,"interior"),i=U.multiloc.findParachain(a);if(U.multiloc.findGlobalConsensus(a))return t;if(i){let l=qt.acc.getSovereignAccounts(i);return this.chain.parachainId===0?Je.encodePubKey(l.relay):Je.encodePubKey(l.generic)}let c=r&&r.interior;if(c==="Here"||c?.type==="Here")return this.chain.treasury||t}return t}};var St=class{#t;constructor(t){this.#t=B.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,i=await this.useSignerFee(s)?{asset:new J.Asset(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,l=await o.getEncodedData();return{from:t,data:Ye.Binary.toHex(l),type:J.CallType.Substrate,txOptions:i,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:nt(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await fe(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return(0,E.firstValueFrom)(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe((0,E.map)(({value:l})=>l)).pipe((0,E.concatMap)(l=>i(l)),(0,E.distinctUntilChanged)((l,m)=>l===m),(0,E.concatMap)(async l=>{let m=await fe(l,t,s);return J.AssetAmount.fromAsset(t,m)}),(0,E.catchError)(l=>(console.error("subscribe fails for:",t),(0,E.throwError)(()=>l))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=J.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};var ye=require("@galacticcouncil/xc-core"),st=require("polkadot-api"),Ce=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=st.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=ye.multiloc.findPalletInstance(e),n=ye.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,st.Enum)("X2",[(0,st.Enum)("PalletInstance",Number(s)),(0,st.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var Jt=require("@galacticcouncil/xc-core"),tn=require("@mysten/sui/transactions"),en=require("@mysten/sui/utils"),nn=require("@mysten/bcs"),at=require("@wormhole-foundation/sdk-connect"),sn=require("@wormhole-foundation/sdk-definitions"),Ae=require("@wormhole-foundation/sdk-sui"),an=require("@wormhole-foundation/sdk-sui-tokenbridge");var Ze=require("@mysten/bcs");function Xt(u,t={}){let e=u.inputs??[],s=u.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),i=l=>{let m=(0,Ze.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)}},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}},c=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?o(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return l})}var be=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Jt.Wormhole.fromChain(this.#t),n=this.#t.client,a=at.encoding.b64.decode(e),r=(0,sn.deserialize)("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await(0,an.getTokenCoinType)(n,o,r.payload.token.address.toUint8Array(),(0,at.toChainId)(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([(0,Ae.getPackageId)(n,i),(0,Ae.getPackageId)(n,o)]),d=new tn.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",(0,at.serialize)(r)),d.object(en.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[c]});let T=await d.build({client:n}),b=await d.toJSON(),y=Xt(JSON.parse(b));return{from:t,commands:y,data:(0,nn.toBase64)(T),type:Jt.CallType.Sui}}};var ee=require("@galacticcouncil/xc-core"),on=require("@mysten/bcs"),j=require("rxjs");var Yt=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 rn=require("@mysten/sui/utils");var Wn=9,Zt=class extends Yt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:rn.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return Wn}};var te=class{static get(t,e){switch(e.module){case"Native":return new Zt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Pt=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=await a.toJSON(),o=Xt(JSON.parse(i));return{from:t,commands:o,data:(0,on.toBase64)(r),type:ee.CallType.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),l=BigInt(o.storageCost),m=c+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=te.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return ee.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new j.Subject,n=s.pipe((0,j.shareReplay)(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe((0,j.finalize)(()=>r?.()),(0,j.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var cn=require("@mysten/sui/keypairs/ed25519"),un=require("@mysten/sui/transactions"),we=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof cn.Ed25519Keypair){let o=un.Transaction.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var K=class{platform={};constructor(t){switch(t.getType()){case rt.ChainType.EvmChain:this.registerEvm(t);break;case rt.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case rt.ChainType.Parachain:this.registerSubstrate(t);break;case rt.ChainType.SolanaChain:this.registerSolana(t);break;case rt.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new ft(e)}registerSolana(t){let e=t;this.platform.Solana=new yt(e)}registerSui(t){let e=t;this.platform.Sui=new Pt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new St(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};var H=require("@galacticcouncil/xc-core"),Tt=require("@galacticcouncil/common");var ln=require("@galacticcouncil/common"),it=Dn(require("big.js"),1);function mn(u,t,e,s){let n=u.toBig().minus(e.toBig()).minus(u.isSame(t)?t.toBig():new it.default(0));return s&&(n=n.minus(u.isSame(s)?s.toBig():new it.default(0))),u.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function dn(u,t,e,s){let a=u.copyWith({amount:0n}).toBig().plus(u.isSame(t)?t.toBig():new it.default(0)).plus(u.toBig().lt(e.toBig())?e.toBig():new it.default(0));return s&&(a=a.plus(u.isSame(s)&&u.toBig().lt(s.toBig())?s.toBig():new it.default(0))),u.copyWith({amount:BigInt(a.toFixed())})}async function z(u,t){return t.isEvmParachain()?t.getDerivatedAddress(u):u}function gn(u,t){return t?ln.big.toBigInt(t,u):0n}var Y=require("@galacticcouncil/xc-core"),pn=require("@galacticcouncil/common");var{EvmAddr:Un}=Y.addr,ot=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof Y.Parachain)return(await B.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=Un.isValid(r.toString())?await z(t,e):t,o=s.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:s}=e,n=s.asset,a=s.min;if(t instanceof Y.Parachain&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}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),i=0n;return a&&(i=pn.big.toBigInt(a,r)),Y.AssetAmount.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:fn}=H.addr,Bt=class extends ot{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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,i=a.fee.amount,o=n.destinationFee.asset||a.fee.asset,c=await this.getDecimals(o);if(Number.isFinite(i))return{fee:H.AssetAmount.fromAsset(o,{amount:Tt.big.toBigInt(i,c),decimals:c}),feeBreakdown:{}};let l=i,{amount:m,breakdown:d}=await l.build({feeAsset:o,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:H.AssetAmount.fromAsset(o,{amount:m,decimals:c}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=fn.isValid(o.toString())?await z(t,e):t,l=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await z(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:l}=s.source,m=l?gn(c.decimals,l.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=fn.isValid(r.toString())?await z(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof H.Parachain&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:l,asset:m,sender:d}=t,p=await(await B.create(e)).buildMessageId(d,l,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||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:s}=e;if(s){let n=Object.assign({transact:{chain:s.chain}}),a={...t,...n};return{...await this.getTransactData(s,a),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,a=await n.build(e),r=await B.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,l=Tt.acc.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.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: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=Tt.big.toBigInt(e.amount,s);return H.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){let{chain:s}=this.config,{fee:n}=t,a=n.balance.build({address:e.sender,asset:n.asset,chain:s});return this.adapter.getBalance(n.asset,a)}};var Et=class extends ot{constructor(t,e){super(t,e)}};var hn=require("@galacticcouncil/xc-core"),ct=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:hn.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:jn}=lt.addr,ne=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,lt.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),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([B.create(r),B.create(i)]),m=new vt(c,l),d=ut.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let h=f.toDecimal();return p.buildCall(h)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new K(n.chain),i=new K(a.chain),o=new Bt(r,n),c=new Et(i,a),l=new lt.TransferValidator(...this.validations),[m,d,g,p,f,h,T]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:b,destination:y}=n.route,I=g.fee.copyWith(y.fee.asset),k=g.feeBreakdown,mt=b.asset.isEqual(I)&&I.amount>10n?I.amount+1n:10n,A={address:s,amount:mt,asset:b.asset,destination:{balance:h,chain:a.chain,fee:I,feeBreakdown:k},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};A.transact=await o.getTransact(A);let F=new ct(A),w=await o.getFee(A),V;F.isSwapSupported(b.fee)&&(V=await F.getSwap(w),A.source.feeSwap=V);let O;F.isDestinationSwapSupported(w)&&(O=await F.getDestinationSwap(w),A.source.destinationFeeSwap=O),(V||O)&&(w=await o.getFee(A),w=w.padByPct(5n));let Ft=await c.getEd(),ae=dn(h,I,T,Ft),x=await o.getEd(),Dt=mn(m,w,f,x);A.amount=0n,A.source.fee=w;let dt={source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:O,fee:w,feeBalance:d,feeSwap:V,max:Dt,min:m.copyWith({amount:ae.amount})},destination:{balance:h,fee:I},async buildCall($){let S=Object.assign({},A);return S.amount=ut.big.toBigInt($,m.decimals),S.transact=await o.getTransact(S),o.getCall(S)},async estimateFee($){let S=Object.assign({},A);return S.amount=ut.big.toBigInt($,m.decimals),S.transact=await o.getTransact(S),o.getFee(S)},async estimateDestinationFee($){let S=ut.big.toBigInt($,m.decimals),{fee:Q,feeBreakdown:Sn}=await o.getDestinationFee(S);return A.destination.fee=Q,A.destination.feeBreakdown=Sn,A.source.destinationFee=Q,dt.destination.fee=Q,dt.source.destinationFee=Q,Q},async validate($){let S=Object.assign({},A),Q=$||w.amount;return S.source.fee=w.copyWith({amount:Q}),l.validate(S)}};return dt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new K(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:l,balance:m}=c,d=n.chain.getBalanceAssetId(l),g=jn.isValid(d.toString())?await z(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),i=await Promise.all(r);return(0,se.combineLatest)(i).pipe((0,se.debounceTime)(500)).subscribe(s)}};var yn=require("@galacticcouncil/xc-core");function Cn(u){let t=(0,yn.ConfigBuilder)(u.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return u.getTransferData(h,d,g)}}}}}}}}}var An=require("@galacticcouncil/xc-core"),Kn="https://api.wormholescan.io",It=class{_baseUrl;constructor(t){this._baseUrl=t||Kn}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===An.Precompile.Bridge}};var bn=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),wn=require("@wormhole-foundation/sdk-base"),vn=require("@wormhole-foundation/sdk-connect"),xn=require("@wormhole-foundation/sdk-definitions");var ve=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(ve||{});var zn=300*1e3,xe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new It}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=bn.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),h=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case v.ChainType.EvmChain:let T=new gt(g);p=async y=>T.redeem(y,h);break;case v.ChainType.SolanaChain:let b=new At(g);p=async y=>b.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:v.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await v.mrl.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:l}=c,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:l,sourceChain:m}=c,{payload:d,standarizedProperties:g}=l,p=this.getStatus(c),{tokenAddress:f}=g,h=this.chains.find(y=>v.Wormhole.isKnown(y)&&v.Wormhole.fromChain(y).getWormholeId()===d.tokenChain),T=this.chains.find(y=>v.Wormhole.isKnown(y)&&v.Wormhole.fromChain(y).getWormholeId()===d.toChain),b;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),I=c.vaa.raw;if(this.isStuck(y)){let k=new bt(T);b=async L=>k.redeemMrlViaXcm(L,I)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:b,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+zn}getVaaHeader(t){let e=wn.encoding.b64.decode(t),s=(0,xn.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,vn.keccak256)(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};0&&(module.exports={DISPATCH_ADDRESS,EvmClaim,EvmPlatform,EvmSigner,FeeSwap,PlatformAdapter,SolanaClaim,SolanaLilJit,SolanaPlatform,SolanaSigner,SubstrateClaim,SubstrateExec,SubstratePlatform,SubstrateService,SubstrateSigner,SuiClaim,SuiPlatform,SuiSigner,TransferBuilder,Wallet,WhStatus,WormholeScan,WormholeTransfer,chunkBySize,deserializeV0,ixToHuman,serializeV0});
|
|
3
|
+
`,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Nt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var pt=class{static get(t,e){return new Mt(t,e)}};var Be=require("@galacticcouncil/xc-core"),Ee=require("viem");function ie(u){return u.module==="Snowbridge"&&u.func==="v2_sendMessage"}function Ie(u){if(!ie(u))return;let t=u.args[1];if(!t||t.length===0)return;let[e,s]=(0,Ee.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Fe(u){let t=u.module==="Snowbridge"&&u.func==="v2_sendMessage"&&Array.isArray(u.args[1])&&u.args[1].length===0,e=u.module==="Snowbridge"&&u.func==="sendToken"&&u.args[0]==="0x0000000000000000000000000000000000000000";return u.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(u.func)||t||e}function De(u){return Object.entries(Be.Precompile).map(([e,s])=>s).includes(u.address)}var ft=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=pt.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:R.CallType.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),h=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:h}}};if(De(n)||Fe(n))return c;let l=ie(n)?Ie(n):i,m=new R.Erc20Client(this.#t,l),d=await m.allowance(t,n.address);if(d>=e)return c;let g=m.approve(n.address,e);return{abi:JSON.stringify(R.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:R.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await pt.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=_t.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return R.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new _.Subject,n=s.pipe((0,_.shareReplay)(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let l=await this.getBalance(t,e);s.next(l)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe((0,_.finalize)(()=>i?.()),(0,_.distinctUntilChanged)((o,c)=>o.amount===c.amount))}};var Re=require("@galacticcouncil/xc-core"),ke=require("@galacticcouncil/common"),Ve=require("polkadot-api"),oe="0x0000000000000000000000000000000000000401",{H160:kn}=ke.h160,ce=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=kn.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Re.EvmParachain)try{let i=this.#t.client,o=Ve.Binary.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:oe}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:oe})}else{let{data:i,to:o,value:c}=t,[l,m]=await Promise.all([n.estimateGas({account:s,data:i,to:o,value:c}),n.getGasPrice()]),d=m+m*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};var Lt=require("@galacticcouncil/xc-core"),je=require("@solana/web3.js"),Ke=require("buffer"),N=require("rxjs");var tt=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 Oe=require("@wormhole-foundation/sdk-solana");var Vn=9,Wt=class extends tt{async getBalance(){let{address:t}=this.config,e=new Oe.SolanaAddress(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Vn}};var Ut=require("@wormhole-foundation/sdk-solana");var jt=class extends tt{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Ut.SolanaAddress(t).unwrap(),n=new Ut.SolanaAddress(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).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 Ut.SolanaAddress(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var Kt=class{static get(t,e){switch(e.module){case"Native":return new Wt(t,e);case"Token":return new jt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var D=require("@solana/web3.js"),_e=.5,Me=2,Ne=1,We=1e6,On=25e4,Ht=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 D.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new D.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=_e,s=Me,n=Ne,a=We){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[D.ComputeBudgetProgram.setComputeUnitLimit({units:r}),D.ComputeBudgetProgram.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new D.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new D.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):On}async determinePriorityFee(t,e=_e,s=Me,n=Ne,a=We){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),l=Math.ceil(c.length*e);if(c.length>l){let d=c[l]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var ht=class{static get(t,e){return new Ht(t,e)}};var Ue=require("@solana/web3.js");function M(u){return u.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function ue(u,t){let e=[];for(let s=0;s<u.length;s+=t)e.push(u.slice(s,s+t));return e}function et(u){let t=u.serialize();return Buffer.from(t).toString("hex")}function _n(u){let t=Buffer.from(u,"hex"),e=Uint8Array.from(t);return Ue.MessageV0.deserialize(e)}var yt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=ht.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=Ke.Buffer.from(i).toString("hex");return{from:t,data:o,ix:M(n.instructions),signers:n.signers,type:Lt.CallType.Solana,dryRun:async()=>{let{err:c,logs:l}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:l}}}}async estimateFee(t,e,s,n){let a=ht.get(this.#t,n),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=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=Kt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Lt.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new N.Subject,n=s.pipe((0,N.shareReplay)(1)),a=async()=>{let i=async()=>{let l=await this.getBalance(t,e);s.next(l)};await i();let o=new je.PublicKey(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe((0,N.finalize)(()=>r?.()),(0,N.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var G=require("@galacticcouncil/xc-core"),P=require("@solana/web3.js"),C=require("@solana/spl-token"),He=require("@wormhole-foundation/sdk-solana"),le=require("@wormhole-foundation/sdk-solana-core"),Le=require("@wormhole-foundation/sdk-base"),me=require("@wormhole-foundation/sdk-definitions"),Ct=require("@wormhole-foundation/sdk-solana-tokenbridge");var q=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var At=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new q(t)}async redeem(t,e,s){let n=G.Wormhole.fromChain(this.#t),a=Le.encoding.b64.decode(e),r=(0,me.deserialize)("TokenBridge:Transfer",a),i=(0,me.deserialize)("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new P.PublicKey(t),l=s?new P.PublicKey(s):c,m=c.equals(l),d=[];if(!await this.#e.getAccountInfo(o)){let y=P.Keypair.generate(),I=await le.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,y.publicKey),k=ue(I,2);for(let F=0;F<k.length;F++){let w=k[F],V=await this.getV0Message(c,w),O=et(V);d.push({from:t,data:O,ix:M(w),signers:[y],type:G.CallType.Solana})}let z=le.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,y.publicKey),mt=await this.getV0Message(c,[z]),A=et(mt);d.push({from:t,data:A,ix:M([z]),type:G.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new P.PublicKey(r.payload.token.address.toUint8Array()),h=p&&f.equals(C.NATIVE_MINT),T=await this.#n.getTipAccount(),b=P.SystemProgram.transfer({fromPubkey:c,toPubkey:new P.PublicKey(T[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,c,r,b);d.push(y)}else{let y=await this.redeemToken(n,c,l,f,p,r,b);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?Ct.createCompleteTransferNativeInstruction:Ct.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=(0,C.getAssociatedTokenAddressSync)(n,s),m=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,l,s,n),d=await this.getV0Message(e,[m,c,i]),g=et(d);return{from:e.toBase58(),data:g,ix:M([m,c]),type:G.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new P.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,C.getMint)(this.#e,C.NATIVE_MINT),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await(0,C.getMinimumBalanceForRentExemptAccount)(this.#e),c=P.Keypair.generate(),l=(0,C.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,C.NATIVE_MINT),m=(0,Ct.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=P.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:C.ACCOUNT_SIZE,programId:C.TOKEN_PROGRAM_ID}),g=(0,C.createInitializeAccountInstruction)(c.publicKey,C.NATIVE_MINT,e),p=(0,C.createTransferInstruction)(a,c.publicKey,e,i),f=(0,C.createCloseAccountInstruction)(c.publicKey,e,e),h=[l,m,d,g,p,f,n],T=await this.getV0Message(e,h),b=et(T);return{from:e.toBase58(),data:b,ix:M(h),signers:[c],type:G.CallType.Solana}}derivePostedVaaKey(t,e){return He.utils.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new P.TransactionMessage({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};var X=require("@solana/web3.js"),zt=require("buffer");var de=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new q(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof X.Keypair){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let l=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(l);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof X.Keypair)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>zt.Buffer.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(l=>zt.Buffer.from(l.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=zt.Buffer.from(t,"hex"),n=Uint8Array.from(s),a=X.MessageV0.deserialize(n),r=new X.VersionedTransaction(a);return e&&r.sign(e),r}};var W=require("@galacticcouncil/xc-core"),ge=require("@wormhole-foundation/sdk-base"),ze=require("viem"),pe=require("polkadot-api"),bt=class{#t;constructor(t){this.#t=t,W.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=ge.encoding.b64.decode(e),n=ge.encoding.hex.encode(s),a=W.Abi.Gmp,r=(0,ze.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:W.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),i=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:pe.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:pe.Binary.toHex(i),from:t,type:W.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var Qt=require("@galacticcouncil/xc-core"),wt=require("polkadot-api");var $e=require("@galacticcouncil/common");async function fe(u,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:$e.big.convertDecimals(u,a,n),decimals:n}}var Qe=require("@galacticcouncil/common"),qe=u=>{let t=[];for(let e of u)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},nt=u=>{let t=u.value.error;return t.type==="Module"?Qe.enums.enumPath(t.value):JSON.stringify(t.value)};var $t=require("@galacticcouncil/common");function Mn(u){return{parents:0,interior:{type:"X1",value:u.startsWith("0x")?$t.xcm.toAccountKey20(u):$t.xcm.toAccountId32(u)}}}function Ge(u){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:u.parachainId}}}}}var Nn=(u,t)=>({id:$t.xcm.transform(u),fun:{type:"Fungible",value:t}}),Xe=(u,t,e,s,n,a)=>{console.log(a);let r=Mn(u),i=Nn(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: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 vt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,l=await c.getCurrency(),m=l.asset,d=l.decimals,g=c.getAssetXcmLocation(m),p=wt.Binary.fromHex(s.data),h=await(await o.txFromCallData(p)).getPaymentInfo(e),T=BigInt(h.partial_fee)*120n/100n,b=Qt.AssetAmount.fromAsset(m,{amount:T,decimals:d}),y=h.weight.ref_time,I=h.weight.proof_size,k=Ge(c),z=Xe(e,g,b,y,I,p),mt=r.tx.PolkadotXcm.send({dest:k,message:z}),A=[];try{let x=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,b,10),Dt=wt.Binary.fromHex(x),dt=await r.txFromCallData(Dt);A.push(dt)}catch{}let F=await n(b),w=wt.Binary.fromHex(F.data),V=await r.txFromCallData(w);A.push(V),A.push(mt);let O=A.map(x=>x.decodedCall),Ft=r.tx.Utility.batch_all({calls:O}),ae=await Ft.getEncodedData();return{from:t,data:wt.Binary.toHex(ae),type:Qt.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let x=await this.#t.dryRun(t,Ft);return{call:"polkadotXcm.send",error:x.execution_result&&x.execution_result.success?void 0:nt(x.execution_result),events:x.emitted_events||[],xcm:x.forwarded_xcms||[]}}catch(x){return{call:"polkadotXcm.send",error:x instanceof Error?x.message:"unknown"}}}:()=>{}}}};var J=require("@galacticcouncil/xc-core"),Ye=require("polkadot-api"),E=require("rxjs");var U=require("@galacticcouncil/xc-core"),qt=require("@galacticcouncil/common"),Gt=require("@polkadot-api/substrate-bindings"),xt=require("@polkadot-api/utils"),he=require("polkadot-api");var{Ss58Addr:Je}=U.addr,B=class u{chain;_currency;constructor(t){this.chain=t}static async create(t){return new u(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return U.AssetAmount.fromAsset(e,{amount:t,decimals:s})}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Gt.u32.enc(a),i=l=>new TextEncoder().encode(l),o=new Uint8Array([...i(this.chain.parachainId.toString()),...(0,xt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,xt.fromHex)(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=(0,Gt.Blake2256)(o);return(0,xt.toHex)(c)}async dryRun(t,e){let s=(0,he.Enum)("Signed",t),n=(0,he.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: "+qt.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 qe(a.emitted_events||[]);{let r=nt(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
|
|
4
|
+
${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=U.multiloc.findNestedKey(a,"interior"),i=U.multiloc.findParachain(a);if(U.multiloc.findGlobalConsensus(a))return t;if(i){let l=qt.acc.getSovereignAccounts(i);return this.chain.parachainId===0?Je.encodePubKey(l.relay):Je.encodePubKey(l.generic)}let c=r&&r.interior;if(c==="Here"||c?.type==="Here")return this.chain.treasury||t}return t}};var St=class{#t;constructor(t){this.#t=B.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,i=await this.useSignerFee(s)?{asset:new J.Asset(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,l=await o.getEncodedData();return{from:t,data:Ye.Binary.toHex(l),type:J.CallType.Substrate,txOptions:i,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:nt(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await fe(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return(0,E.firstValueFrom)(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe((0,E.map)(({value:l})=>l)).pipe((0,E.concatMap)(l=>i(l)),(0,E.distinctUntilChanged)((l,m)=>l===m),(0,E.concatMap)(async l=>{let m=await fe(l,t,s);return J.AssetAmount.fromAsset(t,m)}),(0,E.catchError)(l=>(console.error("subscribe fails for:",t),(0,E.throwError)(()=>l))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=J.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};var ye=require("@galacticcouncil/xc-core"),st=require("polkadot-api"),Ce=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=st.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=ye.multiloc.findPalletInstance(e),n=ye.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,st.Enum)("X2",[(0,st.Enum)("PalletInstance",Number(s)),(0,st.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var Jt=require("@galacticcouncil/xc-core"),tn=require("@mysten/sui/transactions"),en=require("@mysten/sui/utils"),nn=require("@mysten/bcs"),at=require("@wormhole-foundation/sdk-connect"),sn=require("@wormhole-foundation/sdk-definitions"),Ae=require("@wormhole-foundation/sdk-sui"),an=require("@wormhole-foundation/sdk-sui-tokenbridge");var Ze=require("@mysten/bcs");function Xt(u,t={}){let e=u.inputs??[],s=u.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),i=l=>{let m=(0,Ze.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)}},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}},c=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?o(l.Input):l;return s.map(l=>{if(l.MoveCall){let m=l.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(l.SplitCoins){let m=l.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(l.MergeCoins){let m=l.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(l.TransferObjects){let m=l.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return l})}var be=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Jt.Wormhole.fromChain(this.#t),n=this.#t.client,a=at.encoding.b64.decode(e),r=(0,sn.deserialize)("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await(0,an.getTokenCoinType)(n,o,r.payload.token.address.toUint8Array(),(0,at.toChainId)(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[l,m]=await Promise.all([(0,Ae.getPackageId)(n,i),(0,Ae.getPackageId)(n,o)]),d=new tn.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",(0,at.serialize)(r)),d.object(en.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[c]});let T=await d.build({client:n}),b=await d.toJSON(),y=Xt(JSON.parse(b));return{from:t,commands:y,data:(0,nn.toBase64)(T),type:Jt.CallType.Sui}}};var ee=require("@galacticcouncil/xc-core"),on=require("@mysten/bcs"),j=require("rxjs");var Yt=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 rn=require("@mysten/sui/utils");var Wn=9,Zt=class extends Yt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:rn.SUI_TYPE_ARG});return BigInt(e.totalBalance)}async getDecimals(){return Wn}};var te=class{static get(t,e){switch(e.module){case"Native":return new Zt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var Pt=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),i=await a.toJSON(),o=Xt(JSON.parse(i));return{from:t,commands:o,data:(0,on.toBase64)(r),type:ee.CallType.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),l=BigInt(o.storageCost),m=c+l;return s.copyWith({amount:m})}async getBalance(t,e){let s=te.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return ee.AssetAmount.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new j.Subject,n=s.pipe((0,j.shareReplay)(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe((0,j.finalize)(()=>r?.()),(0,j.distinctUntilChanged)((i,o)=>i.amount===o.amount))}};var cn=require("@mysten/sui/keypairs/ed25519"),un=require("@mysten/sui/transactions"),we=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof cn.Ed25519Keypair){let o=un.Transaction.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var K=class{platform={};constructor(t){switch(t.getType()){case rt.ChainType.EvmChain:this.registerEvm(t);break;case rt.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case rt.ChainType.Parachain:this.registerSubstrate(t);break;case rt.ChainType.SolanaChain:this.registerSolana(t);break;case rt.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new ft(e)}registerSolana(t){let e=t;this.platform.Solana=new yt(e)}registerSui(t){let e=t;this.platform.Sui=new Pt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new St(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"),Tt=require("@galacticcouncil/common");var ln=require("@galacticcouncil/common"),it=Dn(require("big.js"),1);function mn(u,t,e,s){let n=u.toBig().minus(e.toBig()).minus(u.isSame(t)?t.toBig():new it.default(0));return s&&(n=n.minus(u.isSame(s)?s.toBig():new it.default(0))),u.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function dn(u,t,e,s){let a=u.copyWith({amount:0n}).toBig().plus(u.isSame(t)?t.toBig():new it.default(0)).plus(u.toBig().lt(e.toBig())?e.toBig():new it.default(0));return s&&(a=a.plus(u.isSame(s)&&u.toBig().lt(s.toBig())?s.toBig():new it.default(0))),u.copyWith({amount:BigInt(a.toFixed())})}async function H(u,t){return t.isEvmParachain()?t.getDerivatedAddress(u):u}function gn(u,t){return t?ln.big.toBigInt(t,u):0n}var Y=require("@galacticcouncil/xc-core"),pn=require("@galacticcouncil/common");var{EvmAddr:Un}=Y.addr,ot=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof Y.Parachain)return(await B.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=Un.isValid(r.toString())?await H(t,e):t,o=s.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:s}=e,n=s.asset,a=s.min;if(t instanceof Y.Parachain&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}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),i=0n;return a&&(i=pn.big.toBigInt(a,r)),Y.AssetAmount.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:fn}=L.addr,Bt=class extends ot{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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,i=a.fee.amount,o=n.destinationFee.asset||a.fee.asset,c=await this.getDecimals(o);if(Number.isFinite(i))return{fee:L.AssetAmount.fromAsset(o,{amount:Tt.big.toBigInt(i,c),decimals:c}),feeBreakdown:{}};let l=i,{amount:m,breakdown:d}=await l.build({feeAsset:o,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:L.AssetAmount.fromAsset(o,{amount:m,decimals:c}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=fn.isValid(o.toString())?await H(t,e):t,l=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,l)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await H(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:l}=s.source,m=l?gn(c.decimals,l.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=fn.isValid(r.toString())?await H(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof L.Parachain&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:l,asset:m,sender:d}=t,p=await(await B.create(e)).buildMessageId(d,l,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||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:s}=e;if(s){let n=Object.assign({transact:{chain:s.chain}}),a={...t,...n};return{...await this.getTransactData(s,a),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,a=await n.build(e),r=await B.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,l=Tt.acc.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.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: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=Tt.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 Et=class extends ot{constructor(t,e){super(t,e)}};var hn=require("@galacticcouncil/xc-core"),ct=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:hn.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:jn}=lt.addr,ne=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,lt.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),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,l]=await Promise.all([B.create(r),B.create(i)]),m=new vt(c,l),d=ut.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let h=f.toDecimal();return p.buildCall(h)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new K(n.chain),i=new K(a.chain),o=new Bt(r,n),c=new Et(i,a),l=new lt.TransferValidator(...this.validations),[m,d,g,p,f,h,T]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:b,destination:y}=n.route,I=g.fee.copyWith(y.fee.asset),k=g.feeBreakdown,mt=b.asset.isEqual(I)&&I.amount>10n?I.amount+1n:10n,A={address:s,amount:mt,asset:b.asset,destination:{balance:h,chain:a.chain,fee:I,feeBreakdown:k},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};A.transact=await o.getTransact(A);let F=new ct(A),w=await o.getFee(A),V;F.isSwapSupported(b.fee)&&(V=await F.getSwap(w),A.source.feeSwap=V);let O;F.isDestinationSwapSupported(w)&&(O=await F.getDestinationSwap(w),A.source.destinationFeeSwap=O),(V||O)&&(w=await o.getFee(A),w=w.padByPct(5n));let Ft=await c.getEd(),ae=dn(h,I,T,Ft),x=await o.getEd(),Dt=mn(m,w,f,x);A.amount=0n,A.source.fee=w;let dt={source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:O,fee:w,feeBalance:d,feeSwap:V,max:Dt,min:m.copyWith({amount:ae.amount})},destination:{balance:h,fee:I},async buildCall($){let S=Object.assign({},A);return S.amount=ut.big.toBigInt($,m.decimals),S.transact=await o.getTransact(S),o.getCall(S)},async estimateFee($){let S=Object.assign({},A);return S.amount=ut.big.toBigInt($,m.decimals),S.transact=await o.getTransact(S),o.getFee(S)},async estimateDestinationFee($){let S=ut.big.toBigInt($,m.decimals),{fee:Q,feeBreakdown:Sn}=await o.getDestinationFee(S);return A.destination.fee=Q,A.destination.feeBreakdown=Sn,A.source.destinationFee=Q,dt.destination.fee=Q,dt.source.destinationFee=Q,Q},async validate($){let S=Object.assign({},A),Q=$||w.amount;return S.source.fee=w.copyWith({amount:Q}),l.validate(S)}};return dt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new K(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:l,balance:m}=c,d=n.chain.getBalanceAssetId(l),g=jn.isValid(d.toString())?await H(t,n.chain):t,p=m.build({address:g,asset:l,chain:n.chain});return a.subscribeBalance(l,p)}),i=await Promise.all(r);return(0,se.combineLatest)(i).pipe((0,se.debounceTime)(500)).subscribe(s)}};var yn=require("@galacticcouncil/xc-core");function Cn(u){let t=(0,yn.ConfigBuilder)(u.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return u.getTransferData(h,d,g)}}}}}}}}}var An=require("@galacticcouncil/xc-core"),Kn="https://api.wormholescan.io",It=class{_baseUrl;constructor(t){this._baseUrl=t||Kn}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===An.Precompile.Bridge}};var bn=require("@galacticcouncil/common"),v=require("@galacticcouncil/xc-core"),wn=require("@wormhole-foundation/sdk-base"),vn=require("@wormhole-foundation/sdk-connect"),xn=require("@wormhole-foundation/sdk-definitions");var ve=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(ve||{});var Hn=300*1e3,xe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new It}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=bn.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),l=this.chains.find(f=>f instanceof v.Parachain&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>v.Wormhole.isKnown(f)&&v.Wormhole.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),h=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case v.ChainType.EvmChain:let T=new gt(g);p=async y=>T.redeem(y,h);break;case v.ChainType.SolanaChain:let b=new At(g);p=async y=>b.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:v.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await v.mrl.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:l}=c,{payload:m}=l;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:l,sourceChain:m}=c,{payload:d,standarizedProperties:g}=l,p=this.getStatus(c),{tokenAddress:f}=g,h=this.chains.find(y=>v.Wormhole.isKnown(y)&&v.Wormhole.fromChain(y).getWormholeId()===d.tokenChain),T=this.chains.find(y=>v.Wormhole.isKnown(y)&&v.Wormhole.fromChain(y).getWormholeId()===d.toChain),b;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),I=c.vaa.raw;if(this.isStuck(y)){let k=new bt(T);b=async z=>k.redeemMrlViaXcm(z,I)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:b,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+Hn}getVaaHeader(t){let e=wn.encoding.b64.decode(t),s=(0,xn.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,vn.keccak256)(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};0&&(module.exports={DISPATCH_ADDRESS,EvmClaim,EvmPlatform,EvmSigner,FeeSwap,PlatformAdapter,SolanaClaim,SolanaLilJit,SolanaPlatform,SolanaSigner,SubstrateClaim,SubstrateExec,SubstratePlatform,SubstrateService,SubstrateSigner,SuiClaim,SuiPlatform,SuiSigner,TransferBuilder,Wallet,WhStatus,WormholeScan,WormholeTransfer,chunk,deserializeV0,ixToHuman,serializeV0});
|
package/build/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{acc as Es,big as Vt}from"@galacticcouncil/common";import{addr as Is,ConfigBuilder as Fs,TransferValidator as Ds}from"@galacticcouncil/xc-core";import{combineLatest as Rs,debounceTime as ks}from"rxjs";import{ChainType as q}from"@galacticcouncil/xc-core";import{Abi as Ie,Wormhole as Fe}from"@galacticcouncil/xc-core";import{encodeFunctionData as De}from"viem";import{encoding as _t}from"@wormhole-foundation/sdk-base";var et=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Fe.fromChain(this.#t),n=_t.b64.decode(e),a=_t.hex.encode(n),r=Ie.TokenBridge,i=De({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};import{Abi as Me,AssetAmount as Ne,CallType as Ut,Erc20Client as We}from"@galacticcouncil/xc-core";import{distinctUntilChanged as Ue,finalize as je,shareReplay as Ke,Subject as
|
|
1
|
+
import{acc as Es,big as Vt}from"@galacticcouncil/common";import{addr as Is,ConfigBuilder as Fs,TransferValidator as Ds}from"@galacticcouncil/xc-core";import{combineLatest as Rs,debounceTime as ks}from"rxjs";import{ChainType as q}from"@galacticcouncil/xc-core";import{Abi as Ie,Wormhole as Fe}from"@galacticcouncil/xc-core";import{encodeFunctionData as De}from"viem";import{encoding as _t}from"@wormhole-foundation/sdk-base";var et=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=Fe.fromChain(this.#t),n=_t.b64.decode(e),a=_t.hex.encode(n),r=Ie.TokenBridge,i=De({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:i,from:t,to:s.getTokenBridge()}}};import{Abi as Me,AssetAmount as Ne,CallType as Ut,Erc20Client as We}from"@galacticcouncil/xc-core";import{distinctUntilChanged as Ue,finalize as je,shareReplay as Ke,Subject as He}from"rxjs";var _=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 Re}from"@galacticcouncil/xc-core";var nt=class extends _{erc20;constructor(t,e){super(t,e),this.erc20=new Re(t,e.address)}async getBalance(){let{args:t}=this.config,[e]=t;return this.erc20.balanceOf(e)}async getDecimals(){return this.erc20.decimals()}};var st=class extends _{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 at=class{static get(t,e){switch(e.module){case"Erc20":return new nt(t,e);case"Native":return new st(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ContractFunctionExecutionError as ke,decodeEventLog as Ve}from"viem";var rt=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof ke?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(),i=await this.getNonce(t);try{let{results:o}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:i}]}),[c]=o;return c}catch(o){return console.log(`Can't simulate call!
|
|
3
|
-
`,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=Ve({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var H=class{static get(t,e){return new rt(t,e)}};import{Precompile as Oe}from"@galacticcouncil/xc-core";import{decodeAbiParameters as _e}from"viem";function Tt(l){return l.module==="Snowbridge"&&l.func==="v2_sendMessage"}function Mt(l){if(!Tt(l))return;let t=l.args[1];if(!t||t.length===0)return;let[e,s]=_e([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Nt(l){let t=l.module==="Snowbridge"&&l.func==="v2_sendMessage"&&Array.isArray(l.args[1])&&l.args[1].length===0,e=l.module==="Snowbridge"&&l.func==="sendToken"&&l.args[0]==="0x0000000000000000000000000000000000000000";return l.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(l.func)||t||e}function Wt(l){return Object.entries(Oe).map(([e,s])=>s).includes(l.address)}var it=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=H.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:Ut.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),h=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:h}}};if(Wt(n)||Nt(n))return c;let u=Tt(n)?Mt(n):i,m=new We(this.#t,u),d=await m.allowance(t,n.address);if(d>=e)return c;let g=m.approve(n.address,e);return{abi:JSON.stringify(Me.Erc20),allowance:d,data:g,from:t,to:u,type:Ut.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await H.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=at.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Ne.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new ze,n=s.pipe(Ke(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let u=await this.getBalance(t,e);s.next(u)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe(je(()=>i?.()),Ue((o,c)=>o.amount===c.amount))}};import{EvmParachain as He}from"@galacticcouncil/xc-core";import{h160 as Le}from"@galacticcouncil/common";import{Binary as $e}from"polkadot-api";var jt="0x0000000000000000000000000000000000000401",{H160:Qe}=Le,Kt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Qe.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof He)try{let i=this.#t.client,o=$e.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:jt}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:jt})}else{let{data:i,to:o,value:c}=t,[u,m]=await Promise.all([n.estimateGas({account:s,data:i,to:o,value:c}),n.getGasPrice()]),d=m+m*5n/100n,g=u+u*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};import{AssetAmount as tn,CallType as en}from"@galacticcouncil/xc-core";import{PublicKey as nn}from"@solana/web3.js";import{Buffer as sn}from"buffer";import{distinctUntilChanged as an,finalize as rn,shareReplay as on,Subject as cn}from"rxjs";var M=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 qe}from"@wormhole-foundation/sdk-solana";var Ge=9,ot=class extends M{async getBalance(){let{address:t}=this.config,e=new qe(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Ge}};import{SolanaAddress as Bt}from"@wormhole-foundation/sdk-solana";var ct=class extends M{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Bt(t).unwrap(),n=new Bt(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).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 Bt(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var ut=class{static get(t,e){switch(e.module){case"Native":return new ot(t,e);case"Token":return new ct(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as zt,PublicKey as Xe,TransactionMessage as Je,VersionedTransaction as Ht}from"@solana/web3.js";var Lt=.5,$t=2,Qt=1,qt=1e6,Ye=25e4,lt=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 Xe(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Je({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=Lt,s=$t,n=Qt,a=qt){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[zt.setComputeUnitLimit({units:r}),zt.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new Ht(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Ht(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):Ye}async determinePriorityFee(t,e=Lt,s=$t,n=Qt,a=qt){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),u=Math.ceil(c.length*e);if(c.length>u){let d=c[u]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var L=class{static get(t,e){return new lt(t,e)}};import{MessageV0 as Ze}from"@solana/web3.js";function V(l){return l.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Gt(l,t=1e3){let e=[],s=[],n=0;for(let a of l){let r=a.data?.length??0;s.length&&n+r>t&&(e.push(s),s=[],n=0),s.push(a),n+=r}return s.length&&e.push(s),e}function $(l){let t=l.serialize();return Buffer.from(t).toString("hex")}function wr(l){let t=Buffer.from(l,"hex"),e=Uint8Array.from(t);return Ze.deserialize(e)}var mt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=L.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=sn.from(i).toString("hex");return{from:t,data:o,ix:V(n.instructions),signers:n.signers,type:en.Solana,dryRun:async()=>{let{err:c,logs:u}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:u}}}}async estimateFee(t,e,s,n){let a=L.get(this.#t,n),r=await a.estimateFee(t,e),i=await a.getPriorityMessage(t),{accounts:o}=await a.simulateTransaction(t,i),u=(o&&o[0])?.lamports;if(u){let m=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(u)-(m?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}async getBalance(t,e){let s=ut.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return tn.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new cn,n=s.pipe(on(1)),a=async()=>{let i=async()=>{let u=await this.getBalance(t,e);s.next(u)};await i();let o=new nn(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe(rn(()=>r?.()),an((i,o)=>i.amount===o.amount))}};import{CallType as dt,Wormhole as un}from"@galacticcouncil/xc-core";import{Keypair as Xt,PublicKey as Q,SystemProgram as Jt,TransactionMessage as ln}from"@solana/web3.js";import{ACCOUNT_SIZE as mn,NATIVE_MINT as gt,TOKEN_PROGRAM_ID as dn,createAssociatedTokenAccountIdempotentInstruction as Yt,createCloseAccountInstruction as gn,createInitializeAccountInstruction as pn,createTransferInstruction as fn,getAssociatedTokenAddressSync as hn,getMinimumBalanceForRentExemptAccount as yn,getMint as Cn}from"@solana/spl-token";import{utils as An}from"@wormhole-foundation/sdk-solana";import{utils as Zt}from"@wormhole-foundation/sdk-solana-core";import{encoding as bn}from"@wormhole-foundation/sdk-base";import{deserialize as te}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as ee,createCompleteTransferWrappedInstruction as wn}from"@wormhole-foundation/sdk-solana-tokenbridge";var N=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var pt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new N(t)}async redeem(t,e,s){let n=un.fromChain(this.#t),a=bn.b64.decode(e),r=te("TokenBridge:Transfer",a),i=te("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new Q(t),u=s?new Q(s):c,m=c.equals(u),d=[];if(!await this.#e.getAccountInfo(o)){let y=Xt.generate(),S=await Zt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,y.publicKey),B=Gt(S,1e3);for(let T=0;T<B.length;T++){let b=B[T],E=await this.getV0Message(c,b),I=$(E);d.push({from:t,data:I,ix:V(b),signers:[y],type:dt.Solana})}let D=Zt.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,y.publicKey),K=await this.getV0Message(c,[D]),C=$(K);d.push({from:t,data:C,ix:V([D]),type:dt.Solana})}let p=r.payload.token.chain==="Solana",f=new Q(r.payload.token.address.toUint8Array()),h=p&&f.equals(gt),x=await this.#n.getTipAccount(),A=Jt.transfer({fromPubkey:c,toPubkey:new Q(x[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,c,r,A);d.push(y)}else{let y=await this.redeemToken(n,c,u,f,p,r,A);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?ee:wn)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),u=hn(n,s),m=Yt(e,u,s,n),d=await this.getV0Message(e,[m,c,i]),g=$(d);return{from:e.toBase58(),data:g,ix:V([m,c]),type:dt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new Q(s.payload.to.address.toUint8Array()),r=await Cn(this.#e,gt),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await yn(this.#e),c=Xt.generate(),u=Yt(e,a,e,gt),m=ee(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Jt.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:mn,programId:dn}),g=pn(c.publicKey,gt,e),p=fn(a,c.publicKey,e,i),f=gn(c.publicKey,e,e),h=[u,m,d,g,p,f,n],x=await this.getV0Message(e,h),A=$(x);return{from:e.toBase58(),data:A,ix:V(h),signers:[c],type:dt.Solana}}derivePostedVaaKey(t,e){return An.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new ln({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as ne,MessageV0 as vn,VersionedTransaction as xn}from"@solana/web3.js";import{Buffer as Et}from"buffer";var se=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new N(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof ne){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let u=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(u);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof ne)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>Et.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(u=>Et.from(u.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Et.from(t,"hex"),n=Uint8Array.from(s),a=vn.deserialize(n),r=new xn(a);return e&&r.sign(e),r}};import{Abi as Sn,CallType as Pn,Precompile as Tn,Wormhole as Bn}from"@galacticcouncil/xc-core";import{encoding as ae}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as En}from"viem";import{Binary as re}from"polkadot-api";var ft=class{#t;constructor(t){this.#t=t,Bn.fromChain(this.#t)}redeemMrl(t,e){let s=ae.b64.decode(e),n=ae.hex.encode(s),a=Sn.Gmp,r=En({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Tn.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),i=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:re.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:re.toHex(i),from:t,type:Pn.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as kn,CallType as Vn}from"@galacticcouncil/xc-core";import{Binary as ht}from"polkadot-api";import{big as In}from"@galacticcouncil/common";async function It(l,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:In.convertDecimals(l,a,n),decimals:n}}import{enums as Fn}from"@galacticcouncil/common";var ie=l=>{let t=[];for(let e of l)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},W=l=>{let t=l.value.error;return t.type==="Module"?Fn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as Ft}from"@galacticcouncil/common";function Dn(l){return{parents:0,interior:{type:"X1",value:l.startsWith("0x")?Ft.toAccountKey20(l):Ft.toAccountId32(l)}}}function oe(l){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:l.parachainId}}}}}var Rn=(l,t)=>({id:Ft.transform(l),fun:{type:"Fungible",value:t}}),ce=(l,t,e,s,n,a)=>{console.log(a);let r=Dn(l),i=Rn(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:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var yt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,u=await c.getCurrency(),m=u.asset,d=u.decimals,g=c.getAssetXcmLocation(m),p=ht.fromHex(s.data),h=await(await o.txFromCallData(p)).getPaymentInfo(e),x=BigInt(h.partial_fee)*120n/100n,A=kn.fromAsset(m,{amount:x,decimals:d}),y=h.weight.ref_time,S=h.weight.proof_size,B=oe(c),D=ce(e,g,A,y,S,p),K=r.tx.PolkadotXcm.send({dest:B,message:D}),C=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,A,10),tt=ht.fromHex(w),z=await r.txFromCallData(tt);C.push(z)}catch{}let T=await n(A),b=ht.fromHex(T.data),E=await r.txFromCallData(b);C.push(E),C.push(K);let I=C.map(w=>w.decodedCall),Z=r.tx.Utility.batch_all({calls:I}),Pt=await Z.getEncodedData();return{from:t,data:ht.toHex(Pt),type:Vn.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,Z);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:W(w.execution_result),events:w.emitted_events||[],xcm:w.forwarded_xcms||[]}}catch(w){return{call:"polkadotXcm.send",error:w instanceof Error?w.message:"unknown"}}}:()=>{}}}};import{Asset as Kn,AssetAmount as de,CallType as zn}from"@galacticcouncil/xc-core";import{Binary as Hn}from"polkadot-api";import{concatMap as ge,catchError as Ln,distinctUntilChanged as $n,firstValueFrom as Qn,map as qn,throwError as Gn}from"rxjs";import{addr as On,multiloc as Dt,AssetAmount as _n}from"@galacticcouncil/xc-core";import{acc as Mn,enums as Nn}from"@galacticcouncil/common";import{Blake2256 as Wn,u32 as Un}from"@polkadot-api/substrate-bindings";import{toHex as jn,fromHex as ue}from"@polkadot-api/utils";import{Enum as le}from"polkadot-api";var{Ss58Addr:me}=On,P=class l{chain;_currency;constructor(t){this.chain=t}static async create(t){return new l(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return _n.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=Un.enc(a),i=u=>new TextEncoder().encode(u),o=new Uint8Array([...i(this.chain.parachainId.toString()),...ue(t.startsWith("0x")?t.slice(2):t),...r,...ue(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=Wn(o);return jn(c)}async dryRun(t,e){let s=le("Signed",t),n=le("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: "+Nn.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 ie(a.emitted_events||[]);{let r=W(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=Dt.findNestedKey(a,"interior"),i=Dt.findParachain(a);if(Dt.findGlobalConsensus(a))return t;if(i){let u=Mn.getSovereignAccounts(i);return this.chain.parachainId===0?me.encodePubKey(u.relay):me.encodePubKey(u.generic)}let c=r&&r.interior;if(c==="Here"||c?.type==="Here")return this.chain.treasury||t}return t}};var Ct=class{#t;constructor(t){this.#t=P.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,i=await this.useSignerFee(s)?{asset:new Kn(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,u=await o.getEncodedData();return{from:t,data:Hn.toHex(u),type:zn.Substrate,txOptions:i,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:W(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await It(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return Qn(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe(qn(({value:u})=>u)).pipe(ge(u=>i(u)),$n((u,m)=>u===m),ge(async u=>{let m=await It(u,t,s);return de.fromAsset(t,m)}),Ln(u=>(console.error("subscribe fails for:",t),Gn(()=>u))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=de.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};import{multiloc as pe}from"@galacticcouncil/xc-core";import{Binary as Xn,Enum as Rt}from"polkadot-api";var fe=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=Xn.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=pe.findPalletInstance(e),n=pe.findGeneralIndex(e);return{parents:0,interior:Rt("X2",[Rt("PalletInstance",Number(s)),Rt("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as Yn,Wormhole as Zn}from"@galacticcouncil/xc-core";import{Transaction as ts}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as es}from"@mysten/sui/utils";import{toBase64 as ns}from"@mysten/bcs";import{encoding as ss,serialize as as,toChainId as rs}from"@wormhole-foundation/sdk-connect";import{deserialize as is}from"@wormhole-foundation/sdk-definitions";import{getPackageId as he}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as os}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as Jn}from"@mysten/bcs";function At(l,t={}){let e=l.inputs??[],s=l.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=u=>n==="bigint"?u:n==="number"?Number(u):u.toString(),i=u=>{let m=Jn(u),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=u=>{let m=e[u];if(!m)return{Input:u};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:u}},c=u=>u?.GasCoin?"GasCoin":Array.isArray(u?.NestedResult)?u:typeof u?.Input=="number"?o(u.Input):u;return s.map(u=>{if(u.MoveCall){let m=u.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(u.SplitCoins){let m=u.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(u.MergeCoins){let m=u.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(u.TransferObjects){let m=u.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return u})}var ye=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Zn.fromChain(this.#t),n=this.#t.client,a=ss.b64.decode(e),r=is("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await os(n,o,r.payload.token.address.toUint8Array(),rs(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[u,m]=await Promise.all([he(n,i),he(n,o)]),d=new ts;d.setSender(t);let[g]=d.moveCall({target:`${u}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",as(r)),d.object(es)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[c]});let x=await d.build({client:n}),A=await d.toJSON(),y=At(JSON.parse(A));return{from:t,commands:y,data:ns(x),type:Yn.Sui}}};import{AssetAmount as ls,CallType as ms}from"@galacticcouncil/xc-core";import{toBase64 as ds}from"@mysten/bcs";import{distinctUntilChanged as gs,finalize as ps,shareReplay as fs,Subject as hs}from"rxjs";var bt=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 cs}from"@mysten/sui/utils";var us=9,wt=class extends bt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:cs});return BigInt(e.totalBalance)}async getDecimals(){return us}};var vt=class{static get(t,e){switch(e.module){case"Native":return new wt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var xt=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}),i=await a.toJSON(),o=At(JSON.parse(i));return{from:t,commands:o,data:ds(r),type:ms.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),u=BigInt(o.storageCost),m=c+u;return s.copyWith({amount:m})}async getBalance(t,e){let s=vt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return ls.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new hs,n=s.pipe(fs(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe(ps(()=>r?.()),gs((i,o)=>i.amount===o.amount))}};import{Ed25519Keypair as ys}from"@mysten/sui/keypairs/ed25519";import{Transaction as Cs}from"@mysten/sui/transactions";var Ce=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof ys){let o=Cs.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var O=class{platform={};constructor(t){switch(t.getType()){case q.EvmChain:this.registerEvm(t);break;case q.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case q.Parachain:this.registerSubstrate(t);break;case q.SolanaChain:this.registerSolana(t);break;case q.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new it(e)}registerSolana(t){let e=t;this.platform.Solana=new mt(e)}registerSui(t){let e=t;this.platform.Sui=new xt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new Ct(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};import{addr as Ss,AssetAmount as kt,Parachain as Ps}from"@galacticcouncil/xc-core";import{acc as Ts,big as xe}from"@galacticcouncil/common";import{big as As}from"@galacticcouncil/common";import G from"big.js";function Ae(l,t,e,s){let n=l.toBig().minus(e.toBig()).minus(l.isSame(t)?t.toBig():new G(0));return s&&(n=n.minus(l.isSame(s)?s.toBig():new G(0))),l.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function be(l,t,e,s){let a=l.copyWith({amount:0n}).toBig().plus(l.isSame(t)?t.toBig():new G(0)).plus(l.toBig().lt(e.toBig())?e.toBig():new G(0));return s&&(a=a.plus(l.isSame(s)&&l.toBig().lt(s.toBig())?s.toBig():new G(0))),l.copyWith({amount:BigInt(a.toFixed())})}async function F(l,t){return t.isEvmParachain()?t.getDerivatedAddress(l):l}function we(l,t){return t?As.toBigInt(t,l):0n}import{addr as bs,AssetAmount as ws,Parachain as ve}from"@galacticcouncil/xc-core";import{big as vs}from"@galacticcouncil/common";var{EvmAddr:xs}=bs,U=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof ve)return(await P.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=xs.isValid(r.toString())?await F(t,e):t,o=s.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:s}=e,n=s.asset,a=s.min;if(t instanceof ve&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}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),i=0n;return a&&(i=vs.toBigInt(a,r)),ws.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:Se}=Ss,X=class extends U{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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,i=a.fee.amount,o=n.destinationFee.asset||a.fee.asset,c=await this.getDecimals(o);if(Number.isFinite(i))return{fee:kt.fromAsset(o,{amount:xe.toBigInt(i,c),decimals:c}),feeBreakdown:{}};let u=i,{amount:m,breakdown:d}=await u.build({feeAsset:o,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:kt.fromAsset(o,{amount:m,decimals:c}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=Se.isValid(o.toString())?await F(t,e):t,u=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,u)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await F(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:u}=s.source,m=u?we(c.decimals,u.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=Se.isValid(r.toString())?await F(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof Ps&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:u,asset:m,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,u,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||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: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 P.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,u=Ts.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await i.getPaymentInfo(u),d=await i.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=xe.toBigInt(e.amount,s);return kt.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 J=class extends U{constructor(t,e){super(t,e)}};import{AssetAmount as Bs}from"@galacticcouncil/xc-core";var Y=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:Bs.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:Vs}=Is,Ot=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Fs(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),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,u]=await Promise.all([P.create(r),P.create(i)]),m=new yt(c,u),d=Es.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await u.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let h=f.toDecimal();return p.buildCall(h)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new O(n.chain),i=new O(a.chain),o=new X(r,n),c=new J(i,a),u=new Ds(...this.validations),[m,d,g,p,f,h,x]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:A,destination:y}=n.route,S=g.fee.copyWith(y.fee.asset),B=g.feeBreakdown,K=A.asset.isEqual(S)&&S.amount>10n?S.amount+1n:10n,C={address:s,amount:K,asset:A.asset,destination:{balance:h,chain:a.chain,fee:S,feeBreakdown:B},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};C.transact=await o.getTransact(C);let T=new Y(C),b=await o.getFee(C),E;T.isSwapSupported(A.fee)&&(E=await T.getSwap(b),C.source.feeSwap=E);let I;T.isDestinationSwapSupported(b)&&(I=await T.getDestinationSwap(b),C.source.destinationFeeSwap=I),(E||I)&&(b=await o.getFee(C),b=b.padByPct(5n));let Z=await c.getEd(),Pt=be(h,S,x,Z),w=await o.getEd(),tt=Ae(m,b,f,w);C.amount=0n,C.source.fee=b;let z={source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:I,fee:b,feeBalance:d,feeSwap:E,max:tt,min:m.copyWith({amount:Pt.amount})},destination:{balance:h,fee:S},async buildCall(R){let v=Object.assign({},C);return v.amount=Vt.toBigInt(R,m.decimals),v.transact=await o.getTransact(v),o.getCall(v)},async estimateFee(R){let v=Object.assign({},C);return v.amount=Vt.toBigInt(R,m.decimals),v.transact=await o.getTransact(v),o.getFee(v)},async estimateDestinationFee(R){let v=Vt.toBigInt(R,m.decimals),{fee:k,feeBreakdown:Ee}=await o.getDestinationFee(v);return C.destination.fee=k,C.destination.feeBreakdown=Ee,C.source.destinationFee=k,z.destination.fee=k,z.source.destinationFee=k,k},async validate(R){let v=Object.assign({},C),k=R||b.amount;return v.source.fee=b.copyWith({amount:k}),u.validate(v)}};return z}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new O(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:u,balance:m}=c,d=n.chain.getBalanceAssetId(u),g=Vs.isValid(d.toString())?await F(t,n.chain):t,p=m.build({address:g,asset:u,chain:n.chain});return a.subscribeBalance(u,p)}),i=await Promise.all(r);return Rs(i).pipe(ks(500)).subscribe(s)}};import{ConfigBuilder as Os}from"@galacticcouncil/xc-core";function _s(l){let t=Os(l.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:u,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:u,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return l.getTransferData(h,d,g)}}}}}}}}}import{Precompile as Ms}from"@galacticcouncil/xc-core";var Ns="https://api.wormholescan.io",St=class{_baseUrl;constructor(t){this._baseUrl=t||Ns}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===Ms.Bridge}};import{acc as Ws}from"@galacticcouncil/common";import{mrl as Us,ChainType as Te,Parachain as js,Precompile as Ks,Wormhole as j}from"@galacticcouncil/xc-core";import{encoding as zs}from"@wormhole-foundation/sdk-base";import{keccak256 as Hs}from"@wormhole-foundation/sdk-connect";import{deserialize as Ls}from"@wormhole-foundation/sdk-definitions";var Pe=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(Pe||{});var $s=300*1e3,Be=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new St}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=Ws.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),u=this.chains.find(f=>f instanceof js&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>j.isKnown(f)&&j.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),h=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case Te.EvmChain:let x=new et(g);p=async y=>x.redeem(y,h);break;case Te.SolanaChain:let A=new pt(g);p=async y=>A.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:u,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:Ks.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await Us.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:u}=c,{payload:m}=u;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:u,sourceChain:m}=c,{payload:d,standarizedProperties:g}=u,p=this.getStatus(c),{tokenAddress:f}=g,h=this.chains.find(y=>j.isKnown(y)&&j.fromChain(y).getWormholeId()===d.tokenChain),x=this.chains.find(y=>j.isKnown(y)&&j.fromChain(y).getWormholeId()===d.toChain),A;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),S=c.vaa.raw;if(this.isStuck(y)){let B=new ft(x);A=async D=>B.redeemMrlViaXcm(D,S)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:A,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+$s}getVaaHeader(t){let e=zs.b64.decode(t),s=Ls("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Hs(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{jt as DISPATCH_ADDRESS,et as EvmClaim,it as EvmPlatform,Kt as EvmSigner,Y as FeeSwap,O as PlatformAdapter,pt as SolanaClaim,N as SolanaLilJit,mt as SolanaPlatform,se as SolanaSigner,ft as SubstrateClaim,yt as SubstrateExec,Ct as SubstratePlatform,P as SubstrateService,fe as SubstrateSigner,ye as SuiClaim,xt as SuiPlatform,Ce as SuiSigner,_s as TransferBuilder,Ot as Wallet,Pe as WhStatus,St as WormholeScan,Be as WormholeTransfer,Gt as chunkBySize,wr as deserializeV0,V as ixToHuman,$ as serializeV0};
|
|
3
|
+
`,o.details),{error:o}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=Ve({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var L=class{static get(t,e){return new rt(t,e)}};import{Precompile as Oe}from"@galacticcouncil/xc-core";import{decodeAbiParameters as _e}from"viem";function Tt(l){return l.module==="Snowbridge"&&l.func==="v2_sendMessage"}function Mt(l){if(!Tt(l))return;let t=l.args[1];if(!t||t.length===0)return;let[e,s]=_e([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Nt(l){let t=l.module==="Snowbridge"&&l.func==="v2_sendMessage"&&Array.isArray(l.args[1])&&l.args[1].length===0,e=l.module==="Snowbridge"&&l.func==="sendToken"&&l.args[0]==="0x0000000000000000000000000000000000000000";return l.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(l.func)||t||e}function Wt(l){return Object.entries(Oe).map(([e,s])=>s).includes(l.address)}var it=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=L.get(this.#t,n),{abi:r,asset:i,calldata:o}=a,c={abi:JSON.stringify(r),data:o,from:t,to:n.address,type:Ut.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),h=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:h}}};if(Wt(n)||Nt(n))return c;let u=Tt(n)?Mt(n):i,m=new We(this.#t,u),d=await m.allowance(t,n.address);if(d>=e)return c;let g=m.approve(n.address,e);return{abi:JSON.stringify(Me.Erc20),allowance:d,data:g,from:t,to:u,type:Ut.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await L.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}async getBalance(t,e){let s=at.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return Ne.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new He,n=s.pipe(Ke(1)),a=this.#t.getProvider(),r=async()=>{let o=async()=>{let u=await this.getBalance(t,e);s.next(u)};await o();let c=a.watchBlocks({onBlock:()=>o()});return()=>c()},i;return r().then(o=>i=o),n.pipe(je(()=>i?.()),Ue((o,c)=>o.amount===c.amount))}};import{EvmParachain as Le}from"@galacticcouncil/xc-core";import{h160 as ze}from"@galacticcouncil/common";import{Binary as $e}from"polkadot-api";var jt="0x0000000000000000000000000000000000000401",{H160:Qe}=ze,Kt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Qe.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Le)try{let i=this.#t.client,o=$e.fromHex(t.data);await i.getUnsafeApi().txFromCallData(o),a=!0}catch{}let r;if(a){let[i,o]=await Promise.all([n.estimateGas({account:s,data:t.data,to:jt}),n.getGasPrice()]),c=o+o/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:c,maxFeePerGas:c,gas:i*11n/10n,to:jt})}else{let{data:i,to:o,value:c}=t,[u,m]=await Promise.all([n.estimateGas({account:s,data:i,to:o,value:c}),n.getGasPrice()]),d=m+m*5n/100n,g=u+u*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:i,to:o,value:c,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(i=>e.onTransactionReceipt(i)).catch(i=>e.onError(i))}};import{AssetAmount as tn,CallType as en}from"@galacticcouncil/xc-core";import{PublicKey as nn}from"@solana/web3.js";import{Buffer as sn}from"buffer";import{distinctUntilChanged as an,finalize as rn,shareReplay as on,Subject as cn}from"rxjs";var M=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 qe}from"@wormhole-foundation/sdk-solana";var Ge=9,ot=class extends M{async getBalance(){let{address:t}=this.config,e=new qe(t).unwrap(),s=await this.connection.getBalance(e);return BigInt(s)}async getDecimals(){return Ge}};import{SolanaAddress as Bt}from"@wormhole-foundation/sdk-solana";var ct=class extends M{constructor(t,e){super(t,e),this.validateToken(e)}async getBalance(){let{address:t,token:e}=this.config,s=new Bt(t).unwrap(),n=new Bt(e).unwrap();return(await this.connection.getParsedTokenAccountsByOwner(s,{mint:n})).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 Bt(t).unwrap();return(await this.connection.getTokenSupply(e)).value.decimals}validateToken(t){if(!t.token)throw new Error("Token address is required")}};var ut=class{static get(t,e){switch(e.module){case"Native":return new ot(t,e);case"Token":return new ct(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};import{ComputeBudgetProgram as Ht,PublicKey as Xe,TransactionMessage as Je,VersionedTransaction as Lt}from"@solana/web3.js";var zt=.5,$t=2,Qt=1,qt=1e6,Ye=25e4,lt=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 Xe(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Je({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=zt,s=$t,n=Qt,a=qt){let[r,i]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Ht.setComputeUnitLimit({units:r}),Ht.setComputeUnitPrice({microLamports:i})]}async simulateTransaction(t,e){let s=new Lt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Lt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):Ye}async determinePriorityFee(t,e=zt,s=$t,n=Qt,a=qt){let r=n,i=await this.getTxAccounts(t),o=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:i});if(o){let c=o.map(m=>m.prioritizationFee).filter(m=>m>0).sort((m,d)=>m-d),u=Math.ceil(c.length*e);if(c.length>u){let d=c[u]*s;r=Math.max(r,d)}}return Math.min(Math.max(r,n),a)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var z=class{static get(t,e){return new lt(t,e)}};import{MessageV0 as Ze}from"@solana/web3.js";function V(l){return l.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Gt(l,t){let e=[];for(let s=0;s<l.length;s+=t)e.push(l.slice(s,s+t));return e}function $(l){let t=l.serialize();return Buffer.from(t).toString("hex")}function wr(l){let t=Buffer.from(l,"hex"),e=Uint8Array.from(t);return Ze.deserialize(e)}var mt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=z.get(this.#t,n),r=await a.getPriorityMessage(t),i=r.serialize(),o=sn.from(i).toString("hex");return{from:t,data:o,ix:V(n.instructions),signers:n.signers,type:en.Solana,dryRun:async()=>{let{err:c,logs:u}=await a.simulateTransaction(t,r);return{call:n.module+"."+n.func,error:c,events:u}}}}async estimateFee(t,e,s,n){let a=z.get(this.#t,n),r=await a.estimateFee(t,e),i=await a.getPriorityMessage(t),{accounts:o}=await a.simulateTransaction(t,i),u=(o&&o[0])?.lamports;if(u){let m=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(u)-(m?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}async getBalance(t,e){let s=ut.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return tn.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new cn,n=s.pipe(on(1)),a=async()=>{let i=async()=>{let u=await this.getBalance(t,e);s.next(u)};await i();let o=new nn(e.address),c=this.#t.onAccountChange(o,()=>i());return()=>{this.#t.removeAccountChangeListener(c)}},r;return a().then(i=>r=i),n.pipe(rn(()=>r?.()),an((i,o)=>i.amount===o.amount))}};import{CallType as dt,Wormhole as un}from"@galacticcouncil/xc-core";import{Keypair as Xt,PublicKey as Q,SystemProgram as Jt,TransactionMessage as ln}from"@solana/web3.js";import{ACCOUNT_SIZE as mn,NATIVE_MINT as gt,TOKEN_PROGRAM_ID as dn,createAssociatedTokenAccountIdempotentInstruction as Yt,createCloseAccountInstruction as gn,createInitializeAccountInstruction as pn,createTransferInstruction as fn,getAssociatedTokenAddressSync as hn,getMinimumBalanceForRentExemptAccount as yn,getMint as Cn}from"@solana/spl-token";import{utils as An}from"@wormhole-foundation/sdk-solana";import{utils as Zt}from"@wormhole-foundation/sdk-solana-core";import{encoding as bn}from"@wormhole-foundation/sdk-base";import{deserialize as te}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as ee,createCompleteTransferWrappedInstruction as wn}from"@wormhole-foundation/sdk-solana-tokenbridge";var N=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var pt=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new N(t)}async redeem(t,e,s){let n=un.fromChain(this.#t),a=bn.b64.decode(e),r=te("TokenBridge:Transfer",a),i=te("Uint8Array",a),o=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),c=new Q(t),u=s?new Q(s):c,m=c.equals(u),d=[];if(!await this.#e.getAccountInfo(o)){let y=Xt.generate(),S=await Zt.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),c,i,y.publicKey),B=Gt(S,2);for(let T=0;T<B.length;T++){let b=B[T],E=await this.getV0Message(c,b),I=$(E);d.push({from:t,data:I,ix:V(b),signers:[y],type:dt.Solana})}let D=Zt.createPostVaaInstruction(this.#e,n.getCoreBridge(),c,i,y.publicKey),K=await this.getV0Message(c,[D]),C=$(K);d.push({from:t,data:C,ix:V([D]),type:dt.Solana})}let p=r.payload.token.chain==="Solana",f=new Q(r.payload.token.address.toUint8Array()),h=p&&f.equals(gt),x=await this.#n.getTipAccount(),A=Jt.transfer({fromPubkey:c,toPubkey:new Q(x[0]),lamports:1e3});if(h&&m){let y=await this.redeemAndUnwrap(n,c,r,A);d.push(y)}else{let y=await this.redeemToken(n,c,u,f,p,r,A);d.push(y)}return d}async redeemToken(t,e,s,n,a,r,i){let c=(a?ee:wn)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),u=hn(n,s),m=Yt(e,u,s,n),d=await this.getV0Message(e,[m,c,i]),g=$(d);return{from:e.toBase58(),data:g,ix:V([m,c]),type:dt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new Q(s.payload.to.address.toUint8Array()),r=await Cn(this.#e,gt),i=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),o=await yn(this.#e),c=Xt.generate(),u=Yt(e,a,e,gt),m=ee(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Jt.createAccount({fromPubkey:e,newAccountPubkey:c.publicKey,lamports:o,space:mn,programId:dn}),g=pn(c.publicKey,gt,e),p=fn(a,c.publicKey,e,i),f=gn(c.publicKey,e,e),h=[u,m,d,g,p,f,n],x=await this.getV0Message(e,h),A=$(x);return{from:e.toBase58(),data:A,ix:V(h),signers:[c],type:dt.Solana}}derivePostedVaaKey(t,e){return An.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new ln({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as ne,MessageV0 as vn,VersionedTransaction as xn}from"@solana/web3.js";import{Buffer as Et}from"buffer";var se=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new N(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof ne){a.sign([this.#e]);let c=await this.#t.connection.sendTransaction(a);e.onTransactionSend(c);let u=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(u);return}let r=this.#e;await r.connect(),n&&a.sign(n);let{signature:i}=await r.signAndSendTransaction(a);e.onTransactionSend(i);let o=await this.#t.connection.getSignatureStatus(i);e.onStatus?.(o)}catch(r){e.onError(r)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:a,signers:r}=n;return this.toVersioned(a,r)});try{let n;if(this.#e instanceof ne)s.forEach(o=>o.sign([this.#e])),n=s.map(o=>Et.from(o.serialize()).toString("base64"));else{let o=this.#e;await o.connect(),n=(await o.signAllTransactions(s)).map(u=>Et.from(u.serialize()).toString("base64"))}let a=await this.#n.simulateBundle(n);if(a.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(a,null,2));let r=await this.#n.sendBundle(n);e.onTransactionSend(r);let i=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(i.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Et.from(t,"hex"),n=Uint8Array.from(s),a=vn.deserialize(n),r=new xn(a);return e&&r.sign(e),r}};import{Abi as Sn,CallType as Pn,Precompile as Tn,Wormhole as Bn}from"@galacticcouncil/xc-core";import{encoding as ae}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as En}from"viem";import{Binary as re}from"polkadot-api";var ft=class{#t;constructor(t){this.#t=t,Bn.fromChain(this.#t)}redeemMrl(t,e){let s=ae.b64.decode(e),n=ae.hex.encode(s),a=Sn.Gmp,r=En({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Tn.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),i=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:re.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:re.toHex(i),from:t,type:Pn.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as kn,CallType as Vn}from"@galacticcouncil/xc-core";import{Binary as ht}from"polkadot-api";import{big as In}from"@galacticcouncil/common";async function It(l,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:In.convertDecimals(l,a,n),decimals:n}}import{enums as Fn}from"@galacticcouncil/common";var ie=l=>{let t=[];for(let e of l)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},W=l=>{let t=l.value.error;return t.type==="Module"?Fn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as Ft}from"@galacticcouncil/common";function Dn(l){return{parents:0,interior:{type:"X1",value:l.startsWith("0x")?Ft.toAccountKey20(l):Ft.toAccountId32(l)}}}function oe(l){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:l.parachainId}}}}}var Rn=(l,t)=>({id:Ft.transform(l),fun:{type:"Fungible",value:t}}),ce=(l,t,e,s,n,a)=>{console.log(a);let r=Dn(l),i=Rn(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:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var yt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,i=await this.#t.getAsset(),o=this.#e.api,c=this.#e.chain,u=await c.getCurrency(),m=u.asset,d=u.decimals,g=c.getAssetXcmLocation(m),p=ht.fromHex(s.data),h=await(await o.txFromCallData(p)).getPaymentInfo(e),x=BigInt(h.partial_fee)*120n/100n,A=kn.fromAsset(m,{amount:x,decimals:d}),y=h.weight.ref_time,S=h.weight.proof_size,B=oe(c),D=ce(e,g,A,y,S,p),K=r.tx.PolkadotXcm.send({dest:B,message:D}),C=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||i,m,A,10),tt=ht.fromHex(w),H=await r.txFromCallData(tt);C.push(H)}catch{}let T=await n(A),b=ht.fromHex(T.data),E=await r.txFromCallData(b);C.push(E),C.push(K);let I=C.map(w=>w.decodedCall),Z=r.tx.Utility.batch_all({calls:I}),Pt=await Z.getEncodedData();return{from:t,data:ht.toHex(Pt),type:Vn.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,Z);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:W(w.execution_result),events:w.emitted_events||[],xcm:w.forwarded_xcms||[]}}catch(w){return{call:"polkadotXcm.send",error:w instanceof Error?w.message:"unknown"}}}:()=>{}}}};import{Asset as Kn,AssetAmount as de,CallType as Hn}from"@galacticcouncil/xc-core";import{Binary as Ln}from"polkadot-api";import{concatMap as ge,catchError as zn,distinctUntilChanged as $n,firstValueFrom as Qn,map as qn,throwError as Gn}from"rxjs";import{addr as On,multiloc as Dt,AssetAmount as _n}from"@galacticcouncil/xc-core";import{acc as Mn,enums as Nn}from"@galacticcouncil/common";import{Blake2256 as Wn,u32 as Un}from"@polkadot-api/substrate-bindings";import{toHex as jn,fromHex as ue}from"@polkadot-api/utils";import{Enum as le}from"polkadot-api";var{Ss58Addr:me}=On,P=class l{chain;_currency;constructor(t){this.chain=t}static async create(t){return new l(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}async getExistentialDeposit(){let t;try{let n=await this.api.constants.Balances.ExistentialDeposit();t=typeof n=="bigint"?n:BigInt(String(n))}catch{t=0n}let{asset:e,decimals:s}=await this.getCurrency();return _n.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=Un.enc(a),i=u=>new TextEncoder().encode(u),o=new Uint8Array([...i(this.chain.parachainId.toString()),...ue(t.startsWith("0x")?t.slice(2):t),...r,...ue(s.startsWith("0x")?s.slice(2):s),...i(n),...i(e.toString())]),c=Wn(o);return jn(c)}async dryRun(t,e){let s=le("Signed",t),n=le("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: "+Nn.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 ie(a.emitted_events||[]);{let r=W(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=Dt.findNestedKey(a,"interior"),i=Dt.findParachain(a);if(Dt.findGlobalConsensus(a))return t;if(i){let u=Mn.getSovereignAccounts(i);return this.chain.parachainId===0?me.encodePubKey(u.relay):me.encodePubKey(u.generic)}let c=r&&r.interior;if(c==="Here"||c?.type==="Here")return this.chain.treasury||t}return t}};var Ct=class{#t;constructor(t){this.#t=P.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,i=await this.useSignerFee(s)?{asset:new Kn(s)}:void 0,o=n.getTx(a.client),c=n.module+"."+n.func,u=await o.getEncodedData();return{from:t,data:Ln.toHex(u),type:Hn.Substrate,txOptions:i,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:W(d.execution_result);return{call:c,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(m){return{call:c,error:m instanceof Error?m.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let a=await this.#t,r=await a.estimateNetworkFee(t,n),i=await a.estimateDeliveryFee(t,n),o=await this.exchangeFee(r+i,s),c=await It(o,s,a);return s.copyWith(c)}async getBalance(t,e){let s=await this.subscribeBalance(t,e);return Qn(s)}async subscribeBalance(t,e){let s=await this.#t,{module:n,func:a,args:r,transform:i}=e;return s.client.getUnsafeApi().query[n][a].watchValue(...r,{at:"best"}).pipe(qn(({value:u})=>u)).pipe(ge(u=>i(u)),$n((u,m)=>u===m),ge(async u=>{let m=await It(u,t,s);return de.fromAsset(t,m)}),zn(u=>(console.error("subscribe fails for:",t),Gn(()=>u))))}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),a=await s.getDecimals();if(n.isEqual(e))return t;try{let r=s.chain.dex,i=de.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,i,!0)).amount}catch{}return t}};import{multiloc as pe}from"@galacticcouncil/xc-core";import{Binary as Xn,Enum as Rt}from"polkadot-api";var fe=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=Xn.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(i=>{i.signSubmitAndWatch(this.#e,r).subscribe({next:o=>{o.type==="broadcasted"&&e.onTransactionSend(o.txHash),o.type==="finalized"&&e.onFinalized(o)},error:o=>{e.onError(o)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=pe.findPalletInstance(e),n=pe.findGeneralIndex(e);return{parents:0,interior:Rt("X2",[Rt("PalletInstance",Number(s)),Rt("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as Yn,Wormhole as Zn}from"@galacticcouncil/xc-core";import{Transaction as ts}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as es}from"@mysten/sui/utils";import{toBase64 as ns}from"@mysten/bcs";import{encoding as ss,serialize as as,toChainId as rs}from"@wormhole-foundation/sdk-connect";import{deserialize as is}from"@wormhole-foundation/sdk-definitions";import{getPackageId as he}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as os}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as Jn}from"@mysten/bcs";function At(l,t={}){let e=l.inputs??[],s=l.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=u=>n==="bigint"?u:n==="number"?Number(u):u.toString(),i=u=>{let m=Jn(u),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(m[f])<<8n*BigInt(f);return p};return m.length===1?{type:"pure",valueType:"u8",value:Number(m[0])}:m.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:m.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:m.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:m.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...m].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(m)}},o=u=>{let m=e[u];if(!m)return{Input:u};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:u}},c=u=>u?.GasCoin?"GasCoin":Array.isArray(u?.NestedResult)?u:typeof u?.Input=="number"?o(u.Input):u;return s.map(u=>{if(u.MoveCall){let m=u.MoveCall;return{MoveCall:{...m,arguments:(m.arguments??[]).map(c)}}}if(u.SplitCoins){let m=u.SplitCoins,d=m.coin?.GasCoin?"GasCoin":c(m.coin),g=(m.amounts??[]).map(c);return{SplitCoins:[d,g]}}if(u.MergeCoins){let m=u.MergeCoins;return{MergeCoins:{...m,destination:c(m.destination),sources:(m.sources??[]).map(c)}}}if(u.TransferObjects){let m=u.TransferObjects;return{TransferObjects:{...m,objects:(m.objects??[]).map(c),address:c(m.address)}}}return u})}var ye=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=Zn.fromChain(this.#t),n=this.#t.client,a=ss.b64.decode(e),r=is("TokenBridge:Transfer",a),i=s.getCoreBridge(),o=s.getTokenBridge(),c=await os(n,o,r.payload.token.address.toUint8Array(),rs(r.payload.token.chain));if(!c)throw new Error("Unable to fetch token coinType");let[u,m]=await Promise.all([he(n,i),he(n,o)]),d=new ts;d.setSender(t);let[g]=d.moveCall({target:`${u}::vaa::parse_and_verify`,arguments:[d.object(i),d.pure.vector("u8",as(r)),d.object(es)]}),[p]=d.moveCall({target:`${m}::vaa::verify_only_once`,arguments:[d.object(o),g]}),[f]=d.moveCall({target:`${m}::complete_transfer::authorize_transfer`,arguments:[d.object(o),p],typeArguments:[c]}),[h]=d.moveCall({target:`${m}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[c]});d.moveCall({target:`${m}::coin_utils::return_nonzero`,arguments:[h],typeArguments:[c]});let x=await d.build({client:n}),A=await d.toJSON(),y=At(JSON.parse(A));return{from:t,commands:y,data:ns(x),type:Yn.Sui}}};import{AssetAmount as ls,CallType as ms}from"@galacticcouncil/xc-core";import{toBase64 as ds}from"@mysten/bcs";import{distinctUntilChanged as gs,finalize as ps,shareReplay as fs,Subject as hs}from"rxjs";var bt=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 cs}from"@mysten/sui/utils";var us=9,wt=class extends bt{async getBalance(){let{address:t}=this.config,e=await this.client.getBalance({owner:t,coinType:cs});return BigInt(e.totalBalance)}async getDecimals(){return us}};var vt=class{static get(t,e){switch(e.module){case"Native":return new wt(t,e);default:throw new Error("Module "+e.module+" is not supported")}}};var xt=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}),i=await a.toJSON(),o=At(JSON.parse(i));return{from:t,commands:o,data:ds(r),type:ms.Sui,dryRun:async()=>{let c=await this.#t.dryRunTransactionBlock({transactionBlock:r});return{call:n.module+"."+n.func,error:c.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),o=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,c=BigInt(o.computationCost),u=BigInt(o.storageCost),m=c+u;return s.copyWith({amount:m})}async getBalance(t,e){let s=vt.get(this.#t,e),[n,a]=await Promise.all([s.getBalance(),s.getDecimals()]);return ls.fromAsset(t,{amount:n,decimals:a})}async subscribeBalance(t,e){let s=new hs,n=s.pipe(fs(1)),a=async()=>{await(async()=>{let c=await this.getBalance(t,e);s.next(c)})();let o=setInterval(()=>{},3e3);return()=>clearInterval(o)},r;return a().then(i=>r=i),n.pipe(ps(()=>r?.()),gs((i,o)=>i.amount===o.amount))}};import{Ed25519Keypair as ys}from"@mysten/sui/keypairs/ed25519";import{Transaction as Cs}from"@mysten/sui/transactions";var Ce=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,a=this.#t.client;try{if(this.#e instanceof ys){let o=Cs.from(n),c=await a.signAndExecuteTransaction({signer:this.#e,transaction:o,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest);return}let r=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),i=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(i.digest)}catch(r){e.onError(r)}}};var O=class{platform={};constructor(t){switch(t.getType()){case q.EvmChain:this.registerEvm(t);break;case q.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case q.Parachain:this.registerSubstrate(t);break;case q.SolanaChain:this.registerSolana(t);break;case q.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new it(e)}registerSolana(t){let e=t;this.platform.Solana=new mt(e)}registerSui(t){let e=t;this.platform.Sui=new xt(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new Ct(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}async getBalance(t,e){return this.platform[e.type].getBalance(t,e)}async subscribeBalance(t,e){return this.platform[e.type].subscribeBalance(t,e)}};import{addr as Ss,AssetAmount as kt,Parachain as Ps}from"@galacticcouncil/xc-core";import{acc as Ts,big as xe}from"@galacticcouncil/common";import{big as As}from"@galacticcouncil/common";import G from"big.js";function Ae(l,t,e,s){let n=l.toBig().minus(e.toBig()).minus(l.isSame(t)?t.toBig():new G(0));return s&&(n=n.minus(l.isSame(s)?s.toBig():new G(0))),l.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function be(l,t,e,s){let a=l.copyWith({amount:0n}).toBig().plus(l.isSame(t)?t.toBig():new G(0)).plus(l.toBig().lt(e.toBig())?e.toBig():new G(0));return s&&(a=a.plus(l.isSame(s)&&l.toBig().lt(s.toBig())?s.toBig():new G(0))),l.copyWith({amount:BigInt(a.toFixed())})}async function F(l,t){return t.isEvmParachain()?t.getDerivatedAddress(l):l}function we(l,t){return t?As.toBigInt(t,l):0n}import{addr as bs,AssetAmount as ws,Parachain as ve}from"@galacticcouncil/xc-core";import{big as vs}from"@galacticcouncil/common";var{EvmAddr:xs}=bs,U=class{adapter;config;constructor(t,e){this.adapter=t,this.config=e}async getEd(){let{chain:t}=this.config;if(t instanceof ve)return(await P.create(t)).getExistentialDeposit()}async getBalance(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.asset,r=e.getBalanceAssetId(a),i=xs.isValid(r.toString())?await F(t,e):t,o=s.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:s}=e,n=s.asset,a=s.min;if(t instanceof ve&&a){let r=t.getMinAssetId(n),i=a.build({asset:r});return this.adapter.getBalance(n,i)}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),i=0n;return a&&(i=vs.toBigInt(a,r)),ws.fromAsset(n,{amount:i,decimals:r})}async getDecimals(t){let{chain:e}=this.config,s=e.getAssetDecimals(t);return s||(await e.getCurrency()).decimals}};var{EvmAddr:Se}=Ss,X=class extends U{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(t){let{chain:e,route:s}=this.config,{source:n,destination:a,transact:r}=s,i=a.fee.amount,o=n.destinationFee.asset||a.fee.asset,c=await this.getDecimals(o);if(Number.isFinite(i))return{fee:kt.fromAsset(o,{amount:xe.toBigInt(i,c),decimals:c}),feeBreakdown:{}};let u=i,{amount:m,breakdown:d}=await u.build({feeAsset:o,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:kt.fromAsset(o,{amount:m,decimals:c}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{chain:e,route:s}=this.config,{source:n,destination:a}=s,r=n.asset,i=n.destinationFee.asset||a.fee.asset;if(r.isEqual(i))return this.getBalance(t);let o=e.getBalanceAssetId(i),c=Se.isValid(o.toString())?await F(t,e):t,u=n.destinationFee.balance.build({address:c,asset:i,chain:e});return this.adapter.getBalance(i,u)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,i=await this.getTransfer(t),o=s.contract?await F(a,e):a,c=await this.adapter.estimateFee(o,n,r.feeBalance,i),{fee:u}=s.source,m=u?we(c.decimals,u.extra):0n,d=c.amount+m;return c.copyWith({amount:d})}async getFeeBalance(t){let{chain:e,route:s}=this.config,{source:n}=s;if(!n.fee)return this.getBalance(t);let a=await this.getFeeAsset(t),r=e.getBalanceAssetId(a),i=Se.isValid(r.toString())?await F(t,e):t,o=n.fee.balance.build({address:i,asset:a,chain:e});return this.adapter.getBalance(a,o)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let i=a.asset;return e instanceof Ps&&"build"in i?await i.build({chain:e,address:t}):i}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:i}=s;if(a){let{address:c,amount:u,asset:m,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,u,m.originSymbol,c);return a.build({...t,messageId:p})}let o=n||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: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 P.create(s),i=a.getTx(r.client),o=e.source.chain,c=e.sender,u=Ts.getMultilocationDerivatedAccount(o.parachainId,c,s.parachainId===0?0:1,s.usesH160Acc),m=await i.getPaymentInfo(u),d=await i.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=xe.toBigInt(e.amount,s);return kt.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 J=class extends U{constructor(t,e){super(t,e)}};import{AssetAmount as Bs}from"@galacticcouncil/xc-core";var Y=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:Bs.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:Vs}=Is,Ot=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Fs(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),i=this.config.getChain(s);if(!(r.isSubstrate()&&i.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[c,u]=await Promise.all([P.create(r),P.create(i)]),m=new yt(c,u),d=Es.getMultilocationDerivatedAccount(r.parachainId,t,1,i.usesH160Acc),g=await u.getAsset(),p=await this.transfer(g,t,e,d,s);return m.remoteExec(t,d,n,f=>{let h=f.toDecimal();return p.buildCall(h)},a)}async getTransferData(t,e,s){let n=t.origin,a=t.reverse,r=new O(n.chain),i=new O(a.chain),o=new X(r,n),c=new J(i,a),u=new Ds(...this.validations),[m,d,g,p,f,h,x]=await Promise.all([o.getBalance(e),o.getFeeBalance(e),o.getDestinationFee(),o.getDestinationFeeBalance(e),o.getMin(),c.getBalance(s),c.getMin()]),{source:A,destination:y}=n.route,S=g.fee.copyWith(y.fee.asset),B=g.feeBreakdown,K=A.asset.isEqual(S)&&S.amount>10n?S.amount+1n:10n,C={address:s,amount:K,asset:A.asset,destination:{balance:h,chain:a.chain,fee:S,feeBreakdown:B},sender:e,source:{balance:m,chain:n.chain,fee:d.copyWith({amount:0n}),feeBalance:d,destinationFee:g.fee,destinationFeeBalance:p}};C.transact=await o.getTransact(C);let T=new Y(C),b=await o.getFee(C),E;T.isSwapSupported(A.fee)&&(E=await T.getSwap(b),C.source.feeSwap=E);let I;T.isDestinationSwapSupported(b)&&(I=await T.getDestinationSwap(b),C.source.destinationFeeSwap=I),(E||I)&&(b=await o.getFee(C),b=b.padByPct(5n));let Z=await c.getEd(),Pt=be(h,S,x,Z),w=await o.getEd(),tt=Ae(m,b,f,w);C.amount=0n,C.source.fee=b;let H={source:{balance:m,destinationFee:g.fee,destinationFeeBalance:p,destinationFeeSwap:I,fee:b,feeBalance:d,feeSwap:E,max:tt,min:m.copyWith({amount:Pt.amount})},destination:{balance:h,fee:S},async buildCall(R){let v=Object.assign({},C);return v.amount=Vt.toBigInt(R,m.decimals),v.transact=await o.getTransact(v),o.getCall(v)},async estimateFee(R){let v=Object.assign({},C);return v.amount=Vt.toBigInt(R,m.decimals),v.transact=await o.getTransact(v),o.getFee(v)},async estimateDestinationFee(R){let v=Vt.toBigInt(R,m.decimals),{fee:k,feeBreakdown:Ee}=await o.getDestinationFee(v);return C.destination.fee=k,C.destination.feeBreakdown=Ee,C.source.destinationFee=k,H.destination.fee=k,H.source.destinationFee=k,k},async validate(R){let v=Object.assign({},C),k=R||b.amount;return v.source.fee=b.copyWith({amount:k}),u.validate(v)}};return H}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=new O(n.chain),r=n.getUniqueRoutes().map(async({source:c})=>{let{asset:u,balance:m}=c,d=n.chain.getBalanceAssetId(u),g=Vs.isValid(d.toString())?await F(t,n.chain):t,p=m.build({address:g,asset:u,chain:n.chain});return a.subscribeBalance(u,p)}),i=await Promise.all(r);return Rs(i).pipe(ks(500)).subscribe(s)}};import{ConfigBuilder as Os}from"@galacticcouncil/xc-core";function _s(l){let t=Os(l.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:u,build:m}=a.destination(r);return{routes:i,destinationAssets:o,isAssetSelect:c,isTagSelect:u,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let h=m(p,f);return l.getTransferData(h,d,g)}}}}}}}}}import{Precompile as Ms}from"@galacticcouncil/xc-core";var Ns="https://api.wormholescan.io",St=class{_baseUrl;constructor(t){this._baseUrl=t||Ns}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===Ms.Bridge}};import{acc as Ws}from"@galacticcouncil/common";import{mrl as Us,ChainType as Te,Parachain as js,Precompile as Ks,Wormhole as j}from"@galacticcouncil/xc-core";import{encoding as Hs}from"@wormhole-foundation/sdk-base";import{keccak256 as Ls}from"@wormhole-foundation/sdk-connect";import{deserialize as zs}from"@wormhole-foundation/sdk-definitions";var Pe=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(Pe||{});var $s=300*1e3,Be=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new St}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=Ws.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:i,standarizedProperties:o}=r,c=this.getStatus(a),u=this.chains.find(f=>f instanceof js&&f.parachainId===this.parachainId),{toAddress:m,tokenAddress:d}=o,g=this.chains.find(f=>j.isKnown(f)&&j.fromChain(f).getWormholeId()===i.tokenChain),p;if(c===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),h=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case Te.EvmChain:let x=new et(g);p=async y=>x.redeem(y,h);break;case Te.SolanaChain:let A=new pt(g);p=async y=>A.redeem(y,h);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:u,to:m,toChain:g,status:c,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:Ks.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,i=(await Us.createPayload(a,t)).toHex(),o=s.filter(c=>{let{content:u}=c,{payload:m}=u;return m.payloadType===3&&m.toChain===16&&"0x"+m.payload===i}).map(async c=>{let{content:u,sourceChain:m}=c,{payload:d,standarizedProperties:g}=u,p=this.getStatus(c),{tokenAddress:f}=g,h=this.chains.find(y=>j.isKnown(y)&&j.fromChain(y).getWormholeId()===d.tokenChain),x=this.chains.find(y=>j.isKnown(y)&&j.fromChain(y).getWormholeId()===d.toChain),A;if(p===1&&c.vaa){let{timestamp:y}=this.getVaaHeader(c.vaa.raw),S=c.vaa.raw;if(this.isStuck(y)){let B=new ft(x);A=async D=>B.redeemMrlViaXcm(D,S)}}return{asset:f,assetSymbol:c.data.symbol,amount:c.data.tokenAmount,from:m.from,fromChain:h,to:t,toChain:n,status:p,redeem:A,operation:c}});return Promise.all(o)}isStuck(t){return Date.now()>=t*1e3+$s}getVaaHeader(t){let e=Hs.b64.decode(t),s=zs("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Ls(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{jt as DISPATCH_ADDRESS,et as EvmClaim,it as EvmPlatform,Kt as EvmSigner,Y as FeeSwap,O as PlatformAdapter,pt as SolanaClaim,N as SolanaLilJit,mt as SolanaPlatform,se as SolanaSigner,ft as SubstrateClaim,yt as SubstrateExec,Ct as SubstratePlatform,P as SubstrateService,fe as SubstrateSigner,ye as SuiClaim,xt as SuiPlatform,Ce as SuiSigner,_s as TransferBuilder,Ot as Wallet,Pe as WhStatus,St as WormholeScan,Be as WormholeTransfer,Gt as chunk,wr as deserializeV0,V as ixToHuman,$ as serializeV0};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/Wallet.ts", "../src/platforms/adapter.ts", "../src/platforms/evm/EvmClaim.ts", "../src/platforms/evm/EvmPlatform.ts", "../src/platforms/evm/balance/EvmBalance.ts", "../src/platforms/evm/balance/Erc20.ts", "../src/platforms/evm/balance/Native.ts", "../src/platforms/evm/balance/EvmBalanceFactory.ts", "../src/platforms/evm/transfer/EvmTransfer.ts", "../src/platforms/evm/transfer/EvmTransferFactory.ts", "../src/platforms/evm/transfer/utils.ts", "../src/platforms/evm/EvmSigner.ts", "../src/platforms/solana/SolanaPlatform.ts", "../src/platforms/solana/balance/SolanaBalance.ts", "../src/platforms/solana/balance/Native.ts", "../src/platforms/solana/balance/Token.ts", "../src/platforms/solana/balance/SolanaBalanceFactory.ts", "../src/platforms/solana/transfer/SolanaTransfer.ts", "../src/platforms/solana/transfer/SolanaTransferFactory.ts", "../src/platforms/solana/utils.ts", "../src/platforms/solana/SolanaClaim.ts", "../src/platforms/solana/SolanaLilJit.ts", "../src/platforms/solana/SolanaSigner.ts", "../src/platforms/substrate/SubstrateClaim.ts", "../src/platforms/substrate/SubstrateExec.ts", "../src/platforms/substrate/utils/amount.ts", "../src/platforms/substrate/utils/dryRun.ts", "../src/platforms/substrate/utils/xcm.ts", "../src/platforms/substrate/SubstratePlatform.ts", "../src/platforms/substrate/SubstrateService.ts", "../src/platforms/substrate/SubstrateSigner.ts", "../src/platforms/sui/SuiClaim.ts", "../src/platforms/sui/utils.ts", "../src/platforms/sui/SuiPlatform.ts", "../src/platforms/sui/balance/SuiBalance.ts", "../src/platforms/sui/balance/Native.ts", "../src/platforms/sui/balance/SuiBalanceFactory.ts", "../src/platforms/sui/SuiSigner.ts", "../src/transfer/DataOriginProcessor.ts", "../src/transfer/utils.ts", "../src/transfer/DataProcessor.ts", "../src/transfer/DataReverseProcessor.ts", "../src/FeeSwap.ts", "../src/Wallet.utils.ts", "../src/clients/WormholeScan.ts", "../src/clients/WormholeTransfer.ts", "../src/clients/types.ts"],
|
|
4
|
+
"sourcesContent": ["import { acc, big } from '@galacticcouncil/common';\n\nimport {\n addr,\n Asset,\n AnyChain,\n AnyParachain,\n AssetAmount,\n ConfigBuilder,\n ConfigService,\n TransferConfigs,\n TransferCtx,\n TransferValidator,\n TransferValidation,\n TransferValidationReport,\n} from '@galacticcouncil/xc-core';\n\nimport { combineLatest, debounceTime, Subscription } from 'rxjs';\n\nimport {\n Call,\n PlatformAdapter,\n SubstrateCall,\n SubstrateExec,\n SubstrateService,\n} from './platforms';\nimport {\n calculateMax,\n calculateMin,\n formatEvmAddress,\n DataOriginProcessor,\n DataReverseProcessor,\n} from './transfer';\nimport { Transfer } from './types';\n\nimport { FeeSwap } from './FeeSwap';\n\nconst { EvmAddr } = addr;\n\nexport interface WalletOptions {\n configService: ConfigService;\n transferValidations?: TransferValidation[];\n}\n\nexport class Wallet {\n readonly config: ConfigService;\n readonly validations: TransferValidation[];\n\n constructor({ configService, transferValidations }: WalletOptions) {\n this.config = configService;\n this.validations = transferValidations || [];\n }\n\n async transfer(\n asset: string | Asset,\n srcAddress: string,\n srcChain: string | AnyChain,\n dstAddress: string,\n dstChain: string | AnyChain\n ): Promise<Transfer> {\n const transfer = ConfigBuilder(this.config)\n .assets()\n .asset(asset)\n .source(srcChain)\n .destination(dstChain)\n .build();\n return this.getTransferData(transfer, srcAddress, dstAddress);\n }\n\n async remoteXcm(\n srcAddress: string,\n srcChain: string | AnyParachain,\n dstChain: string | AnyParachain,\n dstCall: SubstrateCall,\n opts: {\n srcFeeAsset?: Asset;\n } = {}\n ): Promise<SubstrateCall> {\n const src = this.config.getChain(srcChain) as AnyParachain;\n const dst = this.config.getChain(dstChain) as AnyParachain;\n\n const isSubstrateExec = src.isSubstrate() && dst.isSubstrate();\n if (!isSubstrateExec)\n throw Error('RemoteXcm is supported only between parachains');\n\n const [srcSub, dstSub] = await Promise.all([\n SubstrateService.create(src),\n SubstrateService.create(dst),\n ]);\n\n const exec = new SubstrateExec(srcSub, dstSub);\n\n const dstAddress = acc.getMultilocationDerivatedAccount(\n src.parachainId,\n srcAddress,\n 1,\n dst.usesH160Acc\n );\n\n const dstAsset = await dstSub.getAsset();\n const transfer = await this.transfer(\n dstAsset,\n srcAddress,\n srcChain,\n dstAddress,\n dstChain\n );\n\n return exec.remoteExec(\n srcAddress,\n dstAddress,\n dstCall,\n (fees) => {\n const feesFmt = fees.toDecimal();\n return transfer.buildCall(feesFmt);\n },\n opts\n );\n }\n\n async getTransferData(\n configs: TransferConfigs,\n srcAddress: string,\n dstAddress: string\n ): Promise<Transfer> {\n const srcConf = configs.origin;\n const dstConf = configs.reverse;\n\n const srcAdapter = new PlatformAdapter(srcConf.chain);\n const dstAdapter = new PlatformAdapter(dstConf.chain);\n\n const src = new DataOriginProcessor(srcAdapter, srcConf);\n const dst = new DataReverseProcessor(dstAdapter, dstConf);\n const validator = new TransferValidator(...this.validations);\n\n const [\n srcBalance,\n srcFeeBalance,\n srcDestinationFee,\n srcDestinationFeeBalance,\n srcMin,\n dstBalance,\n dstMin,\n ] = await Promise.all([\n src.getBalance(srcAddress),\n src.getFeeBalance(srcAddress),\n src.getDestinationFee(),\n src.getDestinationFeeBalance(srcAddress),\n src.getMin(),\n dst.getBalance(dstAddress),\n dst.getMin(),\n ]);\n\n const { source, destination } = srcConf.route;\n\n // Normalize destination fee asset\n const dstFee = srcDestinationFee.fee.copyWith(destination.fee.asset);\n const dstFeeBreakdown = srcDestinationFee.feeBreakdown;\n\n const sameAssetDestFee = source.asset.isEqual(dstFee);\n const initAmount =\n sameAssetDestFee && dstFee.amount > 10n ? dstFee.amount + 1n : 10n;\n\n const ctx: TransferCtx = {\n address: dstAddress,\n amount: initAmount,\n asset: source.asset,\n destination: {\n balance: dstBalance,\n chain: dstConf.chain,\n fee: dstFee,\n feeBreakdown: dstFeeBreakdown,\n },\n sender: srcAddress,\n source: {\n balance: srcBalance,\n chain: srcConf.chain,\n fee: srcFeeBalance.copyWith({ amount: 0n }),\n feeBalance: srcFeeBalance,\n destinationFee: srcDestinationFee.fee,\n destinationFeeBalance: srcDestinationFeeBalance,\n },\n };\n\n ctx.transact = await src.getTransact(ctx);\n\n const swap = new FeeSwap(ctx);\n\n let srcFee = await src.getFee(ctx);\n let srcFeeSwap;\n if (swap.isSwapSupported(source.fee)) {\n srcFeeSwap = await swap.getSwap(srcFee);\n ctx.source.feeSwap = srcFeeSwap;\n }\n\n let srcDestinationFeeSwap;\n if (swap.isDestinationSwapSupported(srcFee)) {\n srcDestinationFeeSwap = await swap.getDestinationSwap(srcFee);\n ctx.source.destinationFeeSwap = srcDestinationFeeSwap;\n }\n\n if (srcFeeSwap || srcDestinationFeeSwap) {\n // Re-estimate fee if fee swap & add 5% margin\n srcFee = await src.getFee(ctx);\n srcFee = srcFee.padByPct(5n);\n }\n\n const dstEd = await dst.getEd();\n const min = calculateMin(dstBalance, dstFee, dstMin, dstEd);\n\n const srcEd = await src.getEd();\n const max = calculateMax(srcBalance, srcFee, srcMin, srcEd);\n\n ctx.amount = 0n;\n ctx.source.fee = srcFee;\n\n const transfer = {\n source: {\n balance: srcBalance,\n destinationFee: srcDestinationFee.fee,\n destinationFeeBalance: srcDestinationFeeBalance,\n destinationFeeSwap: srcDestinationFeeSwap,\n fee: srcFee,\n feeBalance: srcFeeBalance,\n feeSwap: srcFeeSwap,\n max,\n min: srcBalance.copyWith({ amount: min.amount }),\n },\n destination: {\n balance: dstBalance,\n fee: dstFee,\n },\n async buildCall(amount): Promise<Call> {\n const copyCtx = Object.assign({}, ctx);\n copyCtx.amount = big.toBigInt(amount, srcBalance.decimals);\n copyCtx.transact = await src.getTransact(copyCtx);\n return src.getCall(copyCtx);\n },\n async estimateFee(amount): Promise<AssetAmount> {\n const copyCtx = Object.assign({}, ctx);\n copyCtx.amount = big.toBigInt(amount, srcBalance.decimals);\n copyCtx.transact = await src.getTransact(copyCtx);\n return src.getFee(copyCtx);\n },\n async estimateDestinationFee(amount): Promise<AssetAmount> {\n const target = big.toBigInt(amount, srcBalance.decimals);\n const { fee, feeBreakdown } = await src.getDestinationFee(target);\n ctx.destination.fee = fee;\n ctx.destination.feeBreakdown = feeBreakdown;\n ctx.source.destinationFee = fee;\n transfer.destination.fee = fee;\n transfer.source.destinationFee = fee;\n return fee;\n },\n async validate(fee): Promise<TransferValidationReport[]> {\n const copyCtx = Object.assign({}, ctx);\n const srcFeeAmount = fee || srcFee.amount;\n copyCtx.source.fee = srcFee.copyWith({ amount: srcFeeAmount });\n return validator.validate(copyCtx);\n },\n } as Transfer;\n\n return transfer;\n }\n\n async subscribeBalance(\n address: string,\n chain: string | AnyChain,\n observer: (balances: AssetAmount[]) => void\n ): Promise<Subscription> {\n const chainRoutes = this.config.getChainRoutes(chain);\n const adapter = new PlatformAdapter(chainRoutes.chain);\n const observables = chainRoutes\n .getUniqueRoutes()\n .map(async ({ source }) => {\n const { asset, balance } = source;\n const assetId = chainRoutes.chain.getBalanceAssetId(asset);\n const account = EvmAddr.isValid(assetId.toString())\n ? await formatEvmAddress(address, chainRoutes.chain)\n : address;\n const balanceConfig = balance.build({\n address: account,\n asset: asset,\n chain: chainRoutes.chain,\n });\n return adapter.subscribeBalance(asset, balanceConfig);\n });\n\n const ob = await Promise.all(observables);\n const observable = combineLatest(ob);\n return observable.pipe(debounceTime(500)).subscribe(observer);\n }\n}\n", "import {\n AnyChain,\n AnyEvmChain,\n Asset,\n AssetAmount,\n BaseConfig,\n ChainType,\n Parachain,\n SolanaChain,\n SuiChain,\n} from '@galacticcouncil/xc-core';\n\nimport { Observable } from 'rxjs';\n\nimport { EvmPlatform } from './evm';\nimport { SolanaPlatform } from './solana';\nimport { SubstratePlatform } from './substrate';\nimport { SuiPlatform } from './sui';\nimport { Call, Platform } from './types';\n\nexport class PlatformAdapter {\n readonly platform: Record<string, Platform<BaseConfig, BaseConfig>> = {};\n\n constructor(chain: AnyChain) {\n switch (chain.getType()) {\n case ChainType.EvmChain:\n this.registerEvm(chain);\n break;\n case ChainType.EvmParachain:\n this.registerEvm(chain);\n this.registerSubstrate(chain);\n break;\n case ChainType.Parachain:\n this.registerSubstrate(chain);\n break;\n case ChainType.SolanaChain:\n this.registerSolana(chain);\n break;\n case ChainType.SuiChain:\n this.registerSui(chain);\n break;\n default:\n throw new Error('Unsupported platform: ' + chain.getType());\n }\n }\n\n private registerEvm(chain: AnyChain) {\n const evmChain = chain as AnyEvmChain;\n this.platform.Evm = new EvmPlatform(evmChain);\n }\n\n private registerSolana(chain: AnyChain) {\n const solanaChain = chain as SolanaChain;\n this.platform.Solana = new SolanaPlatform(solanaChain);\n }\n\n private registerSui(chain: AnyChain) {\n const suiChain = chain as SuiChain;\n this.platform.Sui = new SuiPlatform(suiChain);\n }\n\n private registerSubstrate(chain: AnyChain) {\n const parachain = chain as Parachain;\n this.platform.Substrate = new SubstratePlatform(parachain);\n }\n\n async buildCall(\n account: string,\n amount: bigint,\n feeBalance: AssetAmount,\n config: BaseConfig\n ): Promise<Call> {\n return this.platform[config.type].buildCall(\n account,\n amount,\n feeBalance,\n config\n );\n }\n\n async estimateFee(\n account: string,\n amount: bigint,\n feeBalance: AssetAmount,\n config: BaseConfig\n ): Promise<AssetAmount> {\n return this.platform[config.type].estimateFee(\n account,\n amount,\n feeBalance,\n config\n );\n }\n\n async getBalance(asset: Asset, config: BaseConfig): Promise<AssetAmount> {\n return this.platform[config.type].getBalance(asset, config);\n }\n\n async subscribeBalance(\n asset: Asset,\n config: BaseConfig\n ): Promise<Observable<AssetAmount>> {\n return this.platform[config.type].subscribeBalance(asset, config);\n }\n}\n", "import { Abi, EvmChain, Wormhole as Wh } from '@galacticcouncil/xc-core';\n\nimport { encodeFunctionData } from 'viem';\n\nimport { encoding } from '@wormhole-foundation/sdk-base';\n\nimport { EvmCall } from './types';\n\nexport class EvmClaim {\n readonly #chain: EvmChain;\n\n constructor(chain: EvmChain) {\n this.#chain = chain;\n }\n\n redeem(from: string, vaaRaw: string): EvmCall {\n const ctxWh = Wh.fromChain(this.#chain);\n\n const vaaBytes = encoding.b64.decode(vaaRaw);\n const vaaHex = encoding.hex.encode(vaaBytes);\n\n const abi = Abi.TokenBridge;\n const data = encodeFunctionData({\n abi: abi,\n functionName: 'completeTransfer',\n args: ['0x' + vaaHex],\n });\n\n return {\n abi: JSON.stringify(abi),\n data: data,\n from: from,\n to: ctxWh.getTokenBridge(),\n } as EvmCall;\n }\n}\n", "import {\n Abi,\n AnyEvmChain,\n Asset,\n AssetAmount,\n CallType,\n ContractConfig,\n Erc20Client,\n EvmClient,\n} from '@galacticcouncil/xc-core';\n\nimport {\n distinctUntilChanged,\n finalize,\n shareReplay,\n Observable,\n Subject,\n} from 'rxjs';\n\nimport { EvmBalanceFactory } from './balance';\nimport { EvmTransferFactory } from './transfer';\nimport {\n isNativeEthBridge,\n isPrecompile,\n isSnowbridgeV2,\n getSnowbridgeV2TokenAddress,\n} from './transfer/utils';\nimport { EvmCall, EvmDryRunResult } from './types';\n\nimport { Platform } from '../types';\n\nexport class EvmPlatform implements Platform<ContractConfig, ContractConfig> {\n readonly #client: EvmClient;\n\n constructor(chain: AnyEvmChain) {\n this.#client = chain.evmClient;\n }\n\n async buildCall(\n account: string,\n amount: bigint,\n _feeBalance: AssetAmount,\n config: ContractConfig\n ): Promise<EvmCall> {\n const contract = EvmTransferFactory.get(this.#client, config);\n const { abi, asset, calldata } = contract;\n const transferCall = {\n abi: JSON.stringify(abi),\n data: calldata as `0x${string}`,\n from: account as `0x${string}`,\n to: config.address as `0x${string}`,\n type: CallType.Evm,\n value: config.value,\n dryRun: async () => {\n const { error, logs } = await contract.simulateCall(account);\n const decodedEvents = contract.decodeEvents(logs);\n return {\n call: config.module + '.' + config.func,\n error: error?.shortMessage,\n events: decodedEvents,\n } as EvmDryRunResult;\n },\n } as EvmCall;\n\n if (isPrecompile(config) || isNativeEthBridge(config)) {\n return transferCall;\n }\n\n const tokenAddress = isSnowbridgeV2(config)\n ? getSnowbridgeV2TokenAddress(config)!\n : asset;\n\n const erc20 = new Erc20Client(this.#client, tokenAddress);\n const allowance = await erc20.allowance(account, config.address);\n if (allowance >= amount) {\n return transferCall;\n }\n\n const approve = erc20.approve(config.address, amount);\n return {\n abi: JSON.stringify(Abi.Erc20),\n allowance: allowance,\n data: approve as `0x${string}`,\n from: account as `0x${string}`,\n to: tokenAddress as `0x${string}`,\n type: CallType.Evm,\n dryRun: () => {},\n } as EvmCall;\n }\n\n async estimateFee(\n account: string,\n amount: bigint,\n feeBalance: AssetAmount,\n config: ContractConfig\n ): Promise<AssetAmount> {\n const contract = EvmTransferFactory.get(this.#client, config);\n const fee = await contract.estimateFee(account, amount);\n return feeBalance.copyWith({\n amount: fee,\n });\n }\n\n async getBalance(asset: Asset, config: ContractConfig): Promise<AssetAmount> {\n const contract = EvmBalanceFactory.get(this.#client, config);\n const [balance, decimals] = await Promise.all([\n contract.getBalance(),\n contract.getDecimals(),\n ]);\n return AssetAmount.fromAsset(asset, {\n amount: balance,\n decimals: decimals,\n });\n }\n\n async subscribeBalance(\n asset: Asset,\n config: ContractConfig\n ): Promise<Observable<AssetAmount>> {\n const subject = new Subject<AssetAmount>();\n const observable = subject.pipe(shareReplay(1));\n const provider = this.#client.getProvider();\n\n const run = async () => {\n const updateBalance = async () => {\n const balance = await this.getBalance(asset, config);\n subject.next(balance);\n };\n await updateBalance();\n const unsub = provider.watchBlocks({\n onBlock: () => updateBalance(),\n });\n return () => unsub();\n };\n\n let disconnect: () => void;\n run().then((unsub) => (disconnect = unsub));\n\n return observable.pipe(\n finalize(() => disconnect?.()),\n distinctUntilChanged((prev, curr) => prev.amount === curr.amount)\n ) as Observable<AssetAmount>;\n }\n}\n", "import { ContractConfig, EvmClient } from '@galacticcouncil/xc-core';\n\nexport abstract class EvmBalance {\n readonly client: EvmClient;\n readonly config: ContractConfig;\n\n constructor(client: EvmClient, config: ContractConfig) {\n this.validateClient(client);\n this.validateConfig(config);\n this.client = client;\n this.config = config;\n }\n\n private validateClient(client: EvmClient) {\n if (!client) {\n throw new Error(`No EVM client found`);\n }\n }\n\n private validateConfig(config: ContractConfig) {\n if (!config.address) {\n throw new Error('Contract address is required');\n }\n }\n\n abstract getBalance(): Promise<bigint>;\n abstract getDecimals(): Promise<number>;\n}\n", "import {\n ContractConfig,\n Erc20Client,\n EvmClient,\n} from '@galacticcouncil/xc-core';\n\nimport { EvmBalance } from './EvmBalance';\n\nexport class Erc20 extends EvmBalance {\n readonly erc20: Erc20Client;\n\n constructor(client: EvmClient, config: ContractConfig) {\n super(client, config);\n this.erc20 = new Erc20Client(client, config.address);\n }\n\n async getBalance(): Promise<bigint> {\n const { args } = this.config;\n const [account] = args;\n return this.erc20.balanceOf(account);\n }\n\n async getDecimals(): Promise<number> {\n return this.erc20.decimals();\n }\n}\n", "import { EvmBalance } from './EvmBalance';\n\nexport class Native extends EvmBalance {\n async getBalance(): Promise<bigint> {\n const provider = this.client.getProvider();\n const { address } = this.config;\n\n return provider.getBalance({\n address: address as `0x${string}`,\n });\n }\n\n async getDecimals(): Promise<number> {\n return this.client.chain.nativeCurrency.decimals;\n }\n}\n", "import { ContractConfig, EvmClient } from '@galacticcouncil/xc-core';\n\nimport { Erc20 } from './Erc20';\nimport { Native } from './Native';\nimport { EvmBalance } from './EvmBalance';\n\nexport class EvmBalanceFactory {\n static get(client: EvmClient, config: ContractConfig): EvmBalance {\n switch (config.module) {\n case 'Erc20':\n return new Erc20(client, config);\n case 'Native':\n return new Native(client, config);\n default: {\n throw new Error('Module ' + config.module + ' is not supported');\n }\n }\n }\n}\n", "import { ContractConfig, EvmClient } from '@galacticcouncil/xc-core';\nimport {\n Abi,\n BaseError,\n ContractFunctionExecutionError,\n Log,\n decodeEventLog,\n} from 'viem';\n\nimport { EvmEventLog } from '../types';\n\ntype SimulateCallResult = {\n error: BaseError | undefined;\n logs: Log[] | undefined;\n};\n\nexport class EvmTransfer {\n protected readonly client: EvmClient;\n protected readonly config: ContractConfig;\n\n constructor(client: EvmClient, config: ContractConfig) {\n this.validateClient(client);\n this.client = client;\n this.config = config;\n }\n\n private validateClient(client: EvmClient) {\n if (!client) {\n throw new Error(`No EVM client found`);\n }\n }\n\n get abi(): Abi {\n return this.config.abi;\n }\n\n get asset(): string {\n const args = this.config.args;\n const [asset] = args;\n return asset;\n }\n\n get calldata(): string {\n return this.config.encodeFunctionData();\n }\n\n async estimateGas(account: string): Promise<bigint> {\n const { address, args, value, func } = this.config;\n const provider = this.client.getProvider();\n return await provider.estimateContractGas({\n address: address as `0x${string}`,\n abi: this.abi,\n functionName: func,\n args: args,\n value: value,\n account: account as `0x${string}`,\n });\n }\n\n async estimateFee(account: string, balance: bigint): Promise<bigint> {\n if (balance === 0n) {\n return 0n;\n }\n\n try {\n const estimatedGas = await this.estimateGas(account);\n const gasPrice = await this.getGasPrice();\n return estimatedGas * gasPrice;\n } catch (e) {\n if (e instanceof ContractFunctionExecutionError) {\n const err = e as ContractFunctionExecutionError;\n console.log(\"Can't estimate fees!\\n\", err.message);\n } else {\n console.log(e);\n }\n return 0n;\n }\n }\n\n async getGasPrice(): Promise<bigint> {\n return this.client.getProvider().getGasPrice();\n }\n\n async getNonce(account: string): Promise<number> {\n return this.client.getProvider().getTransactionCount({\n address: account as `0x${string}`,\n });\n }\n\n async simulateCall(account: string): Promise<SimulateCallResult> {\n const { address, args, value, func } = this.config;\n const provider = this.client.getProvider();\n const nonce = await this.getNonce(account);\n try {\n const { results } = await provider.simulateCalls({\n account: account as `0x${string}`,\n calls: [\n {\n to: address as `0x${string}`,\n abi: this.abi,\n functionName: func,\n args: args,\n value: value,\n },\n ],\n stateOverrides: [\n {\n address: account as `0x${string}`,\n nonce: nonce,\n },\n ],\n });\n const [result] = results;\n return result as SimulateCallResult;\n } catch (error) {\n const err = error as BaseError;\n console.log(\"Can't simulate call!\\n\", err.details);\n return {\n error: error,\n } as SimulateCallResult;\n }\n }\n\n decodeEvents(logs: Log[] | undefined): EvmEventLog[] {\n const decodedLogs: EvmEventLog[] = [];\n if (logs) {\n logs.forEach((l) => {\n try {\n const { eventName, args } = decodeEventLog({\n abi: this.abi,\n data: l.data,\n topics: l.topics,\n });\n decodedLogs.push({\n eventName: eventName,\n args: args,\n } as unknown as EvmEventLog);\n } catch (e) {}\n });\n }\n return decodedLogs;\n }\n}\n", "import { ContractConfig, EvmClient } from '@galacticcouncil/xc-core';\n\nimport { EvmTransfer } from './EvmTransfer';\n\nexport class EvmTransferFactory {\n static get(client: EvmClient, config: ContractConfig): EvmTransfer {\n return new EvmTransfer(client, config);\n }\n}\n", "import { ContractConfig, Precompile } from '@galacticcouncil/xc-core';\nimport { decodeAbiParameters } from 'viem';\n\nexport function isSnowbridgeV2(config: ContractConfig): boolean {\n return config.module === 'Snowbridge' && config.func === 'v2_sendMessage';\n}\n\n/**\n * Extract the ERC20 token address from Snowbridge V2 assets arg.\n */\nexport function getSnowbridgeV2TokenAddress(\n config: ContractConfig\n): string | undefined {\n if (!isSnowbridgeV2(config)) return undefined;\n const assets = config.args[1] as string[];\n if (!assets || assets.length === 0) return undefined;\n const [_kind, tokenAddress] = decodeAbiParameters(\n [{ type: 'uint8' }, { type: 'address' }, { type: 'uint128' }],\n assets[0] as `0x${string}`\n );\n return tokenAddress as string;\n}\n\nexport function isNativeEthBridge(config: ContractConfig): boolean {\n const isSnowbridgeNative =\n config.module === 'Snowbridge' &&\n config.func === 'v2_sendMessage' &&\n Array.isArray(config.args[1]) &&\n config.args[1].length === 0;\n\n // Snowbridge V1 (legacy) native ETH: sendToken with the zero token address.\n const isSnowbridgeV1Native =\n config.module === 'Snowbridge' &&\n config.func === 'sendToken' &&\n config.args[0] === '0x0000000000000000000000000000000000000000';\n\n const isWormholeNative =\n config.module === 'TokenBridge' &&\n ['wrapAndTransferETHWithPayload', 'wrapAndTransferETH'].includes(\n config.func\n );\n\n return isWormholeNative || isSnowbridgeNative || isSnowbridgeV1Native;\n}\n\nexport function isPrecompile(config: ContractConfig): boolean {\n const precompiles = Object.entries(Precompile).map(([_, v]) => v);\n return precompiles.includes(config.address);\n}\n", "import { AnyEvmChain, EvmClient, EvmParachain } from '@galacticcouncil/xc-core';\nimport { h160 } from '@galacticcouncil/common';\n\nimport { Binary } from 'polkadot-api';\nimport { WalletClient } from 'viem';\n\nimport { EvmCall, EvmTxObserver } from './types';\n\nimport { Call } from '../types';\n\nexport const DISPATCH_ADDRESS = '0x0000000000000000000000000000000000000401';\n\nconst { H160 } = h160;\n\nexport class EvmSigner {\n readonly #chain: AnyEvmChain;\n readonly #client: EvmClient;\n readonly #signer: WalletClient;\n\n constructor(chain: AnyEvmChain, signer: WalletClient) {\n this.#chain = chain;\n this.#client = chain.evmClient;\n this.#signer = signer;\n }\n\n async signAndSend(call: Call, observer: EvmTxObserver) {\n const account = H160.fromAny(call.from);\n const provider = this.#client.getProvider();\n\n let isDispatch = false;\n if (this.#chain instanceof EvmParachain) {\n try {\n const dotClient = this.#chain.client;\n const callData = Binary.fromHex(call.data);\n const api = dotClient.getUnsafeApi();\n await api.txFromCallData(callData);\n isDispatch = true;\n } catch (_) {}\n }\n\n let txHash: `0x${string}`;\n\n if (isDispatch) {\n const [gas, gasPrice] = await Promise.all([\n provider.estimateGas({\n account: account as `0x${string}`,\n data: call.data as `0x${string}`,\n to: DISPATCH_ADDRESS as `0x${string}`,\n }),\n provider.getGasPrice(),\n ]);\n\n const gasPriceExtra = gasPrice + (gasPrice / 100n) * 10n;\n\n txHash = await this.#signer.sendTransaction({\n account: account as `0x${string}`,\n chain: this.#client.chain,\n data: call.data as `0x${string}`,\n maxPriorityFeePerGas: gasPriceExtra,\n maxFeePerGas: gasPriceExtra,\n gas: (gas * 11n) / 10n,\n to: DISPATCH_ADDRESS as `0x${string}`,\n });\n } else {\n const { data, to, value } = call as EvmCall;\n\n const [gas, gasPrice] = await Promise.all([\n provider.estimateGas({\n account: account as `0x${string}`,\n data: data as `0x${string}`,\n to: to as `0x${string}`,\n value: value,\n }),\n provider.getGasPrice(),\n ]);\n\n // Fee math mirrors hydration-ui's EthereumSigner: gas price + 5% surplus,\n // gas limit + 30% surplus, with maxFeePerGas == maxPriorityFeePerGas so\n // the wallet uses the chain's (low, flat) price instead of its own\n // base-fee oracle.\n const gasPriceSurplus = gasPrice + (gasPrice * 5n) / 100n;\n const gasLimit = gas + (gas * 30n) / 100n;\n\n txHash = await this.#signer.sendTransaction({\n account: account as `0x${string}`,\n chain: this.#client.chain,\n data: data as `0x${string}`,\n to: to as `0x${string}`,\n value: value,\n gas: gasLimit,\n maxFeePerGas: gasPriceSurplus,\n maxPriorityFeePerGas: gasPriceSurplus,\n });\n }\n\n observer.onTransactionSend(txHash);\n provider\n .waitForTransactionReceipt({ hash: txHash })\n .then((receipt) => observer.onTransactionReceipt(receipt))\n .catch((error) => observer.onError(error));\n }\n}\n", "import {\n Asset,\n AssetAmount,\n CallType,\n ProgramConfig,\n SolanaChain,\n SolanaQueryConfig,\n} from '@galacticcouncil/xc-core';\n\nimport { Connection, PublicKey } from '@solana/web3.js';\n\nimport { Buffer } from 'buffer';\nimport {\n distinctUntilChanged,\n finalize,\n shareReplay,\n Observable,\n Subject,\n} from 'rxjs';\n\nimport { SolanaBalanceFactory } from './balance';\nimport { SolanaTransferFactory } from './transfer';\nimport { SolanaCall, SolanaDryRunResult } from './types';\nimport { ixToHuman } from './utils';\n\nimport { Platform } from '../types';\n\nexport class SolanaPlatform implements Platform<\n ProgramConfig,\n SolanaQueryConfig\n> {\n readonly #connection: Connection;\n\n constructor(chain: SolanaChain) {\n this.#connection = chain.connection;\n }\n\n async buildCall(\n account: string,\n _amount: bigint,\n _feeBalance: AssetAmount,\n config: ProgramConfig\n ): Promise<SolanaCall> {\n const transfer = SolanaTransferFactory.get(this.#connection, config);\n const mssgV0 = await transfer.getPriorityMessage(account);\n\n const mssgArray = mssgV0.serialize();\n const mssgHex = Buffer.from(mssgArray).toString('hex');\n return {\n from: account,\n data: mssgHex,\n ix: ixToHuman(config.instructions),\n signers: config.signers,\n type: CallType.Solana,\n dryRun: async () => {\n const { err, logs } = await transfer.simulateTransaction(\n account,\n mssgV0\n );\n\n return {\n call: config.module + '.' + config.func,\n error: err,\n events: logs,\n } as SolanaDryRunResult;\n },\n } as SolanaCall;\n }\n\n async estimateFee(\n account: string,\n amount: bigint,\n feeBalance: AssetAmount,\n config: ProgramConfig\n ): Promise<AssetAmount> {\n const transfer = SolanaTransferFactory.get(this.#connection, config);\n const fee = await transfer.estimateFee(account, amount);\n const mssgV0 = await transfer.getPriorityMessage(account);\n const { accounts } = await transfer.simulateTransaction(account, mssgV0);\n\n const sender = accounts && accounts[0];\n const senderFinalBalance = sender?.lamports;\n\n if (senderFinalBalance) {\n const isSolTransfer =\n config.module === 'TokenBridge' &&\n config.func === 'TransferNativeWithPayload';\n\n return feeBalance.copyWith({\n amount:\n feeBalance.amount -\n BigInt(senderFinalBalance) -\n (isSolTransfer ? amount : 0n) +\n config.rentReserve,\n });\n }\n\n return feeBalance.copyWith({\n amount: fee + config.rentReserve,\n });\n }\n\n async getBalance(\n asset: Asset,\n config: SolanaQueryConfig\n ): Promise<AssetAmount> {\n const query = SolanaBalanceFactory.get(this.#connection, config);\n const [balance, decimals] = await Promise.all([\n query.getBalance(),\n query.getDecimals(),\n ]);\n return AssetAmount.fromAsset(asset, {\n amount: balance,\n decimals: decimals,\n });\n }\n\n async subscribeBalance(\n asset: Asset,\n config: SolanaQueryConfig\n ): Promise<Observable<AssetAmount>> {\n const subject = new Subject<AssetAmount>();\n const observable = subject.pipe(shareReplay(1));\n\n const run = async () => {\n const updateBalance = async () => {\n const balance = await this.getBalance(asset, config);\n subject.next(balance);\n };\n await updateBalance();\n const sender = new PublicKey(config.address);\n const id = this.#connection.onAccountChange(sender, () =>\n updateBalance()\n );\n return () => {\n this.#connection.removeAccountChangeListener(id);\n };\n };\n\n let disconnect: () => void;\n run().then((unsub) => (disconnect = unsub));\n\n return observable.pipe(\n finalize(() => disconnect?.()),\n distinctUntilChanged((prev, curr) => prev.amount === curr.amount)\n ) as Observable<AssetAmount>;\n }\n}\n", "import { SolanaQueryConfig } from '@galacticcouncil/xc-core';\n\nimport { Connection } from '@solana/web3.js';\n\nexport abstract class SolanaBalance {\n readonly connection: Connection;\n readonly config: SolanaQueryConfig;\n\n constructor(connection: Connection, config: SolanaQueryConfig) {\n this.validateConnection(connection);\n this.validateConfig(config);\n this.connection = connection;\n this.config = config;\n }\n\n private validateConnection(connection: Connection) {\n if (!connection) {\n throw new Error(`No connection found`);\n }\n }\n\n private validateConfig(config: SolanaQueryConfig) {\n if (!config.address) {\n throw new Error('Solana address is required');\n }\n }\n\n abstract getBalance(): Promise<bigint>;\n abstract getDecimals(): Promise<number>;\n}\n", "import { SolanaAddress } from '@wormhole-foundation/sdk-solana';\n\nimport { SolanaBalance } from './SolanaBalance';\n\nconst NATIVE_DECIMALS = 9;\n\nexport class Native extends SolanaBalance {\n async getBalance(): Promise<bigint> {\n const { address } = this.config;\n\n const senderAddress = new SolanaAddress(address).unwrap();\n const balance = await this.connection.getBalance(senderAddress);\n return BigInt(balance);\n }\n\n async getDecimals(): Promise<number> {\n return NATIVE_DECIMALS;\n }\n}\n", "import { SolanaQueryConfig } from '@galacticcouncil/xc-core';\n\nimport { SolanaAddress } from '@wormhole-foundation/sdk-solana';\nimport { Connection } from '@solana/web3.js';\n\nimport { SolanaBalance } from './SolanaBalance';\n\nexport class Token extends SolanaBalance {\n constructor(connection: Connection, config: SolanaQueryConfig) {\n super(connection, config);\n this.validateToken(config);\n }\n\n async getBalance(): Promise<bigint> {\n const { address, token } = this.config;\n\n const senderAddress = new SolanaAddress(address).unwrap();\n const mintAddress = new SolanaAddress(token!).unwrap();\n\n const accounts = await this.connection.getParsedTokenAccountsByOwner(\n senderAddress,\n { mint: mintAddress }\n );\n\n return accounts.value.reduce((sum: bigint, { account }) => {\n const t = account.data.parsed.info.tokenAmount;\n sum += BigInt(t.amount);\n return sum;\n }, 0n);\n }\n\n async getDecimals(): Promise<number> {\n const { token } = this.config;\n\n const mintAddress = new SolanaAddress(token!).unwrap();\n\n const supply = await this.connection.getTokenSupply(mintAddress);\n return supply.value.decimals;\n }\n\n private validateToken(config: SolanaQueryConfig) {\n if (!config.token) {\n throw new Error('Token address is required');\n }\n }\n}\n", "import { SolanaQueryConfig } from '@galacticcouncil/xc-core';\n\nimport { Connection } from '@solana/web3.js';\n\nimport { Native } from './Native';\nimport { Token } from './Token';\nimport { SolanaBalance } from './SolanaBalance';\n\nexport class SolanaBalanceFactory {\n static get(connection: Connection, config: SolanaQueryConfig): SolanaBalance {\n switch (config.module) {\n case 'Native':\n return new Native(connection, config);\n case 'Token':\n return new Token(connection, config);\n default: {\n throw new Error('Module ' + config.module + ' is not supported');\n }\n }\n }\n}\n", "import { ProgramConfig } from '@galacticcouncil/xc-core';\n\nimport {\n AddressLookupTableAccount,\n Connection,\n ComputeBudgetProgram,\n MessageV0,\n PublicKey,\n SimulatedTransactionResponse,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\n\nconst DEFAULT_PRIORITY_FEE_PERCENTILE = 0.5;\nconst DEFAULT_PERCENTILE_MULTIPLE = 2;\nconst DEFAULT_MIN_PRIORITY_FEE = 1;\nconst DEFAULT_MAX_PRIORITY_FEE = 1e6;\n\nconst DEFAULT_COMPUTE_BUDGET = 250_000;\n\nexport class SolanaTransfer {\n readonly connection: Connection;\n readonly config: ProgramConfig;\n\n constructor(connection: Connection, config: ProgramConfig) {\n this.validateConnection(connection);\n this.connection = connection;\n this.config = config;\n }\n\n private validateConnection(connection: Connection) {\n if (!connection) {\n throw new Error(`No connection found`);\n }\n }\n\n async getPriorityMessage(account: string): Promise<MessageV0> {\n const { instructions } = this.config;\n const message = await this.getV0Message(account, instructions);\n const priorityFeeIx = await this.createPriorityFeeInstructions(message);\n return this.getV0Message(account, [...instructions, ...priorityFeeIx]);\n }\n\n async estimateFee(account: string, balance: bigint): Promise<bigint> {\n if (balance === 0n) {\n return 0n;\n }\n\n const { instructions } = this.config;\n const message = await this.getV0Message(account, instructions);\n const budget = await this.determineComputeBudget(message);\n return BigInt(budget);\n }\n\n private async getV0Message(\n account: string,\n instructions: TransactionInstruction[]\n ): Promise<MessageV0> {\n const payerKey = new PublicKey(account);\n const { blockhash } = await this.connection.getLatestBlockhash('finalized');\n return new TransactionMessage({\n payerKey: payerKey,\n recentBlockhash: blockhash,\n instructions: instructions,\n }).compileToV0Message();\n }\n\n private async createPriorityFeeInstructions(\n message: MessageV0,\n feePercentile: number = DEFAULT_PRIORITY_FEE_PERCENTILE,\n multiple: number = DEFAULT_PERCENTILE_MULTIPLE,\n minPriorityFee: number = DEFAULT_MIN_PRIORITY_FEE,\n maxPriorityFee: number = DEFAULT_MAX_PRIORITY_FEE\n ): Promise<TransactionInstruction[]> {\n const [computeBudget, priorityFee] = await Promise.all([\n this.determineComputeBudget(message),\n this.determinePriorityFee(\n message,\n feePercentile,\n multiple,\n minPriorityFee,\n maxPriorityFee\n ),\n ]);\n\n return [\n ComputeBudgetProgram.setComputeUnitLimit({\n units: computeBudget,\n }),\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: priorityFee,\n }),\n ];\n }\n\n async simulateTransaction(\n account: string,\n message: MessageV0\n ): Promise<SimulatedTransactionResponse> {\n const transaction = new VersionedTransaction(message);\n const simulateResponse = await this.connection.simulateTransaction(\n transaction,\n {\n accounts: {\n encoding: 'base64',\n addresses: [account],\n },\n }\n );\n return simulateResponse.value;\n }\n\n /**\n * Determine compute budget from simulated transaction\n *\n * @param transaction - versioned transaction\n * @returns Compute budget to 120% of the units used in the\n * simulated transaction or default\n */\n async determineComputeBudget(message: MessageV0): Promise<number> {\n const transaction = new VersionedTransaction(message);\n const simulateResponse =\n await this.connection.simulateTransaction(transaction);\n\n const { err, unitsConsumed } = simulateResponse.value;\n if (unitsConsumed && !err) {\n return Math.round(unitsConsumed * 1.2);\n }\n\n return DEFAULT_COMPUTE_BUDGET;\n }\n\n /**\n * Determine the priority fee to use for a transaction\n *\n * @param transaction - the transaction to determine the priority fee for\n * @param percentile - the percentile of recent fees to use\n * @param multiple - the multiple to apply to the percentile fee\n * @param minPriorityFee - the minimum priority fee to use\n * @param maxPriorityFee - the maximum priority fee to use\n * @returns the priority fee to use according to the recent transactions and the given parameters\n */\n async determinePriorityFee(\n message: MessageV0,\n percentile: number = DEFAULT_PRIORITY_FEE_PERCENTILE,\n multiple: number = DEFAULT_PERCENTILE_MULTIPLE,\n minPriorityFee: number = DEFAULT_MIN_PRIORITY_FEE,\n maxPriorityFee: number = DEFAULT_MAX_PRIORITY_FEE\n ): Promise<number> {\n // Start with min fee\n let fee = minPriorityFee;\n\n // Figure out tx accounts that needs write lock\n const lockedWritableAccounts = await this.getTxAccounts(message);\n const recentFeesResponse =\n await this.connection.getRecentPrioritizationFees({\n lockedWritableAccounts,\n });\n\n if (recentFeesResponse) {\n // Sort fees to find the percentile\n const recentFees = recentFeesResponse\n .map((dp) => dp.prioritizationFee)\n .filter((f) => f > 0)\n .sort((a, b) => a - b);\n\n // Find the element in the distribution that matches the percentile\n const idx = Math.ceil(recentFees.length * percentile);\n\n if (recentFees.length > idx) {\n const percentileFee = recentFees[idx];\n const percentileFeeJuiced = percentileFee * multiple;\n fee = Math.max(fee, percentileFeeJuiced);\n }\n }\n\n return Math.min(Math.max(fee, minPriorityFee), maxPriorityFee);\n }\n\n private async getTxAccounts(message: MessageV0): Promise<PublicKey[]> {\n const luts = (\n await Promise.all(\n message.addressTableLookups.map((acc) =>\n this.connection.getAddressLookupTable(acc.accountKey)\n )\n )\n )\n .map((lut) => lut.value)\n .filter((val) => val !== null) as AddressLookupTableAccount[];\n\n const keys = message.getAccountKeys({\n addressLookupTableAccounts: luts ?? undefined,\n });\n\n return message.compiledInstructions\n .flatMap((ix) => ix.accountKeyIndexes)\n .map((k) => (message.isAccountWritable(k) ? keys.get(k) : null))\n .filter((k) => k !== null) as PublicKey[];\n }\n}\n", "import { ProgramConfig } from '@galacticcouncil/xc-core';\n\nimport { Connection } from '@solana/web3.js';\n\nimport { SolanaTransfer } from './SolanaTransfer';\n\nexport class SolanaTransferFactory {\n static get(connection: Connection, config: ProgramConfig): SolanaTransfer {\n return new SolanaTransfer(connection, config);\n }\n}\n", "import { MessageV0, TransactionInstruction } from '@solana/web3.js';\n\nimport { HumanizedIx } from './types';\n\nexport function ixToHuman(\n instructions: TransactionInstruction[]\n): HumanizedIx[] {\n return instructions.map((ix) => {\n return {\n program: ix.programId.toBase58(),\n data: ix.data.toString('hex'),\n keys: ix.keys.map((k) => k.pubkey.toBase58()),\n };\n });\n}\n\nexport function chunk<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n out.push(items.slice(i, i + size));\n }\n return out;\n}\n\nexport function serializeV0(mssgV0: MessageV0): string {\n const mssgArray = mssgV0.serialize();\n return Buffer.from(mssgArray).toString('hex');\n}\n\nexport function deserializeV0(mssgV0: string): MessageV0 {\n const mssgBuffer = Buffer.from(mssgV0, 'hex');\n const mssgArray = Uint8Array.from(mssgBuffer);\n return MessageV0.deserialize(mssgArray);\n}\n", "import {\n CallType,\n SolanaChain,\n Wormhole as Wh,\n} from '@galacticcouncil/xc-core';\n\nimport {\n Connection,\n Keypair,\n MessageV0,\n PublicKey,\n PublicKeyInitData,\n SystemProgram,\n TransactionInstruction,\n TransactionMessage,\n} from '@solana/web3.js';\n\nimport {\n ACCOUNT_SIZE,\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountIdempotentInstruction,\n createCloseAccountInstruction,\n createInitializeAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n getMinimumBalanceForRentExemptAccount,\n getMint,\n} from '@solana/spl-token';\n\nimport { utils as tutils } from '@wormhole-foundation/sdk-solana';\nimport { utils as cutils } from '@wormhole-foundation/sdk-solana-core';\n\nimport { encoding } from '@wormhole-foundation/sdk-base';\nimport { deserialize, VAA } from '@wormhole-foundation/sdk-definitions';\n\nimport {\n createCompleteTransferNativeInstruction,\n createCompleteTransferWrappedInstruction,\n} from '@wormhole-foundation/sdk-solana-tokenbridge';\n\nimport { SolanaCall } from './types';\nimport { chunk, ixToHuman, serializeV0 } from './utils';\n\nimport { SolanaLilJit } from './SolanaLilJit';\n\nexport class SolanaClaim {\n readonly #chain: SolanaChain;\n readonly #connection: Connection;\n readonly #lilJit: SolanaLilJit;\n\n constructor(chain: SolanaChain) {\n this.#chain = chain;\n this.#connection = chain.connection;\n this.#lilJit = new SolanaLilJit(chain);\n }\n\n async redeem(\n from: string,\n vaaRaw: string,\n recipient?: string\n ): Promise<SolanaCall[]> {\n const ctx = Wh.fromChain(this.#chain);\n\n const vaaBytes = encoding.b64.decode(vaaRaw);\n // We don't check for TokenBridge:TransferWithPayload because claim (complete_wrapped_with_payload)\n // must be called via CPI from the redeemer program only if using TokenRelayer\n const vaa = deserialize('TokenBridge:Transfer', vaaBytes);\n const vaaU8a = deserialize('Uint8Array', vaaBytes);\n const postedVaaAddress = this.derivePostedVaaKey(\n ctx.getCoreBridge(),\n Buffer.from(vaa.hash)\n );\n\n const payer = new PublicKey(from);\n const payee = recipient ? new PublicKey(recipient) : payer;\n const isSelfRedeem = payer.equals(payee);\n\n const calls: SolanaCall[] = [];\n\n const posted = await this.#connection.getAccountInfo(postedVaaAddress);\n if (!posted) {\n const signatureSet = Keypair.generate();\n const verifyIxs = await cutils.createVerifySignaturesInstructions(\n this.#chain.connection,\n ctx.getCoreBridge(),\n payer,\n vaaU8a,\n signatureSet.publicKey\n );\n\n // Each secp256k1 + verify_signatures pair goes in its own transaction.\n // Batching multiple pairs overruns Solana's max transaction size.\n const chunks = chunk(verifyIxs, 2);\n for (let i = 0; i < chunks.length; i++) {\n const sigIx = chunks[i];\n const sigV0 = await this.getV0Message(payer, sigIx);\n const sigTx = serializeV0(sigV0);\n calls.push({\n from: from,\n data: sigTx,\n ix: ixToHuman(sigIx),\n signers: [signatureSet],\n type: CallType.Solana,\n } as SolanaCall);\n }\n\n const postVaaIx = cutils.createPostVaaInstruction(\n this.#connection,\n ctx.getCoreBridge(),\n payer,\n vaaU8a,\n signatureSet.publicKey\n );\n const postVaaV0 = await this.getV0Message(payer, [postVaaIx]);\n const postVaaTx = serializeV0(postVaaV0);\n calls.push({\n from: from,\n data: postVaaTx,\n ix: ixToHuman([postVaaIx]),\n type: CallType.Solana,\n } as SolanaCall);\n }\n\n const isNative = vaa.payload.token.chain === 'Solana';\n const mint = new PublicKey(vaa.payload.token.address.toUint8Array());\n const isNativeSol = isNative && mint.equals(NATIVE_MINT);\n\n const tipAccounts = await this.#lilJit.getTipAccount();\n const tipIx = SystemProgram.transfer({\n fromPubkey: payer,\n toPubkey: new PublicKey(tipAccounts[0]),\n lamports: 1000,\n });\n\n if (isNativeSol && isSelfRedeem) {\n const completeCall = await this.redeemAndUnwrap(ctx, payer, vaa, tipIx);\n calls.push(completeCall);\n } else {\n const completeCall = await this.redeemToken(\n ctx,\n payer,\n payee,\n mint,\n isNative,\n vaa,\n tipIx\n );\n calls.push(completeCall);\n }\n\n return calls;\n }\n\n private async redeemToken(\n ctx: Wh,\n payer: PublicKey,\n payee: PublicKey,\n mint: PublicKey,\n isNative: boolean,\n vaa: VAA<'TokenBridge:Transfer'>,\n tipIx: TransactionInstruction\n ): Promise<SolanaCall> {\n const createCompleteTransferInstruction = isNative\n ? createCompleteTransferNativeInstruction\n : createCompleteTransferWrappedInstruction;\n const completeIx = createCompleteTransferInstruction(\n this.#connection,\n ctx.getTokenBridge(),\n ctx.getCoreBridge(),\n payer,\n vaa\n );\n\n const ata = getAssociatedTokenAddressSync(mint, payee);\n const createAtaIx = createAssociatedTokenAccountIdempotentInstruction(\n payer,\n ata,\n payee,\n mint\n );\n\n const completeV0 = await this.getV0Message(payer, [\n createAtaIx,\n completeIx,\n tipIx,\n ]);\n const completeTx = serializeV0(completeV0);\n return {\n from: payer.toBase58(),\n data: completeTx,\n ix: ixToHuman([createAtaIx, completeIx]),\n type: CallType.Solana,\n } as SolanaCall;\n }\n\n private async redeemAndUnwrap(\n ctx: Wh,\n payer: PublicKey,\n vaa: VAA<'TokenBridge:Transfer'>,\n tipIx: TransactionInstruction\n ): Promise<SolanaCall> {\n const ata = new PublicKey(vaa.payload.to.address.toUint8Array());\n const mintInfo = await getMint(this.#connection, NATIVE_MINT);\n const targetAmount =\n vaa.payload.token.amount * BigInt(Math.pow(10, mintInfo.decimals - 8));\n const rentBalance = await getMinimumBalanceForRentExemptAccount(\n this.#connection\n );\n\n const ancillaryKeypair = Keypair.generate();\n\n const createAtaIx = createAssociatedTokenAccountIdempotentInstruction(\n payer,\n ata,\n payer,\n NATIVE_MINT\n );\n\n const completeIx = createCompleteTransferNativeInstruction(\n this.#connection,\n ctx.getTokenBridge(),\n ctx.getCoreBridge(),\n payer,\n vaa\n );\n\n const createAncillaryIx = SystemProgram.createAccount({\n fromPubkey: payer,\n newAccountPubkey: ancillaryKeypair.publicKey,\n lamports: rentBalance,\n space: ACCOUNT_SIZE,\n programId: TOKEN_PROGRAM_ID,\n });\n\n const initAncillaryIx = createInitializeAccountInstruction(\n ancillaryKeypair.publicKey,\n NATIVE_MINT,\n payer\n );\n\n const transferIx = createTransferInstruction(\n ata,\n ancillaryKeypair.publicKey,\n payer,\n targetAmount\n );\n\n const closeIx = createCloseAccountInstruction(\n ancillaryKeypair.publicKey,\n payer,\n payer\n );\n\n const ixs = [\n createAtaIx,\n completeIx,\n createAncillaryIx,\n initAncillaryIx,\n transferIx,\n closeIx,\n tipIx,\n ];\n\n const completeV0 = await this.getV0Message(payer, ixs);\n const completeTx = serializeV0(completeV0);\n return {\n from: payer.toBase58(),\n data: completeTx,\n ix: ixToHuman(ixs),\n signers: [ancillaryKeypair],\n type: CallType.Solana,\n } as SolanaCall;\n }\n\n private derivePostedVaaKey(\n wormholeProgramId: PublicKeyInitData,\n hash: Buffer\n ): PublicKey {\n return tutils.deriveAddress(\n [Buffer.from('PostedVAA'), hash],\n wormholeProgramId\n );\n }\n\n private async getV0Message(\n payer: PublicKey,\n ixs: TransactionInstruction[]\n ): Promise<MessageV0> {\n const { blockhash } =\n await this.#connection.getLatestBlockhash('finalized');\n return new TransactionMessage({\n payerKey: payer,\n recentBlockhash: blockhash,\n instructions: ixs,\n }).compileToV0Message();\n }\n}\n", "import { SolanaChain } from '@galacticcouncil/xc-core';\n\nimport { Connection } from '@solana/web3.js';\n\ntype JitoBundleSimulationResponse = {\n context: {\n apiVersion: string;\n slot: number;\n };\n value: {\n summary:\n | 'succeeded'\n | {\n failed: {\n error: {\n TransactionFailure: [number[], string];\n };\n tx_signature: string;\n };\n };\n transactionResults: Array<{\n err: null | unknown;\n logs: string[];\n postExecutionAccounts: null | unknown;\n preExecutionAccounts: null | unknown;\n returnData: null | unknown;\n unitsConsumed: number;\n }>;\n };\n};\n\ntype JitoBundleStatus = {\n context: {\n apiVersion: string;\n slot: number;\n };\n value: Array<{\n bundle_id: string;\n landed_slot: number;\n status: string;\n }>;\n};\n\nexport class SolanaLilJit {\n readonly #connection: Connection;\n\n constructor(chain: SolanaChain) {\n this.#connection = chain.connection;\n }\n\n /**\n * Returns bundle id\n *\n * @see https://explorer.jito.wtf/bundle/${bundle_id}\n *\n * @param encoded base 64 encoded tx\n * @returns bundle id\n */\n async sendBundle(encoded: string[]): Promise<string> {\n const { result } = await (this.#connection as any)._rpcRequest(\n 'sendBundle',\n [encoded]\n );\n return result;\n }\n\n async simulateBundle(\n encoded: string[]\n ): Promise<JitoBundleSimulationResponse> {\n const res = await (this.#connection as any)._rpcRequest('simulateBundle', [\n [encoded],\n ]);\n return res.result;\n }\n\n async getInflightBundleStatuses(\n bundleIds: string[]\n ): Promise<JitoBundleStatus> {\n const { result } = await (this.#connection as any)._rpcRequest(\n 'getInflightBundleStatuses',\n [bundleIds]\n );\n return result;\n }\n\n async getRegion(): Promise<string[]> {\n const { result } = await (this.#connection as any)._rpcRequest(\n 'getRegions',\n []\n );\n return result;\n }\n\n async getTipAccount(): Promise<string[]> {\n const { result } = await (this.#connection as any)._rpcRequest(\n 'getTipAccounts',\n []\n );\n return result;\n }\n}\n", "import { SolanaChain } from '@galacticcouncil/xc-core';\n\nimport { Keypair, MessageV0, VersionedTransaction } from '@solana/web3.js';\n\nimport { Buffer } from 'buffer';\n\nimport { SolanaLilJit } from './SolanaLilJit';\nimport { SolanaCall, SolanaWallet, SolanaTxObserver } from './types';\n\nimport { Call } from '../types';\n\nexport class SolanaSigner {\n readonly #chain: SolanaChain;\n readonly #wallet: SolanaWallet | Keypair;\n readonly #lilJit: SolanaLilJit;\n\n constructor(chain: SolanaChain, wallet: SolanaWallet | Keypair) {\n this.#chain = chain;\n this.#wallet = wallet;\n this.#lilJit = new SolanaLilJit(chain);\n }\n\n async signAndSend(call: Call, observer: SolanaTxObserver) {\n const { data, signers } = call as SolanaCall;\n const versioned = this.toVersioned(data, signers);\n\n try {\n if (this.#wallet instanceof Keypair) {\n versioned.sign([this.#wallet]);\n const signature =\n await this.#chain.connection.sendTransaction(versioned);\n observer.onTransactionSend(signature);\n const status =\n await this.#chain.connection.getSignatureStatus(signature);\n observer.onStatus?.(status);\n return;\n }\n\n const wallet = this.#wallet;\n await wallet.connect();\n if (signers) {\n versioned.sign(signers);\n }\n const { signature } = await wallet.signAndSendTransaction(versioned);\n observer.onTransactionSend(signature);\n const status = await this.#chain.connection.getSignatureStatus(signature);\n observer.onStatus?.(status);\n } catch (err) {\n observer.onError(err);\n }\n }\n\n async signAndSendAll(calls: Call[], observer: SolanaTxObserver) {\n const versioned = calls.map((c) => {\n const { data, signers } = c as SolanaCall;\n return this.toVersioned(data, signers);\n });\n\n try {\n let encoded: string[];\n\n if (this.#wallet instanceof Keypair) {\n versioned.forEach((tx) => tx.sign([this.#wallet as Keypair]));\n encoded = versioned.map((tx) =>\n Buffer.from(tx.serialize()).toString('base64')\n );\n } else {\n const wallet = this.#wallet;\n await wallet.connect();\n const signed = await wallet.signAllTransactions(versioned);\n encoded = signed.map((s) =>\n Buffer.from(s.serialize()).toString('base64')\n );\n }\n\n const simulation = await this.#lilJit.simulateBundle(encoded);\n if (simulation.value.summary !== 'succeeded') {\n throw new Error(\n 'Bundle simulation failed! ' + JSON.stringify(simulation, null, 2)\n );\n }\n\n const bundleId = await this.#lilJit.sendBundle(encoded);\n observer.onTransactionSend(bundleId);\n\n const status = await this.#lilJit.getInflightBundleStatuses([bundleId]);\n observer.onBundleStatus?.(status.value);\n } catch (err) {\n observer.onError(err);\n }\n }\n\n private toVersioned(data: string, signers?: Keypair[]): VersionedTransaction {\n const mssgBuffer = Buffer.from(data, 'hex');\n const mssgArray = Uint8Array.from(mssgBuffer);\n const mssgV0 = MessageV0.deserialize(mssgArray);\n const versioned = new VersionedTransaction(mssgV0);\n if (signers) {\n versioned.sign(signers);\n }\n return versioned;\n }\n}\n", "import {\n Abi,\n CallType,\n EvmParachain,\n Precompile,\n Wormhole as Wh,\n} from '@galacticcouncil/xc-core';\n\nimport { encoding } from '@wormhole-foundation/sdk-base';\n\nimport { encodeFunctionData } from 'viem';\n\nimport { Binary } from 'polkadot-api';\n\nimport { SubstrateCall } from './types';\nimport { EvmCall } from '../evm';\n\nexport class SubstrateClaim {\n readonly #chain: EvmParachain;\n\n constructor(chain: EvmParachain) {\n this.#chain = chain;\n Wh.fromChain(this.#chain);\n }\n\n redeemMrl(from: string, vaaBytes: string): EvmCall {\n const vaaArray = encoding.b64.decode(vaaBytes);\n const vaaHex = encoding.hex.encode(vaaArray);\n\n const abi = Abi.Gmp;\n const data = encodeFunctionData({\n abi: abi,\n functionName: 'wormholeTransferERC20',\n args: ['0x' + vaaHex],\n });\n return {\n abi: JSON.stringify(abi),\n data: data,\n from: from,\n to: Precompile.Bridge,\n } as EvmCall;\n }\n\n async redeemMrlViaXcm(\n from: string,\n vaaBytes: string\n ): Promise<SubstrateCall> {\n const client = this.#chain.client;\n const api = client.getUnsafeApi();\n const claim = this.redeemMrl(from, vaaBytes);\n const tx = (api.tx as any).EthereumXcm.transact({\n xcm_transaction: {\n type: 'V2',\n value: {\n gas_limit: [5_000_000n, 0n, 0n, 0n],\n action: {\n type: 'Call',\n value: claim.to,\n },\n value: [0n, 0n, 0n, 0n],\n input: Binary.fromHex(claim.data),\n access_list: undefined,\n },\n },\n });\n\n const encoded = await tx.getEncodedData();\n return {\n data: Binary.toHex(encoded),\n from: from,\n type: CallType.Substrate,\n dryRun: async () => undefined,\n txOptions: undefined,\n } as SubstrateCall;\n }\n}\n", "import { Asset, AssetAmount, CallType } from '@galacticcouncil/xc-core';\n\nimport { Binary } from 'polkadot-api';\n\nimport { SubstrateService } from './SubstrateService';\n\nimport { SubstrateCall, SubstrateDryRunResult } from './types';\nimport { buildXcmDest, buildXcmMessage, getErrorFromDryRun } from './utils';\n\nimport { Call } from '../types';\n\nexport class SubstrateExec {\n readonly #src: SubstrateService;\n readonly #dst: SubstrateService;\n\n constructor(src: SubstrateService, dst: SubstrateService) {\n this.#src = src;\n this.#dst = dst;\n }\n\n async remoteExec(\n srcAccount: string,\n dstAccount: string,\n dstCall: SubstrateCall,\n transfer: (fees: AssetAmount) => Promise<Call>,\n opts: {\n srcFeeAsset?: Asset;\n } = {}\n ): Promise<SubstrateCall> {\n const srcApi = this.#src.api;\n const srcAsset = await this.#src.getAsset();\n\n const dstApi = this.#dst.api;\n const dstChain = this.#dst.chain;\n\n const dstCuurrency = await dstChain.getCurrency();\n const dstAsset = dstCuurrency.asset;\n const dstDecimals = dstCuurrency.decimals;\n\n const dstFeeLocation = dstChain.getAssetXcmLocation(dstAsset);\n const dstCallBinary = Binary.fromHex(dstCall.data);\n\n const dstExtrinsic = await dstApi.txFromCallData(dstCallBinary);\n const dstPaymentInfo = await dstExtrinsic.getPaymentInfo(dstAccount);\n\n const dstFeeAmount = (BigInt(dstPaymentInfo.partial_fee) * 120n) / 100n;\n\n const dstFee = AssetAmount.fromAsset(dstAsset, {\n amount: dstFeeAmount,\n decimals: dstDecimals,\n });\n\n const dstRefTime = dstPaymentInfo.weight.ref_time;\n const dstProofSize = dstPaymentInfo.weight.proof_size;\n\n const transactXcmDest = buildXcmDest(dstChain);\n const transactXcmMessage = buildXcmMessage(\n dstAccount,\n dstFeeLocation,\n dstFee,\n dstRefTime,\n dstProofSize,\n dstCallBinary\n );\n\n const transactTx = srcApi.tx.PolkadotXcm.send({\n dest: transactXcmDest,\n message: transactXcmMessage,\n });\n\n const calls: any[] = [];\n\n try {\n const swapTxHash = await this.#src.chain.dex.getCalldata(\n srcAccount,\n opts.srcFeeAsset || srcAsset,\n dstAsset,\n dstFee,\n 10 // swap slippage\n );\n const swapBinary = Binary.fromHex(swapTxHash);\n const swapTx = await srcApi.txFromCallData(swapBinary);\n calls.push(swapTx);\n } catch {}\n\n const transferCall = await transfer(dstFee);\n const transferBinary = Binary.fromHex(transferCall.data);\n const transferTx = await srcApi.txFromCallData(transferBinary);\n\n calls.push(transferTx);\n calls.push(transactTx);\n\n const decoded = calls.map((c) => c.decodedCall);\n\n const batchTx = srcApi.tx.Utility.batch_all({ calls: decoded });\n const batchTxEncoded = await batchTx.getEncodedData();\n\n return {\n from: srcAccount,\n data: Binary.toHex(batchTxEncoded),\n type: CallType.Substrate,\n dryRun: this.#src.isDryRunSupported()\n ? async () => {\n try {\n const dryRunResult = await this.#src.dryRun(srcAccount, batchTx);\n\n const error =\n dryRunResult.execution_result &&\n dryRunResult.execution_result.success\n ? undefined\n : getErrorFromDryRun(dryRunResult.execution_result);\n\n return {\n call: 'polkadotXcm.send',\n error: error,\n events: dryRunResult.emitted_events || [],\n xcm: dryRunResult.forwarded_xcms || [],\n } as SubstrateDryRunResult;\n } catch (e) {\n return {\n call: 'polkadotXcm.send',\n error: e instanceof Error ? e.message : 'unknown',\n } as SubstrateDryRunResult;\n }\n }\n : () => {},\n } as SubstrateCall;\n }\n}\n", "import { Asset, AssetAmountParams } from '@galacticcouncil/xc-core';\nimport { big } from '@galacticcouncil/common';\n\nimport { SubstrateService } from '../SubstrateService';\n\n/**\n * Normalize asset amount if chain uses solely chain decimals\n * for balance representation of assets.\n *\n * @param amount - original chain amount\n * @param asset - asset\n * @param substrate - source chain substrate service\n * @returns normalized asset amount if chain decimals used, otherwise default\n */\nexport async function normalizeAssetAmount(\n amount: bigint,\n asset: Asset,\n substrate: SubstrateService\n): Promise<AssetAmountParams> {\n const chainDecimals = await substrate.getDecimals();\n const assetDecimals =\n substrate.chain.getAssetDecimals(asset) ?? chainDecimals;\n const normDecimals = substrate.chain.usesChainDecimals\n ? chainDecimals\n : assetDecimals;\n const normBalance = big.convertDecimals(amount, normDecimals, assetDecimals);\n return {\n amount: normBalance,\n decimals: assetDecimals,\n };\n}\n", "import { enums } from '@galacticcouncil/common';\n\nexport const getDeliveryFeeFromDryRun = (events: any[]): bigint => {\n const deliveryFees: bigint[] = [];\n\n for (const e of events) {\n const isXcmEvent =\n ['PolkadotXcm'].includes(e.type) && e.value.type === 'FeesPaid';\n\n if (isXcmEvent) {\n const fees = e.value.value.fees;\n for (const fee of fees) {\n if (fee.fun.type === 'Fungible') {\n const plancks = BigInt(fee.fun.value);\n deliveryFees.push(plancks);\n }\n }\n }\n }\n return deliveryFees.reduce((acc, df) => acc + df, 0n);\n};\n\nexport const getErrorFromDryRun = (\n executionResult: any\n): string | undefined => {\n const error = executionResult.value.error;\n\n if (error.type === 'Module') {\n return enums.enumPath(error.value);\n }\n return JSON.stringify(error.value);\n};\n", "import { AnyParachain, AssetAmount } from '@galacticcouncil/xc-core';\nimport { xcm } from '@galacticcouncil/common';\n\nexport function buildBeneficiary(dstAccount: string) {\n const acc = dstAccount.startsWith('0x')\n ? xcm.toAccountKey20(dstAccount)\n : xcm.toAccountId32(dstAccount);\n\n return {\n parents: 0,\n interior: {\n type: 'X1',\n value: acc,\n },\n };\n}\n\nexport function buildXcmDest(dstChain: AnyParachain) {\n return {\n type: 'V4',\n value: {\n parents: 1,\n interior: {\n type: 'X1',\n value: {\n type: 'Parachain',\n value: dstChain.parachainId,\n },\n },\n },\n };\n}\n\nconst toAsset = (assetLocation: object, amount: any) => {\n return {\n id: xcm.transform(assetLocation),\n fun: {\n type: 'Fungible',\n value: amount,\n },\n };\n};\n\nexport const buildXcmMessage = (\n dstAccount: string,\n dstFeeLocation: any,\n dstFee: AssetAmount,\n dstRefTime: bigint,\n dstProofSize: bigint,\n dstCallEncoded: Uint8Array\n) => {\n console.log(dstCallEncoded);\n const beneficiary = buildBeneficiary(dstAccount);\n const feeAsset = toAsset(dstFeeLocation, dstFee.amount);\n\n return {\n type: 'V4',\n value: [\n {\n type: 'WithdrawAsset',\n value: [feeAsset],\n },\n {\n type: 'BuyExecution',\n value: {\n fees: feeAsset,\n weight_limit: {\n type: 'Unlimited',\n },\n },\n },\n {\n type: 'Transact',\n value: {\n origin_kind: {\n type: 'SovereignAccount',\n },\n require_weight_at_most: {\n ref_time: dstRefTime,\n proof_size: dstProofSize,\n },\n call: dstCallEncoded,\n },\n },\n {\n type: 'RefundSurplus',\n value: undefined,\n },\n {\n type: 'DepositAsset',\n value: {\n assets: {\n type: 'Wild',\n value: {\n type: 'AllCounted',\n value: 1,\n },\n },\n beneficiary: beneficiary,\n },\n },\n ],\n };\n};\n", "import {\n AnyParachain,\n Asset,\n AssetAmount,\n CallType,\n ExtrinsicConfig,\n SubstrateQueryConfig,\n} from '@galacticcouncil/xc-core';\n\nimport { Binary } from 'polkadot-api';\n\nimport {\n concatMap,\n catchError,\n distinctUntilChanged,\n firstValueFrom,\n map,\n throwError,\n Observable,\n} from 'rxjs';\n\nimport { SubstrateService } from './SubstrateService';\nimport { getErrorFromDryRun, normalizeAssetAmount } from './utils';\nimport { SubstrateCall, SubstrateDryRunResult } from './types';\n\nimport { Platform } from '../types';\n\ntype WatchValueEmission<T = any> = { value: T };\n\nexport class SubstratePlatform implements Platform<\n ExtrinsicConfig,\n SubstrateQueryConfig\n> {\n readonly #substrate: Promise<SubstrateService>;\n\n constructor(chain: AnyParachain) {\n this.#substrate = SubstrateService.create(chain);\n }\n\n private async useSignerFee(fee: Asset) {\n const substrate = await this.#substrate;\n const asset = await substrate.getAsset();\n return substrate.chain.usesSignerFee && !asset.isEqual(fee);\n }\n\n async buildCall(\n account: string,\n _amount: bigint,\n feeBalance: AssetAmount,\n config: ExtrinsicConfig\n ): Promise<SubstrateCall> {\n const substrate = await this.#substrate;\n const useSignerFee = await this.useSignerFee(feeBalance);\n\n const txOptions = useSignerFee\n ? {\n asset: new Asset(feeBalance),\n }\n : undefined;\n\n const extrinsic = config.getTx(substrate.client);\n const extrinsicCall = config.module + '.' + config.func;\n\n const callData = await extrinsic.getEncodedData();\n\n return {\n from: account,\n data: Binary.toHex(callData),\n type: CallType.Substrate,\n txOptions: txOptions,\n dryRun: substrate.isDryRunSupported()\n ? async () => {\n try {\n const extrinsic = config.getTx(substrate.client);\n const dryRunResult = await substrate.dryRun(account, extrinsic);\n\n const error =\n dryRunResult.execution_result &&\n dryRunResult.execution_result.success\n ? undefined\n : getErrorFromDryRun(dryRunResult.execution_result);\n\n return {\n call: extrinsicCall,\n error: error,\n events: dryRunResult.emitted_events || [],\n xcm: dryRunResult.forwarded_xcms || [],\n } as SubstrateDryRunResult;\n } catch (e) {\n return {\n call: extrinsicCall,\n error: e instanceof Error ? e.message : 'unknown',\n } as SubstrateDryRunResult;\n }\n }\n : () => {},\n } as SubstrateCall;\n }\n\n async estimateFee(\n account: string,\n _amount: bigint,\n feeBalance: AssetAmount,\n config: ExtrinsicConfig\n ): Promise<AssetAmount> {\n const substrate = await this.#substrate;\n const networkFee = await substrate.estimateNetworkFee(account, config);\n const deliveryFee = await substrate.estimateDeliveryFee(account, config);\n const fee = await this.exchangeFee(networkFee + deliveryFee, feeBalance);\n const params = await normalizeAssetAmount(fee, feeBalance, substrate);\n return feeBalance.copyWith(params);\n }\n\n async getBalance(\n asset: Asset,\n config: SubstrateQueryConfig\n ): Promise<AssetAmount> {\n const ob = await this.subscribeBalance(asset, config);\n return firstValueFrom(ob);\n }\n\n async subscribeBalance(\n asset: Asset,\n config: SubstrateQueryConfig\n ): Promise<Observable<AssetAmount>> {\n const substrate = await this.#substrate;\n const { module, func, args, transform } = config;\n\n const fn = substrate.client.getUnsafeApi().query[module][func];\n const observable$ = fn\n .watchValue(...args, { at: 'best' })\n .pipe(map(({ value }: WatchValueEmission) => value));\n\n return observable$.pipe(\n concatMap((b: any) => transform(b)),\n distinctUntilChanged((prev, curr) => prev === curr),\n concatMap(async (balance) => {\n const params = await normalizeAssetAmount(\n balance as bigint,\n asset,\n substrate\n );\n return AssetAmount.fromAsset(asset, params);\n }),\n catchError((err) => {\n console.error('subscribe fails for:', asset);\n return throwError(() => err);\n })\n );\n }\n\n /**\n * Display native fee in user preferred fee payment asset\n *\n * Supported only if on-chain swap enabled (dex support)\n *\n * @param fee - native fee\n * @param feeBalance - user preferred payment asset balance\n * @returns - fee in user preferred payment asset\n */\n private async exchangeFee(\n fee: bigint,\n feeBalance: AssetAmount\n ): Promise<bigint> {\n const substrate = await this.#substrate;\n const asset = await substrate.getAsset();\n const decimals = await substrate.getDecimals();\n\n if (asset.isEqual(feeBalance)) {\n return fee;\n }\n\n try {\n const dex = substrate.chain.dex;\n const amount = AssetAmount.fromAsset(asset, { amount: fee, decimals });\n const quote = await dex.getQuote(feeBalance, asset, amount, true);\n return quote.amount;\n } catch {}\n return fee;\n }\n}\n", "import {\n addr,\n multiloc,\n AnyParachain,\n Asset,\n AssetAmount,\n ChainCurrency,\n Extrinsic,\n ExtrinsicConfig,\n} from '@galacticcouncil/xc-core';\n\nimport { acc, enums } from '@galacticcouncil/common';\nimport { HubApis } from '@galacticcouncil/descriptors';\n\nimport { Blake2256, u32 } from '@polkadot-api/substrate-bindings';\nimport { toHex, fromHex } from '@polkadot-api/utils';\n\nimport { Enum, ResultPayload } from 'polkadot-api';\n\nimport { getDeliveryFeeFromDryRun, getErrorFromDryRun } from './utils';\n\ntype TRawDryRun = HubApis['DryRunApi']['dry_run_call']['Value']['value'];\ntype TDryRun = Extract<TRawDryRun, { execution_result: any }>;\n\nconst { Ss58Addr } = addr;\n\nexport class SubstrateService {\n readonly chain: AnyParachain;\n\n private _currency?: Promise<ChainCurrency>;\n\n constructor(chain: AnyParachain) {\n this.chain = chain;\n }\n\n static async create(chain: AnyParachain): Promise<SubstrateService> {\n return new SubstrateService(chain);\n }\n\n get client() {\n return this.chain.client;\n }\n\n get api() {\n return this.client.getUnsafeApi();\n }\n\n async getCurrency(): Promise<ChainCurrency> {\n if (!this._currency) {\n this._currency = this.chain.getCurrency();\n }\n return this._currency;\n }\n\n async getAsset(): Promise<Asset> {\n const currency = await this.getCurrency();\n return currency.asset;\n }\n\n async getDecimals(): Promise<number> {\n const currency = await this.getCurrency();\n return currency.decimals;\n }\n\n async getExistentialDeposit(): Promise<AssetAmount> {\n let ed: bigint;\n try {\n const result = await this.api.constants.Balances.ExistentialDeposit();\n ed = typeof result === 'bigint' ? result : BigInt(String(result));\n } catch {\n ed = 0n;\n }\n const { asset, decimals } = await this.getCurrency();\n return AssetAmount.fromAsset(asset, {\n amount: ed,\n decimals,\n });\n }\n\n isDryRunSupported(): boolean {\n return this.api.apis?.DryRunApi !== undefined;\n }\n\n async buildMessageId(\n account: string,\n amount: bigint,\n asset: string,\n beneficiary: string\n ): Promise<string> {\n const accountNextId = await this.client._request<number>(\n 'system_accountNextIndex',\n [account]\n );\n const accountNextIdBytes = u32.enc(accountNextId);\n\n const stringToU8a = (str: string) => new TextEncoder().encode(str);\n\n const entropy = new Uint8Array([\n ...stringToU8a(this.chain.parachainId.toString()),\n ...fromHex(account.startsWith('0x') ? account.slice(2) : account),\n ...accountNextIdBytes,\n ...fromHex(asset.startsWith('0x') ? asset.slice(2) : asset),\n ...stringToU8a(beneficiary),\n ...stringToU8a(amount.toString()),\n ]);\n\n const hash = Blake2256(entropy);\n return toHex(hash);\n }\n\n async dryRun(account: string, tx: Extrinsic): Promise<TDryRun> {\n const rawOrigin = Enum('Signed', account);\n const origin = Enum('system', rawOrigin);\n\n const raw = (await this.api.apis.DryRunApi.dry_run_call(\n origin,\n tx.decodedCall,\n 4\n )) as ResultPayload<TRawDryRun, unknown>;\n\n if (!raw.success) {\n throw new Error('DryRun call failed');\n }\n\n const result = raw.value as TRawDryRun;\n if ('type' in result && 'value' in result) {\n throw new Error('DryRun call error: ' + enums.enumPath(result.value));\n }\n\n return result as TDryRun;\n }\n\n async estimateNetworkFee(\n account: string,\n config: ExtrinsicConfig\n ): Promise<bigint> {\n const tx = config.getTx(this.client);\n try {\n const info = await tx.getPaymentInfo(account);\n return BigInt(info.partial_fee);\n } catch (e) {\n /**\n * Tx panic for V3 or higher multi-location versions if used\n * for an extrinsic with empty ammount (of transferred asset).\n */\n console.warn(`Can't estimate network fee.`);\n }\n return 0n;\n }\n\n async estimateDeliveryFee(\n account: string,\n config: ExtrinsicConfig\n ): Promise<bigint> {\n if (this.chain.usesDeliveryFee) {\n const acc = await this.estimateDeliveryFeeWith(account, config);\n\n try {\n const tx = config.getTx(this.client);\n const dryRunResult = await this.dryRun(acc, tx);\n\n if (dryRunResult.execution_result?.success) {\n return getDeliveryFeeFromDryRun(dryRunResult.emitted_events || []);\n } else {\n const error = getErrorFromDryRun(dryRunResult.execution_result);\n console.warn(`Can't estimate delivery fee. Reason:\\n ${error}`);\n }\n } catch (e) {}\n }\n return 0n;\n }\n\n private async estimateDeliveryFeeWith(\n account: string,\n config: ExtrinsicConfig\n ): Promise<string> {\n if (['PolkadotXcm'].includes(config.module)) {\n const extrinsic = config.getTx(this.client).decodedCall;\n const args = extrinsic.value.value;\n const dest = 'dest' in args ? args.dest : undefined;\n if (!dest) return account;\n\n const interior = multiloc.findNestedKey(dest, 'interior');\n const parachain = multiloc.findParachain(dest);\n const consensus = multiloc.findGlobalConsensus(dest);\n\n // Cross consensus (use user account)\n if (consensus) {\n return account;\n }\n\n // Downward (use chain sovereign account)\n if (parachain) {\n const saPub = acc.getSovereignAccounts(parachain);\n return this.chain.parachainId === 0\n ? Ss58Addr.encodePubKey(saPub.relay)\n : Ss58Addr.encodePubKey(saPub.generic);\n }\n\n // Upward (use chain treasury account if any)\n const interiorValue = interior && interior['interior'];\n if (interiorValue === 'Here' || interiorValue?.type === 'Here') {\n return this.chain.treasury || account;\n }\n }\n return account;\n }\n}\n", "import { multiloc, AnyParachain, Asset } from '@galacticcouncil/xc-core';\n\nimport { Binary, Enum, PolkadotSigner, TxEvent } from 'polkadot-api';\n\nimport { SubstrateCall, SubstrateTxObserver } from './types';\n\nexport class SubstrateSigner {\n readonly #chain: AnyParachain;\n readonly #signer: PolkadotSigner;\n\n constructor(chain: AnyParachain, signer: PolkadotSigner) {\n this.#chain = chain;\n this.#signer = signer;\n }\n\n signAndSend(call: SubstrateCall, observer: SubstrateTxObserver) {\n const client = this.#chain.client;\n const api = client.getUnsafeApi();\n\n const callData = Binary.fromHex(call.data);\n\n let opts: Record<string, unknown> = {};\n if (call.txOptions?.asset) {\n const feeAsset = this.getFeeAsset(call.txOptions.asset);\n opts = { asset: feeAsset };\n }\n\n api.txFromCallData(callData).then((tx) => {\n tx.signSubmitAndWatch(this.#signer, opts).subscribe({\n next: (event: TxEvent) => {\n if (event.type === 'broadcasted') {\n observer.onTransactionSend(event.txHash);\n }\n if (event.type === 'finalized') {\n observer.onFinalized(event);\n }\n },\n error: (err: unknown) => {\n observer.onError(err);\n },\n });\n });\n }\n\n private getFeeAsset(asset: Asset) {\n const location = this.#chain.getAssetXcmLocation(asset);\n if (location) {\n const pallet = multiloc.findPalletInstance(location);\n const index = multiloc.findGeneralIndex(location);\n return {\n parents: 0,\n interior: Enum('X2', [\n Enum('PalletInstance', Number(pallet)),\n Enum('GeneralIndex', BigInt(index)),\n ]),\n };\n }\n throw new Error('Asset location not found');\n }\n}\n", "import { CallType, SuiChain, Wormhole as Wh } from '@galacticcouncil/xc-core';\n\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui/utils';\nimport { toBase64 } from '@mysten/bcs';\nimport {\n encoding,\n serialize,\n toChainId,\n} from '@wormhole-foundation/sdk-connect';\nimport { deserialize } from '@wormhole-foundation/sdk-definitions';\nimport { getPackageId } from '@wormhole-foundation/sdk-sui';\nimport { getTokenCoinType } from '@wormhole-foundation/sdk-sui-tokenbridge';\n\nimport { SuiCall } from './types';\nimport { resolveCommandsTyped } from './utils';\n\nexport class SuiClaim {\n readonly #chain: SuiChain;\n\n constructor(chain: SuiChain) {\n this.#chain = chain;\n }\n\n async redeem(from: string, vaaRaw: string): Promise<SuiCall> {\n const ctxWh = Wh.fromChain(this.#chain);\n const client = this.#chain.client;\n\n const vaaBytes = encoding.b64.decode(vaaRaw);\n const vaa = deserialize('TokenBridge:Transfer', vaaBytes);\n\n const coreBridgeObjectId = ctxWh.getCoreBridge();\n const tokenBridgeObjectId = ctxWh.getTokenBridge();\n\n const coinType = await getTokenCoinType(\n client,\n tokenBridgeObjectId,\n vaa.payload.token.address.toUint8Array(),\n toChainId(vaa.payload.token.chain)\n );\n\n if (!coinType) {\n throw new Error('Unable to fetch token coinType');\n }\n\n const [coreBridgePackageId, tokenBridgePackageId] = await Promise.all([\n getPackageId(client, coreBridgeObjectId),\n getPackageId(client, tokenBridgeObjectId),\n ]);\n\n const tx = new Transaction();\n tx.setSender(from);\n\n const [verifiedVAA] = tx.moveCall({\n target: `${coreBridgePackageId}::vaa::parse_and_verify`,\n arguments: [\n tx.object(coreBridgeObjectId),\n tx.pure.vector('u8', serialize(vaa)),\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n\n const [tokenBridgeMessage] = tx.moveCall({\n target: `${tokenBridgePackageId}::vaa::verify_only_once`,\n arguments: [tx.object(tokenBridgeObjectId), verifiedVAA!],\n });\n\n const [relayerReceipt] = tx.moveCall({\n target: `${tokenBridgePackageId}::complete_transfer::authorize_transfer`,\n arguments: [tx.object(tokenBridgeObjectId), tokenBridgeMessage!],\n typeArguments: [coinType],\n });\n\n const [coins] = tx.moveCall({\n target: `${tokenBridgePackageId}::complete_transfer::redeem_relayer_payout`,\n arguments: [relayerReceipt!],\n typeArguments: [coinType],\n });\n\n tx.moveCall({\n target: `${tokenBridgePackageId}::coin_utils::return_nonzero`,\n arguments: [coins!],\n typeArguments: [coinType],\n });\n\n const txBytes = await tx.build({ client });\n const txJson = await tx.toJSON();\n const commands = resolveCommandsTyped(JSON.parse(txJson));\n\n return {\n from: from,\n commands: commands,\n data: toBase64(txBytes),\n type: CallType.Sui,\n } as SuiCall;\n }\n}\n", "import { fromBase64 } from '@mysten/bcs';\n\ntype NumberMode = 'string' | 'number' | 'bigint';\ntype Options = {\n numbers?: NumberMode;\n decode32As?: 'address' | 'vector<u8>';\n};\n\nexport function resolveCommandsTyped(\n root: { inputs: any[]; commands: any[] },\n opts: Options = {}\n) {\n const inputs = root.inputs ?? [];\n const cmds = root.commands ?? [];\n const numbers: NumberMode = opts.numbers ?? 'string';\n const decode32As = opts.decode32As ?? 'address';\n\n const emitNum = (v: bigint) =>\n numbers === 'bigint'\n ? (v as any)\n : numbers === 'number'\n ? Number(v)\n : v.toString();\n\n const pureToTyped = (b64: string) => {\n const b = fromBase64(b64);\n const le = (n: number) => {\n let v = 0n;\n for (let i = 0; i < n; i++) v |= BigInt(b[i]) << (8n * BigInt(i));\n return v;\n };\n\n if (b.length === 1)\n return { type: 'pure', valueType: 'u8', value: Number(b[0]) };\n if (b.length === 2)\n return { type: 'pure', valueType: 'u16', value: emitNum(le(2)) };\n if (b.length === 4)\n return { type: 'pure', valueType: 'u32', value: Number(le(4)) };\n if (b.length === 8)\n return { type: 'pure', valueType: 'u64', value: emitNum(le(8)) };\n\n if (b.length === 32 && decode32As === 'address') {\n const hex =\n '0x' + [...b].map((x) => x.toString(16).padStart(2, '0')).join('');\n return { type: 'pure', valueType: 'address', value: hex };\n }\n return { type: 'pure', valueType: 'vector<u8>', value: Array.from(b) };\n };\n\n const inputToTyped = (idx: number): any => {\n const i = inputs[idx];\n if (!i) return { Input: idx };\n\n if (i.Pure?.bytes) return pureToTyped(i.Pure.bytes);\n\n const so = i.Object?.SharedObject;\n if (so) {\n return {\n type: 'object',\n objectType: 'sharedObject',\n objectId: so.objectId,\n initialSharedVersion: String(so.initialSharedVersion),\n mutable: !!so.mutable,\n };\n }\n\n const oo = i.Object?.ImmOrOwnedObject;\n if (oo) {\n return {\n type: 'object',\n objectType: 'immOrOwnedObject',\n objectId: oo.objectId,\n version: String(oo.version),\n digest: oo.digest ?? undefined,\n };\n }\n\n return { Input: idx };\n };\n\n const mapArg = (arg: any): any => {\n if (arg?.GasCoin) return 'GasCoin';\n if (Array.isArray(arg?.NestedResult)) return arg;\n if (typeof arg?.Input === 'number') return inputToTyped(arg.Input);\n return arg;\n };\n\n return cmds.map((c: any) => {\n if (c.MoveCall) {\n const m = c.MoveCall;\n return {\n MoveCall: {\n ...m,\n arguments: (m.arguments ?? []).map(mapArg),\n },\n };\n }\n\n if (c.SplitCoins) {\n const s = c.SplitCoins;\n const coinOut = s.coin?.GasCoin ? 'GasCoin' : mapArg(s.coin);\n const amtOut = (s.amounts ?? []).map(mapArg);\n return { SplitCoins: [coinOut, amtOut] };\n }\n\n if (c.MergeCoins) {\n const m = c.MergeCoins;\n return {\n MergeCoins: {\n ...m,\n destination: mapArg(m.destination),\n sources: (m.sources ?? []).map(mapArg),\n },\n };\n }\n\n if (c.TransferObjects) {\n const t = c.TransferObjects;\n return {\n TransferObjects: {\n ...t,\n objects: (t.objects ?? []).map(mapArg),\n address: mapArg(t.address),\n },\n };\n }\n return c;\n });\n}\n", "import {\n Asset,\n AssetAmount,\n CallType,\n MoveConfig,\n SuiChain,\n SuiQueryConfig,\n} from '@galacticcouncil/xc-core';\n\nimport { SuiClient } from '@mysten/sui/client';\nimport { toBase64 } from '@mysten/bcs';\n\nimport {\n distinctUntilChanged,\n finalize,\n shareReplay,\n Observable,\n Subject,\n} from 'rxjs';\n\nimport { SuiBalanceFactory } from './balance';\nimport { SuiCall } from './types';\nimport { resolveCommandsTyped } from './utils';\n\nimport { DryRunResult, Platform } from '../types';\n\nexport class SuiPlatform implements Platform<MoveConfig, SuiQueryConfig> {\n readonly #client: SuiClient;\n\n constructor(chain: SuiChain) {\n this.#client = chain.client;\n }\n\n async buildCall(\n account: string,\n _amount: bigint,\n _feeBalance: AssetAmount,\n config: MoveConfig\n ): Promise<SuiCall> {\n const { transaction } = config;\n\n transaction.setSender(account);\n\n const txBytes = await transaction.build({ client: this.#client });\n const txJson = await transaction.toJSON();\n\n const commands = resolveCommandsTyped(JSON.parse(txJson));\n return {\n from: account,\n commands: commands,\n data: toBase64(txBytes),\n type: CallType.Sui,\n dryRun: async () => {\n const sim = await this.#client.dryRunTransactionBlock({\n transactionBlock: txBytes,\n });\n\n return {\n call: config.module + '.' + config.func,\n error: sim.executionErrorSource,\n } as DryRunResult;\n },\n } as SuiCall;\n }\n\n async estimateFee(\n account: string,\n _amount: bigint,\n feeBalance: AssetAmount,\n config: MoveConfig\n ): Promise<AssetAmount> {\n const { transaction } = config;\n\n transaction.setSender(account);\n const txBytes = await transaction.build({ client: this.#client });\n const sim = await this.#client.dryRunTransactionBlock({\n transactionBlock: txBytes,\n });\n\n const gasUsed = sim.effects.gasUsed;\n\n const computation = BigInt(gasUsed.computationCost);\n const storage = BigInt(gasUsed.storageCost);\n const mist = computation + storage;\n\n return feeBalance.copyWith({ amount: mist });\n }\n\n async getBalance(asset: Asset, config: SuiQueryConfig): Promise<AssetAmount> {\n const query = SuiBalanceFactory.get(this.#client, config);\n const [balance, decimals] = await Promise.all([\n query.getBalance(),\n query.getDecimals(),\n ]);\n return AssetAmount.fromAsset(asset, {\n amount: balance,\n decimals: decimals,\n });\n }\n\n async subscribeBalance(\n asset: Asset,\n config: SuiQueryConfig\n ): Promise<Observable<AssetAmount>> {\n const subject = new Subject<AssetAmount>();\n const observable = subject.pipe(shareReplay(1));\n\n const run = async () => {\n const updateBalance = async () => {\n const balance = await this.getBalance(asset, config);\n subject.next(balance);\n };\n await updateBalance();\n const intervalId = setInterval(() => {}, 3000);\n return () => clearInterval(intervalId);\n };\n\n let disconnect: () => void;\n run().then((unsub) => (disconnect = unsub));\n\n return observable.pipe(\n finalize(() => disconnect?.()),\n distinctUntilChanged((prev, curr) => prev.amount === curr.amount)\n ) as Observable<AssetAmount>;\n }\n}\n", "import { SuiQueryConfig } from '@galacticcouncil/xc-core';\n\nimport { SuiClient } from '@mysten/sui/client';\n\nexport abstract class SuiBalance {\n readonly client: SuiClient;\n readonly config: SuiQueryConfig;\n\n constructor(client: SuiClient, config: SuiQueryConfig) {\n this.validateClient(client);\n this.validateConfig(config);\n this.client = client;\n this.config = config;\n }\n\n private validateClient(client: SuiClient) {\n if (!client) {\n throw new Error(`No client found`);\n }\n }\n\n private validateConfig(config: SuiQueryConfig) {\n if (!config.address) {\n throw new Error('Sui address is required');\n }\n }\n\n abstract getBalance(): Promise<bigint>;\n abstract getDecimals(): Promise<number>;\n}\n", "import { SUI_TYPE_ARG } from '@mysten/sui/utils';\n\nimport { SuiBalance } from './SuiBalance';\n\nconst NATIVE_DECIMALS = 9;\n\nexport class Native extends SuiBalance {\n async getBalance(): Promise<bigint> {\n const { address } = this.config;\n const balance = await this.client.getBalance({\n owner: address,\n coinType: SUI_TYPE_ARG,\n });\n return BigInt(balance.totalBalance);\n }\n\n async getDecimals(): Promise<number> {\n return NATIVE_DECIMALS;\n }\n}\n", "import { SuiQueryConfig } from '@galacticcouncil/xc-core';\n\nimport { SuiClient } from '@mysten/sui/client';\n\nimport { Native } from './Native';\nimport { SuiBalance } from './SuiBalance';\n\nexport class SuiBalanceFactory {\n static get(client: SuiClient, config: SuiQueryConfig): SuiBalance {\n switch (config.module) {\n case 'Native':\n return new Native(client, config);\n default: {\n throw new Error('Module ' + config.module + ' is not supported');\n }\n }\n }\n}\n", "import { SuiChain } from '@galacticcouncil/xc-core';\n\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { SuiCall, SuiWallet, SuiTxObserver } from './types';\n\nimport { Call } from '../types';\n\nexport class SuiSigner {\n readonly #chain: SuiChain;\n readonly #wallet: SuiWallet | Ed25519Keypair;\n\n constructor(chain: SuiChain, wallet: SuiWallet | Ed25519Keypair) {\n this.#chain = chain;\n this.#wallet = wallet;\n }\n\n async signAndSend(call: Call, observer: SuiTxObserver) {\n const { from, data } = call as SuiCall;\n const client = this.#chain.client;\n\n try {\n if (this.#wallet instanceof Ed25519Keypair) {\n const transaction = Transaction.from(data);\n const result = await client.signAndExecuteTransaction({\n signer: this.#wallet,\n transaction,\n options: {\n showEffects: true,\n showEvents: true,\n showObjectChanges: true,\n showBalanceChanges: true,\n },\n });\n observer.onTransactionSend(result.digest);\n return;\n }\n\n const signed = await this.#wallet.signTransaction({\n transaction: data,\n address: from,\n networkID: 'sui:mainnet',\n });\n\n const exec = await client.executeTransactionBlock({\n transactionBlock: signed.transaction,\n signature: signed.signature,\n options: {\n showEffects: true,\n showEvents: true,\n showObjectChanges: true,\n showBalanceChanges: true,\n },\n });\n observer.onTransactionSend(exec.digest);\n } catch (err) {\n observer.onError(err);\n }\n }\n}\n", "import {\n addr,\n Asset,\n AssetAmount,\n FeeAmountConfigBuilder,\n FeeAssetConfigBuilder,\n Parachain,\n TransferCtx,\n TransferConfig,\n TransactCtx,\n TransactConfig,\n} from '@galacticcouncil/xc-core';\nimport { acc, big } from '@galacticcouncil/common';\n\nimport { formatAmount, formatEvmAddress } from './utils';\nimport { Call, PlatformAdapter, SubstrateService } from '../platforms';\n\nimport { DataProcessor } from './DataProcessor';\n\nconst { EvmAddr } = addr;\n\nexport class DataOriginProcessor extends DataProcessor {\n constructor(adapter: PlatformAdapter, config: TransferConfig) {\n super(adapter, config);\n }\n\n async getCall(ctx: TransferCtx): Promise<Call> {\n const { amount, sender, source } = ctx;\n const transfer = await this.getTransfer(ctx);\n return this.adapter.buildCall(sender, amount, source.feeBalance, transfer);\n }\n\n async getDestinationFee(transferAmount?: bigint): Promise<{\n fee: AssetAmount;\n feeBreakdown: { [key: string]: bigint };\n }> {\n const { chain, route } = this.config;\n const { source, destination, transact } = route;\n\n const feeAmount = destination.fee.amount;\n const feeAsset = source.destinationFee.asset || destination.fee.asset;\n const feeDecimals = await this.getDecimals(feeAsset);\n\n if (Number.isFinite(feeAmount)) {\n const destinationFee = AssetAmount.fromAsset(feeAsset, {\n amount: big.toBigInt(feeAmount as number, feeDecimals),\n decimals: feeDecimals,\n });\n return {\n fee: destinationFee,\n feeBreakdown: {},\n };\n }\n\n const feeConfigBuilder = feeAmount as FeeAmountConfigBuilder;\n const { amount, breakdown } = await feeConfigBuilder.build({\n feeAsset: feeAsset,\n transferAsset: source.asset,\n source: transact ? transact.chain : chain,\n destination: destination.chain,\n amount: transferAmount,\n });\n\n const fee = AssetAmount.fromAsset(feeAsset, {\n amount: amount,\n decimals: feeDecimals,\n });\n\n return {\n fee: fee,\n feeBreakdown: breakdown,\n };\n }\n\n async getDestinationFeeBalance(address: string): Promise<AssetAmount> {\n const { chain, route } = this.config;\n const { source, destination } = route;\n\n const asset = source.asset;\n const feeAsset = source.destinationFee.asset || destination.fee.asset;\n\n if (asset.isEqual(feeAsset)) {\n return this.getBalance(address);\n }\n\n const feeAssetId = chain.getBalanceAssetId(feeAsset);\n const account = EvmAddr.isValid(feeAssetId.toString())\n ? await formatEvmAddress(address, chain)\n : address;\n const feeBalanceConfig = source.destinationFee.balance.build({\n address: account,\n asset: feeAsset,\n chain: chain,\n });\n return this.adapter.getBalance(feeAsset, feeBalanceConfig);\n }\n\n async getFee(ctx: TransferCtx): Promise<AssetAmount> {\n const { chain, route } = this.config;\n const { amount, sender, source } = ctx;\n\n const transfer = await this.getTransfer(ctx);\n const address = route.contract\n ? await formatEvmAddress(sender, chain)\n : sender;\n\n const networkFee = await this.adapter.estimateFee(\n address,\n amount,\n source.feeBalance,\n transfer\n );\n\n const { fee } = route.source;\n const extraFee = fee ? formatAmount(networkFee.decimals, fee.extra) : 0n;\n const totalFee = networkFee.amount + extraFee;\n return networkFee.copyWith({ amount: totalFee });\n }\n\n async getFeeBalance(address: string): Promise<AssetAmount> {\n const { chain, route } = this.config;\n const { source } = route;\n\n if (!source.fee) {\n return this.getBalance(address);\n }\n\n const feeAsset = await this.getFeeAsset(address);\n const feeAssetId = chain.getBalanceAssetId(feeAsset);\n const account = EvmAddr.isValid(feeAssetId.toString())\n ? await formatEvmAddress(address, chain)\n : address;\n const feeBalanceConfig = source.fee.balance.build({\n address: account,\n asset: feeAsset,\n chain: chain,\n });\n\n return this.adapter.getBalance(feeAsset, feeBalanceConfig);\n }\n\n async getFeeAsset(address: string): Promise<Asset> {\n const { chain, route } = this.config;\n const { source } = route;\n\n const fee = source.fee;\n const asset = source.asset;\n\n if (!fee) {\n return asset;\n }\n\n const feeAssetConfig = fee.asset;\n if (chain instanceof Parachain && 'build' in feeAssetConfig) {\n const feeAssetBuilder = feeAssetConfig as FeeAssetConfigBuilder;\n return await feeAssetBuilder.build({\n chain,\n address,\n });\n }\n return feeAssetConfig as Asset;\n }\n\n private async getTransfer(ctx: TransferCtx) {\n const { chain, route } = this.config;\n const { contract, extrinsic, program, move } = route;\n\n if (extrinsic) {\n const { address, amount, asset, sender } = ctx;\n const substrate = await SubstrateService.create(chain as Parachain);\n const messageId = await substrate.buildMessageId(\n sender,\n amount,\n asset.originSymbol,\n address\n );\n return extrinsic.build({\n ...ctx,\n messageId: messageId,\n });\n }\n\n const callable = contract || program || move;\n if (callable) {\n return callable.build({\n ...ctx,\n });\n }\n\n throw new Error(\n 'AssetRoute transfer config is invalid! Specify contract, extrinsic, move or program instructions.'\n );\n }\n\n async getTransact(ctx: TransferCtx): Promise<TransactCtx | undefined> {\n const { route } = this.config;\n const { transact } = route;\n\n if (transact) {\n // Augment transfer context with transact chain info\n const ctxTransactBase = Object.assign({\n transact: {\n chain: transact.chain,\n },\n });\n\n const context = {\n ...ctx,\n ...ctxTransactBase,\n };\n\n const data = await this.getTransactData(transact, context);\n return {\n ...data,\n chain: transact.chain,\n } as TransactCtx;\n }\n return undefined;\n }\n\n /**\n * Transact remote execution context\n *\n * @param cfg - transact config\n * @param ctx - augmented transfer context\n * @returns transact remote call context\n */\n private async getTransactData(\n cfg: TransactConfig,\n ctx: TransferCtx\n ): Promise<TransactCtx> {\n const { chain, extrinsic } = cfg;\n const config = await extrinsic.build(ctx);\n const substrate = await SubstrateService.create(chain);\n const submittable = config.getTx(substrate.client);\n\n const fromChain = ctx.source.chain as Parachain;\n const fromAddr = ctx.sender;\n\n const mda = acc.getMultilocationDerivatedAccount(\n fromChain.parachainId,\n fromAddr,\n chain.parachainId === 0 ? 0 : 1,\n chain.usesH160Acc\n );\n\n const paymentInfo = await submittable.getPaymentInfo(mda);\n const encodedTx = await submittable.getEncodedData();\n\n const [transactFee, transactFeeBalance] = await Promise.all([\n this.getTransactFee(cfg),\n this.getTransactFeeBalance(cfg, ctx),\n ]);\n\n return {\n call: encodedTx,\n chain: chain,\n fee: transactFee,\n feeBalance: transactFeeBalance,\n weight: {\n refTime: paymentInfo.weight.ref_time,\n proofSize: paymentInfo.weight.proof_size,\n },\n } as TransactCtx;\n }\n\n /**\n * Transact fee on source chain\n *\n * @param cfg - transact config\n * @returns transact source chain fee\n */\n private async getTransactFee(cfg: TransactConfig): Promise<AssetAmount> {\n const { fee } = cfg;\n const decimals = await this.getDecimals(fee.asset);\n const amount = big.toBigInt(fee.amount, decimals);\n return AssetAmount.fromAsset(fee.asset, {\n amount: amount,\n decimals,\n });\n }\n\n /**\n * Transact fee balance on source chain\n *\n * @param cfg - transact config\n * @param ctx - augmented transfer context\n * @returns transact source chain fee balance\n */\n private async getTransactFeeBalance(\n cfg: TransactConfig,\n ctx: TransferCtx\n ): Promise<AssetAmount> {\n const { chain } = this.config;\n const { fee } = cfg;\n const feeBalanceConfig = fee.balance.build({\n address: ctx.sender,\n asset: fee.asset,\n chain: chain,\n });\n return this.adapter.getBalance(fee.asset, feeBalanceConfig);\n }\n}\n", "import { AnyChain, AssetAmount, EvmParachain } from '@galacticcouncil/xc-core';\nimport { big } from '@galacticcouncil/common';\n\nimport Big from 'big.js';\n\n/**\n * Calculate maximum allowed amount of asset to send from source to\n * destination chain.\n *\n * @param balance - source chain asset balance\n * @param fee - source chain transfer fee\n * @param min - source chain minimum\n * @param ed - source chain existential deposit (opt)\n * @returns - maximum allowed amount of tokens to send or zero in\n * case of not enough funds\n */\nexport function calculateMax(\n balance: AssetAmount,\n fee: AssetAmount,\n min: AssetAmount,\n ed?: AssetAmount\n): AssetAmount {\n let result = balance\n .toBig()\n .minus(min.toBig())\n .minus(balance.isSame(fee) ? fee.toBig() : new Big(0));\n\n if (ed) {\n result = result.minus(balance.isSame(ed) ? ed.toBig() : new Big(0));\n }\n\n return balance.copyWith({\n amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n });\n}\n\n/**\n * Calculate minimum required amount of asset to send from source to\n * destination chain.\n *\n * @param balance - destination chain asset balance\n * @param fee - destination chain transfer fee\n * @param min - destination chain minimum\n * @param ed - destination chain existential deposit (opt)\n * @returns - minimum required amount of tokens to send or zero in\n * case of no available funds\n */\nexport function calculateMin(\n balance: AssetAmount,\n fee: AssetAmount,\n min: AssetAmount,\n ed?: AssetAmount\n): AssetAmount {\n const zero = balance.copyWith({\n amount: 0n,\n });\n\n let result = zero\n .toBig()\n .plus(balance.isSame(fee) ? fee.toBig() : new Big(0))\n .plus(balance.toBig().lt(min.toBig()) ? min.toBig() : new Big(0));\n\n if (ed) {\n result = result.plus(\n balance.isSame(ed) && balance.toBig().lt(ed.toBig())\n ? ed.toBig()\n : new Big(0)\n );\n }\n\n return balance.copyWith({\n amount: BigInt(result.toFixed()),\n });\n}\n\n/**\n * Return h160 derivated address in case of Evm parachain\n *\n * @param address - h160 or ss58 address format\n * @param chain - transfer chain ctx\n * @returns - derivated address if evm resolver defined, fallback to default\n */\nexport async function formatEvmAddress(\n address: string,\n chain: AnyChain\n): Promise<string> {\n if (chain.isEvmParachain()) {\n const evmParachain = chain as EvmParachain;\n return evmParachain.getDerivatedAddress(address);\n }\n return address;\n}\n\n/**\n * Format amount if defined\n *\n * @param decimals - fee asset decimals\n * @param amount - fee amount\n * @returns formatted amount or 0\n */\nexport function formatAmount(decimals: number, amount?: number): bigint {\n return amount ? big.toBigInt(amount, decimals) : 0n;\n}\n", "import {\n addr,\n Asset,\n AssetAmount,\n Parachain,\n TransferConfig,\n} from '@galacticcouncil/xc-core';\nimport { big } from '@galacticcouncil/common';\n\nimport { formatEvmAddress } from './utils';\nimport { PlatformAdapter, SubstrateService } from '../platforms';\n\nconst { EvmAddr } = addr;\n\nexport abstract class DataProcessor {\n readonly adapter: PlatformAdapter;\n readonly config: TransferConfig;\n\n constructor(adapter: PlatformAdapter, config: TransferConfig) {\n this.adapter = adapter;\n this.config = config;\n }\n\n async getEd(): Promise<AssetAmount | undefined> {\n const { chain } = this.config;\n\n if (chain instanceof Parachain) {\n const substrate = await SubstrateService.create(chain);\n return substrate.getExistentialDeposit();\n }\n return undefined;\n }\n\n async getBalance(address: string): Promise<AssetAmount> {\n const { chain, route } = this.config;\n const { source } = route;\n\n const asset = source.asset;\n\n const assetId = chain.getBalanceAssetId(asset);\n const account = EvmAddr.isValid(assetId.toString())\n ? await formatEvmAddress(address, chain)\n : address;\n const balanceConfig = route.source.balance.build({\n address: account,\n asset: asset,\n chain: chain,\n });\n\n return this.adapter.getBalance(asset, balanceConfig);\n }\n\n async getMin(): Promise<AssetAmount> {\n const { chain, route } = this.config;\n const { source } = route;\n\n const asset = source.asset;\n const min = source.min;\n\n if (chain instanceof Parachain && min) {\n const minAssetId = chain.getMinAssetId(asset);\n const minBalanceConfig = min.build({\n asset: minAssetId,\n });\n return this.adapter.getBalance(asset, minBalanceConfig);\n }\n\n return this.getAssetMin();\n }\n\n private async getAssetMin(): Promise<AssetAmount> {\n const { chain, route } = this.config;\n const { source } = route;\n\n const asset = source.asset;\n const min = chain.getAssetMin(asset);\n const decimals = await this.getDecimals(asset);\n\n let balance: bigint = 0n;\n if (min) {\n balance = big.toBigInt(min, decimals);\n }\n\n return AssetAmount.fromAsset(asset, {\n amount: balance,\n decimals: decimals,\n });\n }\n\n protected async getDecimals(asset: Asset): Promise<number> {\n const { chain } = this.config;\n\n const decimals = chain.getAssetDecimals(asset);\n if (decimals) {\n return decimals;\n }\n\n const chainCurrency = await chain.getCurrency();\n return chainCurrency.decimals;\n }\n}\n", "import { TransferConfig } from '@galacticcouncil/xc-core';\n\nimport { PlatformAdapter } from '../platforms';\n\nimport { DataProcessor } from './DataProcessor';\n\nexport class DataReverseProcessor extends DataProcessor {\n constructor(adapter: PlatformAdapter, config: TransferConfig) {\n super(adapter, config);\n }\n}\n", "import {\n AssetAmount,\n FeeConfig,\n SwapCtx,\n TransferCtx,\n} from '@galacticcouncil/xc-core';\n\nexport class FeeSwap {\n readonly ctx: TransferCtx;\n\n constructor(ctx: TransferCtx) {\n this.ctx = ctx;\n }\n\n get asset() {\n const { source } = this.ctx;\n return source.balance;\n }\n\n get dex() {\n const { source } = this.ctx;\n return source.chain.dex;\n }\n\n get destFee() {\n const { source, transact } = this.ctx;\n return transact ? transact.fee : source.destinationFee;\n }\n\n get destFeeBalance() {\n const { source, transact } = this.ctx;\n return transact ? transact.feeBalance : source.destinationFeeBalance;\n }\n\n get feeBalance() {\n const { source } = this.ctx;\n return source.feeBalance;\n }\n\n /**\n * Fee swap context\n *\n * @param fee - source chain fee\n * @returns source fee swap context\n */\n async getSwap(fee: AssetAmount): Promise<SwapCtx | undefined> {\n const { asset, decimals } = await this.dex!.chain.getCurrency();\n const { amount } = await this.dex!.getQuote(asset, fee, fee);\n\n return {\n aIn: fee,\n aOut: AssetAmount.fromAsset(asset, {\n amount: amount,\n decimals: decimals,\n }),\n enabled: true,\n } as SwapCtx;\n }\n\n /**\n * Swap source fee only if explicitly enabled in route\n * fee config\n *\n * @param fee - source chain fee config\n * @returns true if supported, otherwise false\n */\n isSwapSupported(cfg?: FeeConfig) {\n try {\n this.dex;\n } catch {\n return false;\n }\n\n const isSwapEnabled = cfg && cfg.swap;\n return !!isSwapEnabled;\n }\n\n /**\n * Destination fee swap context\n *\n * Swap is enabled if following applies:\n * - account has not enough destination fee balance\n * - account has enough source fee reserves (double the fee) to buy required asset\n *\n * Note: Slippage can be set up to 100% in builder config (see maxAmountIn)\n *\n * @param fee - source chain fee\n * @returns destination fee swap context\n */\n async getDestinationSwap(fee: AssetAmount): Promise<SwapCtx | undefined> {\n const { amount, route } = await this.dex!.getQuote(\n fee,\n this.destFee,\n this.destFee\n );\n\n const hasNotEnoughDestFee =\n this.destFeeBalance.amount < this.destFee.amount;\n const hasEnoughReservesToSwap =\n this.feeBalance.amount - fee.amount > amount * 2n;\n\n return {\n aIn: fee.copyWith({ amount: amount }),\n aOut: this.destFee,\n enabled: hasNotEnoughDestFee && hasEnoughReservesToSwap,\n route: route,\n } as SwapCtx;\n }\n\n /**\n * Swap destination fee only if:\n * - transfer asset insufficient\n * - destination fee asset is different than fee asset\n *\n * @param fee - source chain fee\n * @returns true if supported, otherwise false\n */\n isDestinationSwapSupported(fee: AssetAmount): boolean {\n try {\n this.dex;\n } catch {\n return false;\n }\n\n const isSwappable = !fee.isSame(this.destFee);\n const isSufficientAssetTransfer = this.asset.isSame(this.destFee);\n return isSwappable && !isSufficientAssetTransfer;\n }\n}\n", "import {\n AnyChain,\n Asset,\n ConfigBuilder,\n TransferConfigs,\n} from '@galacticcouncil/xc-core';\n\nimport { Wallet } from './Wallet';\nimport { Transfer } from './types';\n\nexport function TransferBuilder(wallet: Wallet) {\n const assets = ConfigBuilder(wallet.config).assets();\n return {\n assets,\n withAsset(asset: string | Asset) {\n const sources = assets.asset(asset);\n return {\n sources,\n withSource(srcChain: string | AnyChain) {\n const destinations = sources.source(srcChain);\n return {\n destinations,\n withDestination(dstChain: string | AnyChain) {\n const {\n routes,\n destinationAssets,\n isAssetSelect,\n isTagSelect,\n build,\n } = destinations.destination(dstChain);\n\n return {\n routes,\n destinationAssets,\n isAssetSelect,\n isTagSelect,\n build({\n srcAddress,\n dstAddress,\n dstAsset,\n tag,\n }: {\n srcAddress: string;\n dstAddress: string;\n dstAsset?: string | Asset;\n tag?: string;\n }): Promise<Transfer> {\n const configs = build(dstAsset, tag);\n return wallet.getTransferData(\n configs,\n srcAddress,\n dstAddress\n );\n },\n };\n },\n };\n },\n };\n },\n };\n}\n", "import { Precompile } from '@galacticcouncil/xc-core';\n\nconst DEFAULT_URL = 'https://api.wormholescan.io';\n\nexport interface Vaa {\n sequence: number;\n id: string;\n version: number;\n emitterChain: number;\n emitterAddr: string;\n emitterNativeAddr: string;\n guardianSetIndex: number;\n vaa: string;\n timestamp: string;\n updatedAt: string;\n indexedAt: string;\n txHash: string;\n}\n\nexport interface VaaBytes {\n vaaBytes: string;\n}\n\nexport interface Operation {\n id: string;\n content: {\n payload: OperationPayload;\n standarizedProperties: OperationProperties;\n };\n data: {\n symbol: string;\n tokenAmount: string;\n };\n emitterChain: number;\n emitterAddress: {\n hex: string;\n native: string;\n };\n sequence: string;\n sourceChain: {\n chainId: number;\n from: string;\n status: string;\n timestamp: string;\n transaction: {\n txHash: string;\n };\n };\n targetChain?: {\n status: string;\n };\n vaa?: {\n guardianSetIndex: number;\n isDuplicated: boolean;\n raw: string;\n };\n}\n\nexport interface OperationParsedPayload {\n targetRecipient: string;\n targetRelayerFee: bigint;\n toNativeTokenAmount: bigint;\n}\n\nexport interface OperationPayload {\n amount: string;\n fee: string;\n fromAddress: string;\n parsedPayload: OperationParsedPayload;\n payload: string;\n payloadType: number;\n toAddress: string;\n toChain: number;\n tokenAddress: string;\n tokenChain: number;\n}\n\nexport interface OperationProperties {\n fromChain: number;\n fromAddress: string;\n toChain: number;\n toAddress: string;\n tokenChain: number;\n tokenAddress: string;\n}\n\nexport class WormholeScan {\n private _baseUrl: string;\n\n public constructor(baseUrl?: string) {\n this._baseUrl = baseUrl || DEFAULT_URL;\n }\n\n private buildApi(api: string, params: Record<string, string>): string {\n return (\n [this._baseUrl, api, '?'].join('') +\n new URLSearchParams(params).toString()\n );\n }\n\n async getVaaBytes(wormholeId: string): Promise<VaaBytes> {\n const url = this.buildApi('/v1/signed_vaa/' + wormholeId, {});\n const vaa = await fetch(url);\n const resp = await vaa.json();\n return resp as VaaBytes;\n }\n\n async getVaa(wormholeId: string): Promise<Vaa> {\n const url = this.buildApi('/api/v1/vaas/' + wormholeId, {});\n const vaa = await fetch(url);\n const resp = await vaa.json();\n return resp.data as Vaa;\n }\n\n async getVaaByTxHash(txHash: string): Promise<Vaa> {\n const url = this.buildApi('/api/v1/vaas/', { txHash: txHash });\n const vaa = await fetch(url);\n const resp = await vaa.json();\n if (resp.data.length > 0) {\n return resp.data[0] as Vaa;\n }\n throw Error(\"Can't find VAA for given txHash: \" + txHash);\n }\n\n async getOperations(params: Record<string, string>): Promise<Operation[]> {\n const url = this.buildApi('/api/v1/operations/', params);\n const operations = await fetch(url);\n const resp = await operations.json();\n return resp.operations as Operation[];\n }\n\n async getOperation(wormholeId: string): Promise<Operation> {\n const url = this.buildApi('/api/v1/operations/' + wormholeId, {});\n const operation = await fetch(url);\n const resp = await operation.json();\n return resp as Operation;\n }\n\n isMrlTransfer(payload: OperationPayload): boolean {\n const { payloadType, toAddress, toChain } = payload;\n const nativeToAddress = '0x' + toAddress.substring(26);\n return (\n payloadType === 3 &&\n toChain === 16 &&\n nativeToAddress === Precompile.Bridge\n );\n }\n}\n", "import { acc } from '@galacticcouncil/common';\nimport {\n mrl,\n AnyChain,\n ConfigService,\n ChainType,\n EvmChain,\n EvmParachain,\n Parachain,\n Precompile,\n SolanaChain,\n Wormhole,\n} from '@galacticcouncil/xc-core';\n\nimport { encoding } from '@wormhole-foundation/sdk-base';\nimport { keccak256 } from '@wormhole-foundation/sdk-connect';\nimport { deserialize } from '@wormhole-foundation/sdk-definitions';\n\nimport { EvmClaim, SolanaClaim, SubstrateClaim } from '../platforms';\n\nimport { Operation, WormholeScan } from './WormholeScan';\nimport { WhTransfer, WhStatus } from './types';\n\nconst REDEEM_THRESHOLD = 5 * 60 * 1000; // 5 minutes\n\nexport class WormholeTransfer {\n private parachainId: number;\n private config: ConfigService;\n\n readonly whScan: WormholeScan;\n\n constructor(config: ConfigService, parachainId: number) {\n this.config = config;\n this.parachainId = parachainId;\n\n this.whScan = new WormholeScan();\n }\n\n get chains(): AnyChain[] {\n const configChains = this.config.chains.values();\n return Array.from(configChains);\n }\n\n get filters(): Record<string, string> {\n const toDate = new Date();\n const fromDate = new Date();\n fromDate.setDate(toDate.getDate() - 6);\n\n const toISO = toDate.toISOString();\n const fromISO = fromDate.toISOString();\n\n return {\n page: '0',\n pageSize: '50',\n includeEndDate: 'true',\n from: fromISO,\n to: toISO,\n };\n }\n\n async getWithdraws(address: string): Promise<WhTransfer[]> {\n const mda = acc.getMultilocationDerivatedAccount(\n this.parachainId,\n address,\n 1,\n true\n );\n\n const operations = await this.whScan.getOperations({\n ...this.filters,\n address: mda,\n });\n\n const result = operations.map(async (o) => {\n const { content } = o;\n const { payload, standarizedProperties } = content;\n\n const status = this.getStatus(o);\n\n const fromChain = this.chains.find(\n (c) => c instanceof Parachain && c.parachainId === this.parachainId\n )!;\n\n const { toAddress, tokenAddress } = standarizedProperties;\n const toChain = this.chains.find(\n (c) =>\n Wormhole.isKnown(c) &&\n Wormhole.fromChain(c).getWormholeId() === payload.tokenChain\n )!;\n\n let redeem;\n if (status === WhStatus.VaaEmitted && o.vaa) {\n const { timestamp } = this.getVaaHeader(o.vaa.raw);\n const vaaRaw = o.vaa.raw;\n\n if (this.isStuck(timestamp)) {\n switch (toChain.getType()) {\n case ChainType.EvmChain:\n const evmClaim = new EvmClaim(toChain as EvmChain);\n redeem = async (from: string) => evmClaim.redeem(from, vaaRaw);\n break;\n case ChainType.SolanaChain:\n const solanaClaim = new SolanaClaim(toChain as SolanaChain);\n redeem = async (from: string) => solanaClaim.redeem(from, vaaRaw);\n break;\n }\n }\n }\n\n return {\n asset: tokenAddress,\n assetSymbol: o.data.symbol,\n amount: o.data.tokenAmount,\n from: address,\n fromChain: fromChain,\n to: toAddress,\n toChain: toChain,\n status: status,\n redeem: redeem,\n operation: o,\n };\n });\n\n return Promise.all(result);\n }\n\n async getDeposits(address: string, to = 'hydration'): Promise<WhTransfer[]> {\n const operations = await this.whScan.getOperations({\n ...this.filters,\n address: Precompile.Bridge,\n pageSize: '100',\n });\n\n const toChain = this.config.chains.get(to);\n if (!toChain) {\n return [];\n }\n\n const toParachain = toChain as Parachain;\n const payload = await mrl.createPayload(toParachain, address);\n const payloadHex = payload.toHex();\n const result = operations\n .filter((o) => {\n const { content } = o;\n const { payload } = content;\n return (\n payload.payloadType === 3 &&\n payload.toChain === 16 &&\n '0x' + payload.payload === payloadHex\n );\n })\n .map(async (o) => {\n const { content, sourceChain } = o;\n const { payload, standarizedProperties } = content;\n\n const status = this.getStatus(o);\n const { tokenAddress } = standarizedProperties;\n\n const fromChain = this.chains.find(\n (c) =>\n Wormhole.isKnown(c) &&\n Wormhole.fromChain(c).getWormholeId() === payload.tokenChain\n )!;\n\n const viaChain = this.chains.find(\n (c) =>\n Wormhole.isKnown(c) &&\n Wormhole.fromChain(c).getWormholeId() === payload.toChain\n )!;\n\n let redeem;\n if (status === WhStatus.VaaEmitted && o.vaa) {\n const { timestamp } = this.getVaaHeader(o.vaa.raw);\n const vaaRaw = o.vaa.raw;\n\n if (this.isStuck(timestamp)) {\n const claim = new SubstrateClaim(viaChain as EvmParachain);\n redeem = async (address: string) =>\n claim.redeemMrlViaXcm(address, vaaRaw);\n }\n }\n\n return {\n asset: tokenAddress,\n assetSymbol: o.data.symbol,\n amount: o.data.tokenAmount,\n from: sourceChain.from,\n fromChain: fromChain,\n to: address,\n toChain: toChain,\n status: status,\n redeem: redeem,\n operation: o,\n };\n });\n\n return Promise.all(result);\n }\n\n private isStuck(emittedAt: number) {\n const now = Date.now();\n return now >= emittedAt * 1000 + REDEEM_THRESHOLD;\n }\n\n private getVaaHeader(vaaRaw: string) {\n const vaaBytes = encoding.b64.decode(vaaRaw);\n const vaa = deserialize('Uint8Array', vaaBytes);\n return {\n timestamp: vaa.timestamp,\n emitterChain: vaa.emitterChain,\n emitterAddress: vaa.emitterAddress.toString(),\n sequence: vaa.sequence,\n payload: vaa.payload,\n hash: vaa.hash,\n id: keccak256(vaa.hash),\n };\n }\n\n private getStatus(operation: Operation) {\n if (operation.vaa) {\n const isCompleted =\n operation.targetChain && operation.targetChain.status === 'completed';\n return isCompleted ? WhStatus.Completed : WhStatus.VaaEmitted;\n } else {\n return WhStatus.WaitingForVaa;\n }\n }\n}\n", "import { AnyChain } from '@galacticcouncil/xc-core';\n\nimport { Operation } from './WormholeScan';\nimport { Call } from '../platforms';\n\nexport interface WhTransfer {\n asset: string;\n assetSymbol: string;\n amount: string;\n from: string;\n fromChain: AnyChain;\n to: string;\n toChain: AnyChain;\n status: WhStatus;\n redeem?: (from: string) => Promise<Call | Call[]>;\n operation: Operation;\n}\n\nexport enum WhStatus {\n WaitingForVaa,\n VaaEmitted,\n Completed,\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["acc", "big", "addr", "ConfigBuilder", "TransferValidator", "combineLatest", "debounceTime", "ChainType", "Abi", "Wh", "encodeFunctionData", "encoding", "EvmClaim", "#chain", "chain", "from", "vaaRaw", "ctxWh", "vaaBytes", "vaaHex", "abi", "data", "Abi", "AssetAmount", "CallType", "Erc20Client", "distinctUntilChanged", "finalize", "shareReplay", "Subject", "EvmBalance", "client", "config", "Erc20Client", "Erc20", "EvmBalance", "client", "config", "Erc20Client", "args", "account", "Native", "EvmBalance", "provider", "address", "EvmBalanceFactory", "client", "config", "Erc20", "Native", "ContractFunctionExecutionError", "decodeEventLog", "EvmTransfer", "client", "config", "args", "asset", "account", "address", "value", "func", "balance", "estimatedGas", "gasPrice", "e", "provider", "nonce", "results", "result", "error", "logs", "decodedLogs", "l", "eventName", "EvmTransferFactory", "client", "config", "EvmTransfer", "Precompile", "decodeAbiParameters", "isSnowbridgeV2", "config", "getSnowbridgeV2TokenAddress", "assets", "_kind", "tokenAddress", "isNativeEthBridge", "isSnowbridgeNative", "isSnowbridgeV1Native", "isPrecompile", "_", "v", "EvmPlatform", "#client", "chain", "account", "amount", "_feeBalance", "config", "contract", "EvmTransferFactory", "abi", "asset", "calldata", "transferCall", "CallType", "error", "logs", "decodedEvents", "isPrecompile", "isNativeEthBridge", "tokenAddress", "isSnowbridgeV2", "getSnowbridgeV2TokenAddress", "erc20", "Erc20Client", "allowance", "approve", "Abi", "feeBalance", "fee", "EvmBalanceFactory", "balance", "decimals", "AssetAmount", "subject", "Subject", "observable", "shareReplay", "provider", "run", "updateBalance", "unsub", "disconnect", "finalize", "distinctUntilChanged", "prev", "curr", "EvmParachain", "h160", "Binary", "DISPATCH_ADDRESS", "H160", "EvmSigner", "#chain", "#client", "#signer", "chain", "signer", "call", "observer", "account", "provider", "isDispatch", "dotClient", "callData", "txHash", "gas", "gasPrice", "gasPriceExtra", "data", "to", "value", "gasPriceSurplus", "gasLimit", "receipt", "error", "AssetAmount", "CallType", "PublicKey", "Buffer", "distinctUntilChanged", "finalize", "shareReplay", "Subject", "SolanaBalance", "connection", "config", "SolanaAddress", "NATIVE_DECIMALS", "Native", "SolanaBalance", "address", "senderAddress", "SolanaAddress", "balance", "SolanaAddress", "Token", "SolanaBalance", "connection", "config", "address", "token", "senderAddress", "SolanaAddress", "mintAddress", "sum", "account", "t", "SolanaBalanceFactory", "connection", "config", "Native", "Token", "ComputeBudgetProgram", "PublicKey", "TransactionMessage", "VersionedTransaction", "DEFAULT_PRIORITY_FEE_PERCENTILE", "DEFAULT_PERCENTILE_MULTIPLE", "DEFAULT_MIN_PRIORITY_FEE", "DEFAULT_MAX_PRIORITY_FEE", "DEFAULT_COMPUTE_BUDGET", "SolanaTransfer", "connection", "config", "account", "instructions", "message", "priorityFeeIx", "balance", "budget", "payerKey", "blockhash", "feePercentile", "multiple", "minPriorityFee", "maxPriorityFee", "computeBudget", "priorityFee", "transaction", "simulateResponse", "err", "unitsConsumed", "percentile", "fee", "lockedWritableAccounts", "recentFeesResponse", "recentFees", "dp", "f", "a", "b", "idx", "percentileFeeJuiced", "luts", "acc", "lut", "val", "keys", "ix", "k", "SolanaTransferFactory", "connection", "config", "SolanaTransfer", "MessageV0", "ixToHuman", "instructions", "ix", "k", "chunk", "items", "size", "out", "i", "serializeV0", "mssgV0", "mssgArray", "deserializeV0", "mssgBuffer", "SolanaPlatform", "#connection", "chain", "account", "_amount", "_feeBalance", "config", "transfer", "SolanaTransferFactory", "mssgV0", "mssgArray", "mssgHex", "Buffer", "ixToHuman", "CallType", "err", "logs", "amount", "feeBalance", "fee", "accounts", "senderFinalBalance", "isSolTransfer", "asset", "query", "SolanaBalanceFactory", "balance", "decimals", "AssetAmount", "subject", "Subject", "observable", "shareReplay", "run", "updateBalance", "sender", "PublicKey", "id", "disconnect", "unsub", "finalize", "distinctUntilChanged", "prev", "curr", "CallType", "Wh", "Keypair", "PublicKey", "SystemProgram", "TransactionMessage", "ACCOUNT_SIZE", "NATIVE_MINT", "TOKEN_PROGRAM_ID", "createAssociatedTokenAccountIdempotentInstruction", "createCloseAccountInstruction", "createInitializeAccountInstruction", "createTransferInstruction", "getAssociatedTokenAddressSync", "getMinimumBalanceForRentExemptAccount", "getMint", "tutils", "cutils", "encoding", "deserialize", "createCompleteTransferNativeInstruction", "createCompleteTransferWrappedInstruction", "SolanaLilJit", "#connection", "chain", "encoded", "result", "bundleIds", "SolanaClaim", "#chain", "#connection", "#lilJit", "chain", "SolanaLilJit", "from", "vaaRaw", "recipient", "ctx", "Wh", "vaaBytes", "encoding", "vaa", "deserialize", "vaaU8a", "postedVaaAddress", "payer", "PublicKey", "payee", "isSelfRedeem", "calls", "signatureSet", "Keypair", "verifyIxs", "cutils", "chunks", "chunk", "i", "sigIx", "sigV0", "sigTx", "serializeV0", "ixToHuman", "CallType", "postVaaIx", "postVaaV0", "postVaaTx", "isNative", "mint", "isNativeSol", "NATIVE_MINT", "tipAccounts", "tipIx", "SystemProgram", "completeCall", "completeIx", "createCompleteTransferNativeInstruction", "createCompleteTransferWrappedInstruction", "ata", "getAssociatedTokenAddressSync", "createAtaIx", "createAssociatedTokenAccountIdempotentInstruction", "completeV0", "completeTx", "mintInfo", "getMint", "targetAmount", "rentBalance", "getMinimumBalanceForRentExemptAccount", "ancillaryKeypair", "createAncillaryIx", "ACCOUNT_SIZE", "TOKEN_PROGRAM_ID", "initAncillaryIx", "createInitializeAccountInstruction", "transferIx", "createTransferInstruction", "closeIx", "createCloseAccountInstruction", "ixs", "wormholeProgramId", "hash", "tutils", "blockhash", "TransactionMessage", "Keypair", "MessageV0", "VersionedTransaction", "Buffer", "SolanaSigner", "#chain", "#wallet", "#lilJit", "chain", "wallet", "SolanaLilJit", "call", "observer", "data", "signers", "versioned", "Keypair", "signature", "status", "err", "calls", "c", "encoded", "tx", "Buffer", "s", "simulation", "bundleId", "mssgBuffer", "mssgArray", "mssgV0", "MessageV0", "VersionedTransaction", "Abi", "CallType", "Precompile", "Wh", "encoding", "encodeFunctionData", "Binary", "SubstrateClaim", "#chain", "chain", "from", "vaaBytes", "vaaArray", "vaaHex", "abi", "data", "api", "claim", "encoded", "AssetAmount", "CallType", "Binary", "big", "normalizeAssetAmount", "amount", "asset", "substrate", "chainDecimals", "assetDecimals", "normDecimals", "enums", "getDeliveryFeeFromDryRun", "events", "deliveryFees", "fees", "fee", "plancks", "acc", "df", "getErrorFromDryRun", "executionResult", "error", "xcm", "buildBeneficiary", "dstAccount", "buildXcmDest", "dstChain", "toAsset", "assetLocation", "amount", "buildXcmMessage", "dstFeeLocation", "dstFee", "dstRefTime", "dstProofSize", "dstCallEncoded", "beneficiary", "feeAsset", "SubstrateExec", "#src", "#dst", "src", "dst", "srcAccount", "dstAccount", "dstCall", "transfer", "opts", "srcApi", "srcAsset", "dstApi", "dstChain", "dstCuurrency", "dstAsset", "dstDecimals", "dstFeeLocation", "dstCallBinary", "Binary", "dstPaymentInfo", "dstFeeAmount", "dstFee", "AssetAmount", "dstRefTime", "dstProofSize", "transactXcmDest", "buildXcmDest", "transactXcmMessage", "buildXcmMessage", "transactTx", "calls", "swapTxHash", "swapBinary", "swapTx", "transferCall", "transferBinary", "transferTx", "decoded", "c", "batchTx", "batchTxEncoded", "CallType", "dryRunResult", "getErrorFromDryRun", "e", "Asset", "AssetAmount", "CallType", "Binary", "concatMap", "catchError", "distinctUntilChanged", "firstValueFrom", "map", "throwError", "addr", "multiloc", "AssetAmount", "acc", "enums", "Blake2256", "u32", "toHex", "fromHex", "Enum", "Ss58Addr", "addr", "SubstrateService", "_SubstrateService", "chain", "ed", "result", "asset", "decimals", "AssetAmount", "account", "amount", "beneficiary", "accountNextId", "accountNextIdBytes", "u32", "stringToU8a", "str", "entropy", "fromHex", "hash", "Blake2256", "toHex", "tx", "rawOrigin", "Enum", "origin", "raw", "enums", "config", "info", "acc", "dryRunResult", "getDeliveryFeeFromDryRun", "error", "getErrorFromDryRun", "args", "dest", "interior", "multiloc", "parachain", "saPub", "interiorValue", "SubstratePlatform", "#substrate", "chain", "SubstrateService", "fee", "substrate", "asset", "account", "_amount", "feeBalance", "config", "txOptions", "Asset", "extrinsic", "extrinsicCall", "callData", "Binary", "CallType", "dryRunResult", "error", "getErrorFromDryRun", "e", "networkFee", "deliveryFee", "params", "normalizeAssetAmount", "ob", "firstValueFrom", "module", "func", "args", "transform", "map", "value", "concatMap", "b", "distinctUntilChanged", "prev", "curr", "balance", "AssetAmount", "catchError", "err", "throwError", "decimals", "dex", "amount", "multiloc", "Binary", "Enum", "SubstrateSigner", "#chain", "#signer", "chain", "signer", "call", "observer", "api", "callData", "opts", "tx", "event", "err", "asset", "location", "pallet", "index", "CallType", "Wh", "Transaction", "SUI_CLOCK_OBJECT_ID", "toBase64", "encoding", "serialize", "toChainId", "deserialize", "getPackageId", "getTokenCoinType", "fromBase64", "resolveCommandsTyped", "root", "opts", "inputs", "cmds", "numbers", "decode32As", "emitNum", "v", "pureToTyped", "b64", "b", "le", "n", "i", "x", "inputToTyped", "idx", "so", "oo", "mapArg", "arg", "c", "s", "coinOut", "amtOut", "t", "SuiClaim", "#chain", "chain", "from", "vaaRaw", "ctxWh", "Wh", "client", "vaaBytes", "encoding", "vaa", "deserialize", "coreBridgeObjectId", "tokenBridgeObjectId", "coinType", "getTokenCoinType", "toChainId", "coreBridgePackageId", "tokenBridgePackageId", "getPackageId", "tx", "Transaction", "verifiedVAA", "serialize", "SUI_CLOCK_OBJECT_ID", "tokenBridgeMessage", "relayerReceipt", "coins", "txBytes", "txJson", "commands", "resolveCommandsTyped", "toBase64", "CallType", "AssetAmount", "CallType", "toBase64", "distinctUntilChanged", "finalize", "shareReplay", "Subject", "SuiBalance", "client", "config", "SUI_TYPE_ARG", "NATIVE_DECIMALS", "Native", "SuiBalance", "address", "balance", "SUI_TYPE_ARG", "SuiBalanceFactory", "client", "config", "Native", "SuiPlatform", "#client", "chain", "account", "_amount", "_feeBalance", "config", "transaction", "txBytes", "txJson", "commands", "resolveCommandsTyped", "toBase64", "CallType", "sim", "feeBalance", "gasUsed", "computation", "storage", "mist", "asset", "query", "SuiBalanceFactory", "balance", "decimals", "AssetAmount", "subject", "Subject", "observable", "shareReplay", "run", "intervalId", "disconnect", "unsub", "finalize", "distinctUntilChanged", "prev", "curr", "Ed25519Keypair", "Transaction", "SuiSigner", "#chain", "#wallet", "chain", "wallet", "call", "observer", "from", "data", "client", "transaction", "result", "signed", "exec", "err", "PlatformAdapter", "chain", "ChainType", "evmChain", "EvmPlatform", "solanaChain", "SolanaPlatform", "suiChain", "SuiPlatform", "parachain", "SubstratePlatform", "account", "amount", "feeBalance", "config", "asset", "addr", "AssetAmount", "Parachain", "acc", "big", "big", "Big", "calculateMax", "balance", "fee", "min", "ed", "result", "calculateMin", "formatEvmAddress", "address", "chain", "formatAmount", "decimals", "amount", "addr", "AssetAmount", "Parachain", "big", "EvmAddr", "addr", "DataProcessor", "adapter", "config", "chain", "Parachain", "SubstrateService", "address", "route", "source", "asset", "assetId", "account", "formatEvmAddress", "balanceConfig", "min", "minAssetId", "minBalanceConfig", "decimals", "balance", "big", "AssetAmount", "EvmAddr", "addr", "DataOriginProcessor", "DataProcessor", "adapter", "config", "ctx", "amount", "sender", "source", "transfer", "transferAmount", "chain", "route", "destination", "transact", "feeAmount", "feeAsset", "feeDecimals", "AssetAmount", "big", "feeConfigBuilder", "breakdown", "address", "asset", "feeAssetId", "account", "formatEvmAddress", "feeBalanceConfig", "networkFee", "fee", "extraFee", "formatAmount", "totalFee", "feeAssetConfig", "Parachain", "contract", "extrinsic", "program", "move", "messageId", "SubstrateService", "callable", "ctxTransactBase", "context", "cfg", "substrate", "submittable", "fromChain", "fromAddr", "mda", "acc", "paymentInfo", "encodedTx", "transactFee", "transactFeeBalance", "decimals", "DataReverseProcessor", "DataProcessor", "adapter", "config", "AssetAmount", "FeeSwap", "ctx", "source", "transact", "fee", "asset", "decimals", "amount", "cfg", "route", "hasNotEnoughDestFee", "hasEnoughReservesToSwap", "isSwappable", "isSufficientAssetTransfer", "EvmAddr", "addr", "Wallet", "configService", "transferValidations", "asset", "srcAddress", "srcChain", "dstAddress", "dstChain", "transfer", "ConfigBuilder", "dstCall", "opts", "src", "dst", "srcSub", "dstSub", "SubstrateService", "exec", "SubstrateExec", "acc", "dstAsset", "fees", "feesFmt", "configs", "srcConf", "dstConf", "srcAdapter", "PlatformAdapter", "dstAdapter", "DataOriginProcessor", "DataReverseProcessor", "validator", "TransferValidator", "srcBalance", "srcFeeBalance", "srcDestinationFee", "srcDestinationFeeBalance", "srcMin", "dstBalance", "dstMin", "source", "destination", "dstFee", "dstFeeBreakdown", "initAmount", "ctx", "swap", "FeeSwap", "srcFee", "srcFeeSwap", "srcDestinationFeeSwap", "dstEd", "min", "calculateMin", "srcEd", "max", "calculateMax", "amount", "copyCtx", "big", "target", "fee", "feeBreakdown", "srcFeeAmount", "address", "chain", "observer", "chainRoutes", "adapter", "observables", "balance", "assetId", "account", "formatEvmAddress", "balanceConfig", "ob", "combineLatest", "debounceTime", "ConfigBuilder", "TransferBuilder", "wallet", "assets", "asset", "sources", "srcChain", "destinations", "dstChain", "routes", "destinationAssets", "isAssetSelect", "isTagSelect", "build", "srcAddress", "dstAddress", "dstAsset", "tag", "configs", "Precompile", "DEFAULT_URL", "WormholeScan", "baseUrl", "api", "params", "wormholeId", "url", "txHash", "resp", "payload", "payloadType", "toAddress", "toChain", "nativeToAddress", "acc", "mrl", "ChainType", "Parachain", "Precompile", "Wormhole", "encoding", "keccak256", "deserialize", "WhStatus", "REDEEM_THRESHOLD", "WormholeTransfer", "config", "parachainId", "WormholeScan", "configChains", "toDate", "fromDate", "toISO", "address", "mda", "acc", "result", "o", "content", "payload", "standarizedProperties", "status", "fromChain", "c", "Parachain", "toAddress", "tokenAddress", "toChain", "Wormhole", "redeem", "timestamp", "vaaRaw", "ChainType", "evmClaim", "EvmClaim", "from", "solanaClaim", "SolanaClaim", "to", "operations", "Precompile", "toParachain", "payloadHex", "mrl", "sourceChain", "viaChain", "claim", "SubstrateClaim", "emittedAt", "vaaBytes", "encoding", "vaa", "deserialize", "keccak256", "operation"]
|
|
7
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MessageV0, TransactionInstruction } from '@solana/web3.js';
|
|
2
2
|
import { HumanizedIx } from './types';
|
|
3
3
|
export declare function ixToHuman(instructions: TransactionInstruction[]): HumanizedIx[];
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function chunk<T>(items: T[], size: number): T[][];
|
|
5
5
|
export declare function serializeV0(mssgV0: MessageV0): string;
|
|
6
6
|
export declare function deserializeV0(mssgV0: string): MessageV0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@galacticcouncil/xc-sdk",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Cross-chain sdk",
|
|
5
5
|
"author": "GalacticCouncil",
|
|
6
6
|
"type": "module",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"link": "npm ln"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@galacticcouncil/xc-core": "1.2.1
|
|
36
|
+
"@galacticcouncil/xc-core": "^1.2.1"
|
|
37
37
|
}
|
|
38
38
|
}
|