@galacticcouncil/xc-sdk 1.3.0 → 2.0.0-pr346-8e7401c

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.
@@ -83,5 +83,4 @@ export declare class WormholeScan {
83
83
  getVaaByTxHash(txHash: string): Promise<Vaa>;
84
84
  getOperations(params: Record<string, string>): Promise<Operation[]>;
85
85
  getOperation(wormholeId: string): Promise<Operation>;
86
- isMrlTransfer(payload: OperationPayload): boolean;
87
86
  }
@@ -8,9 +8,34 @@ export declare class WormholeTransfer {
8
8
  constructor(config: ConfigService, parachainId: number);
9
9
  get chains(): AnyChain[];
10
10
  get filters(): Record<string, string>;
11
+ private get parachain();
12
+ /**
13
+ * Get NTT transfers sent from parachain (via wormhole).
14
+ *
15
+ * @param address - parachain user address (ss58 or H160)
16
+ * @returns pending & completed wormhole withdrawals
17
+ */
11
18
  getWithdraws(address: string): Promise<WhTransfer[]>;
12
- getDeposits(address: string, to?: string): Promise<WhTransfer[]>;
13
- private isStuck;
14
- private getVaaHeader;
19
+ /**
20
+ * Get NTT transfers received on parachain (via wormhole).
21
+ *
22
+ * @param address - parachain user address (ss58 or H160)
23
+ * @returns pending & completed wormhole deposits
24
+ */
25
+ getDeposits(address: string): Promise<WhTransfer[]>;
26
+ /**
27
+ * Get all NTT transfers of given user.
28
+ *
29
+ * Transfers are matched against the NTT token registry by the VAA
30
+ * emitter (source transceiver) address.
31
+ *
32
+ * @param address - parachain user address (ss58 or H160)
33
+ * @returns pending & completed wormhole transfers
34
+ */
35
+ getTransfers(address: string): Promise<WhTransfer[]>;
36
+ private toTransfer;
37
+ private findChainByWormholeId;
38
+ private findNtt;
39
+ private findNttByEmitter;
15
40
  private getStatus;
16
41
  }
package/build/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var sn=Object.create;var vt=Object.defineProperty;var an=Object.getOwnPropertyDescriptor;var rn=Object.getOwnPropertyNames;var on=Object.getPrototypeOf,cn=Object.prototype.hasOwnProperty;var un=(o,t)=>{for(var e in t)vt(o,e,{get:t[e],enumerable:!0})},re=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rn(t))!cn.call(o,n)&&n!==e&&vt(o,n,{get:()=>t[n],enumerable:!(s=an(t,n))||s.enumerable});return o};var mn=(o,t,e)=>(e=o!=null?sn(on(o)):{},re(t||!o||!o.__esModule?vt(e,"default",{value:o,enumerable:!0}):e,o)),ln=o=>re(vt({},"__esModule",{value:!0}),o);var An={};un(An,{DISPATCH_ADDRESS:()=>Ut,EvmClaim:()=>st,EvmPlatform:()=>rt,EvmSigner:()=>jt,FeeSwap:()=>et,PlatformAdapter:()=>L,SolanaClaim:()=>ut,SolanaLilJit:()=>H,SolanaPlatform:()=>ot,SolanaSigner:()=>Gt,SubstrateClaim:()=>mt,SubstrateExec:()=>dt,SubstratePlatform:()=>pt,SubstrateService:()=>B,SubstrateSigner:()=>Yt,SuiClaim:()=>te,SuiPlatform:()=>ft,SuiSigner:()=>ee,TransferBuilder:()=>qe,Wallet:()=>Vt,WhStatus:()=>se,WormholeScan:()=>xt,WormholeTransfer:()=>ae,chunk:()=>Lt,deserializeV0:()=>pn,ixToHuman:()=>_,serializeV0:()=>z});module.exports=ln(An);var nt=require("@galacticcouncil/common"),Ot=require("@galacticcouncil/xc-core");var Q=require("@galacticcouncil/xc-core");var St=require("@galacticcouncil/xc-core"),ie=require("viem"),Kt=require("@wormhole-foundation/sdk-base"),st=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=St.Wormhole.fromChain(this.#t),n=Kt.encoding.b64.decode(e),a=Kt.encoding.hex.encode(n),r=St.Abi.TokenBridge,c=(0,ie.encodeFunctionData)({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:c,from:t,to:s.getTokenBridge()}}};var K=require("@galacticcouncil/xc-core");var Tt=require("viem"),Pt=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof Tt.ContractFunctionExecutionError?console.log(`Can't estimate fees!
2
- `,s.message):console.log(s),0n}}async getGasPrice(){return this.client.getProvider().getGasPrice()}async getNonce(t){return this.client.getProvider().getTransactionCount({address:t})}async simulateCall(t){let{address:e,args:s,value:n,func:a}=this.config,r=this.client.getProvider(),c=await this.getNonce(t);try{let{results:m}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:c}]}),[i]=m;return i}catch(m){return console.log(`Can't simulate call!
3
- `,m.details),{error:m}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=(0,Tt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var at=class{static get(t,e){return new Pt(t,e)}};var oe=require("@galacticcouncil/xc-core"),ce=require("viem");function Ht(o){return o.module==="Snowbridge"&&o.func==="v2_sendMessage"}function ue(o){if(!Ht(o))return;let t=o.args[1];if(!t||t.length===0)return;let[e,s]=(0,ce.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function me(o){let t=o.module==="Snowbridge"&&o.func==="v2_sendMessage"&&Array.isArray(o.args[1])&&o.args[1].length===0,e=o.module==="Snowbridge"&&o.func==="sendToken"&&o.args[0]==="0x0000000000000000000000000000000000000000";return o.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(o.func)||t||e}function le(o){return Object.entries(oe.Precompile).map(([e,s])=>s).includes(o.address)}var rt=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=at.get(this.#t,n),{abi:r,asset:c,calldata:m}=a,i={abi:JSON.stringify(r),data:m,from:t,to:n.address,type:K.CallType.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),C=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:C}}};if(le(n)||me(n))return i;let l=Ht(n)?ue(n):c,u=new K.Erc20Client(this.#t,l),d=await u.allowance(t,n.address);if(d>=e)return i;let g=u.approve(n.address,e);return{abi:JSON.stringify(K.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:K.CallType.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await at.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}};var de=require("@galacticcouncil/xc-core"),ge=require("@galacticcouncil/common"),pe=require("polkadot-api"),Ut="0x0000000000000000000000000000000000000401",{H160:dn}=ge.h160,jt=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 de.EvmParachain)try{let c=this.#t.client,m=pe.Binary.fromHex(t.data);await c.getUnsafeApi().txFromCallData(m),a=!0}catch{}let r;if(a){let[c,m]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Ut}),n.getGasPrice()]),i=m+m/100n*10n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:i,maxFeePerGas:i,gas:c*11n/10n,to:Ut})}else{let{data:c,to:m,value:i}=t,[l,u]=await Promise.all([n.estimateGas({account:s,data:c,to:m,value:i}),n.getGasPrice()]),d=u+u*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:c,to:m,value:i,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(c=>e.onTransactionReceipt(c)).catch(c=>e.onError(c))}};var xe=require("@galacticcouncil/xc-core"),be=require("buffer");var F=require("@solana/web3.js"),fe=.5,he=2,ye=1,Ce=1e6,gn=25e4,Et=class{connection;config;constructor(t,e){this.validateConnection(t),this.connection=t,this.config=e}validateConnection(t){if(!t)throw new Error("No connection found")}async getPriorityMessage(t){let{instructions:e}=this.config,s=await this.getV0Message(t,e),n=await this.createPriorityFeeInstructions(s);return this.getV0Message(t,[...e,...n])}async estimateFee(t,e){if(e===0n)return 0n;let{instructions:s}=this.config,n=await this.getV0Message(t,s),a=await this.determineComputeBudget(n);return BigInt(a)}async getV0Message(t,e){let s=new F.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new F.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=fe,s=he,n=ye,a=Ce){let[r,c]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[F.ComputeBudgetProgram.setComputeUnitLimit({units:r}),F.ComputeBudgetProgram.setComputeUnitPrice({microLamports:c})]}async simulateTransaction(t,e){let s=new F.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new F.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):gn}async determinePriorityFee(t,e=fe,s=he,n=ye,a=Ce){let r=n,c=await this.getTxAccounts(t),m=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:c});if(m){let i=m.map(u=>u.prioritizationFee).filter(u=>u>0).sort((u,d)=>u-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 it=class{static get(t,e){return new Et(t,e)}};var Ae=require("@solana/web3.js");function _(o){return o.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Lt(o,t){let e=[];for(let s=0;s<o.length;s+=t)e.push(o.slice(s,s+t));return e}function z(o){let t=o.serialize();return Buffer.from(t).toString("hex")}function pn(o){let t=Buffer.from(o,"hex"),e=Uint8Array.from(t);return Ae.MessageV0.deserialize(e)}var ot=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=it.get(this.#t,n),r=await a.getPriorityMessage(t),c=r.serialize(),m=be.Buffer.from(c).toString("hex");return{from:t,data:m,ix:_(n.instructions),signers:n.signers,type:xe.CallType.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=it.get(this.#t,n),r=await a.estimateFee(t,e),c=await a.getPriorityMessage(t),{accounts:m}=await a.simulateTransaction(t,c),l=(m&&m[0])?.lamports;if(l){let u=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(u?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}};var U=require("@galacticcouncil/xc-core"),T=require("@solana/web3.js"),y=require("@solana/spl-token"),we=require("@wormhole-foundation/sdk-solana"),zt=require("@wormhole-foundation/sdk-solana-core"),ve=require("@wormhole-foundation/sdk-base"),$t=require("@wormhole-foundation/sdk-definitions"),ct=require("@wormhole-foundation/sdk-solana-tokenbridge");var H=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){return(await this.#t._rpcRequest("simulateBundle",[[t]])).result}async getInflightBundleStatuses(t){let{result:e}=await this.#t._rpcRequest("getInflightBundleStatuses",[t]);return e}async getRegion(){let{result:t}=await this.#t._rpcRequest("getRegions",[]);return t}async getTipAccount(){let{result:t}=await this.#t._rpcRequest("getTipAccounts",[]);return t}};var ut=class{#t;#e;#n;constructor(t){this.#t=t,this.#e=t.connection,this.#n=new H(t)}async redeem(t,e,s){let n=U.Wormhole.fromChain(this.#t),a=ve.encoding.b64.decode(e),r=(0,$t.deserialize)("TokenBridge:Transfer",a),c=(0,$t.deserialize)("Uint8Array",a),m=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),i=new T.PublicKey(t),l=s?new T.PublicKey(s):i,u=i.equals(l),d=[];if(!await this.#e.getAccountInfo(m)){let h=T.Keypair.generate(),O=await zt.utils.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),i,c,h.publicKey),E=Lt(O,2);for(let A=0;A<E.length;A++){let I=E[A],v=await this.getV0Message(i,I),k=z(v);d.push({from:t,data:k,ix:_(I),signers:[h],type:U.CallType.Solana})}let D=zt.utils.createPostVaaInstruction(this.#e,n.getCoreBridge(),i,c,h.publicKey),bt=await this.getV0Message(i,[D]),R=z(bt);d.push({from:t,data:R,ix:_([D]),type:U.CallType.Solana})}let p=r.payload.token.chain==="Solana",f=new T.PublicKey(r.payload.token.address.toUint8Array()),C=p&&f.equals(y.NATIVE_MINT),w=await this.#n.getTipAccount(),x=T.SystemProgram.transfer({fromPubkey:i,toPubkey:new T.PublicKey(w[0]),lamports:1e3});if(C&&u){let h=await this.redeemAndUnwrap(n,i,r,x);d.push(h)}else{let h=await this.redeemToken(n,i,l,f,p,r,x);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,c){let i=(a?ct.createCompleteTransferNativeInstruction:ct.createCompleteTransferWrappedInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=(0,y.getAssociatedTokenAddressSync)(n,s),u=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,l,s,n),d=await this.getV0Message(e,[u,i,c]),g=z(d);return{from:e.toBase58(),data:g,ix:_([u,i]),type:U.CallType.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new T.PublicKey(s.payload.to.address.toUint8Array()),r=await(0,y.getMint)(this.#e,y.NATIVE_MINT),c=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),m=await(0,y.getMinimumBalanceForRentExemptAccount)(this.#e),i=T.Keypair.generate(),l=(0,y.createAssociatedTokenAccountIdempotentInstruction)(e,a,e,y.NATIVE_MINT),u=(0,ct.createCompleteTransferNativeInstruction)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=T.SystemProgram.createAccount({fromPubkey:e,newAccountPubkey:i.publicKey,lamports:m,space:y.ACCOUNT_SIZE,programId:y.TOKEN_PROGRAM_ID}),g=(0,y.createInitializeAccountInstruction)(i.publicKey,y.NATIVE_MINT,e),p=(0,y.createTransferInstruction)(a,i.publicKey,e,c),f=(0,y.createCloseAccountInstruction)(i.publicKey,e,e),C=[l,u,d,g,p,f,n],w=await this.getV0Message(e,C),x=z(w);return{from:e.toBase58(),data:x,ix:_(C),signers:[i],type:U.CallType.Solana}}derivePostedVaaKey(t,e){return we.utils.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new T.TransactionMessage({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};var j=require("@solana/web3.js"),Bt=require("buffer");var Gt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new H(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof j.Keypair){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:c}=await r.signAndSendTransaction(a);e.onTransactionSend(c);let m=await this.#t.connection.getSignatureStatus(c);e.onStatus?.(m)}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(m=>m.sign([this.#e])),n=s.map(m=>Bt.Buffer.from(m.serialize()).toString("base64"));else{let m=this.#e;await m.connect(),n=(await m.signAllTransactions(s)).map(l=>Bt.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 c=await this.#n.getInflightBundleStatuses([r]);e.onBundleStatus?.(c.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=Bt.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 V=require("@galacticcouncil/xc-core"),Xt=require("@wormhole-foundation/sdk-base"),Se=require("viem"),Jt=require("polkadot-api"),mt=class{#t;constructor(t){this.#t=t,V.Wormhole.fromChain(this.#t)}redeemMrl(t,e){let s=Xt.encoding.b64.decode(e),n=Xt.encoding.hex.encode(s),a=V.Abi.Gmp,r=(0,Se.encodeFunctionData)({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:V.Precompile.Bridge}}async redeemMrlViaXcm(t,e){let n=this.#t.client.getUnsafeApi(),a=this.redeemMrl(t,e),c=await n.tx.EthereumXcm.transact({xcm_transaction:{type:"V2",value:{gas_limit:[5000000n,0n,0n,0n],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:Jt.Binary.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Jt.Binary.toHex(c),from:t,type:V.CallType.Substrate,dryRun:async()=>{},txOptions:void 0}}};var It=require("@galacticcouncil/xc-core"),lt=require("polkadot-api");var Pe=require("@galacticcouncil/common");async function Te(o,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:Pe.big.convertDecimals(o,a,n),decimals:n}}var Ee=require("@galacticcouncil/common"),Be=o=>{let t=[];for(let e of o)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)},$=o=>{let t=o.value.error;return t.type==="Module"?Ee.enums.enumPath(t.value):JSON.stringify(t.value)};var Ft=require("@galacticcouncil/common");function fn(o){return{parents:0,interior:{type:"X1",value:o.startsWith("0x")?Ft.xcm.toAccountKey20(o):Ft.xcm.toAccountId32(o)}}}function Fe(o){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:o.parachainId}}}}}var hn=(o,t)=>({id:Ft.xcm.transform(o),fun:{type:"Fungible",value:t}}),Ie=(o,t,e,s,n,a)=>{console.log(a);let r=fn(o),c=hn(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[c]},{type:"BuyExecution",value:{fees:c,weight_limit:{type:"Unlimited"}}},{type:"Transact",value:{origin_kind:{type:"SovereignAccount"},require_weight_at_most:{ref_time:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var dt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,c=await this.#t.getAsset(),m=this.#e.api,i=this.#e.chain,l=await i.getCurrency(),u=l.asset,d=l.decimals,g=i.getAssetXcmLocation(u),p=lt.Binary.fromHex(s.data),C=await(await m.txFromCallData(p)).getPaymentInfo(e),w=BigInt(C.partial_fee)*120n/100n,x=It.AssetAmount.fromAsset(u,{amount:w,decimals:d}),h=C.weight.ref_time,O=C.weight.proof_size,E=Fe(i),D=Ie(e,g,x,h,O,p),bt=r.tx.PolkadotXcm.send({dest:E,message:D}),R=[];try{let S=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||c,u,x,10),wt=lt.Binary.fromHex(S),Wt=await r.txFromCallData(wt);R.push(Wt)}catch{}let A=await n(x),I=lt.Binary.fromHex(A.data),v=await r.txFromCallData(I);R.push(v),R.push(bt);let k=R.map(S=>S.decodedCall),M=r.tx.Utility.batch_all({calls:k}),Mt=await M.getEncodedData();return{from:t,data:lt.Binary.toHex(Mt),type:It.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let S=await this.#t.dryRun(t,M);return{call:"polkadotXcm.send",error:S.execution_result&&S.execution_result.success?void 0:$(S.execution_result),events:S.emitted_events||[],xcm:S.forwarded_xcms||[]}}catch(S){return{call:"polkadotXcm.send",error:S instanceof Error?S.message:"unknown"}}}:()=>{}}}};var X=require("@galacticcouncil/xc-core"),Re=require("polkadot-api");var G=require("@galacticcouncil/xc-core"),Dt=require("@galacticcouncil/common"),Rt=require("@polkadot-api/substrate-bindings"),gt=require("@polkadot-api/utils"),qt=require("polkadot-api");var{Ss58Addr:De}=G.addr,B=class o{chain;_currency;constructor(t){this.chain=t}static async create(t){return new o(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}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=Rt.u32.enc(a),c=l=>new TextEncoder().encode(l),m=new Uint8Array([...c(this.chain.parachainId.toString()),...(0,gt.fromHex)(t.startsWith("0x")?t.slice(2):t),...r,...(0,gt.fromHex)(s.startsWith("0x")?s.slice(2):s),...c(n),...c(e.toString())]),i=(0,Rt.Blake2256)(m);return(0,gt.toHex)(i)}async dryRun(t,e){let s=(0,qt.Enum)("Signed",t),n=(0,qt.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: "+Dt.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 Be(a.emitted_events||[]);{let r=$(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=G.multiloc.findNestedKey(a,"interior"),c=G.multiloc.findParachain(a);if(G.multiloc.findGlobalConsensus(a))return t;if(c){let l=Dt.acc.getSovereignAccounts(c);return this.chain.parachainId===0?De.encodePubKey(l.relay):De.encodePubKey(l.generic)}let i=r&&r.interior;if(i==="Here"||i?.type==="Here")return this.chain.treasury||t}return t}};var pt=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,c=await this.useSignerFee(s)?{asset:new X.Asset(s)}:void 0,m=n.getTx(a.client),i=n.module+"."+n.func,l=await m.getEncodedData();return{from:t,data:Re.Binary.toHex(l),type:X.CallType.Substrate,txOptions:c,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:$(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),c=await a.estimateDeliveryFee(t,n),m=await this.exchangeFee(r+c,s),i=await Te(m,s,a);return s.copyWith(i)}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,c=X.AssetAmount.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,c,!0)).amount}catch{}return t}};var Qt=require("@galacticcouncil/xc-core"),J=require("polkadot-api"),Yt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=J.Binary.fromHex(t.data),r={};t.txOptions?.asset&&(r={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(a).then(c=>{c.signSubmitAndWatch(this.#e,r).subscribe({next:m=>{m.type==="broadcasted"&&e.onTransactionSend(m.txHash),m.type==="finalized"&&e.onFinalized(m)},error:m=>{e.onError(m)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=Qt.multiloc.findPalletInstance(e),n=Qt.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,J.Enum)("X2",[(0,J.Enum)("PalletInstance",Number(s)),(0,J.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var _t=require("@galacticcouncil/xc-core"),_e=require("@mysten/sui/transactions"),Ve=require("@mysten/sui/utils"),Oe=require("@mysten/bcs"),q=require("@wormhole-foundation/sdk-connect"),Me=require("@wormhole-foundation/sdk-definitions"),Zt=require("@wormhole-foundation/sdk-sui"),We=require("@wormhole-foundation/sdk-sui-tokenbridge");var ke=require("@mysten/bcs");function kt(o,t={}){let e=o.inputs??[],s=o.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),c=l=>{let u=(0,ke.fromBase64)(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(u[f])<<8n*BigInt(f);return p};return u.length===1?{type:"pure",valueType:"u8",value:Number(u[0])}:u.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:u.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:u.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:u.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...u].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(u)}},m=l=>{let u=e[l];if(!u)return{Input:l};if(u.Pure?.bytes)return c(u.Pure.bytes);let d=u.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=u.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},i=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?m(l.Input):l;return s.map(l=>{if(l.MoveCall){let u=l.MoveCall;return{MoveCall:{...u,arguments:(u.arguments??[]).map(i)}}}if(l.SplitCoins){let u=l.SplitCoins,d=u.coin?.GasCoin?"GasCoin":i(u.coin),g=(u.amounts??[]).map(i);return{SplitCoins:[d,g]}}if(l.MergeCoins){let u=l.MergeCoins;return{MergeCoins:{...u,destination:i(u.destination),sources:(u.sources??[]).map(i)}}}if(l.TransferObjects){let u=l.TransferObjects;return{TransferObjects:{...u,objects:(u.objects??[]).map(i),address:i(u.address)}}}return l})}var te=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=_t.Wormhole.fromChain(this.#t),n=this.#t.client,a=q.encoding.b64.decode(e),r=(0,Me.deserialize)("TokenBridge:Transfer",a),c=s.getCoreBridge(),m=s.getTokenBridge(),i=await(0,We.getTokenCoinType)(n,m,r.payload.token.address.toUint8Array(),(0,q.toChainId)(r.payload.token.chain));if(!i)throw new Error("Unable to fetch token coinType");let[l,u]=await Promise.all([(0,Zt.getPackageId)(n,c),(0,Zt.getPackageId)(n,m)]),d=new _e.Transaction;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(c),d.pure.vector("u8",(0,q.serialize)(r)),d.object(Ve.SUI_CLOCK_OBJECT_ID)]}),[p]=d.moveCall({target:`${u}::vaa::verify_only_once`,arguments:[d.object(m),g]}),[f]=d.moveCall({target:`${u}::complete_transfer::authorize_transfer`,arguments:[d.object(m),p],typeArguments:[i]}),[C]=d.moveCall({target:`${u}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[i]});d.moveCall({target:`${u}::coin_utils::return_nonzero`,arguments:[C],typeArguments:[i]});let w=await d.build({client:n}),x=await d.toJSON(),h=kt(JSON.parse(x));return{from:t,commands:h,data:(0,Oe.toBase64)(w),type:_t.CallType.Sui}}};var Ne=require("@galacticcouncil/xc-core"),Ke=require("@mysten/bcs");var ft=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:a}=n;a.setSender(t);let r=await a.build({client:this.#t}),c=await a.toJSON(),m=kt(JSON.parse(c));return{from:t,commands:m,data:(0,Ke.toBase64)(r),type:Ne.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}),m=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,i=BigInt(m.computationCost),l=BigInt(m.storageCost),u=i+l;return s.copyWith({amount:u})}};var He=require("@mysten/sui/keypairs/ed25519"),Ue=require("@mysten/sui/transactions"),ee=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 He.Ed25519Keypair){let m=Ue.Transaction.from(n),i=await a.signAndExecuteTransaction({signer:this.#e,transaction:m,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"}),c=await a.executeTransactionBlock({transactionBlock:r.transaction,signature:r.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(c.digest)}catch(r){e.onError(r)}}};var L=class{platform={};constructor(t){switch(t.getType()){case Q.ChainType.EvmChain:this.registerEvm(t);break;case Q.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case Q.ChainType.Parachain:this.registerSubstrate(t);break;case Q.ChainType.SolanaChain:this.registerSolana(t);break;case Q.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new rt(e)}registerSolana(t){let e=t;this.platform.Solana=new ot(e)}registerSui(t){let e=t;this.platform.Sui=new ft(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new pt(e)}async buildCall(t,e,s,n){return this.platform[n.type].buildCall(t,e,s,n)}async estimateFee(t,e,s,n){return this.platform[n.type].estimateFee(t,e,s,n)}};var tt=require("@galacticcouncil/xc-core"),yt=require("@galacticcouncil/common");var je=require("@galacticcouncil/common"),Y=mn(require("big.js"),1);function Le(o,t,e,s){let n=o.toBig().minus(e.toBig()).minus(o.isSame(t)?t.toBig():new Y.default(0));return s&&(n=n.minus(o.isSame(s)?s.toBig():new Y.default(0))),o.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function ze(o,t,e,s){let a=o.copyWith({amount:0n}).toBig().plus(o.isSame(t)?t.toBig():new Y.default(0)).plus(o.toBig().lt(e.toBig())?e.toBig():new Y.default(0));return s&&(a=a.plus(o.isSame(s)&&o.toBig().lt(s.toBig())?s.toBig():new Y.default(0))),o.copyWith({amount:BigInt(a.toFixed())})}async function $e(o,t){return t.isEvmParachain()?t.getDerivatedAddress(o):o}function Ge(o,t){return t?je.big.toBigInt(t,o):0n}async function ne(o,t){let e=o.getAssetDecimals(t);return e||(await o.getCurrency()).decimals}var ht=require("@galacticcouncil/xc-core");var Z=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof ht.Parachain?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof ht.Parachain)return this.chain.getMin(this.asset);let t=await ne(this.chain,this.asset);return ht.AssetAmount.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return ne(this.chain,t)}};var Ct=class extends Z{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=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,c=a.fee.amount,m=n.destinationFee??a.fee.asset,i=await this.getDecimals(m);if(Number.isFinite(c))return{fee:tt.AssetAmount.fromAsset(m,{amount:yt.big.toBigInt(c,i),decimals:i}),feeBreakdown:{}};let l=c,{amount:u,breakdown:d}=await l.build({feeAsset:m,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:tt.AssetAmount.fromAsset(m,{amount:u,decimals:i}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,a=e.destinationFee??s.fee.asset;return n.isEqual(a)?this.getBalance(t):this.config.chain.getBalance(a,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,c=await this.getTransfer(t),m=s.contract?await $e(a,e):a,i=await this.adapter.estimateFee(m,n,r.feeBalance,c),{fee:l}=s.source,u=l?Ge(i.decimals,l.extra):0n,d=i.amount+u;return i.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,a=n.fee,r=n.asset;if(!a)return r;let c=a.asset;return e instanceof tt.Parachain&&"build"in c?await c.build({chain:e,address:t}):c}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:a,program:r,move:c}=s;if(a){let{address:i,amount:l,asset:u,sender:d}=t,p=await(await B.create(e)).buildMessageId(d,l,u.originSymbol,i);return a.build({...t,messageId:p})}let m=n||r||c;if(m)return m.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),c=a.getTx(r.client),m=e.source.chain,i=e.sender,l=yt.acc.getMultilocationDerivatedAccount(m.parachainId,i,s.parachainId===0?0:1,s.usesH160Acc),u=await c.getPaymentInfo(l),d=await c.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:u.weight.ref_time,proofSize:u.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=yt.big.toBigInt(e.amount,s);return tt.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var At=class extends Z{};var Xe=require("@galacticcouncil/xc-core"),et=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:Xe.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 Vt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=(0,Ot.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),c=this.config.getChain(s);if(!(r.isSubstrate()&&c.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[i,l]=await Promise.all([B.create(r),B.create(c)]),u=new dt(i,l),d=nt.acc.getMultilocationDerivatedAccount(r.parachainId,t,1,c.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return u.remoteExec(t,d,n,f=>{let C=f.toDecimal();return p.buildCall(C)},a)}async getTransferData(t,e,s){let n=t.origin,{chain:a,asset:r}=n.route.destination,c=new L(n.chain),m=new L(a),i=new Ct(c,n),l=new At(m,a,r),u=new Ot.TransferValidator(...this.validations),[d,g,p,f,C,w,x]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),l.getBalance(s),l.getMin()]),{source:h,destination:O}=n.route,E=p.fee.copyWith(O.fee.asset),D=p.feeBreakdown,R=h.asset.isEqual(E)&&E.amount>10n?E.amount+1n:10n,A={address:s,amount:R,asset:h.asset,destination:{balance:w,chain:a,fee:E,feeBreakdown:D},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:p.fee,destinationFeeBalance:f}};A.transact=await i.getTransact(A);let I=new et(A),v=await i.getFee(A),k;I.isSwapSupported(h.fee)&&(k=await I.getSwap(v),A.source.feeSwap=k);let M;I.isDestinationSwapSupported(v)&&(M=await I.getDestinationSwap(v),A.source.destinationFeeSwap=M),(k||M)&&(v=await i.getFee(A),v=v.padByPct(5n));let Mt=await l.getEd(),S=ze(w,E,x,Mt),wt=await i.getEd(),Wt=Le(d,v,C,wt);A.amount=0n,A.source.fee=v;let Nt={source:{balance:d,destinationFee:p.fee,destinationFeeBalance:f,destinationFeeSwap:M,fee:v,feeBalance:g,feeSwap:k,max:Wt,min:d.copyWith({amount:S.amount})},destination:{balance:w,fee:E},reversible:t.reversible,async buildCall(W){let P=Object.assign({},A);return P.amount=nt.big.toBigInt(W,d.decimals),P.transact=await i.getTransact(P),i.getCall(P)},async estimateFee(W){let P=Object.assign({},A);return P.amount=nt.big.toBigInt(W,d.decimals),P.transact=await i.getTransact(P),i.getFee(P)},async estimateDestinationFee(W){let P=nt.big.toBigInt(W,d.decimals),{fee:N,feeBreakdown:nn}=await i.getDestinationFee(P);return A.destination.fee=N,A.destination.feeBreakdown=nn,A.source.destinationFee=N,Nt.destination.fee=N,Nt.source.destinationFee=N,N},async validate(W){let P=Object.assign({},A),N=W||v.amount;return P.source.fee=v.copyWith({amount:N}),u.validate(P)}};return Nt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=n.getUniqueRoutes().map(r=>r.source.asset);return n.chain.subscribeBalances(a,t).subscribe(s)}};var Je=require("@galacticcouncil/xc-core");function qe(o){let t=(0,Je.ConfigBuilder)(o.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:c,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build:u}=a.destination(r);return{routes:c,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let C=u(p,f);return o.getTransferData(C,d,g)}}}}}}}}}var Qe=require("@galacticcouncil/xc-core"),yn="https://api.wormholescan.io",xt=class{_baseUrl;constructor(t){this._baseUrl=t||yn}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===Qe.Precompile.Bridge}};var Ye=require("@galacticcouncil/common"),b=require("@galacticcouncil/xc-core"),Ze=require("@wormhole-foundation/sdk-base"),tn=require("@wormhole-foundation/sdk-connect"),en=require("@wormhole-foundation/sdk-definitions");var se=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(se||{});var Cn=300*1e3,ae=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new xt}get chains(){let t=this.config.chains.values();return Array.from(t)}get filters(){let t=new Date,e=new Date;e.setDate(t.getDate()-6);let s=t.toISOString();return{page:"0",pageSize:"50",includeEndDate:"true",from:e.toISOString(),to:s}}async getWithdraws(t){let e=Ye.acc.getMultilocationDerivatedAccount(this.parachainId,t,1,!0),n=(await this.whScan.getOperations({...this.filters,address:e})).map(async a=>{let{content:r}=a,{payload:c,standarizedProperties:m}=r,i=this.getStatus(a),l=this.chains.find(f=>f instanceof b.Parachain&&f.parachainId===this.parachainId),{toAddress:u,tokenAddress:d}=m,g=this.chains.find(f=>b.Wormhole.isKnown(f)&&b.Wormhole.fromChain(f).getWormholeId()===c.tokenChain),p;if(i===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),C=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case b.ChainType.EvmChain:let w=new st(g);p=async h=>w.redeem(h,C);break;case b.ChainType.SolanaChain:let x=new ut(g);p=async h=>x.redeem(h,C);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:u,toChain:g,status:i,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:b.Precompile.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,c=(await b.mrl.createPayload(a,t)).toHex(),m=s.filter(i=>{let{content:l}=i,{payload:u}=l;return u.payloadType===3&&u.toChain===16&&"0x"+u.payload===c}).map(async i=>{let{content:l,sourceChain:u}=i,{payload:d,standarizedProperties:g}=l,p=this.getStatus(i),{tokenAddress:f}=g,C=this.chains.find(h=>b.Wormhole.isKnown(h)&&b.Wormhole.fromChain(h).getWormholeId()===d.tokenChain),w=this.chains.find(h=>b.Wormhole.isKnown(h)&&b.Wormhole.fromChain(h).getWormholeId()===d.toChain),x;if(p===1&&i.vaa){let{timestamp:h}=this.getVaaHeader(i.vaa.raw),O=i.vaa.raw;if(this.isStuck(h)){let E=new mt(w);x=async D=>E.redeemMrlViaXcm(D,O)}}return{asset:f,assetSymbol:i.data.symbol,amount:i.data.tokenAmount,from:u.from,fromChain:C,to:t,toChain:n,status:p,redeem:x,operation:i}});return Promise.all(m)}isStuck(t){return Date.now()>=t*1e3+Cn}getVaaHeader(t){let e=Ze.encoding.b64.decode(t),s=(0,en.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,tn.keccak256)(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};0&&(module.exports={DISPATCH_ADDRESS,EvmClaim,EvmPlatform,EvmSigner,FeeSwap,PlatformAdapter,SolanaClaim,SolanaLilJit,SolanaPlatform,SolanaSigner,SubstrateClaim,SubstrateExec,SubstratePlatform,SubstrateService,SubstrateSigner,SuiClaim,SuiPlatform,SuiSigner,TransferBuilder,Wallet,WhStatus,WormholeScan,WormholeTransfer,chunk,deserializeV0,ixToHuman,serializeV0});
1
+ "use strict";var ke=Object.create;var gt=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Me=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Ne=Object.prototype.hasOwnProperty;var We=(i,t)=>{for(var e in t)gt(i,e,{get:t[e],enumerable:!0})},Jt=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Me(t))!Ne.call(i,n)&&n!==e&&gt(i,n,{get:()=>t[n],enumerable:!(s=Oe(t,n))||s.enumerable});return i};var Le=(i,t,e)=>(e=i!=null?ke(Ve(i)):{},Jt(t||!i||!i.__esModule?gt(e,"default",{value:i,enumerable:!0}):e,i)),je=i=>Jt(gt({},"__esModule",{value:!0}),i);var Ye={};We(Ye,{DISPATCH_ADDRESS:()=>Wt,EvmClaim:()=>D,EvmPlatform:()=>Y,EvmSigner:()=>Lt,FeeSwap:()=>$,Gas:()=>I,PlatformAdapter:()=>k,SolanaLilJit:()=>et,SolanaPlatform:()=>tt,SolanaSigner:()=>Ut,SubstrateClaim:()=>nt,SubstrateEvm:()=>R,SubstrateExec:()=>rt,SubstratePlatform:()=>at,SubstrateService:()=>b,SubstrateSigner:()=>Gt,SuiPlatform:()=>it,SuiSigner:()=>zt,TransferBuilder:()=>Ie,Wallet:()=>St,WhStatus:()=>Kt,WormholeScan:()=>lt,WormholeTransfer:()=>Xt,chunk:()=>Ke,deserializeV0:()=>qe,ixToHuman:()=>jt,serializeV0:()=>Xe});module.exports=je(Ye);var K=require("@galacticcouncil/common"),Pt=require("@galacticcouncil/xc-core");var U=require("@galacticcouncil/xc-core");var Rt=require("@galacticcouncil/xc-core"),It=require("viem"),_t=require("@wormhole-foundation/sdk-base"),D=class{redeem(t,e,s){let n=_t.encoding.b64.decode(e),r=_t.encoding.hex.encode(n),a=Rt.Abi.WormholeTransceiver,o=(0,It.encodeFunctionData)({abi:a,functionName:"receiveMessage",args:["0x"+r]});return{abi:JSON.stringify(a),data:o,from:t,to:s.transceiver.wormhole}}completeInboundQueuedTransfer(t,e,s){let n=Rt.Abi.NttManager,r=(0,It.encodeFunctionData)({abi:n,functionName:"completeInboundQueuedTransfer",args:[e]});return{abi:JSON.stringify(n),data:r,from:t,to:s.manager}}};var x=require("@galacticcouncil/xc-core");var pt=require("viem"),ft=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:r}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:r,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 pt.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:r}=this.config,a=this.client.getProvider(),o=await this.getNonce(t);try{let{results:m}=await a.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:r,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[u]=m;return u}catch(m){return console.log(`Can't simulate call!
3
+ `,m.details),{error:m}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:r}=(0,pt.decodeEventLog)({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:r})}catch{}}),e}};var N=class{static get(t,e){return new ft(t,e)}};var Qt=require("@galacticcouncil/xc-core"),Yt=require("viem");function ht(i){return i.module==="Snowbridge"&&i.func==="v2_sendMessage"}function kt(i){if(!ht(i))return;let t=i.args[1];if(!t||t.length===0)return;let[e,s]=(0,Yt.decodeAbiParameters)([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Ot(i){let t=i.module==="Snowbridge"&&i.func==="v2_sendMessage"&&Array.isArray(i.args[1])&&i.args[1].length===0,e=i.module==="Snowbridge"&&i.func==="sendToken"&&i.args[0]==="0x0000000000000000000000000000000000000000";return t||e}function Mt(i){return Object.entries(Qt.Precompile).map(([e,s])=>s).includes(i.address)}var oe=require("@galacticcouncil/xc-core"),Nt=require("polkadot-api");var W=require("@galacticcouncil/xc-core"),Ct=require("@galacticcouncil/common"),At=require("@polkadot-api/substrate-bindings"),Q=require("@polkadot-api/utils"),Vt=require("polkadot-api");var Zt=require("@galacticcouncil/common");async function te(i,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,r=e.chain.usesChainDecimals?s:n;return{amount:Zt.big.convertDecimals(i,r,n),decimals:n}}var ee=require("@galacticcouncil/common"),ne=i=>{let t=[];for(let e of i)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let r of n)if(r.fun.type==="Fungible"){let a=BigInt(r.fun.value);t.push(a)}}return t.reduce((e,s)=>e+s,0n)},T=i=>{let t=i.value.error;return t.type==="Module"?ee.enums.enumPath(t.value):JSON.stringify(t.value)};var yt=require("@galacticcouncil/common");function Ue(i){return{parents:0,interior:{type:"X1",value:i.startsWith("0x")?yt.xcm.toAccountKey20(i):yt.xcm.toAccountId32(i)}}}function se(i){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:i.parachainId}}}}}var He=(i,t)=>({id:yt.xcm.transform(i),fun:{type:"Fungible",value:t}}),re=(i,t,e,s,n,r)=>{console.log(r);let a=Ue(i),o=He(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:r}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:a}}]}};var{Ss58Addr:ae}=W.addr,b=class i{chain;_currency;constructor(t){this.chain=t}static async create(t){return new i(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let r=await this.client._request("system_accountNextIndex",[t]),a=At.u32.enc(r),o=l=>new TextEncoder().encode(l),m=new Uint8Array([...o(this.chain.parachainId.toString()),...(0,Q.fromHex)(t.startsWith("0x")?t.slice(2):t),...a,...(0,Q.fromHex)(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),u=(0,At.Blake2256)(m);return(0,Q.toHex)(u)}async dryRun(t,e){let s=(0,Vt.Enum)("Signed",t),n=(0,Vt.Enum)("system",s),r=await this.api.apis.DryRunApi.dry_run_call(n,e.decodedCall,4);if(!r.success)throw new Error("DryRun call failed");let a=r.value;if("type"in a&&"value"in a)throw new Error("DryRun call error: "+Ct.enums.enumPath(a.value));return a}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),r=await this.dryRun(s,n);if(r.execution_result?.success)return ne(r.emitted_events||[]);{let a=T(r.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
+ ${a}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,r="dest"in n?n.dest:void 0;if(!r)return t;let a=W.multiloc.findNestedKey(r,"interior"),o=W.multiloc.findParachain(r);if(W.multiloc.findGlobalConsensus(r))return t;if(o){let l=Ct.acc.getSovereignAccounts(o);return this.chain.parachainId===0?ae.encodePubKey(l.relay):ae.encodePubKey(l.generic)}let u=a&&a.interior;if(u==="Here"||u?.type==="Here")return this.chain.treasury||t}return t}};var bt=(1n<<64n)-1n,I={approve:200000n,transfer:1200000n,redeem:2000000n,queued:600000n},ie=i=>[i&bt,i>>64n&bt,i>>128n&bt,i>>192n&bt],R=class i{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(t){let e=await b.create(t);return new i(e,t)}async buildCall(t,e){let s=await this.#e.getDerivatedAddress(t),n=await this.#e.evmClient.getProvider().getGasPrice(),r=n+n/10n,a=this.#t.client.getUnsafeApi(),o=e.map(c=>a.tx.EVM.call({source:s,target:c.to,input:Nt.Binary.fromHex(c.data),value:ie(c.value??0n),gas_limit:c.gas,max_fee_per_gas:ie(r),max_priority_fee_per_gas:void 0,nonce:void 0,access_list:[]})),m=o.length===1?o[0]:a.tx.Utility.batch_all({calls:o.map(c=>c.decodedCall)}),u=e.length===1?"EVM.call":"Utility.batch_all",l=await m.getEncodedData();return{from:t,data:Nt.Binary.toHex(l),type:oe.CallType.Substrate,txOptions:void 0,dryRun:this.#t.isDryRunSupported()?async()=>{try{let c=await this.#t.dryRun(t,m),d=c.execution_result&&c.execution_result.success?void 0:T(c.execution_result);return{call:u,error:d,events:c.emitted_events||[],xcm:c.forwarded_xcms||[]}}catch(c){return{call:u,error:c instanceof Error?c.message:"unknown"}}}:()=>{}}}};var{EvmAddr:Ge}=x.addr,Y=class{#t;#e;constructor(t){this.#t=t,this.#e=t.evmClient}async buildCall(t,e,s,n){if(!Ge.isValid(t)&&this.#t instanceof x.EvmParachain)return this.buildSubstrateEvmCall(t,e,n);let r=N.get(this.#e,n),{abi:a,asset:o,calldata:m}=r,u={abi:JSON.stringify(a),data:m,from:t,to:n.address,type:x.CallType.Evm,value:n.value,dryRun:async()=>{let{error:f,logs:h}=await r.simulateCall(t),w=r.decodeEvents(h);return{call:n.module+"."+n.func,error:f?.shortMessage,events:w}}};if(Mt(n)||Ot(n))return u;let l=n.token??(ht(n)?kt(n):o),c=new x.Erc20Client(this.#e,l),d=await c.allowance(t,n.address);if(d>=e)return u;let g=c.approve(n.address,e);return{abi:JSON.stringify(x.Abi.Erc20),allowance:d,data:g,from:t,to:l,type:x.CallType.Evm,dryRun:()=>{}}}async buildSubstrateEvmCall(t,e,s){let n=this.#t,r=N.get(this.#e,s),{asset:a,calldata:o}=r,m=await R.create(n),u={to:s.address,data:o,value:s.value,gas:I.transfer};if(Mt(s)||Ot(s))return m.buildCall(t,[u]);let l=await n.getDerivatedAddress(t),c=s.token??(ht(s)?kt(s):a),d=new x.Erc20Client(this.#e,c);if(await d.allowance(l,s.address)>=e)return m.buildCall(t,[u]);let f=d.approve(s.address,e);return m.buildCall(t,[{to:c,data:f,gas:I.approve},u])}async estimateFee(t,e,s,n){let a=await N.get(this.#e,n).estimateFee(t,e);return s.copyWith({amount:a})}};var ce=require("@galacticcouncil/xc-core"),ue=require("@galacticcouncil/common"),me=require("polkadot-api"),Wt="0x0000000000000000000000000000000000000401",{H160:ze}=ue.h160,Lt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=ze.fromAny(t.from),n=this.#e.getProvider(),r=!1;if(this.#t instanceof ce.EvmParachain)try{let o=this.#t.client,m=me.Binary.fromHex(t.data);await o.getUnsafeApi().txFromCallData(m),r=!0}catch{}let a;if(r){let[o,m]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Wt}),n.getGasPrice()]),u=m+m/100n*10n;a=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:u,maxFeePerGas:u,gas:o*11n/10n,to:Wt})}else{let{data:o,to:m,value:u}=t,[l,c]=await Promise.all([n.estimateGas({account:s,data:o,to:m,value:u}),n.getGasPrice()]),d=c+c*5n/100n,g=l+l*30n/100n;a=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:m,value:u,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(a),n.waitForTransactionReceipt({hash:a}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};var he=require("@galacticcouncil/xc-core"),ye=require("buffer");var S=require("@solana/web3.js"),le=.5,de=2,ge=1,fe=1e6,$e=25e4,xt=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),r=await this.determineComputeBudget(n);return BigInt(r)}async getV0Message(t,e){let s=new S.PublicKey(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new S.TransactionMessage({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=le,s=de,n=ge,r=fe){let[a,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,r)]);return[S.ComputeBudgetProgram.setComputeUnitLimit({units:a}),S.ComputeBudgetProgram.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new S.VersionedTransaction(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new S.VersionedTransaction(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:r}=s.value;return r&&!n?Math.round(r*1.2):$e}async determinePriorityFee(t,e=le,s=de,n=ge,r=fe){let a=n,o=await this.getTxAccounts(t),m=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(m){let u=m.map(c=>c.prioritizationFee).filter(c=>c>0).sort((c,d)=>c-d),l=Math.ceil(u.length*e);if(u.length>l){let d=u[l]*s;a=Math.max(a,d)}}return Math.min(Math.max(a,n),r)}async getTxAccounts(t){let e=(await Promise.all(t.addressTableLookups.map(n=>this.connection.getAddressLookupTable(n.accountKey)))).map(n=>n.value).filter(n=>n!==null),s=t.getAccountKeys({addressLookupTableAccounts:e??void 0});return t.compiledInstructions.flatMap(n=>n.accountKeyIndexes).map(n=>t.isAccountWritable(n)?s.get(n):null).filter(n=>n!==null)}};var Z=class{static get(t,e){return new xt(t,e)}};var pe=require("@solana/web3.js");function jt(i){return i.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Ke(i,t){let e=[];for(let s=0;s<i.length;s+=t)e.push(i.slice(s,s+t));return e}function Xe(i){let t=i.serialize();return Buffer.from(t).toString("hex")}function qe(i){let t=Buffer.from(i,"hex"),e=Uint8Array.from(t);return pe.MessageV0.deserialize(e)}var tt=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let r=Z.get(this.#t,n),a=await r.getPriorityMessage(t),o=a.serialize(),m=ye.Buffer.from(o).toString("hex");return{from:t,data:m,ix:jt(n.instructions),signers:n.signers,type:he.CallType.Solana,dryRun:async()=>{let{err:u,logs:l}=await r.simulateTransaction(t,a);return{call:n.module+"."+n.func,error:u,events:l}}}}async estimateFee(t,e,s,n){let r=Z.get(this.#t,n),a=await r.estimateFee(t,e),o=await r.getPriorityMessage(t),{accounts:m}=await r.simulateTransaction(t,o),l=(m&&m[0])?.lamports;if(l){let c=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(c?e:0n)+n.rentReserve})}return s.copyWith({amount:a+n.rentReserve})}};var et=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 _=require("@solana/web3.js"),wt=require("buffer");var Ut=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new et(t)}async signAndSend(t,e){let{data:s,signers:n}=t,r=this.toVersioned(s,n);try{if(this.#e instanceof _.Keypair){r.sign([this.#e]);let u=await this.#t.connection.sendTransaction(r);e.onTransactionSend(u);let l=await this.#t.connection.getSignatureStatus(u);e.onStatus?.(l);return}let a=this.#e;await a.connect(),n&&r.sign(n);let{signature:o}=await a.signAndSendTransaction(r);e.onTransactionSend(o);let m=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(m)}catch(a){e.onError(a)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:r,signers:a}=n;return this.toVersioned(r,a)});try{let n;if(this.#e instanceof _.Keypair)s.forEach(m=>m.sign([this.#e])),n=s.map(m=>wt.Buffer.from(m.serialize()).toString("base64"));else{let m=this.#e;await m.connect(),n=(await m.signAllTransactions(s)).map(l=>wt.Buffer.from(l.serialize()).toString("base64"))}let r=await this.#n.simulateBundle(n);if(r.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(r,null,2));let a=await this.#n.sendBundle(n);e.onTransactionSend(a);let o=await this.#n.getInflightBundleStatuses([a]);e.onBundleStatus?.(o.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=wt.Buffer.from(t,"hex"),n=Uint8Array.from(s),r=_.MessageV0.deserialize(n),a=new _.VersionedTransaction(r);return e&&a.sign(e),a}};var nt=class i{#t;#e=new D;constructor(t){this.#t=t}static async create(t){let e=await R.create(t);return new i(e)}async redeem(t,e,s){let n=this.#e.redeem(t,e,s);return this.#t.buildCall(t,[{to:n.to,data:n.data,gas:I.redeem}])}async completeInboundQueuedTransfer(t,e,s){let n=this.#e.completeInboundQueuedTransfer(t,e,s);return this.#t.buildCall(t,[{to:n.to,data:n.data,gas:I.queued}])}};var vt=require("@galacticcouncil/xc-core"),st=require("polkadot-api");var rt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,r={}){let a=this.#t.api,o=await this.#t.getAsset(),m=this.#e.api,u=this.#e.chain,l=await u.getCurrency(),c=l.asset,d=l.decimals,g=u.getAssetXcmLocation(c),f=st.Binary.fromHex(s.data),w=await(await m.txFromCallData(f)).getPaymentInfo(e),X=BigInt(w.partial_fee)*120n/100n,q=vt.AssetAmount.fromAsset(c,{amount:X,decimals:d}),J=w.weight.ref_time,Tt=w.weight.proof_size,P=se(u),Et=re(e,g,q,J,Tt,f),qt=a.tx.PolkadotXcm.send({dest:P,message:Et}),O=[];try{let y=await this.#t.chain.dex.getCalldata(t,r.srcFeeAsset||o,c,q,10),dt=st.Binary.fromHex(y),Ft=await a.txFromCallData(dt);O.push(Ft)}catch{}let p=await n(q),M=st.Binary.fromHex(p.data),A=await a.txFromCallData(M);O.push(A),O.push(qt);let V=O.map(y=>y.decodedCall),E=a.tx.Utility.batch_all({calls:V}),Bt=await E.getEncodedData();return{from:t,data:st.Binary.toHex(Bt),type:vt.CallType.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let y=await this.#t.dryRun(t,E);return{call:"polkadotXcm.send",error:y.execution_result&&y.execution_result.success?void 0:T(y.execution_result),events:y.emitted_events||[],xcm:y.forwarded_xcms||[]}}catch(y){return{call:"polkadotXcm.send",error:y instanceof Error?y.message:"unknown"}}}:()=>{}}}};var L=require("@galacticcouncil/xc-core"),Ce=require("polkadot-api");var at=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 r=await this.#t,o=await this.useSignerFee(s)?{asset:new L.Asset(s)}:void 0,m=n.getTx(r.client),u=n.module+"."+n.func,l=await m.getEncodedData();return{from:t,data:Ce.Binary.toHex(l),type:L.CallType.Substrate,txOptions:o,dryRun:r.isDryRunSupported()?async()=>{try{let c=n.getTx(r.client),d=await r.dryRun(t,c),g=d.execution_result&&d.execution_result.success?void 0:T(d.execution_result);return{call:u,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(c){return{call:u,error:c instanceof Error?c.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let r=await this.#t,a=await r.estimateNetworkFee(t,n),o=await r.estimateDeliveryFee(t,n),m=await this.exchangeFee(a+o,s),u=await te(m,s,r);return s.copyWith(u)}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),r=await s.getDecimals();if(n.isEqual(e))return t;try{let a=s.chain.dex,o=L.AssetAmount.fromAsset(n,{amount:t,decimals:r});return(await a.getQuote(e,n,o,!0)).amount}catch{}return t}};var Ht=require("@galacticcouncil/xc-core"),j=require("polkadot-api"),Gt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),r=j.Binary.fromHex(t.data),a={};t.txOptions?.asset&&(a={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(r).then(o=>{o.signSubmitAndWatch(this.#e,a).subscribe({next:m=>{m.type==="broadcasted"&&e.onTransactionSend(m.txHash),m.type==="finalized"&&e.onFinalized(m)},error:m=>{e.onError(m)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=Ht.multiloc.findPalletInstance(e),n=Ht.multiloc.findGeneralIndex(e);return{parents:0,interior:(0,j.Enum)("X2",[(0,j.Enum)("PalletInstance",Number(s)),(0,j.Enum)("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};var xe=require("@galacticcouncil/xc-core"),we=require("@mysten/bcs");var Ae=require("@mysten/bcs");function be(i,t={}){let e=i.inputs??[],s=i.commands??[],n=t.numbers??"string",r=t.decode32As??"address",a=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),o=l=>{let c=(0,Ae.fromBase64)(l),d=g=>{let f=0n;for(let h=0;h<g;h++)f|=BigInt(c[h])<<8n*BigInt(h);return f};return c.length===1?{type:"pure",valueType:"u8",value:Number(c[0])}:c.length===2?{type:"pure",valueType:"u16",value:a(d(2))}:c.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:c.length===8?{type:"pure",valueType:"u64",value:a(d(8))}:c.length===32&&r==="address"?{type:"pure",valueType:"address",value:"0x"+[...c].map(f=>f.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(c)}},m=l=>{let c=e[l];if(!c)return{Input:l};if(c.Pure?.bytes)return o(c.Pure.bytes);let d=c.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=c.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},u=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?m(l.Input):l;return s.map(l=>{if(l.MoveCall){let c=l.MoveCall;return{MoveCall:{...c,arguments:(c.arguments??[]).map(u)}}}if(l.SplitCoins){let c=l.SplitCoins,d=c.coin?.GasCoin?"GasCoin":u(c.coin),g=(c.amounts??[]).map(u);return{SplitCoins:[d,g]}}if(l.MergeCoins){let c=l.MergeCoins;return{MergeCoins:{...c,destination:u(c.destination),sources:(c.sources??[]).map(u)}}}if(l.TransferObjects){let c=l.TransferObjects;return{TransferObjects:{...c,objects:(c.objects??[]).map(u),address:u(c.address)}}}return l})}var it=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:r}=n;r.setSender(t);let a=await r.build({client:this.#t}),o=await r.toJSON(),m=be(JSON.parse(o));return{from:t,commands:m,data:(0,we.toBase64)(a),type:xe.CallType.Sui,dryRun:async()=>{let u=await this.#t.dryRunTransactionBlock({transactionBlock:a});return{call:n.module+"."+n.func,error:u.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:r}=n;r.setSender(t);let a=await r.build({client:this.#t}),m=(await this.#t.dryRunTransactionBlock({transactionBlock:a})).effects.gasUsed,u=BigInt(m.computationCost),l=BigInt(m.storageCost),c=u+l;return s.copyWith({amount:c})}};var ve=require("@mysten/sui/keypairs/ed25519"),Se=require("@mysten/sui/transactions"),zt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,r=this.#t.client;try{if(this.#e instanceof ve.Ed25519Keypair){let m=Se.Transaction.from(n),u=await r.signAndExecuteTransaction({signer:this.#e,transaction:m,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(u.digest);return}let a=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),o=await r.executeTransactionBlock({transactionBlock:a.transaction,signature:a.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(o.digest)}catch(a){e.onError(a)}}};var k=class{platform={};constructor(t){switch(t.getType()){case U.ChainType.EvmChain:this.registerEvm(t);break;case U.ChainType.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case U.ChainType.Parachain:this.registerSubstrate(t);break;case U.ChainType.SolanaChain:this.registerSolana(t);break;case U.ChainType.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new Y(e)}registerSolana(t){let e=t;this.platform.Solana=new tt(e)}registerSui(t){let e=t;this.platform.Sui=new it(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new at(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)}};var z=require("@galacticcouncil/xc-core"),ct=require("@galacticcouncil/common");var Pe=require("@galacticcouncil/common"),H=Le(require("big.js"),1);function Te(i,t,e,s){let n=i.toBig().minus(e.toBig()).minus(i.isSame(t)?t.toBig():new H.default(0));return s&&(n=n.minus(i.isSame(s)?s.toBig():new H.default(0))),i.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function Ee(i,t,e,s){let r=i.copyWith({amount:0n}).toBig().plus(i.isSame(t)?t.toBig():new H.default(0)).plus(i.toBig().lt(e.toBig())?e.toBig():new H.default(0));return s&&(r=r.plus(i.isSame(s)&&i.toBig().lt(s.toBig())?s.toBig():new H.default(0))),i.copyWith({amount:BigInt(r.toFixed())})}async function Be(i,t){return t.isEvmParachain()?t.getDerivatedAddress(i):i}function Fe(i,t){return t?Pe.big.toBigInt(t,i):0n}async function $t(i,t){let e=i.getAssetDecimals(t);return e||(await i.getCurrency()).decimals}var ot=require("@galacticcouncil/xc-core");var G=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof ot.Parachain?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof ot.Parachain)return this.chain.getMin(this.asset);let t=await $t(this.chain,this.asset);return ot.AssetAmount.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return $t(this.chain,t)}};var ut=class extends G{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=e}async getCall(t){let{amount:e,sender:s,source:n}=t,r=await this.getTransfer(t);return this.adapter.buildCall(s,e,n.feeBalance,r)}async getDestinationFee(t){let{chain:e,route:s}=this.config,{source:n,destination:r,transact:a}=s,o=r.fee.amount,m=n.destinationFee??r.fee.asset,u=await this.getDecimals(m);if(Number.isFinite(o))return{fee:z.AssetAmount.fromAsset(m,{amount:ct.big.toBigInt(o,u),decimals:u}),feeBreakdown:{}};let l=o,{amount:c,breakdown:d}=await l.build({feeAsset:m,transferAsset:n.asset,source:a?a.chain:e,destination:r.chain,amount:t});return{fee:z.AssetAmount.fromAsset(m,{amount:c,decimals:u}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,r=e.destinationFee??s.fee.asset;return n.isEqual(r)?this.getBalance(t):this.config.chain.getBalance(r,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:r,source:a}=t,o=await this.getTransfer(t),m=s.contract?await Be(r,e):r,u=await this.adapter.estimateFee(m,n,a.feeBalance,o),{fee:l}=s.source,c=l?Fe(u.decimals,l.extra):0n,d=u.amount+c;return u.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,r=n.fee,a=n.asset;if(!r)return a;let o=r.asset;return e instanceof z.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:r,program:a,move:o}=s;if(r){let{address:u,amount:l,asset:c,sender:d}=t,f=await(await b.create(e)).buildMessageId(d,l,c.originSymbol,u);return r.build({...t,messageId:f})}let m=n||a||o;if(m)return m.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}}),r={...t,...n};return{...await this.getTransactData(s,r),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,r=await n.build(e),a=await b.create(s),o=r.getTx(a.client),m=e.source.chain,u=e.sender,l=ct.acc.getMultilocationDerivatedAccount(m.parachainId,u,s.parachainId===0?0:1,s.usesH160Acc),c=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:c.weight.ref_time,proofSize:c.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=ct.big.toBigInt(e.amount,s);return z.AssetAmount.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var mt=class extends G{};var De=require("@galacticcouncil/xc-core"),$=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:De.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,r=this.feeBalance.amount-t.amount>e*2n;return{aIn:t.copyWith({amount:e}),aOut:this.destFee,enabled:n&&r,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 St=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,r){let a=(0,Pt.ConfigBuilder)(this.config).assets().asset(t).source(s).destination(r).build();return this.getTransferData(a,e,n)}async remoteXcm(t,e,s,n,r={}){let a=this.config.getChain(e),o=this.config.getChain(s);if(!(a.isSubstrate()&&o.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[u,l]=await Promise.all([b.create(a),b.create(o)]),c=new rt(u,l),d=K.acc.getMultilocationDerivatedAccount(a.parachainId,t,1,o.usesH160Acc),g=await l.getAsset(),f=await this.transfer(g,t,e,d,s);return c.remoteExec(t,d,n,h=>{let w=h.toDecimal();return f.buildCall(w)},r)}async getTransferData(t,e,s){let n=t.origin,{chain:r,asset:a}=n.route.destination,o=new k(n.chain),m=new k(r),u=new ut(o,n),l=new mt(m,r,a),c=new Pt.TransferValidator(...this.validations),[d,g,f,h,w,X,q]=await Promise.all([u.getBalance(e),u.getFeeBalance(e),u.getDestinationFee(),u.getDestinationFeeBalance(e),u.getMin(),l.getBalance(s),l.getMin()]),{source:J,destination:Tt}=n.route,P=f.fee.copyWith(Tt.fee.asset),Et=f.feeBreakdown,O=J.asset.isEqual(P)&&P.amount>10n?P.amount+1n:10n,p={address:s,amount:O,asset:J.asset,destination:{balance:X,chain:r,fee:P,feeBreakdown:Et},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:f.fee,destinationFeeBalance:h}};p.transact=await u.getTransact(p);let M=new $(p),A=await u.getFee(p),V;M.isSwapSupported(J.fee)&&(V=await M.getSwap(A),p.source.feeSwap=V);let E;M.isDestinationSwapSupported(A)&&(E=await M.getDestinationSwap(A),p.source.destinationFeeSwap=E),(V||E)&&(A=await u.getFee(p),A=A.padByPct(5n));let Bt=await l.getEd(),y=Ee(X,P,q,Bt),dt=await u.getEd(),Ft=Te(d,A,w,dt);p.amount=0n,p.source.fee=A;let Dt={source:{balance:d,destinationFee:f.fee,destinationFeeBalance:h,destinationFeeSwap:E,fee:A,feeBalance:g,feeSwap:V,max:Ft,min:d.copyWith({amount:y.amount})},destination:{balance:X,fee:P},reversible:t.reversible,async buildCall(B){let C=Object.assign({},p);return C.amount=K.big.toBigInt(B,d.decimals),C.transact=await u.getTransact(C),u.getCall(C)},async estimateFee(B){let C=Object.assign({},p);return C.amount=K.big.toBigInt(B,d.decimals),C.transact=await u.getTransact(C),u.getFee(C)},async estimateDestinationFee(B){let C=K.big.toBigInt(B,d.decimals),{fee:F,feeBreakdown:_e}=await u.getDestinationFee(C);return p.destination.fee=F,p.destination.feeBreakdown=_e,p.source.destinationFee=F,Dt.destination.fee=F,Dt.source.destinationFee=F,F},async validate(B){let C=Object.assign({},p),F=B||A.amount;return C.source.fee=A.copyWith({amount:F}),c.validate(C)}};return Dt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),r=n.getUniqueRoutes().map(a=>a.source.asset);return n.chain.subscribeBalances(r,t).subscribe(s)}};var Re=require("@galacticcouncil/xc-core");function Ie(i){let t=(0,Re.ConfigBuilder)(i.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let r=s.source(n);return{destinations:r,withDestination(a){let{routes:o,destinationAssets:m,isAssetSelect:u,isTagSelect:l,build:c}=r.destination(a);return{routes:o,destinationAssets:m,isAssetSelect:u,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:f,tag:h}){let w=c(f,h);return i.getTransferData(w,d,g)}}}}}}}}}var Je="https://api.wormholescan.io",lt=class{_baseUrl;constructor(t){this._baseUrl=t||Je}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()}};var v=require("@galacticcouncil/xc-core");var Kt=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(Kt||{});var{EvmAddr:Qe}=v.addr,Xt=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new lt}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}}get parachain(){return this.chains.find(e=>e instanceof v.Parachain&&e.parachainId===this.parachainId)}async getWithdraws(t){let e=v.Wormhole.fromChain(this.parachain);return(await this.getTransfers(t)).filter(n=>n.operation.emitterChain===e.getWormholeId())}async getDeposits(t){let e=v.Wormhole.fromChain(this.parachain);return(await this.getTransfers(t)).filter(n=>n.operation.content.standarizedProperties.toChain===e.getWormholeId())}async getTransfers(t){let e=await this.parachain.getDerivatedAddress(t);return(await this.whScan.getOperations({...this.filters,address:e})).map(n=>this.toTransfer(n)).filter(n=>!!n)}toTransfer(t){let{content:e,emitterChain:s,emitterAddress:n,sourceChain:r}=t,{standarizedProperties:a}=e,o=this.findNttByEmitter(s,n.native);if(!o)return;let m=this.findChainByWormholeId(a.toChain);if(!m)return;let u=this.getStatus(t),l,c=this.findNtt(m,o.assetKey);if(u===1&&t.vaa&&c){let d=t.vaa.raw;l=async g=>!Qe.isValid(g)&&m instanceof v.EvmParachain?(await nt.create(m)).redeem(g,d,c):new D().redeem(g,d,c)}return{asset:a.tokenAddress,assetSymbol:t.data.symbol,amount:t.data.tokenAmount,from:r.from,fromChain:o.chain,to:a.toAddress,toChain:m,status:u,redeem:l,operation:t}}findChainByWormholeId(t){return this.chains.find(e=>v.Wormhole.isKnown(e)&&v.Wormhole.fromChain(e).getWormholeId()===t)}findNtt(t,e){if("ntt"in t&&t.ntt)return t.ntt[e]}findNttByEmitter(t,e){let s=this.findChainByWormholeId(t);if(!s||!("ntt"in s)||!s.ntt)return;let n=s.ntt,r=Object.entries(n).find(([a,o])=>o.transceiver.wormhole.toLowerCase()===e.toLowerCase());if(r){let[a,o]=r;return{chain:s,assetKey:a,def:o}}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};0&&(module.exports={DISPATCH_ADDRESS,EvmClaim,EvmPlatform,EvmSigner,FeeSwap,Gas,PlatformAdapter,SolanaLilJit,SolanaPlatform,SolanaSigner,SubstrateClaim,SubstrateEvm,SubstrateExec,SubstratePlatform,SubstrateService,SubstrateSigner,SuiPlatform,SuiSigner,TransferBuilder,Wallet,WhStatus,WormholeScan,WormholeTransfer,chunk,deserializeV0,ixToHuman,serializeV0});
package/build/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{acc as Nn,big as wt}from"@galacticcouncil/common";import{ConfigBuilder as Kn,TransferValidator as Hn}from"@galacticcouncil/xc-core";import{ChainType as L}from"@galacticcouncil/xc-core";import{Abi as he,Wormhole as ye}from"@galacticcouncil/xc-core";import{encodeFunctionData as Ce}from"viem";import{encoding as St}from"@wormhole-foundation/sdk-base";var Q=class{#t;constructor(t){this.#t=t}redeem(t,e){let s=ye.fromChain(this.#t),n=St.b64.decode(e),a=St.hex.encode(n),r=he.TokenBridge,o=Ce({abi:r,functionName:"completeTransfer",args:["0x"+a]});return{abi:JSON.stringify(r),data:o,from:t,to:s.getTokenBridge()}}};import{Abi as ve,CallType as Bt,Erc20Client as Se}from"@galacticcouncil/xc-core";import{ContractFunctionExecutionError as Ae,decodeEventLog as xe}from"viem";var Y=class{client;config;constructor(t,e){this.validateClient(t),this.client=t,this.config=e}validateClient(t){if(!t)throw new Error("No EVM client found")}get abi(){return this.config.abi}get asset(){let t=this.config.args,[e]=t;return e}get calldata(){return this.config.encodeFunctionData()}async estimateGas(t){let{address:e,args:s,value:n,func:a}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:a,args:s,value:n,account:t})}async estimateFee(t,e){if(e===0n)return 0n;try{let s=await this.estimateGas(t),n=await this.getGasPrice();return s*n}catch(s){return s instanceof Ae?console.log(`Can't estimate fees!
2
- `,s.message):console.log(s),0n}}async getGasPrice(){return this.client.getProvider().getGasPrice()}async getNonce(t){return this.client.getProvider().getTransactionCount({address:t})}async simulateCall(t){let{address:e,args:s,value:n,func:a}=this.config,r=this.client.getProvider(),o=await this.getNonce(t);try{let{results:m}=await r.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:a,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[i]=m;return i}catch(m){return console.log(`Can't simulate call!
3
- `,m.details),{error:m}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:a}=xe({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:a})}catch{}}),e}};var K=class{static get(t,e){return new Y(t,e)}};import{Precompile as be}from"@galacticcouncil/xc-core";import{decodeAbiParameters as we}from"viem";function ft(c){return c.module==="Snowbridge"&&c.func==="v2_sendMessage"}function Pt(c){if(!ft(c))return;let t=c.args[1];if(!t||t.length===0)return;let[e,s]=we([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function Tt(c){let t=c.module==="Snowbridge"&&c.func==="v2_sendMessage"&&Array.isArray(c.args[1])&&c.args[1].length===0,e=c.module==="Snowbridge"&&c.func==="sendToken"&&c.args[0]==="0x0000000000000000000000000000000000000000";return c.module==="TokenBridge"&&["wrapAndTransferETHWithPayload","wrapAndTransferETH"].includes(c.func)||t||e}function Et(c){return Object.entries(be).map(([e,s])=>s).includes(c.address)}var Z=class{#t;constructor(t){this.#t=t.evmClient}async buildCall(t,e,s,n){let a=K.get(this.#t,n),{abi:r,asset:o,calldata:m}=a,i={abi:JSON.stringify(r),data:m,from:t,to:n.address,type:Bt.Evm,value:n.value,dryRun:async()=>{let{error:p,logs:f}=await a.simulateCall(t),y=a.decodeEvents(f);return{call:n.module+"."+n.func,error:p?.shortMessage,events:y}}};if(Et(n)||Tt(n))return i;let l=ft(n)?Pt(n):o,u=new Se(this.#t,l),d=await u.allowance(t,n.address);if(d>=e)return i;let g=u.approve(n.address,e);return{abi:JSON.stringify(ve.Erc20),allowance:d,data:g,from:t,to:l,type:Bt.Evm,dryRun:()=>{}}}async estimateFee(t,e,s,n){let r=await K.get(this.#t,n).estimateFee(t,e);return s.copyWith({amount:r})}};import{EvmParachain as Pe}from"@galacticcouncil/xc-core";import{h160 as Te}from"@galacticcouncil/common";import{Binary as Ee}from"polkadot-api";var Ft="0x0000000000000000000000000000000000000401",{H160:Be}=Te,It=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Be.fromAny(t.from),n=this.#e.getProvider(),a=!1;if(this.#t instanceof Pe)try{let o=this.#t.client,m=Ee.fromHex(t.data);await o.getUnsafeApi().txFromCallData(m),a=!0}catch{}let r;if(a){let[o,m]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Ft}),n.getGasPrice()]),i=m+m/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:Ft})}else{let{data:o,to:m,value:i}=t,[l,u]=await Promise.all([n.estimateGas({account:s,data:o,to:m,value:i}),n.getGasPrice()]),d=u+u*5n/100n,g=l+l*30n/100n;r=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:m,value:i,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(r),n.waitForTransactionReceipt({hash:r}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};import{CallType as ke}from"@galacticcouncil/xc-core";import{Buffer as _e}from"buffer";import{ComputeBudgetProgram as Dt,PublicKey as Fe,TransactionMessage as Ie,VersionedTransaction as Rt}from"@solana/web3.js";var kt=.5,_t=2,Vt=1,Ot=1e6,De=25e4,tt=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 Fe(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Ie({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=kt,s=_t,n=Vt,a=Ot){let[r,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,a)]);return[Dt.setComputeUnitLimit({units:r}),Dt.setComputeUnitPrice({microLamports:o})]}async simulateTransaction(t,e){let s=new Rt(e);return(await this.connection.simulateTransaction(s,{accounts:{encoding:"base64",addresses:[t]}})).value}async determineComputeBudget(t){let e=new Rt(t),s=await this.connection.simulateTransaction(e),{err:n,unitsConsumed:a}=s.value;return a&&!n?Math.round(a*1.2):De}async determinePriorityFee(t,e=kt,s=_t,n=Vt,a=Ot){let r=n,o=await this.getTxAccounts(t),m=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(m){let i=m.map(u=>u.prioritizationFee).filter(u=>u>0).sort((u,d)=>u-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 H=class{static get(t,e){return new tt(t,e)}};import{MessageV0 as Re}from"@solana/web3.js";function _(c){return c.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Mt(c,t){let e=[];for(let s=0;s<c.length;s+=t)e.push(c.slice(s,s+t));return e}function U(c){let t=c.serialize();return Buffer.from(t).toString("hex")}function Ys(c){let t=Buffer.from(c,"hex"),e=Uint8Array.from(t);return Re.deserialize(e)}var et=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let a=H.get(this.#t,n),r=await a.getPriorityMessage(t),o=r.serialize(),m=_e.from(o).toString("hex");return{from:t,data:m,ix:_(n.instructions),signers:n.signers,type:ke.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=H.get(this.#t,n),r=await a.estimateFee(t,e),o=await a.getPriorityMessage(t),{accounts:m}=await a.simulateTransaction(t,o),l=(m&&m[0])?.lamports;if(l){let u=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(u?e:0n)+n.rentReserve})}return s.copyWith({amount:r+n.rentReserve})}};import{CallType as nt,Wormhole as Ve}from"@galacticcouncil/xc-core";import{Keypair as Wt,PublicKey as j,SystemProgram as Nt,TransactionMessage as Oe}from"@solana/web3.js";import{ACCOUNT_SIZE as Me,NATIVE_MINT as st,TOKEN_PROGRAM_ID as We,createAssociatedTokenAccountIdempotentInstruction as Kt,createCloseAccountInstruction as Ne,createInitializeAccountInstruction as Ke,createTransferInstruction as He,getAssociatedTokenAddressSync as Ue,getMinimumBalanceForRentExemptAccount as je,getMint as Le}from"@solana/spl-token";import{utils as ze}from"@wormhole-foundation/sdk-solana";import{utils as Ht}from"@wormhole-foundation/sdk-solana-core";import{encoding as $e}from"@wormhole-foundation/sdk-base";import{deserialize as Ut}from"@wormhole-foundation/sdk-definitions";import{createCompleteTransferNativeInstruction as jt,createCompleteTransferWrappedInstruction as Ge}from"@wormhole-foundation/sdk-solana-tokenbridge";var V=class{#t;constructor(t){this.#t=t.connection}async sendBundle(t){let{result:e}=await this.#t._rpcRequest("sendBundle",[t]);return e}async simulateBundle(t){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 V(t)}async redeem(t,e,s){let n=Ve.fromChain(this.#t),a=$e.b64.decode(e),r=Ut("TokenBridge:Transfer",a),o=Ut("Uint8Array",a),m=this.derivePostedVaaKey(n.getCoreBridge(),Buffer.from(r.hash)),i=new j(t),l=s?new j(s):i,u=i.equals(l),d=[];if(!await this.#e.getAccountInfo(m)){let h=Wt.generate(),I=await Ht.createVerifySignaturesInstructions(this.#t.connection,n.getCoreBridge(),i,o,h.publicKey),S=Mt(I,2);for(let C=0;C<S.length;C++){let T=S[C],b=await this.getV0Message(i,T),F=U(b);d.push({from:t,data:F,ix:_(T),signers:[h],type:nt.Solana})}let E=Ht.createPostVaaInstruction(this.#e,n.getCoreBridge(),i,o,h.publicKey),J=await this.getV0Message(i,[E]),B=U(J);d.push({from:t,data:B,ix:_([E]),type:nt.Solana})}let p=r.payload.token.chain==="Solana",f=new j(r.payload.token.address.toUint8Array()),y=p&&f.equals(st),x=await this.#n.getTipAccount(),A=Nt.transfer({fromPubkey:i,toPubkey:new j(x[0]),lamports:1e3});if(y&&u){let h=await this.redeemAndUnwrap(n,i,r,A);d.push(h)}else{let h=await this.redeemToken(n,i,l,f,p,r,A);d.push(h)}return d}async redeemToken(t,e,s,n,a,r,o){let i=(a?jt:Ge)(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,r),l=Ue(n,s),u=Kt(e,l,s,n),d=await this.getV0Message(e,[u,i,o]),g=U(d);return{from:e.toBase58(),data:g,ix:_([u,i]),type:nt.Solana}}async redeemAndUnwrap(t,e,s,n){let a=new j(s.payload.to.address.toUint8Array()),r=await Le(this.#e,st),o=s.payload.token.amount*BigInt(Math.pow(10,r.decimals-8)),m=await je(this.#e),i=Wt.generate(),l=Kt(e,a,e,st),u=jt(this.#e,t.getTokenBridge(),t.getCoreBridge(),e,s),d=Nt.createAccount({fromPubkey:e,newAccountPubkey:i.publicKey,lamports:m,space:Me,programId:We}),g=Ke(i.publicKey,st,e),p=He(a,i.publicKey,e,o),f=Ne(i.publicKey,e,e),y=[l,u,d,g,p,f,n],x=await this.getV0Message(e,y),A=U(x);return{from:e.toBase58(),data:A,ix:_(y),signers:[i],type:nt.Solana}}derivePostedVaaKey(t,e){return ze.deriveAddress([Buffer.from("PostedVAA"),e],t)}async getV0Message(t,e){let{blockhash:s}=await this.#e.getLatestBlockhash("finalized");return new Oe({payerKey:t,recentBlockhash:s,instructions:e}).compileToV0Message()}};import{Keypair as Lt,MessageV0 as Xe,VersionedTransaction as Je}from"@solana/web3.js";import{Buffer as ht}from"buffer";var zt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new V(t)}async signAndSend(t,e){let{data:s,signers:n}=t,a=this.toVersioned(s,n);try{if(this.#e instanceof Lt){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 m=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(m)}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 Lt)s.forEach(m=>m.sign([this.#e])),n=s.map(m=>ht.from(m.serialize()).toString("base64"));else{let m=this.#e;await m.connect(),n=(await m.signAllTransactions(s)).map(l=>ht.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=ht.from(t,"hex"),n=Uint8Array.from(s),a=Xe.deserialize(n),r=new Je(a);return e&&r.sign(e),r}};import{Abi as qe,CallType as Qe,Precompile as Ye,Wormhole as Ze}from"@galacticcouncil/xc-core";import{encoding as $t}from"@wormhole-foundation/sdk-base";import{encodeFunctionData as tn}from"viem";import{Binary as Gt}from"polkadot-api";var rt=class{#t;constructor(t){this.#t=t,Ze.fromChain(this.#t)}redeemMrl(t,e){let s=$t.b64.decode(e),n=$t.hex.encode(s),a=qe.Gmp,r=tn({abi:a,functionName:"wormholeTransferERC20",args:["0x"+n]});return{abi:JSON.stringify(a),data:r,from:t,to:Ye.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],action:{type:"Call",value:a.to},value:[0n,0n,0n,0n],input:Gt.fromHex(a.data),access_list:void 0}}}).getEncodedData();return{data:Gt.toHex(o),from:t,type:Qe.Substrate,dryRun:async()=>{},txOptions:void 0}}};import{AssetAmount as rn,CallType as on}from"@galacticcouncil/xc-core";import{Binary as it}from"polkadot-api";import{big as en}from"@galacticcouncil/common";async function Xt(c,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,a=e.chain.usesChainDecimals?s:n;return{amount:en.convertDecimals(c,a,n),decimals:n}}import{enums as nn}from"@galacticcouncil/common";var Jt=c=>{let t=[];for(let e of c)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let a of n)if(a.fun.type==="Fungible"){let r=BigInt(a.fun.value);t.push(r)}}return t.reduce((e,s)=>e+s,0n)},O=c=>{let t=c.value.error;return t.type==="Module"?nn.enumPath(t.value):JSON.stringify(t.value)};import{xcm as yt}from"@galacticcouncil/common";function sn(c){return{parents:0,interior:{type:"X1",value:c.startsWith("0x")?yt.toAccountKey20(c):yt.toAccountId32(c)}}}function qt(c){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:c.parachainId}}}}}var an=(c,t)=>({id:yt.transform(c),fun:{type:"Fungible",value:t}}),Qt=(c,t,e,s,n,a)=>{console.log(a);let r=sn(c),o=an(t,e.amount);return{type:"V4",value:[{type:"WithdrawAsset",value:[o]},{type:"BuyExecution",value:{fees:o,weight_limit:{type:"Unlimited"}}},{type:"Transact",value:{origin_kind:{type:"SovereignAccount"},require_weight_at_most:{ref_time:s,proof_size:n},call:a}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:r}}]}};var ot=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,a={}){let r=this.#t.api,o=await this.#t.getAsset(),m=this.#e.api,i=this.#e.chain,l=await i.getCurrency(),u=l.asset,d=l.decimals,g=i.getAssetXcmLocation(u),p=it.fromHex(s.data),y=await(await m.txFromCallData(p)).getPaymentInfo(e),x=BigInt(y.partial_fee)*120n/100n,A=rn.fromAsset(u,{amount:x,decimals:d}),h=y.weight.ref_time,I=y.weight.proof_size,S=qt(i),E=Qt(e,g,A,h,I,p),J=r.tx.PolkadotXcm.send({dest:S,message:E}),B=[];try{let w=await this.#t.chain.dex.getCalldata(t,a.srcFeeAsset||o,u,A,10),q=it.fromHex(w),gt=await r.txFromCallData(q);B.push(gt)}catch{}let C=await n(A),T=it.fromHex(C.data),b=await r.txFromCallData(T);B.push(b),B.push(J);let F=B.map(w=>w.decodedCall),D=r.tx.Utility.batch_all({calls:F}),dt=await D.getEncodedData();return{from:t,data:it.toHex(dt),type:on.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let w=await this.#t.dryRun(t,D);return{call:"polkadotXcm.send",error:w.execution_result&&w.execution_result.success?void 0:O(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 pn,AssetAmount as fn,CallType as hn}from"@galacticcouncil/xc-core";import{Binary as yn}from"polkadot-api";import{addr as cn,multiloc as Ct}from"@galacticcouncil/xc-core";import{acc as un,enums as mn}from"@galacticcouncil/common";import{Blake2256 as ln,u32 as dn}from"@polkadot-api/substrate-bindings";import{toHex as gn,fromHex as Yt}from"@polkadot-api/utils";import{Enum as Zt}from"polkadot-api";var{Ss58Addr:te}=cn,P=class c{chain;_currency;constructor(t){this.chain=t}static async create(t){return new c(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let a=await this.client._request("system_accountNextIndex",[t]),r=dn.enc(a),o=l=>new TextEncoder().encode(l),m=new Uint8Array([...o(this.chain.parachainId.toString()),...Yt(t.startsWith("0x")?t.slice(2):t),...r,...Yt(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),i=ln(m);return gn(i)}async dryRun(t,e){let s=Zt("Signed",t),n=Zt("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 Jt(a.emitted_events||[]);{let r=O(a.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
- ${r}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,a="dest"in n?n.dest:void 0;if(!a)return t;let r=Ct.findNestedKey(a,"interior"),o=Ct.findParachain(a);if(Ct.findGlobalConsensus(a))return t;if(o){let l=un.getSovereignAccounts(o);return this.chain.parachainId===0?te.encodePubKey(l.relay):te.encodePubKey(l.generic)}let i=r&&r.interior;if(i==="Here"||i?.type==="Here")return this.chain.treasury||t}return t}};var ct=class{#t;constructor(t){this.#t=P.create(t)}async useSignerFee(t){let e=await this.#t,s=await e.getAsset();return e.chain.usesSignerFee&&!s.isEqual(t)}async buildCall(t,e,s,n){let a=await this.#t,o=await this.useSignerFee(s)?{asset:new pn(s)}:void 0,m=n.getTx(a.client),i=n.module+"."+n.func,l=await m.getEncodedData();return{from:t,data:yn.toHex(l),type:hn.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:O(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),m=await this.exchangeFee(r+o,s),i=await Xt(m,s,a);return s.copyWith(i)}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=fn.fromAsset(n,{amount:t,decimals:a});return(await r.getQuote(e,n,o,!0)).amount}catch{}return t}};import{multiloc as ee}from"@galacticcouncil/xc-core";import{Binary as Cn,Enum as At}from"polkadot-api";var ne=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),a=Cn.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:m=>{m.type==="broadcasted"&&e.onTransactionSend(m.txHash),m.type==="finalized"&&e.onFinalized(m)},error:m=>{e.onError(m)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=ee.findPalletInstance(e),n=ee.findGeneralIndex(e);return{parents:0,interior:At("X2",[At("PalletInstance",Number(s)),At("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as xn,Wormhole as bn}from"@galacticcouncil/xc-core";import{Transaction as wn}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as vn}from"@mysten/sui/utils";import{toBase64 as Sn}from"@mysten/bcs";import{encoding as Pn,serialize as Tn,toChainId as En}from"@wormhole-foundation/sdk-connect";import{deserialize as Bn}from"@wormhole-foundation/sdk-definitions";import{getPackageId as se}from"@wormhole-foundation/sdk-sui";import{getTokenCoinType as Fn}from"@wormhole-foundation/sdk-sui-tokenbridge";import{fromBase64 as An}from"@mysten/bcs";function ut(c,t={}){let e=c.inputs??[],s=c.commands??[],n=t.numbers??"string",a=t.decode32As??"address",r=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),o=l=>{let u=An(l),d=g=>{let p=0n;for(let f=0;f<g;f++)p|=BigInt(u[f])<<8n*BigInt(f);return p};return u.length===1?{type:"pure",valueType:"u8",value:Number(u[0])}:u.length===2?{type:"pure",valueType:"u16",value:r(d(2))}:u.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:u.length===8?{type:"pure",valueType:"u64",value:r(d(8))}:u.length===32&&a==="address"?{type:"pure",valueType:"address",value:"0x"+[...u].map(p=>p.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(u)}},m=l=>{let u=e[l];if(!u)return{Input:l};if(u.Pure?.bytes)return o(u.Pure.bytes);let d=u.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=u.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},i=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?m(l.Input):l;return s.map(l=>{if(l.MoveCall){let u=l.MoveCall;return{MoveCall:{...u,arguments:(u.arguments??[]).map(i)}}}if(l.SplitCoins){let u=l.SplitCoins,d=u.coin?.GasCoin?"GasCoin":i(u.coin),g=(u.amounts??[]).map(i);return{SplitCoins:[d,g]}}if(l.MergeCoins){let u=l.MergeCoins;return{MergeCoins:{...u,destination:i(u.destination),sources:(u.sources??[]).map(i)}}}if(l.TransferObjects){let u=l.TransferObjects;return{TransferObjects:{...u,objects:(u.objects??[]).map(i),address:i(u.address)}}}return l})}var ae=class{#t;constructor(t){this.#t=t}async redeem(t,e){let s=bn.fromChain(this.#t),n=this.#t.client,a=Pn.b64.decode(e),r=Bn("TokenBridge:Transfer",a),o=s.getCoreBridge(),m=s.getTokenBridge(),i=await Fn(n,m,r.payload.token.address.toUint8Array(),En(r.payload.token.chain));if(!i)throw new Error("Unable to fetch token coinType");let[l,u]=await Promise.all([se(n,o),se(n,m)]),d=new wn;d.setSender(t);let[g]=d.moveCall({target:`${l}::vaa::parse_and_verify`,arguments:[d.object(o),d.pure.vector("u8",Tn(r)),d.object(vn)]}),[p]=d.moveCall({target:`${u}::vaa::verify_only_once`,arguments:[d.object(m),g]}),[f]=d.moveCall({target:`${u}::complete_transfer::authorize_transfer`,arguments:[d.object(m),p],typeArguments:[i]}),[y]=d.moveCall({target:`${u}::complete_transfer::redeem_relayer_payout`,arguments:[f],typeArguments:[i]});d.moveCall({target:`${u}::coin_utils::return_nonzero`,arguments:[y],typeArguments:[i]});let x=await d.build({client:n}),A=await d.toJSON(),h=ut(JSON.parse(A));return{from:t,commands:h,data:Sn(x),type:xn.Sui}}};import{CallType as In}from"@galacticcouncil/xc-core";import{toBase64 as Dn}from"@mysten/bcs";var mt=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(),m=ut(JSON.parse(o));return{from:t,commands:m,data:Dn(r),type:In.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}),m=(await this.#t.dryRunTransactionBlock({transactionBlock:r})).effects.gasUsed,i=BigInt(m.computationCost),l=BigInt(m.storageCost),u=i+l;return s.copyWith({amount:u})}};import{Ed25519Keypair as Rn}from"@mysten/sui/keypairs/ed25519";import{Transaction as kn}from"@mysten/sui/transactions";var re=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){let m=kn.from(n),i=await a.signAndExecuteTransaction({signer:this.#e,transaction:m,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 M=class{platform={};constructor(t){switch(t.getType()){case L.EvmChain:this.registerEvm(t);break;case L.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case L.Parachain:this.registerSubstrate(t);break;case L.SolanaChain:this.registerSolana(t);break;case L.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new Z(e)}registerSolana(t){let e=t;this.platform.Solana=new et(e)}registerSui(t){let e=t;this.platform.Sui=new mt(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)}};import{AssetAmount as bt,Parachain as On}from"@galacticcouncil/xc-core";import{acc as Mn,big as le}from"@galacticcouncil/common";import{big as _n}from"@galacticcouncil/common";import z from"big.js";function ie(c,t,e,s){let n=c.toBig().minus(e.toBig()).minus(c.isSame(t)?t.toBig():new z(0));return s&&(n=n.minus(c.isSame(s)?s.toBig():new z(0))),c.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function oe(c,t,e,s){let a=c.copyWith({amount:0n}).toBig().plus(c.isSame(t)?t.toBig():new z(0)).plus(c.toBig().lt(e.toBig())?e.toBig():new z(0));return s&&(a=a.plus(c.isSame(s)&&c.toBig().lt(s.toBig())?s.toBig():new z(0))),c.copyWith({amount:BigInt(a.toFixed())})}async function ce(c,t){return t.isEvmParachain()?t.getDerivatedAddress(c):c}function ue(c,t){return t?_n.toBigInt(t,c):0n}async function xt(c,t){let e=c.getAssetDecimals(t);return e||(await c.getCurrency()).decimals}import{AssetAmount as Vn,Parachain as me}from"@galacticcouncil/xc-core";var W=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof me?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof me)return this.chain.getMin(this.asset);let t=await xt(this.chain,this.asset);return Vn.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return xt(this.chain,t)}};var $=class extends W{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=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,o=a.fee.amount,m=n.destinationFee??a.fee.asset,i=await this.getDecimals(m);if(Number.isFinite(o))return{fee:bt.fromAsset(m,{amount:le.toBigInt(o,i),decimals:i}),feeBreakdown:{}};let l=o,{amount:u,breakdown:d}=await l.build({feeAsset:m,transferAsset:n.asset,source:r?r.chain:e,destination:a.chain,amount:t});return{fee:bt.fromAsset(m,{amount:u,decimals:i}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,a=e.destinationFee??s.fee.asset;return n.isEqual(a)?this.getBalance(t):this.config.chain.getBalance(a,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:a,source:r}=t,o=await this.getTransfer(t),m=s.contract?await ce(a,e):a,i=await this.adapter.estimateFee(m,n,r.feeBalance,o),{fee:l}=s.source,u=l?ue(i.decimals,l.extra):0n,d=i.amount+u;return i.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}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 On&&"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:u,sender:d}=t,p=await(await P.create(e)).buildMessageId(d,l,u.originSymbol,i);return a.build({...t,messageId:p})}let m=n||r||o;if(m)return m.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),m=e.source.chain,i=e.sender,l=Mn.getMultilocationDerivatedAccount(m.parachainId,i,s.parachainId===0?0:1,s.usesH160Acc),u=await o.getPaymentInfo(l),d=await o.getEncodedData(),[g,p]=await Promise.all([this.getTransactFee(t),this.getTransactFeeBalance(t,e)]);return{call:d,chain:s,fee:g,feeBalance:p,weight:{refTime:u.weight.ref_time,proofSize:u.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=le.toBigInt(e.amount,s);return bt.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var G=class extends W{};import{AssetAmount as Wn}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:Wn.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 vt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,a){let r=Kn(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)]),u=new ot(i,l),d=Nn.getMultilocationDerivatedAccount(r.parachainId,t,1,o.usesH160Acc),g=await l.getAsset(),p=await this.transfer(g,t,e,d,s);return u.remoteExec(t,d,n,f=>{let y=f.toDecimal();return p.buildCall(y)},a)}async getTransferData(t,e,s){let n=t.origin,{chain:a,asset:r}=n.route.destination,o=new M(n.chain),m=new M(a),i=new $(o,n),l=new G(m,a,r),u=new Hn(...this.validations),[d,g,p,f,y,x,A]=await Promise.all([i.getBalance(e),i.getFeeBalance(e),i.getDestinationFee(),i.getDestinationFeeBalance(e),i.getMin(),l.getBalance(s),l.getMin()]),{source:h,destination:I}=n.route,S=p.fee.copyWith(I.fee.asset),E=p.feeBreakdown,B=h.asset.isEqual(S)&&S.amount>10n?S.amount+1n:10n,C={address:s,amount:B,asset:h.asset,destination:{balance:x,chain:a,fee:S,feeBreakdown:E},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:p.fee,destinationFeeBalance:f}};C.transact=await i.getTransact(C);let T=new X(C),b=await i.getFee(C),F;T.isSwapSupported(h.fee)&&(F=await T.getSwap(b),C.source.feeSwap=F);let D;T.isDestinationSwapSupported(b)&&(D=await T.getDestinationSwap(b),C.source.destinationFeeSwap=D),(F||D)&&(b=await i.getFee(C),b=b.padByPct(5n));let dt=await l.getEd(),w=oe(x,S,A,dt),q=await i.getEd(),gt=ie(d,b,y,q);C.amount=0n,C.source.fee=b;let pt={source:{balance:d,destinationFee:p.fee,destinationFeeBalance:f,destinationFeeSwap:D,fee:b,feeBalance:g,feeSwap:F,max:gt,min:d.copyWith({amount:w.amount})},destination:{balance:x,fee:S},reversible:t.reversible,async buildCall(R){let v=Object.assign({},C);return v.amount=wt.toBigInt(R,d.decimals),v.transact=await i.getTransact(v),i.getCall(v)},async estimateFee(R){let v=Object.assign({},C);return v.amount=wt.toBigInt(R,d.decimals),v.transact=await i.getTransact(v),i.getFee(v)},async estimateDestinationFee(R){let v=wt.toBigInt(R,d.decimals),{fee:k,feeBreakdown:fe}=await i.getDestinationFee(v);return C.destination.fee=k,C.destination.feeBreakdown=fe,C.source.destinationFee=k,pt.destination.fee=k,pt.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 pt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),a=n.getUniqueRoutes().map(r=>r.source.asset);return n.chain.subscribeBalances(a,t).subscribe(s)}};import{ConfigBuilder as Un}from"@galacticcouncil/xc-core";function jn(c){let t=Un(c.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let a=s.source(n);return{destinations:a,withDestination(r){let{routes:o,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build:u}=a.destination(r);return{routes:o,destinationAssets:m,isAssetSelect:i,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:p,tag:f}){let y=u(p,f);return c.getTransferData(y,d,g)}}}}}}}}}import{Precompile as Ln}from"@galacticcouncil/xc-core";var zn="https://api.wormholescan.io",lt=class{_baseUrl;constructor(t){this._baseUrl=t||zn}buildApi(t,e){return[this._baseUrl,t,"?"].join("")+new URLSearchParams(e).toString()}async getVaaBytes(t){let e=this.buildApi("/v1/signed_vaa/"+t,{});return await(await fetch(e)).json()}async getVaa(t){let e=this.buildApi("/api/v1/vaas/"+t,{});return(await(await fetch(e)).json()).data}async getVaaByTxHash(t){let e=this.buildApi("/api/v1/vaas/",{txHash:t}),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===Ln.Bridge}};import{acc as $n}from"@galacticcouncil/common";import{mrl as Gn,ChainType as ge,Parachain as Xn,Precompile as Jn,Wormhole as N}from"@galacticcouncil/xc-core";import{encoding as qn}from"@wormhole-foundation/sdk-base";import{keccak256 as Qn}from"@wormhole-foundation/sdk-connect";import{deserialize as Yn}from"@wormhole-foundation/sdk-definitions";var de=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(de||{});var Zn=300*1e3,pe=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new lt}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=$n.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:m}=r,i=this.getStatus(a),l=this.chains.find(f=>f instanceof Xn&&f.parachainId===this.parachainId),{toAddress:u,tokenAddress:d}=m,g=this.chains.find(f=>N.isKnown(f)&&N.fromChain(f).getWormholeId()===o.tokenChain),p;if(i===1&&a.vaa){let{timestamp:f}=this.getVaaHeader(a.vaa.raw),y=a.vaa.raw;if(this.isStuck(f))switch(g.getType()){case ge.EvmChain:let x=new Q(g);p=async h=>x.redeem(h,y);break;case ge.SolanaChain:let A=new at(g);p=async h=>A.redeem(h,y);break}}return{asset:d,assetSymbol:a.data.symbol,amount:a.data.tokenAmount,from:t,fromChain:l,to:u,toChain:g,status:i,redeem:p,operation:a}});return Promise.all(n)}async getDeposits(t,e="hydration"){let s=await this.whScan.getOperations({...this.filters,address:Jn.Bridge,pageSize:"100"}),n=this.config.chains.get(e);if(!n)return[];let a=n,o=(await Gn.createPayload(a,t)).toHex(),m=s.filter(i=>{let{content:l}=i,{payload:u}=l;return u.payloadType===3&&u.toChain===16&&"0x"+u.payload===o}).map(async i=>{let{content:l,sourceChain:u}=i,{payload:d,standarizedProperties:g}=l,p=this.getStatus(i),{tokenAddress:f}=g,y=this.chains.find(h=>N.isKnown(h)&&N.fromChain(h).getWormholeId()===d.tokenChain),x=this.chains.find(h=>N.isKnown(h)&&N.fromChain(h).getWormholeId()===d.toChain),A;if(p===1&&i.vaa){let{timestamp:h}=this.getVaaHeader(i.vaa.raw),I=i.vaa.raw;if(this.isStuck(h)){let S=new rt(x);A=async E=>S.redeemMrlViaXcm(E,I)}}return{asset:f,assetSymbol:i.data.symbol,amount:i.data.tokenAmount,from:u.from,fromChain:y,to:t,toChain:n,status:p,redeem:A,operation:i}});return Promise.all(m)}isStuck(t){return Date.now()>=t*1e3+Zn}getVaaHeader(t){let e=qn.b64.decode(t),s=Yn("Uint8Array",e);return{timestamp:s.timestamp,emitterChain:s.emitterChain,emitterAddress:s.emitterAddress.toString(),sequence:s.sequence,payload:s.payload,hash:s.hash,id:Qn(s.hash)}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Ft as DISPATCH_ADDRESS,Q as EvmClaim,Z as EvmPlatform,It as EvmSigner,X as FeeSwap,M as PlatformAdapter,at as SolanaClaim,V as SolanaLilJit,et as SolanaPlatform,zt as SolanaSigner,rt as SubstrateClaim,ot as SubstrateExec,ct as SubstratePlatform,P as SubstrateService,ne as SubstrateSigner,ae as SuiClaim,mt as SuiPlatform,re as SuiSigner,jn as TransferBuilder,vt as Wallet,de as WhStatus,lt as WormholeScan,pe as WormholeTransfer,Mt as chunk,Ys as deserializeV0,_ as ixToHuman,U as serializeV0};
1
+ import{acc as en,big as bt}from"@galacticcouncil/common";import{ConfigBuilder as nn,TransferValidator as sn}from"@galacticcouncil/xc-core";import{ChainType as L}from"@galacticcouncil/xc-core";import{Abi as vt}from"@galacticcouncil/xc-core";import{encodeFunctionData as St}from"viem";import{encoding as Pt}from"@wormhole-foundation/sdk-base";var D=class{redeem(t,e,s){let n=Pt.b64.decode(e),r=Pt.hex.encode(n),a=vt.WormholeTransceiver,o=St({abi:a,functionName:"receiveMessage",args:["0x"+r]});return{abi:JSON.stringify(a),data:o,from:t,to:s.transceiver.wormhole}}completeInboundQueuedTransfer(t,e,s){let n=vt.NttManager,r=St({abi:n,functionName:"completeInboundQueuedTransfer",args:[e]});return{abi:JSON.stringify(n),data:r,from:t,to:s.manager}}};import{addr as we,Abi as ve,CallType as Ot,Erc20Client as Mt,EvmParachain as Se}from"@galacticcouncil/xc-core";import{ContractFunctionExecutionError as oe,decodeEventLog as ce}from"viem";var $=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:r}=this.config;return await this.client.getProvider().estimateContractGas({address:e,abi:this.abi,functionName:r,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 oe?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:r}=this.config,a=this.client.getProvider(),o=await this.getNonce(t);try{let{results:m}=await a.simulateCalls({account:t,calls:[{to:e,abi:this.abi,functionName:r,args:s,value:n}],stateOverrides:[{address:t,nonce:o}]}),[u]=m;return u}catch(m){return console.log(`Can't simulate call!
3
+ `,m.details),{error:m}}}decodeEvents(t){let e=[];return t&&t.forEach(s=>{try{let{eventName:n,args:r}=ce({abi:this.abi,data:s.data,topics:s.topics});e.push({eventName:n,args:r})}catch{}}),e}};var R=class{static get(t,e){return new $(t,e)}};import{Precompile as ue}from"@galacticcouncil/xc-core";import{decodeAbiParameters as me}from"viem";function K(i){return i.module==="Snowbridge"&&i.func==="v2_sendMessage"}function lt(i){if(!K(i))return;let t=i.args[1];if(!t||t.length===0)return;let[e,s]=me([{type:"uint8"},{type:"address"},{type:"uint128"}],t[0]);return s}function dt(i){let t=i.module==="Snowbridge"&&i.func==="v2_sendMessage"&&Array.isArray(i.args[1])&&i.args[1].length===0,e=i.module==="Snowbridge"&&i.func==="sendToken"&&i.args[0]==="0x0000000000000000000000000000000000000000";return t||e}function gt(i){return Object.entries(ue).map(([e,s])=>s).includes(i.address)}import{CallType as xe}from"@galacticcouncil/xc-core";import{Binary as _t}from"polkadot-api";import{addr as pe,multiloc as pt}from"@galacticcouncil/xc-core";import{acc as he,enums as ye}from"@galacticcouncil/common";import{Blake2256 as Ce,u32 as Ae}from"@polkadot-api/substrate-bindings";import{toHex as be,fromHex as Dt}from"@polkadot-api/utils";import{Enum as Rt}from"polkadot-api";import{big as le}from"@galacticcouncil/common";async function Tt(i,t,e){let s=await e.getDecimals(),n=e.chain.getAssetDecimals(t)??s,r=e.chain.usesChainDecimals?s:n;return{amount:le.convertDecimals(i,r,n),decimals:n}}import{enums as de}from"@galacticcouncil/common";var Et=i=>{let t=[];for(let e of i)if(["PolkadotXcm"].includes(e.type)&&e.value.type==="FeesPaid"){let n=e.value.value.fees;for(let r of n)if(r.fun.type==="Fungible"){let a=BigInt(r.fun.value);t.push(a)}}return t.reduce((e,s)=>e+s,0n)},v=i=>{let t=i.value.error;return t.type==="Module"?de.enumPath(t.value):JSON.stringify(t.value)};import{xcm as ft}from"@galacticcouncil/common";function ge(i){return{parents:0,interior:{type:"X1",value:i.startsWith("0x")?ft.toAccountKey20(i):ft.toAccountId32(i)}}}function Bt(i){return{type:"V4",value:{parents:1,interior:{type:"X1",value:{type:"Parachain",value:i.parachainId}}}}}var fe=(i,t)=>({id:ft.transform(i),fun:{type:"Fungible",value:t}}),Ft=(i,t,e,s,n,r)=>{console.log(r);let a=ge(i),o=fe(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:r}},{type:"RefundSurplus",value:void 0},{type:"DepositAsset",value:{assets:{type:"Wild",value:{type:"AllCounted",value:1}},beneficiary:a}}]}};var{Ss58Addr:It}=pe,b=class i{chain;_currency;constructor(t){this.chain=t}static async create(t){return new i(t)}get client(){return this.chain.client}get api(){return this.client.getUnsafeApi()}async getCurrency(){return this._currency||(this._currency=this.chain.getCurrency()),this._currency}async getAsset(){return(await this.getCurrency()).asset}async getDecimals(){return(await this.getCurrency()).decimals}isDryRunSupported(){return this.api.apis?.DryRunApi!==void 0}async buildMessageId(t,e,s,n){let r=await this.client._request("system_accountNextIndex",[t]),a=Ae.enc(r),o=l=>new TextEncoder().encode(l),m=new Uint8Array([...o(this.chain.parachainId.toString()),...Dt(t.startsWith("0x")?t.slice(2):t),...a,...Dt(s.startsWith("0x")?s.slice(2):s),...o(n),...o(e.toString())]),u=Ce(m);return be(u)}async dryRun(t,e){let s=Rt("Signed",t),n=Rt("system",s),r=await this.api.apis.DryRunApi.dry_run_call(n,e.decodedCall,4);if(!r.success)throw new Error("DryRun call failed");let a=r.value;if("type"in a&&"value"in a)throw new Error("DryRun call error: "+ye.enumPath(a.value));return a}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),r=await this.dryRun(s,n);if(r.execution_result?.success)return Et(r.emitted_events||[]);{let a=v(r.execution_result);console.warn(`Can't estimate delivery fee. Reason:
4
+ ${a}`)}}catch{}}return 0n}async estimateDeliveryFeeWith(t,e){if(["PolkadotXcm"].includes(e.module)){let n=e.getTx(this.client).decodedCall.value.value,r="dest"in n?n.dest:void 0;if(!r)return t;let a=pt.findNestedKey(r,"interior"),o=pt.findParachain(r);if(pt.findGlobalConsensus(r))return t;if(o){let l=he.getSovereignAccounts(o);return this.chain.parachainId===0?It.encodePubKey(l.relay):It.encodePubKey(l.generic)}let u=a&&a.interior;if(u==="Here"||u?.type==="Here")return this.chain.treasury||t}return t}};var X=(1n<<64n)-1n,_={approve:200000n,transfer:1200000n,redeem:2000000n,queued:600000n},kt=i=>[i&X,i>>64n&X,i>>128n&X,i>>192n&X],I=class i{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(t){let e=await b.create(t);return new i(e,t)}async buildCall(t,e){let s=await this.#e.getDerivatedAddress(t),n=await this.#e.evmClient.getProvider().getGasPrice(),r=n+n/10n,a=this.#t.client.getUnsafeApi(),o=e.map(c=>a.tx.EVM.call({source:s,target:c.to,input:_t.fromHex(c.data),value:kt(c.value??0n),gas_limit:c.gas,max_fee_per_gas:kt(r),max_priority_fee_per_gas:void 0,nonce:void 0,access_list:[]})),m=o.length===1?o[0]:a.tx.Utility.batch_all({calls:o.map(c=>c.decodedCall)}),u=e.length===1?"EVM.call":"Utility.batch_all",l=await m.getEncodedData();return{from:t,data:_t.toHex(l),type:xe.Substrate,txOptions:void 0,dryRun:this.#t.isDryRunSupported()?async()=>{try{let c=await this.#t.dryRun(t,m),d=c.execution_result&&c.execution_result.success?void 0:v(c.execution_result);return{call:u,error:d,events:c.emitted_events||[],xcm:c.forwarded_xcms||[]}}catch(c){return{call:u,error:c instanceof Error?c.message:"unknown"}}}:()=>{}}}};var{EvmAddr:Pe}=we,q=class{#t;#e;constructor(t){this.#t=t,this.#e=t.evmClient}async buildCall(t,e,s,n){if(!Pe.isValid(t)&&this.#t instanceof Se)return this.buildSubstrateEvmCall(t,e,n);let r=R.get(this.#e,n),{abi:a,asset:o,calldata:m}=r,u={abi:JSON.stringify(a),data:m,from:t,to:n.address,type:Ot.Evm,value:n.value,dryRun:async()=>{let{error:f,logs:h}=await r.simulateCall(t),x=r.decodeEvents(h);return{call:n.module+"."+n.func,error:f?.shortMessage,events:x}}};if(gt(n)||dt(n))return u;let l=n.token??(K(n)?lt(n):o),c=new Mt(this.#e,l),d=await c.allowance(t,n.address);if(d>=e)return u;let g=c.approve(n.address,e);return{abi:JSON.stringify(ve.Erc20),allowance:d,data:g,from:t,to:l,type:Ot.Evm,dryRun:()=>{}}}async buildSubstrateEvmCall(t,e,s){let n=this.#t,r=R.get(this.#e,s),{asset:a,calldata:o}=r,m=await I.create(n),u={to:s.address,data:o,value:s.value,gas:_.transfer};if(gt(s)||dt(s))return m.buildCall(t,[u]);let l=await n.getDerivatedAddress(t),c=s.token??(K(s)?lt(s):a),d=new Mt(this.#e,c);if(await d.allowance(l,s.address)>=e)return m.buildCall(t,[u]);let f=d.approve(s.address,e);return m.buildCall(t,[{to:c,data:f,gas:_.approve},u])}async estimateFee(t,e,s,n){let a=await R.get(this.#e,n).estimateFee(t,e);return s.copyWith({amount:a})}};import{EvmParachain as Te}from"@galacticcouncil/xc-core";import{h160 as Ee}from"@galacticcouncil/common";import{Binary as Be}from"polkadot-api";var Vt="0x0000000000000000000000000000000000000401",{H160:Fe}=Ee,Nt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=t.evmClient,this.#n=e}async signAndSend(t,e){let s=Fe.fromAny(t.from),n=this.#e.getProvider(),r=!1;if(this.#t instanceof Te)try{let o=this.#t.client,m=Be.fromHex(t.data);await o.getUnsafeApi().txFromCallData(m),r=!0}catch{}let a;if(r){let[o,m]=await Promise.all([n.estimateGas({account:s,data:t.data,to:Vt}),n.getGasPrice()]),u=m+m/100n*10n;a=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:t.data,maxPriorityFeePerGas:u,maxFeePerGas:u,gas:o*11n/10n,to:Vt})}else{let{data:o,to:m,value:u}=t,[l,c]=await Promise.all([n.estimateGas({account:s,data:o,to:m,value:u}),n.getGasPrice()]),d=c+c*5n/100n,g=l+l*30n/100n;a=await this.#n.sendTransaction({account:s,chain:this.#e.chain,data:o,to:m,value:u,gas:g,maxFeePerGas:d,maxPriorityFeePerGas:d})}e.onTransactionSend(a),n.waitForTransactionReceipt({hash:a}).then(o=>e.onTransactionReceipt(o)).catch(o=>e.onError(o))}};import{CallType as ke}from"@galacticcouncil/xc-core";import{Buffer as Oe}from"buffer";import{ComputeBudgetProgram as Wt,PublicKey as De,TransactionMessage as Re,VersionedTransaction as Lt}from"@solana/web3.js";var jt=.5,Ut=2,Ht=1,Gt=1e6,Ie=25e4,J=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),r=await this.determineComputeBudget(n);return BigInt(r)}async getV0Message(t,e){let s=new De(t),{blockhash:n}=await this.connection.getLatestBlockhash("finalized");return new Re({payerKey:s,recentBlockhash:n,instructions:e}).compileToV0Message()}async createPriorityFeeInstructions(t,e=jt,s=Ut,n=Ht,r=Gt){let[a,o]=await Promise.all([this.determineComputeBudget(t),this.determinePriorityFee(t,e,s,n,r)]);return[Wt.setComputeUnitLimit({units:a}),Wt.setComputeUnitPrice({microLamports:o})]}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:r}=s.value;return r&&!n?Math.round(r*1.2):Ie}async determinePriorityFee(t,e=jt,s=Ut,n=Ht,r=Gt){let a=n,o=await this.getTxAccounts(t),m=await this.connection.getRecentPrioritizationFees({lockedWritableAccounts:o});if(m){let u=m.map(c=>c.prioritizationFee).filter(c=>c>0).sort((c,d)=>c-d),l=Math.ceil(u.length*e);if(u.length>l){let d=u[l]*s;a=Math.max(a,d)}}return Math.min(Math.max(a,n),r)}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 W=class{static get(t,e){return new J(t,e)}};import{MessageV0 as _e}from"@solana/web3.js";function zt(i){return i.map(t=>({program:t.programId.toBase58(),data:t.data.toString("hex"),keys:t.keys.map(e=>e.pubkey.toBase58())}))}function Ls(i,t){let e=[];for(let s=0;s<i.length;s+=t)e.push(i.slice(s,s+t));return e}function js(i){let t=i.serialize();return Buffer.from(t).toString("hex")}function Us(i){let t=Buffer.from(i,"hex"),e=Uint8Array.from(t);return _e.deserialize(e)}var Q=class{#t;constructor(t){this.#t=t.connection}async buildCall(t,e,s,n){let r=W.get(this.#t,n),a=await r.getPriorityMessage(t),o=a.serialize(),m=Oe.from(o).toString("hex");return{from:t,data:m,ix:zt(n.instructions),signers:n.signers,type:ke.Solana,dryRun:async()=>{let{err:u,logs:l}=await r.simulateTransaction(t,a);return{call:n.module+"."+n.func,error:u,events:l}}}}async estimateFee(t,e,s,n){let r=W.get(this.#t,n),a=await r.estimateFee(t,e),o=await r.getPriorityMessage(t),{accounts:m}=await r.simulateTransaction(t,o),l=(m&&m[0])?.lamports;if(l){let c=n.module==="TokenBridge"&&n.func==="TransferNativeWithPayload";return s.copyWith({amount:s.amount-BigInt(l)-(c?e:0n)+n.rentReserve})}return s.copyWith({amount:a+n.rentReserve})}};var Y=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}};import{Keypair as $t,MessageV0 as Me,VersionedTransaction as Ve}from"@solana/web3.js";import{Buffer as ht}from"buffer";var Kt=class{#t;#e;#n;constructor(t,e){this.#t=t,this.#e=e,this.#n=new Y(t)}async signAndSend(t,e){let{data:s,signers:n}=t,r=this.toVersioned(s,n);try{if(this.#e instanceof $t){r.sign([this.#e]);let u=await this.#t.connection.sendTransaction(r);e.onTransactionSend(u);let l=await this.#t.connection.getSignatureStatus(u);e.onStatus?.(l);return}let a=this.#e;await a.connect(),n&&r.sign(n);let{signature:o}=await a.signAndSendTransaction(r);e.onTransactionSend(o);let m=await this.#t.connection.getSignatureStatus(o);e.onStatus?.(m)}catch(a){e.onError(a)}}async signAndSendAll(t,e){let s=t.map(n=>{let{data:r,signers:a}=n;return this.toVersioned(r,a)});try{let n;if(this.#e instanceof $t)s.forEach(m=>m.sign([this.#e])),n=s.map(m=>ht.from(m.serialize()).toString("base64"));else{let m=this.#e;await m.connect(),n=(await m.signAllTransactions(s)).map(l=>ht.from(l.serialize()).toString("base64"))}let r=await this.#n.simulateBundle(n);if(r.value.summary!=="succeeded")throw new Error("Bundle simulation failed! "+JSON.stringify(r,null,2));let a=await this.#n.sendBundle(n);e.onTransactionSend(a);let o=await this.#n.getInflightBundleStatuses([a]);e.onBundleStatus?.(o.value)}catch(n){e.onError(n)}}toVersioned(t,e){let s=ht.from(t,"hex"),n=Uint8Array.from(s),r=Me.deserialize(n),a=new Ve(r);return e&&a.sign(e),a}};var Z=class i{#t;#e=new D;constructor(t){this.#t=t}static async create(t){let e=await I.create(t);return new i(e)}async redeem(t,e,s){let n=this.#e.redeem(t,e,s);return this.#t.buildCall(t,[{to:n.to,data:n.data,gas:_.redeem}])}async completeInboundQueuedTransfer(t,e,s){let n=this.#e.completeInboundQueuedTransfer(t,e,s);return this.#t.buildCall(t,[{to:n.to,data:n.data,gas:_.queued}])}};import{AssetAmount as Ne,CallType as We}from"@galacticcouncil/xc-core";import{Binary as tt}from"polkadot-api";var et=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async remoteExec(t,e,s,n,r={}){let a=this.#t.api,o=await this.#t.getAsset(),m=this.#e.api,u=this.#e.chain,l=await u.getCurrency(),c=l.asset,d=l.decimals,g=u.getAssetXcmLocation(c),f=tt.fromHex(s.data),x=await(await m.txFromCallData(f)).getPaymentInfo(e),M=BigInt(x.partial_fee)*120n/100n,V=Ne.fromAsset(c,{amount:M,decimals:d}),N=x.weight.ref_time,it=x.weight.proof_size,w=Bt(u),ot=Ft(e,g,V,N,it,f),wt=a.tx.PolkadotXcm.send({dest:w,message:ot}),E=[];try{let y=await this.#t.chain.dex.getCalldata(t,r.srcFeeAsset||o,c,V,10),z=tt.fromHex(y),ut=await a.txFromCallData(z);E.push(ut)}catch{}let p=await n(V),B=tt.fromHex(p.data),A=await a.txFromCallData(B);E.push(A),E.push(wt);let F=E.map(y=>y.decodedCall),S=a.tx.Utility.batch_all({calls:F}),ct=await S.getEncodedData();return{from:t,data:tt.toHex(ct),type:We.Substrate,dryRun:this.#t.isDryRunSupported()?async()=>{try{let y=await this.#t.dryRun(t,S);return{call:"polkadotXcm.send",error:y.execution_result&&y.execution_result.success?void 0:v(y.execution_result),events:y.emitted_events||[],xcm:y.forwarded_xcms||[]}}catch(y){return{call:"polkadotXcm.send",error:y instanceof Error?y.message:"unknown"}}}:()=>{}}}};import{Asset as Le,AssetAmount as je,CallType as Ue}from"@galacticcouncil/xc-core";import{Binary as He}from"polkadot-api";var nt=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 r=await this.#t,o=await this.useSignerFee(s)?{asset:new Le(s)}:void 0,m=n.getTx(r.client),u=n.module+"."+n.func,l=await m.getEncodedData();return{from:t,data:He.toHex(l),type:Ue.Substrate,txOptions:o,dryRun:r.isDryRunSupported()?async()=>{try{let c=n.getTx(r.client),d=await r.dryRun(t,c),g=d.execution_result&&d.execution_result.success?void 0:v(d.execution_result);return{call:u,error:g,events:d.emitted_events||[],xcm:d.forwarded_xcms||[]}}catch(c){return{call:u,error:c instanceof Error?c.message:"unknown"}}}:()=>{}}}async estimateFee(t,e,s,n){let r=await this.#t,a=await r.estimateNetworkFee(t,n),o=await r.estimateDeliveryFee(t,n),m=await this.exchangeFee(a+o,s),u=await Tt(m,s,r);return s.copyWith(u)}async exchangeFee(t,e){let s=await this.#t,n=await s.getAsset(),r=await s.getDecimals();if(n.isEqual(e))return t;try{let a=s.chain.dex,o=je.fromAsset(n,{amount:t,decimals:r});return(await a.getQuote(e,n,o,!0)).amount}catch{}return t}};import{multiloc as Xt}from"@galacticcouncil/xc-core";import{Binary as Ge,Enum as yt}from"polkadot-api";var qt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}signAndSend(t,e){let n=this.#t.client.getUnsafeApi(),r=Ge.fromHex(t.data),a={};t.txOptions?.asset&&(a={asset:this.getFeeAsset(t.txOptions.asset)}),n.txFromCallData(r).then(o=>{o.signSubmitAndWatch(this.#e,a).subscribe({next:m=>{m.type==="broadcasted"&&e.onTransactionSend(m.txHash),m.type==="finalized"&&e.onFinalized(m)},error:m=>{e.onError(m)}})})}getFeeAsset(t){let e=this.#t.getAssetXcmLocation(t);if(e){let s=Xt.findPalletInstance(e),n=Xt.findGeneralIndex(e);return{parents:0,interior:yt("X2",[yt("PalletInstance",Number(s)),yt("GeneralIndex",BigInt(n))])}}throw new Error("Asset location not found")}};import{CallType as $e}from"@galacticcouncil/xc-core";import{toBase64 as Ke}from"@mysten/bcs";import{fromBase64 as ze}from"@mysten/bcs";function Jt(i,t={}){let e=i.inputs??[],s=i.commands??[],n=t.numbers??"string",r=t.decode32As??"address",a=l=>n==="bigint"?l:n==="number"?Number(l):l.toString(),o=l=>{let c=ze(l),d=g=>{let f=0n;for(let h=0;h<g;h++)f|=BigInt(c[h])<<8n*BigInt(h);return f};return c.length===1?{type:"pure",valueType:"u8",value:Number(c[0])}:c.length===2?{type:"pure",valueType:"u16",value:a(d(2))}:c.length===4?{type:"pure",valueType:"u32",value:Number(d(4))}:c.length===8?{type:"pure",valueType:"u64",value:a(d(8))}:c.length===32&&r==="address"?{type:"pure",valueType:"address",value:"0x"+[...c].map(f=>f.toString(16).padStart(2,"0")).join("")}:{type:"pure",valueType:"vector<u8>",value:Array.from(c)}},m=l=>{let c=e[l];if(!c)return{Input:l};if(c.Pure?.bytes)return o(c.Pure.bytes);let d=c.Object?.SharedObject;if(d)return{type:"object",objectType:"sharedObject",objectId:d.objectId,initialSharedVersion:String(d.initialSharedVersion),mutable:!!d.mutable};let g=c.Object?.ImmOrOwnedObject;return g?{type:"object",objectType:"immOrOwnedObject",objectId:g.objectId,version:String(g.version),digest:g.digest??void 0}:{Input:l}},u=l=>l?.GasCoin?"GasCoin":Array.isArray(l?.NestedResult)?l:typeof l?.Input=="number"?m(l.Input):l;return s.map(l=>{if(l.MoveCall){let c=l.MoveCall;return{MoveCall:{...c,arguments:(c.arguments??[]).map(u)}}}if(l.SplitCoins){let c=l.SplitCoins,d=c.coin?.GasCoin?"GasCoin":u(c.coin),g=(c.amounts??[]).map(u);return{SplitCoins:[d,g]}}if(l.MergeCoins){let c=l.MergeCoins;return{MergeCoins:{...c,destination:u(c.destination),sources:(c.sources??[]).map(u)}}}if(l.TransferObjects){let c=l.TransferObjects;return{TransferObjects:{...c,objects:(c.objects??[]).map(u),address:u(c.address)}}}return l})}var st=class{#t;constructor(t){this.#t=t.client}async buildCall(t,e,s,n){let{transaction:r}=n;r.setSender(t);let a=await r.build({client:this.#t}),o=await r.toJSON(),m=Jt(JSON.parse(o));return{from:t,commands:m,data:Ke(a),type:$e.Sui,dryRun:async()=>{let u=await this.#t.dryRunTransactionBlock({transactionBlock:a});return{call:n.module+"."+n.func,error:u.executionErrorSource}}}}async estimateFee(t,e,s,n){let{transaction:r}=n;r.setSender(t);let a=await r.build({client:this.#t}),m=(await this.#t.dryRunTransactionBlock({transactionBlock:a})).effects.gasUsed,u=BigInt(m.computationCost),l=BigInt(m.storageCost),c=u+l;return s.copyWith({amount:c})}};import{Ed25519Keypair as Xe}from"@mysten/sui/keypairs/ed25519";import{Transaction as qe}from"@mysten/sui/transactions";var Qt=class{#t;#e;constructor(t,e){this.#t=t,this.#e=e}async signAndSend(t,e){let{from:s,data:n}=t,r=this.#t.client;try{if(this.#e instanceof Xe){let m=qe.from(n),u=await r.signAndExecuteTransaction({signer:this.#e,transaction:m,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(u.digest);return}let a=await this.#e.signTransaction({transaction:n,address:s,networkID:"sui:mainnet"}),o=await r.executeTransactionBlock({transactionBlock:a.transaction,signature:a.signature,options:{showEffects:!0,showEvents:!0,showObjectChanges:!0,showBalanceChanges:!0}});e.onTransactionSend(o.digest)}catch(a){e.onError(a)}}};var k=class{platform={};constructor(t){switch(t.getType()){case L.EvmChain:this.registerEvm(t);break;case L.EvmParachain:this.registerEvm(t),this.registerSubstrate(t);break;case L.Parachain:this.registerSubstrate(t);break;case L.SolanaChain:this.registerSolana(t);break;case L.SuiChain:this.registerSui(t);break;default:throw new Error("Unsupported platform: "+t.getType())}}registerEvm(t){let e=t;this.platform.Evm=new q(e)}registerSolana(t){let e=t;this.platform.Solana=new Q(e)}registerSui(t){let e=t;this.platform.Sui=new st(e)}registerSubstrate(t){let e=t;this.platform.Substrate=new nt(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)}};import{AssetAmount as At,Parachain as Ye}from"@galacticcouncil/xc-core";import{acc as Ze,big as se}from"@galacticcouncil/common";import{big as Je}from"@galacticcouncil/common";import j from"big.js";function Yt(i,t,e,s){let n=i.toBig().minus(e.toBig()).minus(i.isSame(t)?t.toBig():new j(0));return s&&(n=n.minus(i.isSame(s)?s.toBig():new j(0))),i.copyWith({amount:n.lt(0)?0n:BigInt(n.toFixed())})}function Zt(i,t,e,s){let r=i.copyWith({amount:0n}).toBig().plus(i.isSame(t)?t.toBig():new j(0)).plus(i.toBig().lt(e.toBig())?e.toBig():new j(0));return s&&(r=r.plus(i.isSame(s)&&i.toBig().lt(s.toBig())?s.toBig():new j(0))),i.copyWith({amount:BigInt(r.toFixed())})}async function te(i,t){return t.isEvmParachain()?t.getDerivatedAddress(i):i}function ee(i,t){return t?Je.toBigInt(t,i):0n}async function Ct(i,t){let e=i.getAssetDecimals(t);return e||(await i.getCurrency()).decimals}import{AssetAmount as Qe,Parachain as ne}from"@galacticcouncil/xc-core";var O=class{adapter;chain;asset;constructor(t,e,s){this.adapter=t,this.chain=e,this.asset=s}async getEd(){return this.chain instanceof ne?this.chain.getEd():void 0}async getBalance(t){return this.chain.getBalance(this.asset,t)}async getMin(){if(this.chain instanceof ne)return this.chain.getMin(this.asset);let t=await Ct(this.chain,this.asset);return Qe.fromAsset(this.asset,{amount:0n,decimals:t})}async getDecimals(t){return Ct(this.chain,t)}};var U=class extends O{config;constructor(t,e){super(t,e.chain,e.route.source.asset),this.config=e}async getCall(t){let{amount:e,sender:s,source:n}=t,r=await this.getTransfer(t);return this.adapter.buildCall(s,e,n.feeBalance,r)}async getDestinationFee(t){let{chain:e,route:s}=this.config,{source:n,destination:r,transact:a}=s,o=r.fee.amount,m=n.destinationFee??r.fee.asset,u=await this.getDecimals(m);if(Number.isFinite(o))return{fee:At.fromAsset(m,{amount:se.toBigInt(o,u),decimals:u}),feeBreakdown:{}};let l=o,{amount:c,breakdown:d}=await l.build({feeAsset:m,transferAsset:n.asset,source:a?a.chain:e,destination:r.chain,amount:t});return{fee:At.fromAsset(m,{amount:c,decimals:u}),feeBreakdown:d}}async getDestinationFeeBalance(t){let{source:e,destination:s}=this.config.route,n=e.asset,r=e.destinationFee??s.fee.asset;return n.isEqual(r)?this.getBalance(t):this.config.chain.getBalance(r,t)}async getFee(t){let{chain:e,route:s}=this.config,{amount:n,sender:r,source:a}=t,o=await this.getTransfer(t),m=s.contract?await te(r,e):r,u=await this.adapter.estimateFee(m,n,a.feeBalance,o),{fee:l}=s.source,c=l?ee(u.decimals,l.extra):0n,d=u.amount+c;return u.copyWith({amount:d})}async getFeeBalance(t){let{source:e}=this.config.route;if(!e.fee)return this.getBalance(t);let s=await this.getFeeAsset(t);return this.config.chain.getBalance(s,t)}async getFeeAsset(t){let{chain:e,route:s}=this.config,{source:n}=s,r=n.fee,a=n.asset;if(!r)return a;let o=r.asset;return e instanceof Ye&&"build"in o?await o.build({chain:e,address:t}):o}async getTransfer(t){let{chain:e,route:s}=this.config,{contract:n,extrinsic:r,program:a,move:o}=s;if(r){let{address:u,amount:l,asset:c,sender:d}=t,f=await(await b.create(e)).buildMessageId(d,l,c.originSymbol,u);return r.build({...t,messageId:f})}let m=n||a||o;if(m)return m.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}}),r={...t,...n};return{...await this.getTransactData(s,r),chain:s.chain}}}async getTransactData(t,e){let{chain:s,extrinsic:n}=t,r=await n.build(e),a=await b.create(s),o=r.getTx(a.client),m=e.source.chain,u=e.sender,l=Ze.getMultilocationDerivatedAccount(m.parachainId,u,s.parachainId===0?0:1,s.usesH160Acc),c=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:c.weight.ref_time,proofSize:c.weight.proof_size}}}async getTransactFee(t){let{fee:e}=t,s=await this.getDecimals(e.asset),n=se.toBigInt(e.amount,s);return At.fromAsset(e.asset,{amount:n,decimals:s})}async getTransactFeeBalance(t,e){return this.config.chain.getBalance(t.fee.asset,e.sender)}};var H=class extends O{};import{AssetAmount as tn}from"@galacticcouncil/xc-core";var G=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:tn.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,r=this.feeBalance.amount-t.amount>e*2n;return{aIn:t.copyWith({amount:e}),aOut:this.destFee,enabled:n&&r,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 xt=class{config;validations;constructor({configService:t,transferValidations:e}){this.config=t,this.validations=e||[]}async transfer(t,e,s,n,r){let a=nn(this.config).assets().asset(t).source(s).destination(r).build();return this.getTransferData(a,e,n)}async remoteXcm(t,e,s,n,r={}){let a=this.config.getChain(e),o=this.config.getChain(s);if(!(a.isSubstrate()&&o.isSubstrate()))throw Error("RemoteXcm is supported only between parachains");let[u,l]=await Promise.all([b.create(a),b.create(o)]),c=new et(u,l),d=en.getMultilocationDerivatedAccount(a.parachainId,t,1,o.usesH160Acc),g=await l.getAsset(),f=await this.transfer(g,t,e,d,s);return c.remoteExec(t,d,n,h=>{let x=h.toDecimal();return f.buildCall(x)},r)}async getTransferData(t,e,s){let n=t.origin,{chain:r,asset:a}=n.route.destination,o=new k(n.chain),m=new k(r),u=new U(o,n),l=new H(m,r,a),c=new sn(...this.validations),[d,g,f,h,x,M,V]=await Promise.all([u.getBalance(e),u.getFeeBalance(e),u.getDestinationFee(),u.getDestinationFeeBalance(e),u.getMin(),l.getBalance(s),l.getMin()]),{source:N,destination:it}=n.route,w=f.fee.copyWith(it.fee.asset),ot=f.feeBreakdown,E=N.asset.isEqual(w)&&w.amount>10n?w.amount+1n:10n,p={address:s,amount:E,asset:N.asset,destination:{balance:M,chain:r,fee:w,feeBreakdown:ot},sender:e,source:{balance:d,chain:n.chain,fee:g.copyWith({amount:0n}),feeBalance:g,destinationFee:f.fee,destinationFeeBalance:h}};p.transact=await u.getTransact(p);let B=new G(p),A=await u.getFee(p),F;B.isSwapSupported(N.fee)&&(F=await B.getSwap(A),p.source.feeSwap=F);let S;B.isDestinationSwapSupported(A)&&(S=await B.getDestinationSwap(A),p.source.destinationFeeSwap=S),(F||S)&&(A=await u.getFee(p),A=A.padByPct(5n));let ct=await l.getEd(),y=Zt(M,w,V,ct),z=await u.getEd(),ut=Yt(d,A,x,z);p.amount=0n,p.source.fee=A;let mt={source:{balance:d,destinationFee:f.fee,destinationFeeBalance:h,destinationFeeSwap:S,fee:A,feeBalance:g,feeSwap:F,max:ut,min:d.copyWith({amount:y.amount})},destination:{balance:M,fee:w},reversible:t.reversible,async buildCall(P){let C=Object.assign({},p);return C.amount=bt.toBigInt(P,d.decimals),C.transact=await u.getTransact(C),u.getCall(C)},async estimateFee(P){let C=Object.assign({},p);return C.amount=bt.toBigInt(P,d.decimals),C.transact=await u.getTransact(C),u.getFee(C)},async estimateDestinationFee(P){let C=bt.toBigInt(P,d.decimals),{fee:T,feeBreakdown:ie}=await u.getDestinationFee(C);return p.destination.fee=T,p.destination.feeBreakdown=ie,p.source.destinationFee=T,mt.destination.fee=T,mt.source.destinationFee=T,T},async validate(P){let C=Object.assign({},p),T=P||A.amount;return C.source.fee=A.copyWith({amount:T}),c.validate(C)}};return mt}async subscribeBalance(t,e,s){let n=this.config.getChainRoutes(e),r=n.getUniqueRoutes().map(a=>a.source.asset);return n.chain.subscribeBalances(r,t).subscribe(s)}};import{ConfigBuilder as rn}from"@galacticcouncil/xc-core";function an(i){let t=rn(i.config).assets();return{assets:t,withAsset(e){let s=t.asset(e);return{sources:s,withSource(n){let r=s.source(n);return{destinations:r,withDestination(a){let{routes:o,destinationAssets:m,isAssetSelect:u,isTagSelect:l,build:c}=r.destination(a);return{routes:o,destinationAssets:m,isAssetSelect:u,isTagSelect:l,build({srcAddress:d,dstAddress:g,dstAsset:f,tag:h}){let x=c(f,h);return i.getTransferData(x,d,g)}}}}}}}}}var on="https://api.wormholescan.io",rt=class{_baseUrl;constructor(t){this._baseUrl=t||on}buildApi(t,e){return[this._baseUrl,t,"?"].join("")+new URLSearchParams(e).toString()}async getVaaBytes(t){let e=this.buildApi("/v1/signed_vaa/"+t,{});return await(await fetch(e)).json()}async getVaa(t){let e=this.buildApi("/api/v1/vaas/"+t,{});return(await(await fetch(e)).json()).data}async getVaaByTxHash(t){let e=this.buildApi("/api/v1/vaas/",{txHash:t}),n=await(await fetch(e)).json();if(n.data.length>0)return n.data[0];throw Error("Can't find VAA for given txHash: "+t)}async getOperations(t){let e=this.buildApi("/api/v1/operations/",t);return(await(await fetch(e)).json()).operations}async getOperation(t){let e=this.buildApi("/api/v1/operations/"+t,{});return await(await fetch(e)).json()}};import{addr as cn,EvmParachain as un,Parachain as mn,Wormhole as at}from"@galacticcouncil/xc-core";var re=(s=>(s[s.WaitingForVaa=0]="WaitingForVaa",s[s.VaaEmitted=1]="VaaEmitted",s[s.Completed=2]="Completed",s))(re||{});var{EvmAddr:ln}=cn,ae=class{parachainId;config;whScan;constructor(t,e){this.config=t,this.parachainId=e,this.whScan=new rt}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}}get parachain(){return this.chains.find(e=>e instanceof mn&&e.parachainId===this.parachainId)}async getWithdraws(t){let e=at.fromChain(this.parachain);return(await this.getTransfers(t)).filter(n=>n.operation.emitterChain===e.getWormholeId())}async getDeposits(t){let e=at.fromChain(this.parachain);return(await this.getTransfers(t)).filter(n=>n.operation.content.standarizedProperties.toChain===e.getWormholeId())}async getTransfers(t){let e=await this.parachain.getDerivatedAddress(t);return(await this.whScan.getOperations({...this.filters,address:e})).map(n=>this.toTransfer(n)).filter(n=>!!n)}toTransfer(t){let{content:e,emitterChain:s,emitterAddress:n,sourceChain:r}=t,{standarizedProperties:a}=e,o=this.findNttByEmitter(s,n.native);if(!o)return;let m=this.findChainByWormholeId(a.toChain);if(!m)return;let u=this.getStatus(t),l,c=this.findNtt(m,o.assetKey);if(u===1&&t.vaa&&c){let d=t.vaa.raw;l=async g=>!ln.isValid(g)&&m instanceof un?(await Z.create(m)).redeem(g,d,c):new D().redeem(g,d,c)}return{asset:a.tokenAddress,assetSymbol:t.data.symbol,amount:t.data.tokenAmount,from:r.from,fromChain:o.chain,to:a.toAddress,toChain:m,status:u,redeem:l,operation:t}}findChainByWormholeId(t){return this.chains.find(e=>at.isKnown(e)&&at.fromChain(e).getWormholeId()===t)}findNtt(t,e){if("ntt"in t&&t.ntt)return t.ntt[e]}findNttByEmitter(t,e){let s=this.findChainByWormholeId(t);if(!s||!("ntt"in s)||!s.ntt)return;let n=s.ntt,r=Object.entries(n).find(([a,o])=>o.transceiver.wormhole.toLowerCase()===e.toLowerCase());if(r){let[a,o]=r;return{chain:s,assetKey:a,def:o}}}getStatus(t){return t.vaa?t.targetChain&&t.targetChain.status==="completed"?2:1:0}};export{Vt as DISPATCH_ADDRESS,D as EvmClaim,q as EvmPlatform,Nt as EvmSigner,G as FeeSwap,_ as Gas,k as PlatformAdapter,Y as SolanaLilJit,Q as SolanaPlatform,Kt as SolanaSigner,Z as SubstrateClaim,I as SubstrateEvm,et as SubstrateExec,nt as SubstratePlatform,b as SubstrateService,qt as SubstrateSigner,st as SuiPlatform,Qt as SuiSigner,an as TransferBuilder,xt as Wallet,re as WhStatus,rt as WormholeScan,ae as WormholeTransfer,Ls as chunk,Us as deserializeV0,zt as ixToHuman,js as serializeV0};
@@ -1,7 +1,28 @@
1
- import { EvmChain } from '@galacticcouncil/xc-core';
1
+ import { NttTokenDef } from '@galacticcouncil/xc-core';
2
2
  import { EvmCall } from './types';
3
3
  export declare class EvmClaim {
4
- #private;
5
- constructor(chain: EvmChain);
6
- redeem(from: string, vaaRaw: string): EvmCall;
4
+ /**
5
+ * Redeem NTT transfer on destination chain.
6
+ *
7
+ * Delivers the signed VAA to the token transceiver which verifies the
8
+ * attestation and instructs the manager to mint (or unlock) the tokens.
9
+ *
10
+ * @param from - claimer address
11
+ * @param vaaRaw - base64 encoded signed VAA (wormholescan raw format)
12
+ * @param ntt - NTT token deployment on the destination chain
13
+ * @returns claim (receiveMessage) evm call
14
+ */
15
+ redeem(from: string, vaaRaw: string, ntt: NttTokenDef): EvmCall;
16
+ /**
17
+ * Complete an inbound transfer queued by the manager rate limit.
18
+ *
19
+ * Callable once the rate limit duration expired for a transfer that
20
+ * was delivered (redeemed) while the inbound limit was exhausted.
21
+ *
22
+ * @param from - claimer address
23
+ * @param digest - queued transfer message digest
24
+ * @param ntt - NTT token deployment on the destination chain
25
+ * @returns complete transfer evm call
26
+ */
27
+ completeInboundQueuedTransfer(from: string, digest: string, ntt: NttTokenDef): EvmCall;
7
28
  }
@@ -1,9 +1,15 @@
1
1
  import { AnyEvmChain, AssetAmount, ContractConfig } from '@galacticcouncil/xc-core';
2
- import { EvmCall } from './types';
3
- import { Platform } from '../types';
2
+ import { Call, Platform } from '../types';
4
3
  export declare class EvmPlatform implements Platform<ContractConfig> {
5
4
  #private;
6
5
  constructor(chain: AnyEvmChain);
7
- buildCall(account: string, amount: bigint, _feeBalance: AssetAmount, config: ContractConfig): Promise<EvmCall>;
6
+ buildCall(account: string, amount: bigint, _feeBalance: AssetAmount, config: ContractConfig): Promise<Call>;
7
+ /**
8
+ * Build transfer call for a substrate signed origin.
9
+ *
10
+ * Wraps the evm contract call(s) in EVM.call extrinsic(s), batching
11
+ * the erc20 approve when allowance is insufficient (single signature).
12
+ */
13
+ private buildSubstrateEvmCall;
8
14
  estimateFee(account: string, amount: bigint, feeBalance: AssetAmount, config: ContractConfig): Promise<AssetAmount>;
9
15
  }
@@ -1,5 +1,4 @@
1
1
  export * from './SolanaPlatform';
2
- export * from './SolanaClaim';
3
2
  export * from './SolanaLilJit';
4
3
  export * from './SolanaSigner';
5
4
  export * from './types';
@@ -1,9 +1,32 @@
1
- import { EvmParachain } from '@galacticcouncil/xc-core';
1
+ import { EvmParachain, NttTokenDef } from '@galacticcouncil/xc-core';
2
2
  import { SubstrateCall } from './types';
3
- import { EvmCall } from '../evm';
3
+ /**
4
+ * NTT claim for substrate signed origins.
5
+ *
6
+ * Wraps the evm claim calls in EVM.call extrinsic so bound substrate
7
+ * accounts can redeem without an evm signer.
8
+ */
4
9
  export declare class SubstrateClaim {
5
10
  #private;
6
- constructor(chain: EvmParachain);
7
- redeemMrl(from: string, vaaBytes: string): EvmCall;
8
- redeemMrlViaXcm(from: string, vaaBytes: string): Promise<SubstrateCall>;
11
+ private constructor();
12
+ static create(chain: EvmParachain): Promise<SubstrateClaim>;
13
+ /**
14
+ * Redeem NTT transfer (see {@link EvmClaim.redeem}).
15
+ *
16
+ * @param from - claimer address (ss58)
17
+ * @param vaaRaw - base64 encoded signed VAA (wormholescan raw format)
18
+ * @param ntt - NTT token deployment on the destination chain
19
+ * @returns claim (receiveMessage) substrate call
20
+ */
21
+ redeem(from: string, vaaRaw: string, ntt: NttTokenDef): Promise<SubstrateCall>;
22
+ /**
23
+ * Complete an inbound transfer queued by the manager rate limit
24
+ * (see {@link EvmClaim.completeInboundQueuedTransfer}).
25
+ *
26
+ * @param from - claimer address (ss58)
27
+ * @param digest - queued transfer message digest
28
+ * @param ntt - NTT token deployment on the destination chain
29
+ * @returns complete transfer substrate call
30
+ */
31
+ completeInboundQueuedTransfer(from: string, digest: string, ntt: NttTokenDef): Promise<SubstrateCall>;
9
32
  }
@@ -0,0 +1,28 @@
1
+ import { EvmParachain } from '@galacticcouncil/xc-core';
2
+ import { SubstrateCall } from './types';
3
+ export declare const Gas: {
4
+ readonly approve: 200000n;
5
+ readonly transfer: 1200000n;
6
+ readonly redeem: 2000000n;
7
+ readonly queued: 600000n;
8
+ };
9
+ export type EvmCallData = {
10
+ to: string;
11
+ data: string;
12
+ value?: bigint;
13
+ gas: bigint;
14
+ };
15
+ /**
16
+ * EVM.call extrinsic wrapper.
17
+ *
18
+ * Executes evm contract calls from a substrate signed origin. The evm
19
+ * source must be the signer truncated H160 (EnsureAddressTruncated) and
20
+ * the account has to be bound on chain (EVMAccounts) so gas & token
21
+ * balances resolve to the real account.
22
+ */
23
+ export declare class SubstrateEvm {
24
+ #private;
25
+ private constructor();
26
+ static create(chain: EvmParachain): Promise<SubstrateEvm>;
27
+ buildCall(from: string, calls: EvmCallData[]): Promise<SubstrateCall>;
28
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './SubstrateClaim';
2
+ export * from './SubstrateEvm';
2
3
  export * from './SubstrateExec';
3
4
  export * from './SubstratePlatform';
4
5
  export * from './SubstrateService';
@@ -1,4 +1,3 @@
1
- export * from './SuiClaim';
2
1
  export * from './SuiPlatform';
3
2
  export * from './SuiSigner';
4
3
  export * from './types';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galacticcouncil/xc-sdk",
3
- "version": "1.3.0",
3
+ "version": "2.0.0-pr346-8e7401c",
4
4
  "description": "Cross-chain sdk",
5
5
  "author": "GalacticCouncil",
6
6
  "type": "module",
@@ -33,6 +33,7 @@
33
33
  "link": "npm ln"
34
34
  },
35
35
  "dependencies": {
36
- "@galacticcouncil/xc-core": "^1.3.0"
36
+ "@galacticcouncil/xc-core": "2.0.0-pr346-8e7401c",
37
+ "@wormhole-foundation/sdk-base": "6.1.4"
37
38
  }
38
39
  }
@@ -1,11 +0,0 @@
1
- import { SolanaChain } from '@galacticcouncil/xc-core';
2
- import { SolanaCall } from './types';
3
- export declare class SolanaClaim {
4
- #private;
5
- constructor(chain: SolanaChain);
6
- redeem(from: string, vaaRaw: string, recipient?: string): Promise<SolanaCall[]>;
7
- private redeemToken;
8
- private redeemAndUnwrap;
9
- private derivePostedVaaKey;
10
- private getV0Message;
11
- }
@@ -1,7 +0,0 @@
1
- import { SuiChain } from '@galacticcouncil/xc-core';
2
- import { SuiCall } from './types';
3
- export declare class SuiClaim {
4
- #private;
5
- constructor(chain: SuiChain);
6
- redeem(from: string, vaaRaw: string): Promise<SuiCall>;
7
- }