@tuwaio/pulsar-evm 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -88,7 +88,11 @@ import { config } from './wagmi'; // Your wagmi config
88
88
  async function trackMyTransaction(txHash: string, chainId: number) {
89
89
  await evmTracker({
90
90
  config,
91
- tx: { txKey: txHash, chainId },
91
+ tx: {
92
+ txKey: txHash,
93
+ chainId,
94
+ requiredConfirmations: 3,
95
+ },
92
96
  onTxDetailsFetched: (txDetails) => {
93
97
  console.log('Transaction details:', txDetails);
94
98
  },
@@ -101,6 +105,9 @@ async function trackMyTransaction(txHash: string, chainId: number) {
101
105
  onFailure: (error) => {
102
106
  console.error('Tracking failed:', error);
103
107
  },
108
+ onConfirmationsUpdate: (confirmations) => {
109
+ console.log(`Current confirmations: ${confirmations}/3`);
110
+ },
104
111
  });
105
112
  }
106
113
  ```
package/dist/index.d.mts CHANGED
@@ -34,7 +34,7 @@ declare function pulsarEvmAdapter<T extends Transaction>(config: Config, appChai
34
34
  * Defines the parameters for the low-level EVM transaction tracker.
35
35
  */
36
36
  type EVMTrackerParams = {
37
- tx: Pick<Transaction, 'chainId' | 'txKey'>;
37
+ tx: Pick<Transaction, 'chainId' | 'txKey' | 'requiredConfirmations'>;
38
38
  config: Config;
39
39
  onTxDetailsFetched: (txDetails: GetTransactionReturnType) => void;
40
40
  onSuccess: (txDetails: GetTransactionReturnType, receipt: TransactionReceipt, client: Client) => Promise<void>;
@@ -43,6 +43,7 @@ type EVMTrackerParams = {
43
43
  onInitialize?: () => void;
44
44
  retryCount?: number;
45
45
  retryTimeout?: number;
46
+ onConfirmationsUpdate?: (confirmations: number) => void;
46
47
  waitForTransactionReceiptParams?: WaitForTransactionReceiptParameters;
47
48
  };
48
49
  /**
package/dist/index.d.ts CHANGED
@@ -34,7 +34,7 @@ declare function pulsarEvmAdapter<T extends Transaction>(config: Config, appChai
34
34
  * Defines the parameters for the low-level EVM transaction tracker.
35
35
  */
36
36
  type EVMTrackerParams = {
37
- tx: Pick<Transaction, 'chainId' | 'txKey'>;
37
+ tx: Pick<Transaction, 'chainId' | 'txKey' | 'requiredConfirmations'>;
38
38
  config: Config;
39
39
  onTxDetailsFetched: (txDetails: GetTransactionReturnType) => void;
40
40
  onSuccess: (txDetails: GetTransactionReturnType, receipt: TransactionReceipt, client: Client) => Promise<void>;
@@ -43,6 +43,7 @@ type EVMTrackerParams = {
43
43
  onInitialize?: () => void;
44
44
  retryCount?: number;
45
45
  retryTimeout?: number;
46
+ onConfirmationsUpdate?: (confirmations: number) => void;
46
47
  waitForTransactionReceiptParams?: WaitForTransactionReceiptParameters;
47
48
  };
48
49
  /**
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var orbitCore=require('@tuwaio/orbit-core'),orbitEvm=require('@tuwaio/orbit-evm'),pulsarCore=require('@tuwaio/pulsar-core'),core=require('@wagmi/core'),viem=require('viem'),actions=require('viem/actions'),T=require('dayjs'),chains=require('viem/chains');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var T__default=/*#__PURE__*/_interopDefault(T);var E=1.15;async function v({config:t,tx:e}){if(e.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,maxFeePerGas:n,maxPriorityFeePerGas:i,chainId:o}=e;if(a===void 0||!n||!i)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!t)throw new Error("Wagmi config is not provided.");let c=core.getAccount(t);if(!c.address)throw new Error("No connected account found.");let s=BigInt(Math.ceil(Number(i)*E)),r=BigInt(Math.ceil(Number(n)*E));return await core.sendTransaction(t,{to:c.address,value:0n,chainId:o,nonce:a,maxFeePerGas:r,maxPriorityFeePerGas:s})}catch(c){let s=c instanceof Error?c.message:String(c);throw new Error(`Failed to cancel transaction: ${s}`)}}var ue=10,de=3e3;async function me(t){let{tx:e,config:a,onInitialize:n,onTxDetailsFetched:i,onSuccess:o,onFailure:c,onReplaced:s,retryCount:r=ue,retryTimeout:l=de,waitForTransactionReceiptParams:u}=t;if(n?.(),e.txKey===viem.zeroHash)return c(new Error("Transaction hash cannot be the zero hash."));let p=core.getClient(a,{chainId:e.chainId});if(!p)return c(new Error(`Could not create a viem client for chainId: ${e.chainId}`));let d=null;for(let f=0;f<r;f++)try{d=await actions.getTransaction(p,{hash:e.txKey}),i(d);break}catch(m){if(f===r-1)return console.error(`EVM tracker failed to fetch tx ${e.txKey} after ${r} retries:`,m),c(m);await new Promise(y=>setTimeout(y,l));}if(!d)return c(new Error("Transaction details could not be fetched."));try{let f=!1,m=await actions.waitForTransactionReceipt(p,{hash:d.hash,onReplaced:y=>{f=!0,s(y);},...u});if(f)return;await o(d,m,p);}catch(f){console.error(`Error waiting for receipt for tx ${e.txKey}:`,f),c(f);}}async function x(t){let{tx:e,config:a,updateTxParams:n,transactionsPool:i,onSuccess:o,onError:c,onReplaced:s}=t;return me({tx:e,config:a,onInitialize:()=>{n(e.txKey,{hash:e.txKey});},onTxDetailsFetched:r=>{n(e.txKey,{to:r.to??void 0,input:r.input,value:r.value?.toString(),nonce:r.nonce,maxFeePerGas:r.maxFeePerGas?.toString(),maxPriorityFeePerGas:r.maxPriorityFeePerGas?.toString()});},onSuccess:async(r,l,u)=>{let p=await actions.getBlock(u,{blockNumber:l.blockNumber}),d=Number(p.timestamp),f=l.status==="success";n(e.txKey,{status:f?pulsarCore.TransactionStatus.Success:pulsarCore.TransactionStatus.Failed,isError:!f,pending:false,finishedTimestamp:d});let m=i[e.txKey];f&&o&&m&&o(m),!f&&c&&m&&c(new Error("Transaction reverted"),m);},onReplaced:r=>{n(e.txKey,{status:pulsarCore.TransactionStatus.Replaced,replacedTxHash:r.transaction.hash,pending:false});let l=i[e.txKey];s&&l&&s(l,e);},onFailure:r=>{n(e.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,error:orbitCore.normalizeError(r)});let l=i[e.txKey];c&&l&&c(r,l);}})}var R=new Map,g=t=>{let{apiKey:e,baseUrl:a,timeout:n}=t,i=a||"https://api.gelato.cloud",o=`${e}:${i}`,c=R.get(o);if(c)return c;let s={timeout:n??15e3,...t.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${e}`,...t.httpTransportConfig?.fetchOptions?.headers},...t.httpTransportConfig?.fetchOptions}},r=viem.http(`${i}/rpc`,s)({});return R.set(o,r),r};var ge=(o=>(o[o.Pending=100]="Pending",o[o.Submitted=110]="Submitted",o[o.Success=200]="Success",o[o.Rejected=400]="Rejected",o[o.Reverted=500]="Reverted",o))(ge||{}),be=new Set([200,400,500]);function ke(t){return !be.has(t)}function ye(t){return async({tx:e,stopPolling:a,onSuccess:n,onFailure:i,onIntervalTick:o})=>{let c=await t.request({method:"relayer_getStatus",params:{id:e.txKey,logs:false}});o?.(c);let{status:s,createdAt:r}=c;if(r&&T__default.default().diff(T__default.default.unix(r),"hour")>=1&&ke(s)){a();return}s===200?(n(c),a({withoutRemoving:true})):(s===400||s===500)&&(i(c),a({withoutRemoving:true}));}}function F({tx:t,gelatoApiKey:e,updateTxParams:a,removeTxFromPool:n,transactionsPool:i,onSuccess:o,onError:c}){let s=g({apiKey:e}),r=ye(s);return pulsarCore.initializePollingTracker({tx:t,fetcher:r,removeTxFromPool:n,onSuccess:l=>{let u=l.status===200?l.receipt.transactionHash:void 0;a(t.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:u,finishedTimestamp:T__default.default().unix()});let p=i[t.txKey];o&&p&&o(p);},onIntervalTick:l=>{l.status===110&&a(t.txKey,{hash:l.hash});},onFailure:l=>{let u="Transaction failed or was not found.",p;l&&(l.status===400?u=l.message||"Transaction was rejected by Gelato Relay.":l.status===500&&(u=l.message||"Transaction reverted on-chain.",p=l.receipt.transactionHash));let d=new Error(u);a(t.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:p,error:orbitCore.normalizeError(d),finishedTimestamp:T__default.default().unix()});let f=i[t.txKey];c&&f&&c(d,f);}})}var gt={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},O={[chains.mainnet.id]:"https://app.safe.global/eth:",[chains.goerli.id]:"https://app.safe.global/gor:",[chains.sepolia.id]:"https://app.safe.global/sep:",[chains.polygon.id]:"https://app.safe.global/matic:",[chains.arbitrum.id]:"https://app.safe.global/arb1:",[chains.aurora.id]:"https://app.safe.global/aurora:",[chains.avalanche.id]:"https://app.safe.global/avax:",[chains.base.id]:"https://app.safe.global/base:",[chains.boba.id]:"https://app.safe.global/boba:",[chains.bsc.id]:"https://app.safe.global/bnb:",[chains.celo.id]:"https://app.safe.global/celo:",[chains.gnosis.id]:"https://app.safe.global/gno:",[chains.optimism.id]:"https://app.safe.global/oeth:",[chains.polygonZkEvm.id]:"https://app.safe.global/zkevm:",[chains.zksync.id]:"https://app.safe.global/zksync:"},L={[chains.mainnet.id]:"https://safe-transaction-mainnet.safe.global/api/v1",[chains.goerli.id]:"https://safe-transaction-goerli.safe.global/api/v1",[chains.sepolia.id]:"https://safe-transaction-sepolia.safe.global/api/v1",[chains.polygon.id]:"https://safe-transaction-polygon.safe.global/api/v1",[chains.arbitrum.id]:"https://safe-transaction-arbitrum.safe.global/api/v1",[chains.aurora.id]:"https://safe-transaction-aurora.safe.global/api/v1",[chains.avalanche.id]:"https://safe-transaction-avalanche.safe.global/api/v1",[chains.base.id]:"https://safe-transaction-base.safe.global/api/v1",[chains.boba.id]:"https://safe-transaction-boba.safe.global/api/v1",[chains.bsc.id]:"https://safe-transaction-bsc.safe.global/api/v1",[chains.celo.id]:"https://safe-transaction-celo.safe.global/api/v1",[chains.gnosis.id]:"https://safe-transaction-gnosis-chain.safe.global/api/v1",[chains.optimism.id]:"https://safe-transaction-optimism.safe.global/api/v1",[chains.polygonZkEvm.id]:"https://safe-transaction-zkevm.safe.global/api/v1",[chains.zksync.id]:"https://safe-transaction-zksync.safe.global/api/v1"};var Ee=async({tx:t,stopPolling:e,onSuccess:a,onFailure:n,onReplaced:i,onIntervalTick:o})=>{let c=L[t.chainId];if(!c)throw new Error(`Safe Transaction Service URL not found for chainId: ${t.chainId}`);let s=await fetch(`${c}/multisig-transactions/${t.txKey}/`);if(!s.ok)throw s.status===404&&(n(),e()),new Error(`Safe API responded with status: ${s.status}`);let r=await s.json();if(o?.(r),r.isExecuted){r.isSuccessful?a(r):n(r),e({withoutRemoving:true});return}let l=await fetch(`${c}/safes/${t.from}/multisig-transactions/?nonce=${r.nonce}`);if(!l.ok)throw new Error(`Safe API (nonce check) responded with status: ${l.status}`);let p=(await l.json()).results.find(d=>d.isExecuted);if(p){i?.(p),e({withoutRemoving:true});return}T__default.default().diff(T__default.default(r.submissionDate),"day")>=1&&e();};function W({tx:t,updateTxParams:e,removeTxFromPool:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c}){return pulsarCore.initializePollingTracker({tx:t,fetcher:Ee,removeTxFromPool:a,onSuccess:s=>{e(t.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:s.transactionHash??void 0,finishedTimestamp:s.executionDate?T__default.default(s.executionDate).unix():void 0});let r=n[t.txKey];i&&r&&i(r);},onIntervalTick:s=>{e(t.txKey,{hash:s.transactionHash??void 0});},onFailure:s=>{let r=s?new Error("Safe transaction failed or was rejected."):new Error("Transaction not found.");e(t.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:s?.transactionHash??void 0,error:orbitCore.normalizeError(r),finishedTimestamp:s?.executionDate?T__default.default(s.executionDate).unix():void 0});let l=n[t.txKey];o&&l&&o(r,l);},onReplaced:s=>{e(t.txKey,{status:pulsarCore.TransactionStatus.Replaced,pending:false,hash:t.adapter===orbitCore.OrbitAdapter.EVM?t.hash:viem.zeroHash,replacedTxHash:s.safeTxHash??viem.zeroHash,finishedTimestamp:s.executionDate?T__default.default(s.executionDate).unix():void 0});let r=n[t.txKey];c&&r&&c(r,t);}})}async function Y({tracker:t,tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,gelatoApiKey:s,...r}){switch(t){case pulsarCore.TransactionTracker.Ethereum:return x({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r});case pulsarCore.TransactionTracker.Gelato:return s?F({tx:e,transactionsPool:n,onSuccess:i,onError:o,gelatoApiKey:s,...r}):(console.warn(`Gelato tracker requested for tx '${e.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),x({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r}));case pulsarCore.TransactionTracker.Safe:return W({tx:e,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r});default:return console.warn(`Unknown tracker type: '${t}'. Falling back to default EVM tracker.`),x({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r})}}function J({actionTxKey:t,connectorType:e,tracker:a,gelatoApiKey:n}){if(a&&a===pulsarCore.TransactionTracker.Gelato&&n)return {tracker:pulsarCore.TransactionTracker.Gelato,txKey:t};if(!viem.isHex(t))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(t)}`);let i=e.split(":");return (i.length>1?i[i.length-1]==="safe"||i[i.length-1]==="safewallet":e?.toLowerCase()==="safe")?{tracker:pulsarCore.TransactionTracker.Safe,txKey:t}:{tracker:pulsarCore.TransactionTracker.Ethereum,txKey:t}}var Q=({chains:t,tx:e})=>{if(e.tracker===pulsarCore.TransactionTracker.Safe){let o=O[e.chainId];return o?`${o}${e.from}/transactions/tx?id=multisig_${e.from}_${e.txKey}`:""}let n=t.find(o=>o.id===e.chainId)?.blockExplorers?.default.url;if(!n)return "";let i=(e.adapter===orbitCore.OrbitAdapter.EVM?e.replacedTxHash:e.txKey)||(e.adapter===orbitCore.OrbitAdapter.EVM?e.hash:e.txKey);return i?`${n}/tx/${i}`:""};var X=1.15;async function ee({config:t,tx:e}){if(e.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,from:n,to:i,value:o,input:c,maxFeePerGas:s,maxPriorityFeePerGas:r,chainId:l}=e;if(a===void 0||!n||!i||!o||!s||!r)throw new Error("Transaction is missing required fields for speed-up.");try{if(!t)throw new Error("Wagmi config is not provided.");if(!core.getAccount(t).address)throw new Error("No connected account found.");let p=BigInt(Math.ceil(Number(r)*X)),d=BigInt(Math.ceil(Number(s)*X));return await core.sendTransaction(t,{to:i,value:BigInt(o),data:c||"0x",chainId:l,nonce:a,maxFeePerGas:d,maxPriorityFeePerGas:p})}catch(u){let p=u instanceof Error?u.message:String(u);throw new Error(`Failed to speed up transaction: ${p}`)}}function ua(t,e){if(!t)throw new Error("EVM adapter requires a wagmi config object.");return {key:orbitCore.OrbitAdapter.EVM,getConnectorInfo:()=>{let a=core.getConnection(t),n=orbitCore.lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:a.address??n?.address??viem.zeroAddress,connectorType:orbitCore.getConnectorTypeFromName(orbitCore.OrbitAdapter.EVM,a.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:a=>orbitEvm.checkAndSwitchChain(a,t),checkTransactionsTracker:a=>J(a),checkAndInitializeTrackerInStore:({tx:a,...n})=>Y({tracker:a.tracker,tx:a,config:t,...n}),getExplorerUrl:a=>{let{chain:n}=core.getConnection(t),i=n?.blockExplorers?.default.url;return a?`${i}/${a}`:i},getExplorerTxUrl:a=>Q({chains:e,tx:a}),cancelTxAction:a=>v({config:t,tx:a}),speedUpTxAction:a=>ee({config:t,tx:a}),retryTxAction:async({onClose:a,txKey:n,executeTxAction:i,tx:o})=>{if(a(n),!i){console.error("Retry failed: executeTxAction function is not provided.");return}await i({actionFunction:()=>o.actionFunction({config:t,...o.payload}),params:o,defaultTracker:pulsarCore.TransactionTracker.Ethereum});}}}var w=new Map;async function Me(t){let e=await t.request({method:"relayer_getCapabilities",params:[]}),a={};for(let[n,i]of Object.entries(e))a[Number(n)]=i;return a}async function ze(t){let e=w.get(t);if(e)return e;let a=g({apiKey:t}),n=await Me(a);return w.set(t,n),n}async function Ta(t,e){try{let a=await ze(e);return t in a}catch(a){return console.error("Failed to fetch Gelato relay capabilities:",a),w.delete(e),false}}
2
- exports.GelatoStatusCode=ge;exports.SafeTransactionServiceUrls=L;exports.cancelTxAction=v;exports.checkAndInitializeTrackerInStore=Y;exports.checkIsGelatoAvailable=Ta;exports.checkTransactionsTracker=J;exports.createGelatoClient=g;exports.evmTracker=me;exports.evmTrackerForStore=x;exports.gelatoFetcher=ye;exports.gelatoTrackerForStore=F;exports.gnosisSafeLinksHelper=O;exports.pulsarEvmAdapter=ua;exports.safeFetcher=Ee;exports.safeSdkOptions=gt;exports.safeTrackerForStore=W;exports.selectEvmTxExplorerLink=Q;exports.speedUpTxAction=ee;
1
+ 'use strict';var orbitCore=require('@tuwaio/orbit-core'),orbitEvm=require('@tuwaio/orbit-evm'),pulsarCore=require('@tuwaio/pulsar-core'),core=require('@wagmi/core'),viem=require('viem'),actions=require('viem/actions'),b=require('dayjs'),chains=require('viem/chains');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var b__default=/*#__PURE__*/_interopDefault(b);var F=1.15;async function A({config:t,tx:e}){if(e.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,maxFeePerGas:n,maxPriorityFeePerGas:i,chainId:o}=e;if(a===void 0||!n||!i)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!t)throw new Error("Wagmi config is not provided.");let s=core.getAccount(t);if(!s.address)throw new Error("No connected account found.");let c=BigInt(Math.ceil(Number(i)*F)),r=BigInt(Math.ceil(Number(n)*F));return await core.sendTransaction(t,{to:s.address,value:0n,chainId:o,nonce:a,maxFeePerGas:r,maxPriorityFeePerGas:c})}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`Failed to cancel transaction: ${c}`,{cause:s})}}var be=10,ke=3e3,v=3,ye=1e4,Ce=5e3;async function Se(t){let{tx:e,config:a,onInitialize:n,onTxDetailsFetched:i,onSuccess:o,onFailure:s,onReplaced:c,retryCount:r=be,retryTimeout:l=ke,onConfirmationsUpdate:p,waitForTransactionReceiptParams:f}=t,{requiredConfirmations:d}=e;if(n?.(),e.txKey===viem.zeroHash)return s(new Error("Transaction hash cannot be the zero hash."));let u=core.getClient(a,{chainId:e.chainId});if(!u)return s(new Error(`Could not create a viem client for chainId: ${e.chainId}`));let m=null;for(let T=0;T<r;T++)try{m=await actions.getTransaction(u,{hash:e.txKey}),i(m);break}catch(h){if(T===r-1)return console.error(`[evmTracker] Fatal error fetching transaction ${e.txKey} on chain ${e.chainId}:`,h),s(h);console.warn(`[evmTracker] Error fetching transaction ${e.txKey} on chain ${e.chainId} (attempt ${T+1}/${r}):`,h),await new Promise(g=>setTimeout(g,l));}if(!m)return s(new Error("Transaction details could not be fetched."));let E=false;for(let T=0;T<=v;T++)try{let h=await actions.waitForTransactionReceipt(u,{hash:m.hash,onReplaced:g=>{E=!0,c(g);},...f});if(!E){let g=d??1;if(g>1)for(;;){try{let x=await actions.getTransactionConfirmations(u,{transactionReceipt:h}),I=Number(x);if(p?.(I),I>=g)break}catch(x){console.warn(`[evmTracker] Error fetching confirmations for ${e.txKey} on chain ${e.chainId}:`,x);}await new Promise(x=>setTimeout(x,Ce));}await o(m,h,u);}return}catch(h){if(h instanceof Error&&h.name==="TransactionReceiptNotFoundError"&&!E&&T<v){console.warn(`[evmTracker] Receipt not found for ${e.txKey}, retry ${T+1}/${v}...`),await new Promise(x=>setTimeout(x,ye*(T+1)));continue}s(h);return}}async function y(t){let{tx:e,config:a,updateTxParams:n,transactionsPool:i,onSuccess:o,onError:s,onReplaced:c}=t;return Se({tx:e,config:a,onInitialize:()=>{n(e.txKey,{hash:e.txKey});},onTxDetailsFetched:r=>{n(e.txKey,{to:r.to??void 0,input:r.input,value:r.value?.toString(),nonce:r.nonce,maxFeePerGas:r.maxFeePerGas?.toString(),maxPriorityFeePerGas:r.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:r=>{n(e.txKey,{confirmations:r});},onSuccess:async(r,l,p)=>{let f=await actions.getBlock(p,{blockNumber:l.blockNumber}),d=Number(f.timestamp),u=l.status==="success";n(e.txKey,{status:u?pulsarCore.TransactionStatus.Success:pulsarCore.TransactionStatus.Failed,isError:!u,pending:false,finishedTimestamp:d});let m=i[e.txKey];u&&o&&m&&o(m),!u&&s&&m&&s(new Error("Transaction reverted"),m);},onReplaced:r=>{n(e.txKey,{status:pulsarCore.TransactionStatus.Replaced,replacedTxHash:r.transaction.hash,pending:false});let l=i[e.txKey];c&&l&&c(l,e);},onFailure:r=>{n(e.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,error:orbitCore.normalizeError(r)});let l=i[e.txKey];s&&l&&s(r,l);}})}var $=new Map,C=t=>{let{apiKey:e,baseUrl:a,timeout:n}=t,i=a||"https://api.gelato.cloud",o=`${e}:${i}`,s=$.get(o);if(s)return s;let c={timeout:n??15e3,...t.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${e}`,...t.httpTransportConfig?.fetchOptions?.headers},...t.httpTransportConfig?.fetchOptions}},r=viem.http(`${i}/rpc`,c)({});return $.set(o,r),r};var Re=(o=>(o[o.Pending=100]="Pending",o[o.Submitted=110]="Submitted",o[o.Success=200]="Success",o[o.Rejected=400]="Rejected",o[o.Reverted=500]="Reverted",o))(Re||{}),Ge=new Set([200,400,500]);function Pe(t){return !Ge.has(t)}function Ie(t){return async({tx:e,stopPolling:a,onSuccess:n,onFailure:i,onIntervalTick:o})=>{let s=await t.request({method:"relayer_getStatus",params:{id:e.txKey,logs:false}});o?.(s);let{status:c,createdAt:r}=s;if(r&&b__default.default().diff(b__default.default.unix(r),"hour")>=1&&Pe(c)){a();return}c===200?(n(s),a({withoutRemoving:true})):(c===400||c===500)&&(i(s),a({withoutRemoving:true}));}}function K({tx:t,gelatoApiKey:e,updateTxParams:a,removeTxFromPool:n,transactionsPool:i,onSuccess:o,onError:s}){let c=C({apiKey:e}),r=Ie(c);return pulsarCore.initializePollingTracker({tx:t,fetcher:r,removeTxFromPool:n,onSuccess:l=>{let p=l.status===200?l.receipt.transactionHash:void 0;a(t.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:p,finishedTimestamp:b__default.default().unix()});let f=i[t.txKey];o&&f&&o(f);},onIntervalTick:l=>{l.status===110&&a(t.txKey,{hash:l.hash});},onFailure:l=>{let p="Transaction failed or was not found.",f;l&&(l.status===400?p=l.message||"Transaction was rejected by Gelato Relay.":l.status===500&&(p=l.message||"Transaction reverted on-chain.",f=l.receipt.transactionHash));let d=new Error(p);a(t.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:f,error:orbitCore.normalizeError(d),finishedTimestamp:b__default.default().unix()});let u=i[t.txKey];s&&u&&s(d,u);}})}var Rt={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},X={[chains.mainnet.id]:"https://app.safe.global/eth:",[chains.goerli.id]:"https://app.safe.global/gor:",[chains.sepolia.id]:"https://app.safe.global/sep:",[chains.polygon.id]:"https://app.safe.global/matic:",[chains.arbitrum.id]:"https://app.safe.global/arb1:",[chains.aurora.id]:"https://app.safe.global/aurora:",[chains.avalanche.id]:"https://app.safe.global/avax:",[chains.base.id]:"https://app.safe.global/base:",[chains.boba.id]:"https://app.safe.global/boba:",[chains.bsc.id]:"https://app.safe.global/bnb:",[chains.celo.id]:"https://app.safe.global/celo:",[chains.gnosis.id]:"https://app.safe.global/gno:",[chains.optimism.id]:"https://app.safe.global/oeth:",[chains.polygonZkEvm.id]:"https://app.safe.global/zkevm:",[chains.zksync.id]:"https://app.safe.global/zksync:"},Z={[chains.mainnet.id]:"https://safe-transaction-mainnet.safe.global/api/v1",[chains.goerli.id]:"https://safe-transaction-goerli.safe.global/api/v1",[chains.sepolia.id]:"https://safe-transaction-sepolia.safe.global/api/v1",[chains.polygon.id]:"https://safe-transaction-polygon.safe.global/api/v1",[chains.arbitrum.id]:"https://safe-transaction-arbitrum.safe.global/api/v1",[chains.aurora.id]:"https://safe-transaction-aurora.safe.global/api/v1",[chains.avalanche.id]:"https://safe-transaction-avalanche.safe.global/api/v1",[chains.base.id]:"https://safe-transaction-base.safe.global/api/v1",[chains.boba.id]:"https://safe-transaction-boba.safe.global/api/v1",[chains.bsc.id]:"https://safe-transaction-bsc.safe.global/api/v1",[chains.celo.id]:"https://safe-transaction-celo.safe.global/api/v1",[chains.gnosis.id]:"https://safe-transaction-gnosis-chain.safe.global/api/v1",[chains.optimism.id]:"https://safe-transaction-optimism.safe.global/api/v1",[chains.polygonZkEvm.id]:"https://safe-transaction-zkevm.safe.global/api/v1",[chains.zksync.id]:"https://safe-transaction-zksync.safe.global/api/v1"};var He=async({tx:t,stopPolling:e,onSuccess:a,onFailure:n,onReplaced:i,onIntervalTick:o})=>{let s=Z[t.chainId];if(!s)throw new Error(`Safe Transaction Service URL not found for chainId: ${t.chainId}`);let c=await fetch(`${s}/multisig-transactions/${t.txKey}/`);if(!c.ok)throw c.status===404&&(n(),e()),new Error(`Safe API responded with status: ${c.status}`);let r=await c.json();if(o?.(r),r.isExecuted){r.isSuccessful?a(r):n(r),e({withoutRemoving:true});return}let l=await fetch(`${s}/safes/${t.from}/multisig-transactions/?nonce=${r.nonce}`);if(!l.ok)throw new Error(`Safe API (nonce check) responded with status: ${l.status}`);let f=(await l.json()).results.find(d=>d.isExecuted);if(f){i?.(f),e({withoutRemoving:true});return}b__default.default().diff(b__default.default(r.submissionDate),"day")>=1&&e();};function ee({tx:t,updateTxParams:e,removeTxFromPool:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s}){return pulsarCore.initializePollingTracker({tx:t,fetcher:He,removeTxFromPool:a,onSuccess:c=>{e(t.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:c.transactionHash??void 0,finishedTimestamp:c.executionDate?b__default.default(c.executionDate).unix():void 0});let r=n[t.txKey];i&&r&&i(r);},onIntervalTick:c=>{e(t.txKey,{hash:c.transactionHash??void 0});},onFailure:c=>{let r=c?new Error("Safe transaction failed or was rejected."):new Error("Transaction not found.");e(t.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:c?.transactionHash??void 0,error:orbitCore.normalizeError(r),finishedTimestamp:c?.executionDate?b__default.default(c.executionDate).unix():void 0});let l=n[t.txKey];o&&l&&o(r,l);},onReplaced:c=>{e(t.txKey,{status:pulsarCore.TransactionStatus.Replaced,pending:false,hash:t.adapter===orbitCore.OrbitAdapter.EVM?t.hash:viem.zeroHash,replacedTxHash:c.safeTxHash??viem.zeroHash,finishedTimestamp:c.executionDate?b__default.default(c.executionDate).unix():void 0});let r=n[t.txKey];s&&r&&s(r,t);}})}async function te({tracker:t,tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,gelatoApiKey:c,...r}){switch(t){case pulsarCore.TransactionTracker.Ethereum:return y({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r});case pulsarCore.TransactionTracker.Gelato:return c?K({tx:e,transactionsPool:n,onSuccess:i,onError:o,gelatoApiKey:c,...r}):(console.warn(`Gelato tracker requested for tx '${e.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),y({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r}));case pulsarCore.TransactionTracker.Safe:return ee({tx:e,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r});default:return console.warn(`Unknown tracker type: '${t}'. Falling back to default EVM tracker.`),y({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r})}}function ae({actionTxKey:t,connectorType:e,tracker:a,gelatoApiKey:n}){if(a&&a===pulsarCore.TransactionTracker.Gelato&&n)return {tracker:pulsarCore.TransactionTracker.Gelato,txKey:t};if(!viem.isHex(t))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(t)}`);let i=e.split(":");return (i.length>1?i[i.length-1]==="safe"||i[i.length-1]==="safewallet":e?.toLowerCase()==="safe")?{tracker:pulsarCore.TransactionTracker.Safe,txKey:t}:{tracker:pulsarCore.TransactionTracker.Ethereum,txKey:t}}var ne=({chains:t,tx:e})=>{if(e.tracker===pulsarCore.TransactionTracker.Safe){let o=X[e.chainId];return o?`${o}${e.from}/transactions/tx?id=multisig_${e.from}_${e.txKey}`:""}let n=t.find(o=>o.id===e.chainId)?.blockExplorers?.default.url;if(!n)return "";let i=(e.adapter===orbitCore.OrbitAdapter.EVM?e.replacedTxHash:e.txKey)||(e.adapter===orbitCore.OrbitAdapter.EVM?e.hash:e.txKey);return i?`${n}/tx/${i}`:""};var oe=1.15;async function ie({config:t,tx:e}){if(e.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,from:n,to:i,value:o,input:s,maxFeePerGas:c,maxPriorityFeePerGas:r,chainId:l}=e;if(a===void 0||!n||!i||!o||!c||!r)throw new Error("Transaction is missing required fields for speed-up.");try{if(!t)throw new Error("Wagmi config is not provided.");if(!core.getAccount(t).address)throw new Error("No connected account found.");let f=BigInt(Math.ceil(Number(r)*oe)),d=BigInt(Math.ceil(Number(c)*oe));return await core.sendTransaction(t,{to:i,value:BigInt(o),data:s||"0x",chainId:l,nonce:a,maxFeePerGas:d,maxPriorityFeePerGas:f})}catch(p){let f=p instanceof Error?p.message:String(p);throw new Error(`Failed to speed up transaction: ${f}`,{cause:p})}}function ya(t,e){if(!t)throw new Error("EVM adapter requires a wagmi config object.");return {key:orbitCore.OrbitAdapter.EVM,getConnectorInfo:()=>{let a=core.getConnection(t),n=orbitCore.lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:a.address??n?.address??viem.zeroAddress,connectorType:orbitCore.getConnectorTypeFromName(orbitCore.OrbitAdapter.EVM,a.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:a=>orbitEvm.checkAndSwitchChain(a,t),checkTransactionsTracker:a=>ae(a),checkAndInitializeTrackerInStore:({tx:a,...n})=>te({tracker:a.tracker,tx:a,config:t,...n}),getExplorerUrl:a=>{let{chain:n}=core.getConnection(t),i=n?.blockExplorers?.default.url;return a?`${i}/${a}`:i},getExplorerTxUrl:a=>ne({chains:e,tx:a}),cancelTxAction:a=>A({config:t,tx:a}),speedUpTxAction:a=>ie({config:t,tx:a}),retryTxAction:async({onClose:a,txKey:n,executeTxAction:i,tx:o})=>{if(a(n),!i){console.error("Retry failed: executeTxAction function is not provided.");return}await i({actionFunction:()=>o.actionFunction({config:t,...o.payload}),params:o,defaultTracker:pulsarCore.TransactionTracker.Ethereum});}}}var P=new Map;async function De(t){let e=await t.request({method:"relayer_getCapabilities",params:[]}),a={};for(let[n,i]of Object.entries(e))a[Number(n)]=i;return a}async function je(t){let e=P.get(t);if(e)return e;let a=C({apiKey:t}),n=await De(a);return P.set(t,n),n}async function wa(t,e){try{let a=await je(e);return t in a}catch(a){return console.error("Failed to fetch Gelato relay capabilities:",a),P.delete(e),false}}
2
+ exports.GelatoStatusCode=Re;exports.SafeTransactionServiceUrls=Z;exports.cancelTxAction=A;exports.checkAndInitializeTrackerInStore=te;exports.checkIsGelatoAvailable=wa;exports.checkTransactionsTracker=ae;exports.createGelatoClient=C;exports.evmTracker=Se;exports.evmTrackerForStore=y;exports.gelatoFetcher=Ie;exports.gelatoTrackerForStore=K;exports.gnosisSafeLinksHelper=X;exports.pulsarEvmAdapter=ya;exports.safeFetcher=He;exports.safeSdkOptions=Rt;exports.safeTrackerForStore=ee;exports.selectEvmTxExplorerLink=ne;exports.speedUpTxAction=ie;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {OrbitAdapter,normalizeError,lastConnectedConnectorHelpers,getConnectorTypeFromName}from'@tuwaio/orbit-core';import {checkAndSwitchChain}from'@tuwaio/orbit-evm';import {TransactionStatus,initializePollingTracker,TransactionTracker}from'@tuwaio/pulsar-core';import {getAccount,sendTransaction,getClient,getConnection}from'@wagmi/core';import {zeroHash,http,isHex,zeroAddress}from'viem';import {getTransaction,waitForTransactionReceipt,getBlock}from'viem/actions';import T from'dayjs';import {zksync,polygonZkEvm,optimism,gnosis,celo,bsc,boba,base,avalanche,aurora,arbitrum,polygon,sepolia,goerli,mainnet}from'viem/chains';var E=1.15;async function v({config:t,tx:e}){if(e.adapter!==OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,maxFeePerGas:n,maxPriorityFeePerGas:i,chainId:o}=e;if(a===void 0||!n||!i)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!t)throw new Error("Wagmi config is not provided.");let c=getAccount(t);if(!c.address)throw new Error("No connected account found.");let s=BigInt(Math.ceil(Number(i)*E)),r=BigInt(Math.ceil(Number(n)*E));return await sendTransaction(t,{to:c.address,value:0n,chainId:o,nonce:a,maxFeePerGas:r,maxPriorityFeePerGas:s})}catch(c){let s=c instanceof Error?c.message:String(c);throw new Error(`Failed to cancel transaction: ${s}`)}}var ue=10,de=3e3;async function me(t){let{tx:e,config:a,onInitialize:n,onTxDetailsFetched:i,onSuccess:o,onFailure:c,onReplaced:s,retryCount:r=ue,retryTimeout:l=de,waitForTransactionReceiptParams:u}=t;if(n?.(),e.txKey===zeroHash)return c(new Error("Transaction hash cannot be the zero hash."));let p=getClient(a,{chainId:e.chainId});if(!p)return c(new Error(`Could not create a viem client for chainId: ${e.chainId}`));let d=null;for(let f=0;f<r;f++)try{d=await getTransaction(p,{hash:e.txKey}),i(d);break}catch(m){if(f===r-1)return console.error(`EVM tracker failed to fetch tx ${e.txKey} after ${r} retries:`,m),c(m);await new Promise(y=>setTimeout(y,l));}if(!d)return c(new Error("Transaction details could not be fetched."));try{let f=!1,m=await waitForTransactionReceipt(p,{hash:d.hash,onReplaced:y=>{f=!0,s(y);},...u});if(f)return;await o(d,m,p);}catch(f){console.error(`Error waiting for receipt for tx ${e.txKey}:`,f),c(f);}}async function x(t){let{tx:e,config:a,updateTxParams:n,transactionsPool:i,onSuccess:o,onError:c,onReplaced:s}=t;return me({tx:e,config:a,onInitialize:()=>{n(e.txKey,{hash:e.txKey});},onTxDetailsFetched:r=>{n(e.txKey,{to:r.to??void 0,input:r.input,value:r.value?.toString(),nonce:r.nonce,maxFeePerGas:r.maxFeePerGas?.toString(),maxPriorityFeePerGas:r.maxPriorityFeePerGas?.toString()});},onSuccess:async(r,l,u)=>{let p=await getBlock(u,{blockNumber:l.blockNumber}),d=Number(p.timestamp),f=l.status==="success";n(e.txKey,{status:f?TransactionStatus.Success:TransactionStatus.Failed,isError:!f,pending:false,finishedTimestamp:d});let m=i[e.txKey];f&&o&&m&&o(m),!f&&c&&m&&c(new Error("Transaction reverted"),m);},onReplaced:r=>{n(e.txKey,{status:TransactionStatus.Replaced,replacedTxHash:r.transaction.hash,pending:false});let l=i[e.txKey];s&&l&&s(l,e);},onFailure:r=>{n(e.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,error:normalizeError(r)});let l=i[e.txKey];c&&l&&c(r,l);}})}var R=new Map,g=t=>{let{apiKey:e,baseUrl:a,timeout:n}=t,i=a||"https://api.gelato.cloud",o=`${e}:${i}`,c=R.get(o);if(c)return c;let s={timeout:n??15e3,...t.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${e}`,...t.httpTransportConfig?.fetchOptions?.headers},...t.httpTransportConfig?.fetchOptions}},r=http(`${i}/rpc`,s)({});return R.set(o,r),r};var ge=(o=>(o[o.Pending=100]="Pending",o[o.Submitted=110]="Submitted",o[o.Success=200]="Success",o[o.Rejected=400]="Rejected",o[o.Reverted=500]="Reverted",o))(ge||{}),be=new Set([200,400,500]);function ke(t){return !be.has(t)}function ye(t){return async({tx:e,stopPolling:a,onSuccess:n,onFailure:i,onIntervalTick:o})=>{let c=await t.request({method:"relayer_getStatus",params:{id:e.txKey,logs:false}});o?.(c);let{status:s,createdAt:r}=c;if(r&&T().diff(T.unix(r),"hour")>=1&&ke(s)){a();return}s===200?(n(c),a({withoutRemoving:true})):(s===400||s===500)&&(i(c),a({withoutRemoving:true}));}}function F({tx:t,gelatoApiKey:e,updateTxParams:a,removeTxFromPool:n,transactionsPool:i,onSuccess:o,onError:c}){let s=g({apiKey:e}),r=ye(s);return initializePollingTracker({tx:t,fetcher:r,removeTxFromPool:n,onSuccess:l=>{let u=l.status===200?l.receipt.transactionHash:void 0;a(t.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:u,finishedTimestamp:T().unix()});let p=i[t.txKey];o&&p&&o(p);},onIntervalTick:l=>{l.status===110&&a(t.txKey,{hash:l.hash});},onFailure:l=>{let u="Transaction failed or was not found.",p;l&&(l.status===400?u=l.message||"Transaction was rejected by Gelato Relay.":l.status===500&&(u=l.message||"Transaction reverted on-chain.",p=l.receipt.transactionHash));let d=new Error(u);a(t.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:p,error:normalizeError(d),finishedTimestamp:T().unix()});let f=i[t.txKey];c&&f&&c(d,f);}})}var gt={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},O={[mainnet.id]:"https://app.safe.global/eth:",[goerli.id]:"https://app.safe.global/gor:",[sepolia.id]:"https://app.safe.global/sep:",[polygon.id]:"https://app.safe.global/matic:",[arbitrum.id]:"https://app.safe.global/arb1:",[aurora.id]:"https://app.safe.global/aurora:",[avalanche.id]:"https://app.safe.global/avax:",[base.id]:"https://app.safe.global/base:",[boba.id]:"https://app.safe.global/boba:",[bsc.id]:"https://app.safe.global/bnb:",[celo.id]:"https://app.safe.global/celo:",[gnosis.id]:"https://app.safe.global/gno:",[optimism.id]:"https://app.safe.global/oeth:",[polygonZkEvm.id]:"https://app.safe.global/zkevm:",[zksync.id]:"https://app.safe.global/zksync:"},L={[mainnet.id]:"https://safe-transaction-mainnet.safe.global/api/v1",[goerli.id]:"https://safe-transaction-goerli.safe.global/api/v1",[sepolia.id]:"https://safe-transaction-sepolia.safe.global/api/v1",[polygon.id]:"https://safe-transaction-polygon.safe.global/api/v1",[arbitrum.id]:"https://safe-transaction-arbitrum.safe.global/api/v1",[aurora.id]:"https://safe-transaction-aurora.safe.global/api/v1",[avalanche.id]:"https://safe-transaction-avalanche.safe.global/api/v1",[base.id]:"https://safe-transaction-base.safe.global/api/v1",[boba.id]:"https://safe-transaction-boba.safe.global/api/v1",[bsc.id]:"https://safe-transaction-bsc.safe.global/api/v1",[celo.id]:"https://safe-transaction-celo.safe.global/api/v1",[gnosis.id]:"https://safe-transaction-gnosis-chain.safe.global/api/v1",[optimism.id]:"https://safe-transaction-optimism.safe.global/api/v1",[polygonZkEvm.id]:"https://safe-transaction-zkevm.safe.global/api/v1",[zksync.id]:"https://safe-transaction-zksync.safe.global/api/v1"};var Ee=async({tx:t,stopPolling:e,onSuccess:a,onFailure:n,onReplaced:i,onIntervalTick:o})=>{let c=L[t.chainId];if(!c)throw new Error(`Safe Transaction Service URL not found for chainId: ${t.chainId}`);let s=await fetch(`${c}/multisig-transactions/${t.txKey}/`);if(!s.ok)throw s.status===404&&(n(),e()),new Error(`Safe API responded with status: ${s.status}`);let r=await s.json();if(o?.(r),r.isExecuted){r.isSuccessful?a(r):n(r),e({withoutRemoving:true});return}let l=await fetch(`${c}/safes/${t.from}/multisig-transactions/?nonce=${r.nonce}`);if(!l.ok)throw new Error(`Safe API (nonce check) responded with status: ${l.status}`);let p=(await l.json()).results.find(d=>d.isExecuted);if(p){i?.(p),e({withoutRemoving:true});return}T().diff(T(r.submissionDate),"day")>=1&&e();};function W({tx:t,updateTxParams:e,removeTxFromPool:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c}){return initializePollingTracker({tx:t,fetcher:Ee,removeTxFromPool:a,onSuccess:s=>{e(t.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:s.transactionHash??void 0,finishedTimestamp:s.executionDate?T(s.executionDate).unix():void 0});let r=n[t.txKey];i&&r&&i(r);},onIntervalTick:s=>{e(t.txKey,{hash:s.transactionHash??void 0});},onFailure:s=>{let r=s?new Error("Safe transaction failed or was rejected."):new Error("Transaction not found.");e(t.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:s?.transactionHash??void 0,error:normalizeError(r),finishedTimestamp:s?.executionDate?T(s.executionDate).unix():void 0});let l=n[t.txKey];o&&l&&o(r,l);},onReplaced:s=>{e(t.txKey,{status:TransactionStatus.Replaced,pending:false,hash:t.adapter===OrbitAdapter.EVM?t.hash:zeroHash,replacedTxHash:s.safeTxHash??zeroHash,finishedTimestamp:s.executionDate?T(s.executionDate).unix():void 0});let r=n[t.txKey];c&&r&&c(r,t);}})}async function Y({tracker:t,tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,gelatoApiKey:s,...r}){switch(t){case TransactionTracker.Ethereum:return x({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r});case TransactionTracker.Gelato:return s?F({tx:e,transactionsPool:n,onSuccess:i,onError:o,gelatoApiKey:s,...r}):(console.warn(`Gelato tracker requested for tx '${e.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),x({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r}));case TransactionTracker.Safe:return W({tx:e,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r});default:return console.warn(`Unknown tracker type: '${t}'. Falling back to default EVM tracker.`),x({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:c,...r})}}function J({actionTxKey:t,connectorType:e,tracker:a,gelatoApiKey:n}){if(a&&a===TransactionTracker.Gelato&&n)return {tracker:TransactionTracker.Gelato,txKey:t};if(!isHex(t))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(t)}`);let i=e.split(":");return (i.length>1?i[i.length-1]==="safe"||i[i.length-1]==="safewallet":e?.toLowerCase()==="safe")?{tracker:TransactionTracker.Safe,txKey:t}:{tracker:TransactionTracker.Ethereum,txKey:t}}var Q=({chains:t,tx:e})=>{if(e.tracker===TransactionTracker.Safe){let o=O[e.chainId];return o?`${o}${e.from}/transactions/tx?id=multisig_${e.from}_${e.txKey}`:""}let n=t.find(o=>o.id===e.chainId)?.blockExplorers?.default.url;if(!n)return "";let i=(e.adapter===OrbitAdapter.EVM?e.replacedTxHash:e.txKey)||(e.adapter===OrbitAdapter.EVM?e.hash:e.txKey);return i?`${n}/tx/${i}`:""};var X=1.15;async function ee({config:t,tx:e}){if(e.adapter!==OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,from:n,to:i,value:o,input:c,maxFeePerGas:s,maxPriorityFeePerGas:r,chainId:l}=e;if(a===void 0||!n||!i||!o||!s||!r)throw new Error("Transaction is missing required fields for speed-up.");try{if(!t)throw new Error("Wagmi config is not provided.");if(!getAccount(t).address)throw new Error("No connected account found.");let p=BigInt(Math.ceil(Number(r)*X)),d=BigInt(Math.ceil(Number(s)*X));return await sendTransaction(t,{to:i,value:BigInt(o),data:c||"0x",chainId:l,nonce:a,maxFeePerGas:d,maxPriorityFeePerGas:p})}catch(u){let p=u instanceof Error?u.message:String(u);throw new Error(`Failed to speed up transaction: ${p}`)}}function ua(t,e){if(!t)throw new Error("EVM adapter requires a wagmi config object.");return {key:OrbitAdapter.EVM,getConnectorInfo:()=>{let a=getConnection(t),n=lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:a.address??n?.address??zeroAddress,connectorType:getConnectorTypeFromName(OrbitAdapter.EVM,a.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:a=>checkAndSwitchChain(a,t),checkTransactionsTracker:a=>J(a),checkAndInitializeTrackerInStore:({tx:a,...n})=>Y({tracker:a.tracker,tx:a,config:t,...n}),getExplorerUrl:a=>{let{chain:n}=getConnection(t),i=n?.blockExplorers?.default.url;return a?`${i}/${a}`:i},getExplorerTxUrl:a=>Q({chains:e,tx:a}),cancelTxAction:a=>v({config:t,tx:a}),speedUpTxAction:a=>ee({config:t,tx:a}),retryTxAction:async({onClose:a,txKey:n,executeTxAction:i,tx:o})=>{if(a(n),!i){console.error("Retry failed: executeTxAction function is not provided.");return}await i({actionFunction:()=>o.actionFunction({config:t,...o.payload}),params:o,defaultTracker:TransactionTracker.Ethereum});}}}var w=new Map;async function Me(t){let e=await t.request({method:"relayer_getCapabilities",params:[]}),a={};for(let[n,i]of Object.entries(e))a[Number(n)]=i;return a}async function ze(t){let e=w.get(t);if(e)return e;let a=g({apiKey:t}),n=await Me(a);return w.set(t,n),n}async function Ta(t,e){try{let a=await ze(e);return t in a}catch(a){return console.error("Failed to fetch Gelato relay capabilities:",a),w.delete(e),false}}
2
- export{ge as GelatoStatusCode,L as SafeTransactionServiceUrls,v as cancelTxAction,Y as checkAndInitializeTrackerInStore,Ta as checkIsGelatoAvailable,J as checkTransactionsTracker,g as createGelatoClient,me as evmTracker,x as evmTrackerForStore,ye as gelatoFetcher,F as gelatoTrackerForStore,O as gnosisSafeLinksHelper,ua as pulsarEvmAdapter,Ee as safeFetcher,gt as safeSdkOptions,W as safeTrackerForStore,Q as selectEvmTxExplorerLink,ee as speedUpTxAction};
1
+ import {OrbitAdapter,normalizeError,lastConnectedConnectorHelpers,getConnectorTypeFromName}from'@tuwaio/orbit-core';import {checkAndSwitchChain}from'@tuwaio/orbit-evm';import {TransactionStatus,initializePollingTracker,TransactionTracker}from'@tuwaio/pulsar-core';import {getAccount,sendTransaction,getClient,getConnection}from'@wagmi/core';import {zeroHash,http,isHex,zeroAddress}from'viem';import {getTransaction,waitForTransactionReceipt,getTransactionConfirmations,getBlock}from'viem/actions';import b from'dayjs';import {zksync,polygonZkEvm,optimism,gnosis,celo,bsc,boba,base,avalanche,aurora,arbitrum,polygon,sepolia,goerli,mainnet}from'viem/chains';var F=1.15;async function A({config:t,tx:e}){if(e.adapter!==OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,maxFeePerGas:n,maxPriorityFeePerGas:i,chainId:o}=e;if(a===void 0||!n||!i)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!t)throw new Error("Wagmi config is not provided.");let s=getAccount(t);if(!s.address)throw new Error("No connected account found.");let c=BigInt(Math.ceil(Number(i)*F)),r=BigInt(Math.ceil(Number(n)*F));return await sendTransaction(t,{to:s.address,value:0n,chainId:o,nonce:a,maxFeePerGas:r,maxPriorityFeePerGas:c})}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`Failed to cancel transaction: ${c}`,{cause:s})}}var be=10,ke=3e3,v=3,ye=1e4,Ce=5e3;async function Se(t){let{tx:e,config:a,onInitialize:n,onTxDetailsFetched:i,onSuccess:o,onFailure:s,onReplaced:c,retryCount:r=be,retryTimeout:l=ke,onConfirmationsUpdate:p,waitForTransactionReceiptParams:f}=t,{requiredConfirmations:d}=e;if(n?.(),e.txKey===zeroHash)return s(new Error("Transaction hash cannot be the zero hash."));let u=getClient(a,{chainId:e.chainId});if(!u)return s(new Error(`Could not create a viem client for chainId: ${e.chainId}`));let m=null;for(let T=0;T<r;T++)try{m=await getTransaction(u,{hash:e.txKey}),i(m);break}catch(h){if(T===r-1)return console.error(`[evmTracker] Fatal error fetching transaction ${e.txKey} on chain ${e.chainId}:`,h),s(h);console.warn(`[evmTracker] Error fetching transaction ${e.txKey} on chain ${e.chainId} (attempt ${T+1}/${r}):`,h),await new Promise(g=>setTimeout(g,l));}if(!m)return s(new Error("Transaction details could not be fetched."));let E=false;for(let T=0;T<=v;T++)try{let h=await waitForTransactionReceipt(u,{hash:m.hash,onReplaced:g=>{E=!0,c(g);},...f});if(!E){let g=d??1;if(g>1)for(;;){try{let x=await getTransactionConfirmations(u,{transactionReceipt:h}),I=Number(x);if(p?.(I),I>=g)break}catch(x){console.warn(`[evmTracker] Error fetching confirmations for ${e.txKey} on chain ${e.chainId}:`,x);}await new Promise(x=>setTimeout(x,Ce));}await o(m,h,u);}return}catch(h){if(h instanceof Error&&h.name==="TransactionReceiptNotFoundError"&&!E&&T<v){console.warn(`[evmTracker] Receipt not found for ${e.txKey}, retry ${T+1}/${v}...`),await new Promise(x=>setTimeout(x,ye*(T+1)));continue}s(h);return}}async function y(t){let{tx:e,config:a,updateTxParams:n,transactionsPool:i,onSuccess:o,onError:s,onReplaced:c}=t;return Se({tx:e,config:a,onInitialize:()=>{n(e.txKey,{hash:e.txKey});},onTxDetailsFetched:r=>{n(e.txKey,{to:r.to??void 0,input:r.input,value:r.value?.toString(),nonce:r.nonce,maxFeePerGas:r.maxFeePerGas?.toString(),maxPriorityFeePerGas:r.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:r=>{n(e.txKey,{confirmations:r});},onSuccess:async(r,l,p)=>{let f=await getBlock(p,{blockNumber:l.blockNumber}),d=Number(f.timestamp),u=l.status==="success";n(e.txKey,{status:u?TransactionStatus.Success:TransactionStatus.Failed,isError:!u,pending:false,finishedTimestamp:d});let m=i[e.txKey];u&&o&&m&&o(m),!u&&s&&m&&s(new Error("Transaction reverted"),m);},onReplaced:r=>{n(e.txKey,{status:TransactionStatus.Replaced,replacedTxHash:r.transaction.hash,pending:false});let l=i[e.txKey];c&&l&&c(l,e);},onFailure:r=>{n(e.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,error:normalizeError(r)});let l=i[e.txKey];s&&l&&s(r,l);}})}var $=new Map,C=t=>{let{apiKey:e,baseUrl:a,timeout:n}=t,i=a||"https://api.gelato.cloud",o=`${e}:${i}`,s=$.get(o);if(s)return s;let c={timeout:n??15e3,...t.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${e}`,...t.httpTransportConfig?.fetchOptions?.headers},...t.httpTransportConfig?.fetchOptions}},r=http(`${i}/rpc`,c)({});return $.set(o,r),r};var Re=(o=>(o[o.Pending=100]="Pending",o[o.Submitted=110]="Submitted",o[o.Success=200]="Success",o[o.Rejected=400]="Rejected",o[o.Reverted=500]="Reverted",o))(Re||{}),Ge=new Set([200,400,500]);function Pe(t){return !Ge.has(t)}function Ie(t){return async({tx:e,stopPolling:a,onSuccess:n,onFailure:i,onIntervalTick:o})=>{let s=await t.request({method:"relayer_getStatus",params:{id:e.txKey,logs:false}});o?.(s);let{status:c,createdAt:r}=s;if(r&&b().diff(b.unix(r),"hour")>=1&&Pe(c)){a();return}c===200?(n(s),a({withoutRemoving:true})):(c===400||c===500)&&(i(s),a({withoutRemoving:true}));}}function K({tx:t,gelatoApiKey:e,updateTxParams:a,removeTxFromPool:n,transactionsPool:i,onSuccess:o,onError:s}){let c=C({apiKey:e}),r=Ie(c);return initializePollingTracker({tx:t,fetcher:r,removeTxFromPool:n,onSuccess:l=>{let p=l.status===200?l.receipt.transactionHash:void 0;a(t.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:p,finishedTimestamp:b().unix()});let f=i[t.txKey];o&&f&&o(f);},onIntervalTick:l=>{l.status===110&&a(t.txKey,{hash:l.hash});},onFailure:l=>{let p="Transaction failed or was not found.",f;l&&(l.status===400?p=l.message||"Transaction was rejected by Gelato Relay.":l.status===500&&(p=l.message||"Transaction reverted on-chain.",f=l.receipt.transactionHash));let d=new Error(p);a(t.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:f,error:normalizeError(d),finishedTimestamp:b().unix()});let u=i[t.txKey];s&&u&&s(d,u);}})}var Rt={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},X={[mainnet.id]:"https://app.safe.global/eth:",[goerli.id]:"https://app.safe.global/gor:",[sepolia.id]:"https://app.safe.global/sep:",[polygon.id]:"https://app.safe.global/matic:",[arbitrum.id]:"https://app.safe.global/arb1:",[aurora.id]:"https://app.safe.global/aurora:",[avalanche.id]:"https://app.safe.global/avax:",[base.id]:"https://app.safe.global/base:",[boba.id]:"https://app.safe.global/boba:",[bsc.id]:"https://app.safe.global/bnb:",[celo.id]:"https://app.safe.global/celo:",[gnosis.id]:"https://app.safe.global/gno:",[optimism.id]:"https://app.safe.global/oeth:",[polygonZkEvm.id]:"https://app.safe.global/zkevm:",[zksync.id]:"https://app.safe.global/zksync:"},Z={[mainnet.id]:"https://safe-transaction-mainnet.safe.global/api/v1",[goerli.id]:"https://safe-transaction-goerli.safe.global/api/v1",[sepolia.id]:"https://safe-transaction-sepolia.safe.global/api/v1",[polygon.id]:"https://safe-transaction-polygon.safe.global/api/v1",[arbitrum.id]:"https://safe-transaction-arbitrum.safe.global/api/v1",[aurora.id]:"https://safe-transaction-aurora.safe.global/api/v1",[avalanche.id]:"https://safe-transaction-avalanche.safe.global/api/v1",[base.id]:"https://safe-transaction-base.safe.global/api/v1",[boba.id]:"https://safe-transaction-boba.safe.global/api/v1",[bsc.id]:"https://safe-transaction-bsc.safe.global/api/v1",[celo.id]:"https://safe-transaction-celo.safe.global/api/v1",[gnosis.id]:"https://safe-transaction-gnosis-chain.safe.global/api/v1",[optimism.id]:"https://safe-transaction-optimism.safe.global/api/v1",[polygonZkEvm.id]:"https://safe-transaction-zkevm.safe.global/api/v1",[zksync.id]:"https://safe-transaction-zksync.safe.global/api/v1"};var He=async({tx:t,stopPolling:e,onSuccess:a,onFailure:n,onReplaced:i,onIntervalTick:o})=>{let s=Z[t.chainId];if(!s)throw new Error(`Safe Transaction Service URL not found for chainId: ${t.chainId}`);let c=await fetch(`${s}/multisig-transactions/${t.txKey}/`);if(!c.ok)throw c.status===404&&(n(),e()),new Error(`Safe API responded with status: ${c.status}`);let r=await c.json();if(o?.(r),r.isExecuted){r.isSuccessful?a(r):n(r),e({withoutRemoving:true});return}let l=await fetch(`${s}/safes/${t.from}/multisig-transactions/?nonce=${r.nonce}`);if(!l.ok)throw new Error(`Safe API (nonce check) responded with status: ${l.status}`);let f=(await l.json()).results.find(d=>d.isExecuted);if(f){i?.(f),e({withoutRemoving:true});return}b().diff(b(r.submissionDate),"day")>=1&&e();};function ee({tx:t,updateTxParams:e,removeTxFromPool:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s}){return initializePollingTracker({tx:t,fetcher:He,removeTxFromPool:a,onSuccess:c=>{e(t.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:c.transactionHash??void 0,finishedTimestamp:c.executionDate?b(c.executionDate).unix():void 0});let r=n[t.txKey];i&&r&&i(r);},onIntervalTick:c=>{e(t.txKey,{hash:c.transactionHash??void 0});},onFailure:c=>{let r=c?new Error("Safe transaction failed or was rejected."):new Error("Transaction not found.");e(t.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:c?.transactionHash??void 0,error:normalizeError(r),finishedTimestamp:c?.executionDate?b(c.executionDate).unix():void 0});let l=n[t.txKey];o&&l&&o(r,l);},onReplaced:c=>{e(t.txKey,{status:TransactionStatus.Replaced,pending:false,hash:t.adapter===OrbitAdapter.EVM?t.hash:zeroHash,replacedTxHash:c.safeTxHash??zeroHash,finishedTimestamp:c.executionDate?b(c.executionDate).unix():void 0});let r=n[t.txKey];s&&r&&s(r,t);}})}async function te({tracker:t,tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,gelatoApiKey:c,...r}){switch(t){case TransactionTracker.Ethereum:return y({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r});case TransactionTracker.Gelato:return c?K({tx:e,transactionsPool:n,onSuccess:i,onError:o,gelatoApiKey:c,...r}):(console.warn(`Gelato tracker requested for tx '${e.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),y({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r}));case TransactionTracker.Safe:return ee({tx:e,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r});default:return console.warn(`Unknown tracker type: '${t}'. Falling back to default EVM tracker.`),y({tx:e,config:a,transactionsPool:n,onSuccess:i,onError:o,onReplaced:s,...r})}}function ae({actionTxKey:t,connectorType:e,tracker:a,gelatoApiKey:n}){if(a&&a===TransactionTracker.Gelato&&n)return {tracker:TransactionTracker.Gelato,txKey:t};if(!isHex(t))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(t)}`);let i=e.split(":");return (i.length>1?i[i.length-1]==="safe"||i[i.length-1]==="safewallet":e?.toLowerCase()==="safe")?{tracker:TransactionTracker.Safe,txKey:t}:{tracker:TransactionTracker.Ethereum,txKey:t}}var ne=({chains:t,tx:e})=>{if(e.tracker===TransactionTracker.Safe){let o=X[e.chainId];return o?`${o}${e.from}/transactions/tx?id=multisig_${e.from}_${e.txKey}`:""}let n=t.find(o=>o.id===e.chainId)?.blockExplorers?.default.url;if(!n)return "";let i=(e.adapter===OrbitAdapter.EVM?e.replacedTxHash:e.txKey)||(e.adapter===OrbitAdapter.EVM?e.hash:e.txKey);return i?`${n}/tx/${i}`:""};var oe=1.15;async function ie({config:t,tx:e}){if(e.adapter!==OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${e.adapter}'.`);let{nonce:a,from:n,to:i,value:o,input:s,maxFeePerGas:c,maxPriorityFeePerGas:r,chainId:l}=e;if(a===void 0||!n||!i||!o||!c||!r)throw new Error("Transaction is missing required fields for speed-up.");try{if(!t)throw new Error("Wagmi config is not provided.");if(!getAccount(t).address)throw new Error("No connected account found.");let f=BigInt(Math.ceil(Number(r)*oe)),d=BigInt(Math.ceil(Number(c)*oe));return await sendTransaction(t,{to:i,value:BigInt(o),data:s||"0x",chainId:l,nonce:a,maxFeePerGas:d,maxPriorityFeePerGas:f})}catch(p){let f=p instanceof Error?p.message:String(p);throw new Error(`Failed to speed up transaction: ${f}`,{cause:p})}}function ya(t,e){if(!t)throw new Error("EVM adapter requires a wagmi config object.");return {key:OrbitAdapter.EVM,getConnectorInfo:()=>{let a=getConnection(t),n=lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:a.address??n?.address??zeroAddress,connectorType:getConnectorTypeFromName(OrbitAdapter.EVM,a.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:a=>checkAndSwitchChain(a,t),checkTransactionsTracker:a=>ae(a),checkAndInitializeTrackerInStore:({tx:a,...n})=>te({tracker:a.tracker,tx:a,config:t,...n}),getExplorerUrl:a=>{let{chain:n}=getConnection(t),i=n?.blockExplorers?.default.url;return a?`${i}/${a}`:i},getExplorerTxUrl:a=>ne({chains:e,tx:a}),cancelTxAction:a=>A({config:t,tx:a}),speedUpTxAction:a=>ie({config:t,tx:a}),retryTxAction:async({onClose:a,txKey:n,executeTxAction:i,tx:o})=>{if(a(n),!i){console.error("Retry failed: executeTxAction function is not provided.");return}await i({actionFunction:()=>o.actionFunction({config:t,...o.payload}),params:o,defaultTracker:TransactionTracker.Ethereum});}}}var P=new Map;async function De(t){let e=await t.request({method:"relayer_getCapabilities",params:[]}),a={};for(let[n,i]of Object.entries(e))a[Number(n)]=i;return a}async function je(t){let e=P.get(t);if(e)return e;let a=C({apiKey:t}),n=await De(a);return P.set(t,n),n}async function wa(t,e){try{let a=await je(e);return t in a}catch(a){return console.error("Failed to fetch Gelato relay capabilities:",a),P.delete(e),false}}
2
+ export{Re as GelatoStatusCode,Z as SafeTransactionServiceUrls,A as cancelTxAction,te as checkAndInitializeTrackerInStore,wa as checkIsGelatoAvailable,ae as checkTransactionsTracker,C as createGelatoClient,Se as evmTracker,y as evmTrackerForStore,Ie as gelatoFetcher,K as gelatoTrackerForStore,X as gnosisSafeLinksHelper,ya as pulsarEvmAdapter,He as safeFetcher,Rt as safeSdkOptions,ee as safeTrackerForStore,ne as selectEvmTxExplorerLink,ie as speedUpTxAction};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuwaio/pulsar-evm",
3
- "version": "0.4.1",
3
+ "version": "0.5.1",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
@@ -40,8 +40,8 @@
40
40
  ],
41
41
  "peerDependencies": {
42
42
  "@tuwaio/pulsar-core": ">=0.5",
43
- "@tuwaio/orbit-core": ">=0.2.7",
44
- "@tuwaio/orbit-evm": ">=0.2.9",
43
+ "@tuwaio/orbit-core": ">=0.2.8",
44
+ "@tuwaio/orbit-evm": ">=0.2.11",
45
45
  "@wagmi/core": "3.x.x",
46
46
  "dayjs": "1.x.x",
47
47
  "immer": "11.x.x",
@@ -49,19 +49,19 @@
49
49
  "zustand": "5.x.x"
50
50
  },
51
51
  "devDependencies": {
52
- "@tuwaio/orbit-core": "^0.2.7",
53
- "@tuwaio/orbit-evm": "^0.2.10",
54
- "@wagmi/core": "^3.4.0",
55
- "dayjs": "^1.11.19",
56
- "immer": "^11.1.4",
57
- "jsdom": "^28.1.0",
52
+ "@tuwaio/orbit-core": "^0.2.8",
53
+ "@tuwaio/orbit-evm": "^0.2.12",
54
+ "@wagmi/core": "^3.4.9",
55
+ "dayjs": "^1.11.20",
56
+ "immer": "^11.1.8",
57
+ "jsdom": "^29.1.1",
58
58
  "tsup": "^8.5.1",
59
- "typescript": "^5.9.3",
60
- "viem": "^2.46.3",
61
- "vitest": "^4.0.18",
62
- "zustand": "^5.0.11",
63
- "dotenv": "^17.3.1",
64
- "@tuwaio/pulsar-core": "^0.5.1"
59
+ "typescript": "^6.0.3",
60
+ "viem": "^2.48.11",
61
+ "vitest": "^4.1.5",
62
+ "zustand": "^5.0.13",
63
+ "dotenv": "^17.4.2",
64
+ "@tuwaio/pulsar-core": "^0.6.1"
65
65
  },
66
66
  "scripts": {
67
67
  "start": "tsup src/index.ts --watch",