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