@tuwaio/pulsar-evm 0.6.0 → 0.7.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/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'),E=require('dayjs'),actions=require('viem/actions'),chains=require('viem/chains');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var E__default=/*#__PURE__*/_interopDefault(E);var $=1.15;async function N({config:e,tx:t}){if(t.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:r,maxFeePerGas:a,maxPriorityFeePerGas:i,chainId:o}=t;if(r===void 0||!a||!i)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!e)throw new Error("Wagmi config is not provided.");let s=core.getAccount(e);if(!s.address)throw new Error("No connected account found.");let c=BigInt(Math.ceil(Number(i)*$)),n=BigInt(Math.ceil(Number(a)*$));return await core.sendTransaction(e,{to:s.address,value:0n,chainId:o,nonce:r,maxFeePerGas:n,maxPriorityFeePerGas:c})}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`Failed to cancel transaction: ${c}`,{cause:s})}}var M=10,U=3e3,I=5,Ke=5e3,He=5e3,Ae=6e4;function O(e){return e?(r=>{if(!(r instanceof Error))return false;if(r instanceof viem.WaitForTransactionReceiptTimeoutError||r instanceof viem.TransactionReceiptNotFoundError||r.name==="WaitForTransactionReceiptTimeoutError"||r.name==="TransactionReceiptNotFoundError"||r instanceof viem.HttpRequestError||r instanceof viem.WebSocketRequestError||r.name==="HttpRequestError"||r.name==="WebSocketRequestError"||r.name==="TimeoutError")return true;let a=r.message.toLowerCase();return a.includes("fetch failed")||a.includes("network error")||a.includes("timeout")||a.includes("timed out")||a.includes("econnreset")||a.includes("rate limit")||a.includes("502")||a.includes("503")||a.includes("504")})(e)?true:e instanceof Error&&"cause"in e&&e.cause?O(e.cause):false:false}async function G(e){let{tx:t,config:r,onInitialize:a,onTxDetailsFetched:i,onSuccess:o,onFailure:s,onReplaced:c,retryCount:n=M,retryTimeout:l=U,onConfirmationsUpdate:f,waitForTransactionReceiptParams:u}=e,{requiredConfirmations:p}=t;if(a?.(),t.txKey===viem.zeroHash)return s(new Error("Transaction hash cannot be the zero hash."));let d=core.getClient(r,{chainId:t.chainId});if(!d)return s(new Error(`Could not create a viem client for chainId: ${t.chainId}`));let h=null;for(let T=0;T<n;T++)try{h=await actions.getTransaction(d,{hash:t.txKey}),i(h);break}catch(m){if(T===n-1)return console.error(`[evmTracker] Fatal error fetching transaction ${t.txKey} on chain ${t.chainId}:`,m),s(m);console.warn(`[evmTracker] Error fetching transaction ${t.txKey} on chain ${t.chainId} (attempt ${T+1}/${n}):`,m),await new Promise(g=>setTimeout(g,l));}if(!h)return s(new Error("Transaction details could not be fetched."));let k=false;for(let T=0;T<=I;T++)try{let m=await actions.waitForTransactionReceipt(d,{hash:h.hash,onReplaced:g=>{k=!0,c(g);},retryCount:M,retryDelay:U,timeout:Ae,...u});if(!k){let g=p??1;if(g>1)for(;;){try{let x=await actions.getTransactionConfirmations(d,{transactionReceipt:m}),A=Number(x);if(f?.(A),A>=g)break}catch(x){console.warn(`[evmTracker] Error fetching confirmations for ${t.txKey} on chain ${t.chainId}:`,x);}await new Promise(x=>setTimeout(x,He));}await o(h,m,d);}return}catch(m){if(O(m)&&!k&&T<I){console.warn(`[evmTracker] Transient error for ${t.txKey} on chain ${t.chainId} (attempt ${T+1}/${I}). Error: ${m instanceof Error?m.name:"Unknown"}. Retrying...`),await new Promise(x=>setTimeout(x,Ke*(T+1)));continue}s(m);return}}async function w(e){let{tx:t,config:r,updateTxParams:a,transactionsPool:i,onSuccess:o,onError:s,onReplaced:c}=e;return G({tx:t,config:r,onInitialize:()=>{a(t.txKey,{hash:t.txKey});},onTxDetailsFetched:n=>{a(t.txKey,{to:n.to??void 0,input:n.input,value:n.value?.toString(),nonce:n.nonce,maxFeePerGas:n.maxFeePerGas?.toString(),maxPriorityFeePerGas:n.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:n=>{a(t.txKey,{confirmations:n});},onSuccess:async(n,l,f)=>{let u=await actions.getBlock(f,{blockNumber:l.blockNumber}),p=Number(u.timestamp),d=l.status==="success";a(t.txKey,{status:d?pulsarCore.TransactionStatus.Success:pulsarCore.TransactionStatus.Failed,isError:!d,pending:false,finishedTimestamp:p});let h=i[t.txKey];d&&o&&h&&o(h),!d&&s&&h&&s(new Error("Transaction reverted"),h);},onReplaced:n=>{a(t.txKey,{status:pulsarCore.TransactionStatus.Replaced,replacedTxHash:n.transaction.hash,pending:false});let l=i[t.txKey];c&&l&&c(l,t);},onFailure:n=>{a(t.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,error:orbitCore.normalizeError(n)});let l=i[t.txKey];s&&l&&s(n,l);}})}async function B({tx:e,stopPolling:t,onSuccess:r,onFailure:a,onIntervalTick:i}){let o=e,s=o.chainId,c=typeof s=="number"?s:parseInt(String(s),10);if(!c||Number.isNaN(c)){t({withoutRemoving:true}),a({receipt:null,status:"failed",reason:`Invalid chainId: ${String(s)}`});return}let n=orbitEvm.createBundlerRpcClient({chainId:c,apiKey:o.pimlicoApiKey,bundlerUrl:o.bundlerUrl}),l;try{l=await n.getUserOperationReceipt({hash:o.txKey});}catch(u){let p=u;if(p?.name==="UserOperationReceiptNotFoundError"||p?.message?.includes("could not be found")||p?.shortMessage?.includes("could not be found")||p?.details?.includes("could not be found")||p?.message?.includes("not been processed yet")||p?.shortMessage?.includes("not been processed yet")){i?.({receipt:null,status:"pending"});return}throw u}if(!l){i?.({receipt:null,status:"pending"});return}let f=l.receipt?.transactionHash??l.transactionHash;l.success?(t({withoutRemoving:true}),r({receipt:l,status:"success",hash:f})):(t({withoutRemoving:true}),a({receipt:l,status:"failed",hash:f,reason:l.reason??"UserOperation reverted on-chain."}));}function Ut(e){return pulsarCore.initializePollingTracker({...e,fetcher:B,pollingInterval:e.pollingInterval??2e3,maxRetries:e.maxRetries??60})}async function L({tx:e,config:t,updateTxParams:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s}){let c=async l=>{if(t)return G({tx:{chainId:e.chainId,txKey:l,requiredConfirmations:e.requiredConfirmations},config:t,onTxDetailsFetched:u=>{r(e.txKey,{to:u.to??void 0,input:u.input,value:u.value?.toString(),nonce:u.nonce,maxFeePerGas:u.maxFeePerGas?.toString(),maxPriorityFeePerGas:u.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:u=>{r(e.txKey,{confirmations:u});},onSuccess:async(u,p,d)=>{let h=await actions.getBlock(d,{blockNumber:p.blockNumber}),k=Number(h.timestamp),T=p.status==="success";r(e.txKey,{status:T?pulsarCore.TransactionStatus.Success:pulsarCore.TransactionStatus.Failed,isError:!T,pending:false,hash:l,finishedTimestamp:k});let m=a[e.txKey];T&&i&&m&&i(m),!T&&o&&m&&o(new Error("Transaction reverted on-chain."),m);},onFailure:u=>{r(e.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:l,error:orbitCore.normalizeError(u),finishedTimestamp:E__default.default().unix()});let p=a[e.txKey];o&&p&&o(u,p);},onReplaced:u=>{r(e.txKey,{status:pulsarCore.TransactionStatus.Replaced,replacedTxHash:u.transaction.hash,pending:false});let p=a[e.txKey];s&&p&&s(p,e);}});r(e.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:l,finishedTimestamp:E__default.default().unix()});let f=a[e.txKey];i&&f&&i(f);},n=e;if(n.hash)return c(n.hash);pulsarCore.initializePollingTracker({tx:e,fetcher:B,pollingInterval:2e3,maxRetries:60,onSuccess:async l=>{let f=l.hash;if(!f){r(e.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,finishedTimestamp:E__default.default().unix()});let u=a[e.txKey];i&&u&&i(u);return}r(e.txKey,{hash:f}),await c(f);},onIntervalTick:l=>{l.hash&&r(e.txKey,{hash:l.hash});},onFailure:l=>{let f=l?.reason||"UserOperation failed or was not found.",u=l?.hash,p=new Error(f);r(e.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:u,error:orbitCore.normalizeError(p),finishedTimestamp:E__default.default().unix()});let d=a[e.txKey];o&&d&&o(p,d);}});}var j=new Map,R=e=>{let{apiKey:t,baseUrl:r,timeout:a}=e,i=r||"https://api.gelato.cloud",o=`${t}:${i}`,s=j.get(o);if(s)return s;let c={timeout:a??15e3,...e.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${t}`,...e.httpTransportConfig?.fetchOptions?.headers},...e.httpTransportConfig?.fetchOptions}},n=viem.http(`${i}/rpc`,c)({});return j.set(o,n),n};var _e=(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))(_e||{}),ze=new Set([200,400,500]);function Be(e){return !ze.has(e)}function Le(e){return async({tx:t,stopPolling:r,onSuccess:a,onFailure:i,onIntervalTick:o})=>{let s=await e.request({method:"relayer_getStatus",params:{id:t.txKey,logs:false}});o?.(s);let{status:c,createdAt:n}=s;if(n&&E__default.default().diff(E__default.default.unix(n),"hour")>=1&&Be(c)){r();return}c===200?(a(s),r({withoutRemoving:true})):(c===400||c===500)&&(i(s),r({withoutRemoving:true}));}}function P({tx:e,gelatoApiKey:t,updateTxParams:r,removeTxFromPool:a,transactionsPool:i,onSuccess:o,onError:s}){let c=R({apiKey:t}),n=Le(c);return pulsarCore.initializePollingTracker({tx:e,fetcher:n,removeTxFromPool:a,onSuccess:l=>{let f=l.status===200?l.receipt.transactionHash:void 0;r(e.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:f,finishedTimestamp:E__default.default().unix()});let u=i[e.txKey];o&&u&&o(u);},onIntervalTick:l=>{l.status===110&&r(e.txKey,{hash:l.hash});},onFailure:l=>{let f="Transaction failed or was not found.",u;l&&(l.status===400?f=l.message||"Transaction was rejected by Gelato Relay.":l.status===500&&(f=l.message||"Transaction reverted on-chain.",u=l.receipt.transactionHash));let p=new Error(f);r(e.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:u,error:orbitCore.normalizeError(p),finishedTimestamp:E__default.default().unix()});let d=i[e.txKey];s&&d&&s(p,d);}})}var Zt=P;var tr={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},se={[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:"},ce={[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 De=async({tx:e,stopPolling:t,onSuccess:r,onFailure:a,onReplaced:i,onIntervalTick:o})=>{let s=ce[e.chainId];if(!s)throw new Error(`Safe Transaction Service URL not found for chainId: ${e.chainId}`);let c=await fetch(`${s}/multisig-transactions/${e.txKey}/`);if(!c.ok)throw c.status===404&&(a(),t()),new Error(`Safe API responded with status: ${c.status}`);let n=await c.json();if(o?.(n),n.isExecuted){n.isSuccessful?r(n):a(n),t({withoutRemoving:true});return}let l=await fetch(`${s}/safes/${e.from}/multisig-transactions/?nonce=${n.nonce}`);if(!l.ok)throw new Error(`Safe API (nonce check) responded with status: ${l.status}`);let u=(await l.json()).results.find(p=>p.isExecuted);if(u){i?.(u),t({withoutRemoving:true});return}E__default.default().diff(E__default.default(n.submissionDate),"day")>=1&&t();};function ue({tx:e,updateTxParams:t,removeTxFromPool:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s}){return pulsarCore.initializePollingTracker({tx:e,fetcher:De,removeTxFromPool:r,onSuccess:c=>{t(e.txKey,{status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:c.transactionHash??void 0,finishedTimestamp:c.executionDate?E__default.default(c.executionDate).unix():void 0});let n=a[e.txKey];i&&n&&i(n);},onIntervalTick:c=>{t(e.txKey,{hash:c.transactionHash??void 0});},onFailure:c=>{let n=c?new Error("Safe transaction failed or was rejected."):new Error("Transaction not found.");t(e.txKey,{status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:c?.transactionHash??void 0,error:orbitCore.normalizeError(n),finishedTimestamp:c?.executionDate?E__default.default(c.executionDate).unix():void 0});let l=a[e.txKey];o&&l&&o(n,l);},onReplaced:c=>{t(e.txKey,{status:pulsarCore.TransactionStatus.Replaced,pending:false,hash:e.adapter===orbitCore.OrbitAdapter.EVM?e.hash:viem.zeroHash,replacedTxHash:c.safeTxHash??viem.zeroHash,finishedTimestamp:c.executionDate?E__default.default(c.executionDate).unix():void 0});let n=a[e.txKey];s&&n&&s(n,e);}})}async function pe({tracker:e,tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,gelatoApiKey:c,...n}){switch(e){case pulsarCore.TransactionTracker.Ethereum:return w({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n});case pulsarCore.TransactionTracker.ERC4337:return L({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n});case pulsarCore.TransactionTracker.Gelato:return c?P({tx:t,transactionsPool:a,onSuccess:i,onError:o,gelatoApiKey:c,...n}):(console.warn(`Gelato tracker requested for tx '${t.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),w({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n}));case pulsarCore.TransactionTracker.Safe:return ue({tx:t,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n});default:return console.warn(`Unknown tracker type: '${e}'. Falling back to default EVM tracker.`),w({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n})}}function fe({actionTxKey:e,connectorType:t,tracker:r,gelatoApiKey:a}){if(r&&r===pulsarCore.TransactionTracker.Gelato&&a)return {tracker:pulsarCore.TransactionTracker.Gelato,txKey:e};if(!viem.isHex(e))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(e)}`);if(r&&r===pulsarCore.TransactionTracker.ERC4337)return {tracker:pulsarCore.TransactionTracker.ERC4337,txKey:e};let i=t.split(":");return (i.length>1?i[i.length-1]==="safe"||i[i.length-1]==="safewallet":t?.toLowerCase()==="safe")?{tracker:pulsarCore.TransactionTracker.Safe,txKey:e}:{tracker:pulsarCore.TransactionTracker.Ethereum,txKey:e}}var de=({chains:e,tx:t})=>{if(t.tracker===pulsarCore.TransactionTracker.Safe){let c=se[t.chainId];return c?`${c}${t.from}/transactions/tx?id=multisig_${t.from}_${t.txKey}`:""}let a=e.find(c=>c.id===t.chainId)?.blockExplorers?.default.url;if(!a)return "";let o=t.adapter===orbitCore.OrbitAdapter.EVM?t:void 0,s=o?.replacedTxHash||o?.hash||t.txKey;return s?`${a}/tx/${s}`:""};var me=1.15;async function Te({config:e,tx:t}){if(t.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:r,from:a,to:i,value:o,input:s,maxFeePerGas:c,maxPriorityFeePerGas:n,chainId:l}=t;if(r===void 0||!a||!i||!o||!c||!n)throw new Error("Transaction is missing required fields for speed-up.");try{if(!e)throw new Error("Wagmi config is not provided.");if(!core.getAccount(e).address)throw new Error("No connected account found.");let u=BigInt(Math.ceil(Number(n)*me)),p=BigInt(Math.ceil(Number(c)*me));return await core.sendTransaction(e,{to:i,value:BigInt(o),data:s||"0x",chainId:l,nonce:r,maxFeePerGas:p,maxPriorityFeePerGas:u})}catch(f){let u=f instanceof Error?f.message:String(f);throw new Error(`Failed to speed up transaction: ${u}`,{cause:f})}}function Xr(e,t){if(!e)throw new Error("EVM adapter requires a wagmi config object.");return {key:orbitCore.OrbitAdapter.EVM,getConnectorInfo:()=>{let r=core.getConnection(e),a=orbitCore.lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:r.address??a?.address??viem.zeroAddress,connectorType:orbitCore.getConnectorTypeFromName(orbitCore.OrbitAdapter.EVM,r.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:r=>orbitEvm.checkAndSwitchChain(r,e),checkTransactionsTracker:r=>fe(r),checkAndInitializeTrackerInStore:({tx:r,...a})=>pe({tracker:r.tracker,tx:r,config:e,...a}),getExplorerUrl:r=>{let{chain:a}=core.getConnection(e),i=a?.blockExplorers?.default.url;return r?`${i}/${r}`:i},getExplorerTxUrl:r=>de({chains:t,tx:r}),cancelTxAction:r=>N({config:e,tx:r}),speedUpTxAction:r=>Te({config:e,tx:r}),retryTxAction:async({onClose:r,txKey:a,executeTxAction:i,tx:o})=>{if(r(a),!i){console.error("Retry failed: executeTxAction function is not provided.");return}await i({actionFunction:()=>o.actionFunction({config:e,...o.payload}),params:o,defaultTracker:pulsarCore.TransactionTracker.Ethereum});}}}var H=new Map;async function ot(e){let t=await e.request({method:"relayer_getCapabilities",params:[]}),r={};for(let[a,i]of Object.entries(t))r[Number(a)]=i;return r}async function it(e){let t=H.get(e);if(t)return t;let r=R({apiKey:e}),a=await ot(r);return H.set(e,a),a}async function ea(e,t){try{let r=await it(t);return e in r}catch(r){return console.error("Failed to fetch Gelato relay capabilities:",r),H.delete(t),false}}
2
- exports.GelatoStatusCode=_e;exports.SafeTransactionServiceUrls=ce;exports.cancelTxAction=N;exports.checkAndInitializeTrackerInStore=pe;exports.checkIsGelatoAvailable=ea;exports.checkTransactionsTracker=fe;exports.createGelatoClient=R;exports.erc4337Fetcher=B;exports.erc4337Tracker=Ut;exports.erc4337TrackerForStore=L;exports.evmTracker=G;exports.evmTrackerForStore=w;exports.gelatoFetcher=Le;exports.gelatoTracker=Zt;exports.gelatoTrackerForStore=P;exports.gnosisSafeLinksHelper=se;exports.isRetryableReceiptError=O;exports.pulsarEvmAdapter=Xr;exports.safeFetcher=De;exports.safeSdkOptions=tr;exports.safeTrackerForStore=ue;exports.selectEvmTxExplorerLink=de;exports.speedUpTxAction=Te;
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'),y=require('dayjs'),actions=require('viem/actions'),chains=require('viem/chains');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var y__default=/*#__PURE__*/_interopDefault(y);var N=1.15;async function U({config:e,tx:t}){if(t.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:a,maxFeePerGas:n,maxPriorityFeePerGas:c,chainId:r}=t;if(a===void 0||!n||!c)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!e)throw new Error("Wagmi config is not provided.");let s=core.getAccount(e);if(!s.address)throw new Error("No connected account found.");let o=BigInt(Math.ceil(Number(c)*N)),i=BigInt(Math.ceil(Number(n)*N));return await core.sendTransaction(e,{to:s.address,value:0n,chainId:r,nonce:a,maxFeePerGas:i,maxPriorityFeePerGas:o})}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Failed to cancel transaction: ${o}`,{cause:s})}}var M=10,O=3e3,F=5,Ae=5e3,$e=5e3,Ne=6e4;function K(e){return e?(a=>{if(!(a instanceof Error))return false;if(a instanceof viem.WaitForTransactionReceiptTimeoutError||a instanceof viem.TransactionReceiptNotFoundError||a.name==="WaitForTransactionReceiptTimeoutError"||a.name==="TransactionReceiptNotFoundError"||a instanceof viem.HttpRequestError||a instanceof viem.WebSocketRequestError||a.name==="HttpRequestError"||a.name==="WebSocketRequestError"||a.name==="TimeoutError")return true;let n=a.message.toLowerCase();return n.includes("fetch failed")||n.includes("network error")||n.includes("timeout")||n.includes("timed out")||n.includes("econnreset")||n.includes("rate limit")||n.includes("502")||n.includes("503")||n.includes("504")})(e)?true:e instanceof Error&&"cause"in e&&e.cause?K(e.cause):false:false}async function I(e){let{tx:t,config:a,onInitialize:n,onTxDetailsFetched:c,onSuccess:r,onFailure:s,onReplaced:o,retryCount:i=M,retryTimeout:l=O,onConfirmationsUpdate:u,waitForTransactionReceiptParams:p}=e,{requiredConfirmations:d}=t;if(n?.(),t.txKey===viem.zeroHash)return s(new Error("Transaction hash cannot be the zero hash."));let f=core.getClient(a,{chainId:t.chainId});if(!f)return s(new Error(`Could not create a viem client for chainId: ${t.chainId}`));let T=null;for(let h=0;h<i;h++)try{T=await actions.getTransaction(f,{hash:t.txKey}),c(T);break}catch(m){if(h===i-1)return console.error(`[evmTracker] Fatal error fetching transaction ${t.txKey} on chain ${t.chainId}:`,m),s(m);console.warn(`[evmTracker] Error fetching transaction ${t.txKey} on chain ${t.chainId} (attempt ${h+1}/${i}):`,m),await new Promise(x=>setTimeout(x,l));}if(!T)return s(new Error("Transaction details could not be fetched."));let g=false;for(let h=0;h<=F;h++)try{let m=await actions.waitForTransactionReceipt(f,{hash:T.hash,onReplaced:x=>{g=!0,o(x);},retryCount:M,retryDelay:O,timeout:Ne,...p});if(!g){let x=d??1;if(x>1)for(;;){try{let b=await actions.getTransactionConfirmations(f,{transactionReceipt:m}),$=Number(b);if(u?.($),$>=x)break}catch(b){console.warn(`[evmTracker] Error fetching confirmations for ${t.txKey} on chain ${t.chainId}:`,b);}await new Promise(b=>setTimeout(b,$e));}await r(T,m,f);}return}catch(m){if(K(m)&&!g&&h<F){console.warn(`[evmTracker] Transient error for ${t.txKey} on chain ${t.chainId} (attempt ${h+1}/${F}). Error: ${m instanceof Error?m.name:"Unknown"}. Retrying...`),await new Promise(b=>setTimeout(b,Ae*(h+1)));continue}s(m);return}}async function S(e){let{tx:t,config:a,updateTxParams:n,transactionsPool:c,onSuccess:r,onError:s,onReplaced:o}=e,i=pulsarCore.createTxUpdater({tx:t,transactionsPool:c,updateTxParams:n});return I({tx:t,config:a,onInitialize:()=>{i({hash:t.txKey});},onTxDetailsFetched:l=>{i({to:l.to??void 0,input:l.input,value:l.value?.toString(),nonce:l.nonce,maxFeePerGas:l.maxFeePerGas?.toString(),maxPriorityFeePerGas:l.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:l=>{i({confirmations:l});},onSuccess:async(l,u,p)=>{let d=await actions.getBlock(p,{blockNumber:u.blockNumber}),f=Number(d.timestamp),T=u.status==="success",g=i({status:T?pulsarCore.TransactionStatus.Success:pulsarCore.TransactionStatus.Failed,isError:!T,pending:false,finishedTimestamp:f});T&&r&&g&&r(g),!T&&s&&g&&s(new Error("Transaction reverted"),g);},onReplaced:l=>{let u=i({status:pulsarCore.TransactionStatus.Replaced,replacedTxHash:l.transaction.hash,pending:false});o&&u&&o(u,t);},onFailure:l=>{let u=i({status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,error:orbitCore.normalizeError(l)});s&&u&&s(l,u);}})}async function B({tx:e,stopPolling:t,onSuccess:a,onFailure:n,onIntervalTick:c}){let r=e.chainId,s=typeof r=="number"?r:parseInt(String(r),10);if(!s||Number.isNaN(s)){t({withoutRemoving:true}),n({receipt:null,status:"failed",reason:`Invalid chainId: ${String(r)}`});return}let o=orbitEvm.createBundlerRpcClient({chainId:s,apiKey:e.pimlicoApiKey,bundlerUrl:e.bundlerUrl}),i;try{i=await o.getUserOperationReceipt({hash:e.txKey});}catch(u){let p=u;if(p?.name==="UserOperationReceiptNotFoundError"||p?.message?.includes("could not be found")||p?.shortMessage?.includes("could not be found")||p?.details?.includes("could not be found")||p?.message?.includes("not been processed yet")||p?.shortMessage?.includes("not been processed yet")){c?.({receipt:null,status:"pending"});return}throw u}if(!i){c?.({receipt:null,status:"pending"});return}let l=i.receipt?.transactionHash??i.transactionHash;i.success?(t({withoutRemoving:true}),a({receipt:i,status:"success",hash:l})):(t({withoutRemoving:true}),n({receipt:i,status:"failed",hash:l,reason:i.reason??"UserOperation reverted on-chain."}));}function Bt(e){return pulsarCore.initializePollingTracker({...e,fetcher:B,pollingInterval:e.pollingInterval??2e3,maxRetries:e.maxRetries??60})}async function L({tx:e,config:t,updateTxParams:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s}){let o=pulsarCore.createTxUpdater({tx:e,transactionsPool:n,updateTxParams:a}),i=async u=>{if(t)return I({tx:{chainId:e.chainId,txKey:u,requiredConfirmations:e.requiredConfirmations},config:t,onTxDetailsFetched:d=>{o({to:d.to??void 0,input:d.input,value:d.value?.toString(),nonce:d.nonce,maxFeePerGas:d.maxFeePerGas?.toString(),maxPriorityFeePerGas:d.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:d=>{o({confirmations:d});},onSuccess:async(d,f,T)=>{let g=await actions.getBlock(T,{blockNumber:f.blockNumber}),h=Number(g.timestamp),m=f.status==="success",x=o({status:m?pulsarCore.TransactionStatus.Success:pulsarCore.TransactionStatus.Failed,isError:!m,pending:false,hash:u,finishedTimestamp:h});m&&c&&x&&c(x),!m&&r&&x&&r(new Error("Transaction reverted on-chain."),x);},onFailure:d=>{let f=o({status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:u,error:orbitCore.normalizeError(d),finishedTimestamp:y__default.default().unix()});r&&f&&r(d,f);},onReplaced:d=>{let f=o({status:pulsarCore.TransactionStatus.Replaced,replacedTxHash:d.transaction.hash,pending:false});s&&f&&s(f,e);}});let p=o({status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:u,finishedTimestamp:y__default.default().unix()});c&&p&&c(p);},l=e;if(l.hash)return i(l.hash);pulsarCore.initializePollingTracker({tx:e,fetcher:B,pollingInterval:2e3,maxRetries:60,onSuccess:async u=>{let p=u.hash;if(!p){let d=o({status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,finishedTimestamp:y__default.default().unix()});c&&d&&c(d);return}o({hash:p}),await i(p);},onIntervalTick:u=>{u.hash&&o({hash:u.hash});},onFailure:u=>{let p=u?.reason||"UserOperation failed or was not found.",d=u?.hash,f=new Error(p),T=o({status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:d,error:orbitCore.normalizeError(f),finishedTimestamp:y__default.default().unix()});r&&T&&r(f,T);}});}var j=new Map,C=e=>{let{apiKey:t,baseUrl:a,timeout:n}=e,c=a||"https://api.gelato.cloud",r=`${t}:${c}`,s=j.get(r);if(s)return s;let o={timeout:n??15e3,...e.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${t}`,...e.httpTransportConfig?.fetchOptions?.headers},...e.httpTransportConfig?.fetchOptions}},i=viem.http(`${c}/rpc`,o)({});return j.set(r,i),i};var Le=(r=>(r[r.Pending=100]="Pending",r[r.Submitted=110]="Submitted",r[r.Success=200]="Success",r[r.Rejected=400]="Rejected",r[r.Reverted=500]="Reverted",r))(Le||{}),je=new Set([200,400,500]);function Ve(e){return !je.has(e)}function qe(e){return async({tx:t,stopPolling:a,onSuccess:n,onFailure:c,onIntervalTick:r})=>{let s=await e.request({method:"relayer_getStatus",params:{id:t.txKey,logs:false}});r?.(s);let{status:o,createdAt:i}=s;if(i&&y__default.default().diff(y__default.default.unix(i),"hour")>=1&&Ve(o)){c(s),a({withoutRemoving:true});return}o===200?(n(s),a({withoutRemoving:true})):(o===400||o===500)&&(c(s),a({withoutRemoving:true}));}}function G({tx:e,gelatoApiKey:t,updateTxParams:a,transactionsPool:n,onSuccess:c,onError:r}){let s=C({apiKey:t}),o=qe(s),i=pulsarCore.createTxUpdater({tx:e,transactionsPool:n,updateTxParams:a});return pulsarCore.initializePollingTracker({tx:e,fetcher:o,onSuccess:l=>{let u=l.status===200?l.receipt.transactionHash:void 0,p=i({status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:u,finishedTimestamp:y__default.default().unix()});c&&p&&c(p);},onIntervalTick:l=>{l.status===110&&i({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):u="Gelato task was not executed within an hour.");let d=new Error(u),f=i({status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:p,error:orbitCore.normalizeError(d),finishedTimestamp:y__default.default().unix()});r&&f&&r(d,f);}})}var aa=G;var oa={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},se={[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:"},ce={[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 Xe=async({tx:e,stopPolling:t,onSuccess:a,onFailure:n,onReplaced:c,onIntervalTick:r})=>{let s=ce[e.chainId];if(!s)throw new Error(`Safe Transaction Service URL not found for chainId: ${e.chainId}`);let o=await fetch(`${s}/multisig-transactions/${e.txKey}/`);if(!o.ok){if(o.status===404){n(),t({withoutRemoving:true});return}throw new Error(`Safe API responded with status: ${o.status}`)}let i=await o.json();if(r?.(i),i.isExecuted){i.isSuccessful?a(i):n(i),t({withoutRemoving:true});return}let l=await fetch(`${s}/safes/${e.from}/multisig-transactions/?nonce=${i.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){c?.(p),t({withoutRemoving:true});return}y__default.default().diff(y__default.default(i.submissionDate),"day")>=1&&(n(i),t({withoutRemoving:true}));};function ue({tx:e,updateTxParams:t,transactionsPool:a,onSuccess:n,onError:c,onReplaced:r}){let s=pulsarCore.createTxUpdater({tx:e,transactionsPool:a,updateTxParams:t});return pulsarCore.initializePollingTracker({tx:e,fetcher:Xe,onSuccess:o=>{let i=s({status:pulsarCore.TransactionStatus.Success,pending:false,isError:false,hash:o.transactionHash??void 0,finishedTimestamp:o.executionDate?y__default.default(o.executionDate).unix():void 0});n&&i&&n(i);},onIntervalTick:o=>{s({hash:o.transactionHash??void 0});},onFailure:o=>{let i=o?o.isExecuted?new Error("Safe transaction failed or was rejected."):new Error("Safe transaction was not executed within a day."):new Error("Safe transaction not found, or tracking failed."),l=s({status:pulsarCore.TransactionStatus.Failed,pending:false,isError:true,hash:o?.transactionHash??void 0,error:orbitCore.normalizeError(i),finishedTimestamp:o?.executionDate?y__default.default(o.executionDate).unix():void 0});c&&l&&c(i,l);},onReplaced:o=>{let i=s({status:pulsarCore.TransactionStatus.Replaced,pending:false,hash:e.adapter===orbitCore.OrbitAdapter.EVM?e.hash:viem.zeroHash,replacedTxHash:o.safeTxHash??viem.zeroHash,finishedTimestamp:o.executionDate?y__default.default(o.executionDate).unix():void 0});r&&i&&r(i,e);}})}async function pe({tracker:e,tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,gelatoApiKey:o,...i}){switch(e){case pulsarCore.TransactionTracker.Ethereum:return S({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i});case pulsarCore.TransactionTracker.ERC4337:return L({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i});case pulsarCore.TransactionTracker.Gelato:return o?G({tx:t,transactionsPool:n,onSuccess:c,onError:r,gelatoApiKey:o,...i}):(console.warn(`Gelato tracker requested for tx '${t.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),S({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i}));case pulsarCore.TransactionTracker.Safe:return ue({tx:t,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i});default:return console.warn(`Unknown tracker type: '${e}'. Falling back to default EVM tracker.`),S({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i})}}function de({actionTxKey:e,connectorType:t,tracker:a,gelatoApiKey:n}){if(a&&a===pulsarCore.TransactionTracker.Gelato&&n)return {tracker:pulsarCore.TransactionTracker.Gelato,txKey:e};if(!viem.isHex(e))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(e)}`);if(a&&a===pulsarCore.TransactionTracker.ERC4337)return {tracker:pulsarCore.TransactionTracker.ERC4337,txKey:e};let c=t.split(":");return (c.length>1?c[c.length-1]==="safe"||c[c.length-1]==="safewallet":t?.toLowerCase()==="safe")?{tracker:pulsarCore.TransactionTracker.Safe,txKey:e}:{tracker:pulsarCore.TransactionTracker.Ethereum,txKey:e}}var fe=({chains:e,tx:t})=>{if(t.tracker===pulsarCore.TransactionTracker.Safe){let o=se[t.chainId];return o?`${o}${t.from}/transactions/tx?id=multisig_${t.from}_${t.txKey}`:""}let n=e.find(o=>o.id===t.chainId)?.blockExplorers?.default.url;if(!n)return "";let r=t.adapter===orbitCore.OrbitAdapter.EVM?t:void 0,s=r?.replacedTxHash||r?.hash||t.txKey;return s?`${n}/tx/${s}`:""};var me=1.15;async function Te({config:e,tx:t}){if(t.adapter!==orbitCore.OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:a,from:n,to:c,value:r,input:s,maxFeePerGas:o,maxPriorityFeePerGas:i,chainId:l}=t;if(a===void 0||!n||!c||!r||!o||!i)throw new Error("Transaction is missing required fields for speed-up.");try{if(!e)throw new Error("Wagmi config is not provided.");if(!core.getAccount(e).address)throw new Error("No connected account found.");let p=BigInt(Math.ceil(Number(i)*me)),d=BigInt(Math.ceil(Number(o)*me));return await core.sendTransaction(e,{to:c,value:BigInt(r),data:s||"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}`,{cause:u})}}function tr(e,t){if(!e)throw new Error("EVM adapter requires a wagmi config object.");return {key:orbitCore.OrbitAdapter.EVM,getConnectorInfo:()=>{let a=core.getConnection(e),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,e),checkTransactionsTracker:a=>de(a),checkAndInitializeTrackerInStore:({tx:a,...n})=>pe({tracker:a.tracker,tx:a,config:e,...n}),getExplorerUrl:(a,n)=>{let r=(n===void 0?core.getConnection(e).chain:t.find(s=>s.id===Number(n)))?.blockExplorers?.default.url;if(r)return a?`${r.replace(/\/+$/,"")}/${a.replace(/^\/+/,"")}`:r},getExplorerTxUrl:a=>fe({chains:t,tx:a}),cancelTxAction:a=>U({config:e,tx:a}),speedUpTxAction:a=>Te({config:e,tx:a}),retryTxAction:async({onClose:a,txKey:n,executeTxAction:c,tx:r})=>{if(a(n),!c){console.error("Retry failed: executeTxAction function is not provided.");return}await c({actionFunction:()=>r.actionFunction({config:e,...r.payload}),params:r,defaultTracker:pulsarCore.TransactionTracker.Ethereum});}}}var A=new Map;async function lt(e){let t=await e.request({method:"relayer_getCapabilities",params:[]}),a={};for(let[n,c]of Object.entries(t))a[Number(n)]=c;return a}async function ut(e){let t=A.get(e);if(t)return t;let a=C({apiKey:e}),n=await lt(a);return A.set(e,n),n}async function nr(e,t){try{let a=await ut(t);return e in a}catch(a){return console.error("Failed to fetch Gelato relay capabilities:",a),A.delete(t),false}}
2
+ exports.GelatoStatusCode=Le;exports.SafeTransactionServiceUrls=ce;exports.cancelTxAction=U;exports.checkAndInitializeTrackerInStore=pe;exports.checkIsGelatoAvailable=nr;exports.checkTransactionsTracker=de;exports.createGelatoClient=C;exports.erc4337Fetcher=B;exports.erc4337Tracker=Bt;exports.erc4337TrackerForStore=L;exports.evmTracker=I;exports.evmTrackerForStore=S;exports.gelatoFetcher=qe;exports.gelatoTracker=aa;exports.gelatoTrackerForStore=G;exports.gnosisSafeLinksHelper=se;exports.isRetryableReceiptError=K;exports.pulsarEvmAdapter=tr;exports.safeFetcher=Xe;exports.safeSdkOptions=oa;exports.safeTrackerForStore=ue;exports.selectEvmTxExplorerLink=fe;exports.speedUpTxAction=Te;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {OrbitAdapter,normalizeError,lastConnectedConnectorHelpers,getConnectorTypeFromName}from'@tuwaio/orbit-core';import {createBundlerRpcClient,checkAndSwitchChain}from'@tuwaio/orbit-evm';import {TransactionStatus,initializePollingTracker,TransactionTracker}from'@tuwaio/pulsar-core';import {getAccount,sendTransaction,getClient,getConnection}from'@wagmi/core';import {WaitForTransactionReceiptTimeoutError,TransactionReceiptNotFoundError,HttpRequestError,WebSocketRequestError,zeroHash,http,isHex,zeroAddress}from'viem';import E from'dayjs';import {getTransaction,waitForTransactionReceipt,getTransactionConfirmations,getBlock}from'viem/actions';import {zksync,polygonZkEvm,optimism,gnosis,celo,bsc,boba,base,avalanche,aurora,arbitrum,polygon,sepolia,goerli,mainnet}from'viem/chains';var $=1.15;async function N({config:e,tx:t}){if(t.adapter!==OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:r,maxFeePerGas:a,maxPriorityFeePerGas:i,chainId:o}=t;if(r===void 0||!a||!i)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!e)throw new Error("Wagmi config is not provided.");let s=getAccount(e);if(!s.address)throw new Error("No connected account found.");let c=BigInt(Math.ceil(Number(i)*$)),n=BigInt(Math.ceil(Number(a)*$));return await sendTransaction(e,{to:s.address,value:0n,chainId:o,nonce:r,maxFeePerGas:n,maxPriorityFeePerGas:c})}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`Failed to cancel transaction: ${c}`,{cause:s})}}var M=10,U=3e3,I=5,Ke=5e3,He=5e3,Ae=6e4;function O(e){return e?(r=>{if(!(r instanceof Error))return false;if(r instanceof WaitForTransactionReceiptTimeoutError||r instanceof TransactionReceiptNotFoundError||r.name==="WaitForTransactionReceiptTimeoutError"||r.name==="TransactionReceiptNotFoundError"||r instanceof HttpRequestError||r instanceof WebSocketRequestError||r.name==="HttpRequestError"||r.name==="WebSocketRequestError"||r.name==="TimeoutError")return true;let a=r.message.toLowerCase();return a.includes("fetch failed")||a.includes("network error")||a.includes("timeout")||a.includes("timed out")||a.includes("econnreset")||a.includes("rate limit")||a.includes("502")||a.includes("503")||a.includes("504")})(e)?true:e instanceof Error&&"cause"in e&&e.cause?O(e.cause):false:false}async function G(e){let{tx:t,config:r,onInitialize:a,onTxDetailsFetched:i,onSuccess:o,onFailure:s,onReplaced:c,retryCount:n=M,retryTimeout:l=U,onConfirmationsUpdate:f,waitForTransactionReceiptParams:u}=e,{requiredConfirmations:p}=t;if(a?.(),t.txKey===zeroHash)return s(new Error("Transaction hash cannot be the zero hash."));let d=getClient(r,{chainId:t.chainId});if(!d)return s(new Error(`Could not create a viem client for chainId: ${t.chainId}`));let h=null;for(let T=0;T<n;T++)try{h=await getTransaction(d,{hash:t.txKey}),i(h);break}catch(m){if(T===n-1)return console.error(`[evmTracker] Fatal error fetching transaction ${t.txKey} on chain ${t.chainId}:`,m),s(m);console.warn(`[evmTracker] Error fetching transaction ${t.txKey} on chain ${t.chainId} (attempt ${T+1}/${n}):`,m),await new Promise(g=>setTimeout(g,l));}if(!h)return s(new Error("Transaction details could not be fetched."));let k=false;for(let T=0;T<=I;T++)try{let m=await waitForTransactionReceipt(d,{hash:h.hash,onReplaced:g=>{k=!0,c(g);},retryCount:M,retryDelay:U,timeout:Ae,...u});if(!k){let g=p??1;if(g>1)for(;;){try{let x=await getTransactionConfirmations(d,{transactionReceipt:m}),A=Number(x);if(f?.(A),A>=g)break}catch(x){console.warn(`[evmTracker] Error fetching confirmations for ${t.txKey} on chain ${t.chainId}:`,x);}await new Promise(x=>setTimeout(x,He));}await o(h,m,d);}return}catch(m){if(O(m)&&!k&&T<I){console.warn(`[evmTracker] Transient error for ${t.txKey} on chain ${t.chainId} (attempt ${T+1}/${I}). Error: ${m instanceof Error?m.name:"Unknown"}. Retrying...`),await new Promise(x=>setTimeout(x,Ke*(T+1)));continue}s(m);return}}async function w(e){let{tx:t,config:r,updateTxParams:a,transactionsPool:i,onSuccess:o,onError:s,onReplaced:c}=e;return G({tx:t,config:r,onInitialize:()=>{a(t.txKey,{hash:t.txKey});},onTxDetailsFetched:n=>{a(t.txKey,{to:n.to??void 0,input:n.input,value:n.value?.toString(),nonce:n.nonce,maxFeePerGas:n.maxFeePerGas?.toString(),maxPriorityFeePerGas:n.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:n=>{a(t.txKey,{confirmations:n});},onSuccess:async(n,l,f)=>{let u=await getBlock(f,{blockNumber:l.blockNumber}),p=Number(u.timestamp),d=l.status==="success";a(t.txKey,{status:d?TransactionStatus.Success:TransactionStatus.Failed,isError:!d,pending:false,finishedTimestamp:p});let h=i[t.txKey];d&&o&&h&&o(h),!d&&s&&h&&s(new Error("Transaction reverted"),h);},onReplaced:n=>{a(t.txKey,{status:TransactionStatus.Replaced,replacedTxHash:n.transaction.hash,pending:false});let l=i[t.txKey];c&&l&&c(l,t);},onFailure:n=>{a(t.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,error:normalizeError(n)});let l=i[t.txKey];s&&l&&s(n,l);}})}async function B({tx:e,stopPolling:t,onSuccess:r,onFailure:a,onIntervalTick:i}){let o=e,s=o.chainId,c=typeof s=="number"?s:parseInt(String(s),10);if(!c||Number.isNaN(c)){t({withoutRemoving:true}),a({receipt:null,status:"failed",reason:`Invalid chainId: ${String(s)}`});return}let n=createBundlerRpcClient({chainId:c,apiKey:o.pimlicoApiKey,bundlerUrl:o.bundlerUrl}),l;try{l=await n.getUserOperationReceipt({hash:o.txKey});}catch(u){let p=u;if(p?.name==="UserOperationReceiptNotFoundError"||p?.message?.includes("could not be found")||p?.shortMessage?.includes("could not be found")||p?.details?.includes("could not be found")||p?.message?.includes("not been processed yet")||p?.shortMessage?.includes("not been processed yet")){i?.({receipt:null,status:"pending"});return}throw u}if(!l){i?.({receipt:null,status:"pending"});return}let f=l.receipt?.transactionHash??l.transactionHash;l.success?(t({withoutRemoving:true}),r({receipt:l,status:"success",hash:f})):(t({withoutRemoving:true}),a({receipt:l,status:"failed",hash:f,reason:l.reason??"UserOperation reverted on-chain."}));}function Ut(e){return initializePollingTracker({...e,fetcher:B,pollingInterval:e.pollingInterval??2e3,maxRetries:e.maxRetries??60})}async function L({tx:e,config:t,updateTxParams:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s}){let c=async l=>{if(t)return G({tx:{chainId:e.chainId,txKey:l,requiredConfirmations:e.requiredConfirmations},config:t,onTxDetailsFetched:u=>{r(e.txKey,{to:u.to??void 0,input:u.input,value:u.value?.toString(),nonce:u.nonce,maxFeePerGas:u.maxFeePerGas?.toString(),maxPriorityFeePerGas:u.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:u=>{r(e.txKey,{confirmations:u});},onSuccess:async(u,p,d)=>{let h=await getBlock(d,{blockNumber:p.blockNumber}),k=Number(h.timestamp),T=p.status==="success";r(e.txKey,{status:T?TransactionStatus.Success:TransactionStatus.Failed,isError:!T,pending:false,hash:l,finishedTimestamp:k});let m=a[e.txKey];T&&i&&m&&i(m),!T&&o&&m&&o(new Error("Transaction reverted on-chain."),m);},onFailure:u=>{r(e.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:l,error:normalizeError(u),finishedTimestamp:E().unix()});let p=a[e.txKey];o&&p&&o(u,p);},onReplaced:u=>{r(e.txKey,{status:TransactionStatus.Replaced,replacedTxHash:u.transaction.hash,pending:false});let p=a[e.txKey];s&&p&&s(p,e);}});r(e.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:l,finishedTimestamp:E().unix()});let f=a[e.txKey];i&&f&&i(f);},n=e;if(n.hash)return c(n.hash);initializePollingTracker({tx:e,fetcher:B,pollingInterval:2e3,maxRetries:60,onSuccess:async l=>{let f=l.hash;if(!f){r(e.txKey,{status:TransactionStatus.Success,pending:false,isError:false,finishedTimestamp:E().unix()});let u=a[e.txKey];i&&u&&i(u);return}r(e.txKey,{hash:f}),await c(f);},onIntervalTick:l=>{l.hash&&r(e.txKey,{hash:l.hash});},onFailure:l=>{let f=l?.reason||"UserOperation failed or was not found.",u=l?.hash,p=new Error(f);r(e.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:u,error:normalizeError(p),finishedTimestamp:E().unix()});let d=a[e.txKey];o&&d&&o(p,d);}});}var j=new Map,R=e=>{let{apiKey:t,baseUrl:r,timeout:a}=e,i=r||"https://api.gelato.cloud",o=`${t}:${i}`,s=j.get(o);if(s)return s;let c={timeout:a??15e3,...e.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${t}`,...e.httpTransportConfig?.fetchOptions?.headers},...e.httpTransportConfig?.fetchOptions}},n=http(`${i}/rpc`,c)({});return j.set(o,n),n};var _e=(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))(_e||{}),ze=new Set([200,400,500]);function Be(e){return !ze.has(e)}function Le(e){return async({tx:t,stopPolling:r,onSuccess:a,onFailure:i,onIntervalTick:o})=>{let s=await e.request({method:"relayer_getStatus",params:{id:t.txKey,logs:false}});o?.(s);let{status:c,createdAt:n}=s;if(n&&E().diff(E.unix(n),"hour")>=1&&Be(c)){r();return}c===200?(a(s),r({withoutRemoving:true})):(c===400||c===500)&&(i(s),r({withoutRemoving:true}));}}function P({tx:e,gelatoApiKey:t,updateTxParams:r,removeTxFromPool:a,transactionsPool:i,onSuccess:o,onError:s}){let c=R({apiKey:t}),n=Le(c);return initializePollingTracker({tx:e,fetcher:n,removeTxFromPool:a,onSuccess:l=>{let f=l.status===200?l.receipt.transactionHash:void 0;r(e.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:f,finishedTimestamp:E().unix()});let u=i[e.txKey];o&&u&&o(u);},onIntervalTick:l=>{l.status===110&&r(e.txKey,{hash:l.hash});},onFailure:l=>{let f="Transaction failed or was not found.",u;l&&(l.status===400?f=l.message||"Transaction was rejected by Gelato Relay.":l.status===500&&(f=l.message||"Transaction reverted on-chain.",u=l.receipt.transactionHash));let p=new Error(f);r(e.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:u,error:normalizeError(p),finishedTimestamp:E().unix()});let d=i[e.txKey];s&&d&&s(p,d);}})}var Zt=P;var tr={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},se={[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:"},ce={[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 De=async({tx:e,stopPolling:t,onSuccess:r,onFailure:a,onReplaced:i,onIntervalTick:o})=>{let s=ce[e.chainId];if(!s)throw new Error(`Safe Transaction Service URL not found for chainId: ${e.chainId}`);let c=await fetch(`${s}/multisig-transactions/${e.txKey}/`);if(!c.ok)throw c.status===404&&(a(),t()),new Error(`Safe API responded with status: ${c.status}`);let n=await c.json();if(o?.(n),n.isExecuted){n.isSuccessful?r(n):a(n),t({withoutRemoving:true});return}let l=await fetch(`${s}/safes/${e.from}/multisig-transactions/?nonce=${n.nonce}`);if(!l.ok)throw new Error(`Safe API (nonce check) responded with status: ${l.status}`);let u=(await l.json()).results.find(p=>p.isExecuted);if(u){i?.(u),t({withoutRemoving:true});return}E().diff(E(n.submissionDate),"day")>=1&&t();};function ue({tx:e,updateTxParams:t,removeTxFromPool:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s}){return initializePollingTracker({tx:e,fetcher:De,removeTxFromPool:r,onSuccess:c=>{t(e.txKey,{status:TransactionStatus.Success,pending:false,isError:false,hash:c.transactionHash??void 0,finishedTimestamp:c.executionDate?E(c.executionDate).unix():void 0});let n=a[e.txKey];i&&n&&i(n);},onIntervalTick:c=>{t(e.txKey,{hash:c.transactionHash??void 0});},onFailure:c=>{let n=c?new Error("Safe transaction failed or was rejected."):new Error("Transaction not found.");t(e.txKey,{status:TransactionStatus.Failed,pending:false,isError:true,hash:c?.transactionHash??void 0,error:normalizeError(n),finishedTimestamp:c?.executionDate?E(c.executionDate).unix():void 0});let l=a[e.txKey];o&&l&&o(n,l);},onReplaced:c=>{t(e.txKey,{status:TransactionStatus.Replaced,pending:false,hash:e.adapter===OrbitAdapter.EVM?e.hash:zeroHash,replacedTxHash:c.safeTxHash??zeroHash,finishedTimestamp:c.executionDate?E(c.executionDate).unix():void 0});let n=a[e.txKey];s&&n&&s(n,e);}})}async function pe({tracker:e,tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,gelatoApiKey:c,...n}){switch(e){case TransactionTracker.Ethereum:return w({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n});case TransactionTracker.ERC4337:return L({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n});case TransactionTracker.Gelato:return c?P({tx:t,transactionsPool:a,onSuccess:i,onError:o,gelatoApiKey:c,...n}):(console.warn(`Gelato tracker requested for tx '${t.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),w({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n}));case TransactionTracker.Safe:return ue({tx:t,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n});default:return console.warn(`Unknown tracker type: '${e}'. Falling back to default EVM tracker.`),w({tx:t,config:r,transactionsPool:a,onSuccess:i,onError:o,onReplaced:s,...n})}}function fe({actionTxKey:e,connectorType:t,tracker:r,gelatoApiKey:a}){if(r&&r===TransactionTracker.Gelato&&a)return {tracker:TransactionTracker.Gelato,txKey:e};if(!isHex(e))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(e)}`);if(r&&r===TransactionTracker.ERC4337)return {tracker:TransactionTracker.ERC4337,txKey:e};let i=t.split(":");return (i.length>1?i[i.length-1]==="safe"||i[i.length-1]==="safewallet":t?.toLowerCase()==="safe")?{tracker:TransactionTracker.Safe,txKey:e}:{tracker:TransactionTracker.Ethereum,txKey:e}}var de=({chains:e,tx:t})=>{if(t.tracker===TransactionTracker.Safe){let c=se[t.chainId];return c?`${c}${t.from}/transactions/tx?id=multisig_${t.from}_${t.txKey}`:""}let a=e.find(c=>c.id===t.chainId)?.blockExplorers?.default.url;if(!a)return "";let o=t.adapter===OrbitAdapter.EVM?t:void 0,s=o?.replacedTxHash||o?.hash||t.txKey;return s?`${a}/tx/${s}`:""};var me=1.15;async function Te({config:e,tx:t}){if(t.adapter!==OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:r,from:a,to:i,value:o,input:s,maxFeePerGas:c,maxPriorityFeePerGas:n,chainId:l}=t;if(r===void 0||!a||!i||!o||!c||!n)throw new Error("Transaction is missing required fields for speed-up.");try{if(!e)throw new Error("Wagmi config is not provided.");if(!getAccount(e).address)throw new Error("No connected account found.");let u=BigInt(Math.ceil(Number(n)*me)),p=BigInt(Math.ceil(Number(c)*me));return await sendTransaction(e,{to:i,value:BigInt(o),data:s||"0x",chainId:l,nonce:r,maxFeePerGas:p,maxPriorityFeePerGas:u})}catch(f){let u=f instanceof Error?f.message:String(f);throw new Error(`Failed to speed up transaction: ${u}`,{cause:f})}}function Xr(e,t){if(!e)throw new Error("EVM adapter requires a wagmi config object.");return {key:OrbitAdapter.EVM,getConnectorInfo:()=>{let r=getConnection(e),a=lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:r.address??a?.address??zeroAddress,connectorType:getConnectorTypeFromName(OrbitAdapter.EVM,r.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:r=>checkAndSwitchChain(r,e),checkTransactionsTracker:r=>fe(r),checkAndInitializeTrackerInStore:({tx:r,...a})=>pe({tracker:r.tracker,tx:r,config:e,...a}),getExplorerUrl:r=>{let{chain:a}=getConnection(e),i=a?.blockExplorers?.default.url;return r?`${i}/${r}`:i},getExplorerTxUrl:r=>de({chains:t,tx:r}),cancelTxAction:r=>N({config:e,tx:r}),speedUpTxAction:r=>Te({config:e,tx:r}),retryTxAction:async({onClose:r,txKey:a,executeTxAction:i,tx:o})=>{if(r(a),!i){console.error("Retry failed: executeTxAction function is not provided.");return}await i({actionFunction:()=>o.actionFunction({config:e,...o.payload}),params:o,defaultTracker:TransactionTracker.Ethereum});}}}var H=new Map;async function ot(e){let t=await e.request({method:"relayer_getCapabilities",params:[]}),r={};for(let[a,i]of Object.entries(t))r[Number(a)]=i;return r}async function it(e){let t=H.get(e);if(t)return t;let r=R({apiKey:e}),a=await ot(r);return H.set(e,a),a}async function ea(e,t){try{let r=await it(t);return e in r}catch(r){return console.error("Failed to fetch Gelato relay capabilities:",r),H.delete(t),false}}
2
- export{_e as GelatoStatusCode,ce as SafeTransactionServiceUrls,N as cancelTxAction,pe as checkAndInitializeTrackerInStore,ea as checkIsGelatoAvailable,fe as checkTransactionsTracker,R as createGelatoClient,B as erc4337Fetcher,Ut as erc4337Tracker,L as erc4337TrackerForStore,G as evmTracker,w as evmTrackerForStore,Le as gelatoFetcher,Zt as gelatoTracker,P as gelatoTrackerForStore,se as gnosisSafeLinksHelper,O as isRetryableReceiptError,Xr as pulsarEvmAdapter,De as safeFetcher,tr as safeSdkOptions,ue as safeTrackerForStore,de as selectEvmTxExplorerLink,Te as speedUpTxAction};
1
+ import {OrbitAdapter,normalizeError,lastConnectedConnectorHelpers,getConnectorTypeFromName}from'@tuwaio/orbit-core';import {createBundlerRpcClient,checkAndSwitchChain}from'@tuwaio/orbit-evm';import {createTxUpdater,TransactionStatus,initializePollingTracker,TransactionTracker}from'@tuwaio/pulsar-core';import {getAccount,sendTransaction,getClient,getConnection}from'@wagmi/core';import {WaitForTransactionReceiptTimeoutError,TransactionReceiptNotFoundError,HttpRequestError,WebSocketRequestError,zeroHash,http,isHex,zeroAddress}from'viem';import y from'dayjs';import {getTransaction,waitForTransactionReceipt,getTransactionConfirmations,getBlock}from'viem/actions';import {zksync,polygonZkEvm,optimism,gnosis,celo,bsc,boba,base,avalanche,aurora,arbitrum,polygon,sepolia,goerli,mainnet}from'viem/chains';var N=1.15;async function U({config:e,tx:t}){if(t.adapter!==OrbitAdapter.EVM)throw new Error(`Cancellation is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:a,maxFeePerGas:n,maxPriorityFeePerGas:c,chainId:r}=t;if(a===void 0||!n||!c)throw new Error("Transaction is missing required fields for cancellation (nonce, maxFeePerGas, maxPriorityFeePerGas).");try{if(!e)throw new Error("Wagmi config is not provided.");let s=getAccount(e);if(!s.address)throw new Error("No connected account found.");let o=BigInt(Math.ceil(Number(c)*N)),i=BigInt(Math.ceil(Number(n)*N));return await sendTransaction(e,{to:s.address,value:0n,chainId:r,nonce:a,maxFeePerGas:i,maxPriorityFeePerGas:o})}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(`Failed to cancel transaction: ${o}`,{cause:s})}}var M=10,O=3e3,F=5,Ae=5e3,$e=5e3,Ne=6e4;function K(e){return e?(a=>{if(!(a instanceof Error))return false;if(a instanceof WaitForTransactionReceiptTimeoutError||a instanceof TransactionReceiptNotFoundError||a.name==="WaitForTransactionReceiptTimeoutError"||a.name==="TransactionReceiptNotFoundError"||a instanceof HttpRequestError||a instanceof WebSocketRequestError||a.name==="HttpRequestError"||a.name==="WebSocketRequestError"||a.name==="TimeoutError")return true;let n=a.message.toLowerCase();return n.includes("fetch failed")||n.includes("network error")||n.includes("timeout")||n.includes("timed out")||n.includes("econnreset")||n.includes("rate limit")||n.includes("502")||n.includes("503")||n.includes("504")})(e)?true:e instanceof Error&&"cause"in e&&e.cause?K(e.cause):false:false}async function I(e){let{tx:t,config:a,onInitialize:n,onTxDetailsFetched:c,onSuccess:r,onFailure:s,onReplaced:o,retryCount:i=M,retryTimeout:l=O,onConfirmationsUpdate:u,waitForTransactionReceiptParams:p}=e,{requiredConfirmations:d}=t;if(n?.(),t.txKey===zeroHash)return s(new Error("Transaction hash cannot be the zero hash."));let f=getClient(a,{chainId:t.chainId});if(!f)return s(new Error(`Could not create a viem client for chainId: ${t.chainId}`));let T=null;for(let h=0;h<i;h++)try{T=await getTransaction(f,{hash:t.txKey}),c(T);break}catch(m){if(h===i-1)return console.error(`[evmTracker] Fatal error fetching transaction ${t.txKey} on chain ${t.chainId}:`,m),s(m);console.warn(`[evmTracker] Error fetching transaction ${t.txKey} on chain ${t.chainId} (attempt ${h+1}/${i}):`,m),await new Promise(x=>setTimeout(x,l));}if(!T)return s(new Error("Transaction details could not be fetched."));let g=false;for(let h=0;h<=F;h++)try{let m=await waitForTransactionReceipt(f,{hash:T.hash,onReplaced:x=>{g=!0,o(x);},retryCount:M,retryDelay:O,timeout:Ne,...p});if(!g){let x=d??1;if(x>1)for(;;){try{let b=await getTransactionConfirmations(f,{transactionReceipt:m}),$=Number(b);if(u?.($),$>=x)break}catch(b){console.warn(`[evmTracker] Error fetching confirmations for ${t.txKey} on chain ${t.chainId}:`,b);}await new Promise(b=>setTimeout(b,$e));}await r(T,m,f);}return}catch(m){if(K(m)&&!g&&h<F){console.warn(`[evmTracker] Transient error for ${t.txKey} on chain ${t.chainId} (attempt ${h+1}/${F}). Error: ${m instanceof Error?m.name:"Unknown"}. Retrying...`),await new Promise(b=>setTimeout(b,Ae*(h+1)));continue}s(m);return}}async function S(e){let{tx:t,config:a,updateTxParams:n,transactionsPool:c,onSuccess:r,onError:s,onReplaced:o}=e,i=createTxUpdater({tx:t,transactionsPool:c,updateTxParams:n});return I({tx:t,config:a,onInitialize:()=>{i({hash:t.txKey});},onTxDetailsFetched:l=>{i({to:l.to??void 0,input:l.input,value:l.value?.toString(),nonce:l.nonce,maxFeePerGas:l.maxFeePerGas?.toString(),maxPriorityFeePerGas:l.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:l=>{i({confirmations:l});},onSuccess:async(l,u,p)=>{let d=await getBlock(p,{blockNumber:u.blockNumber}),f=Number(d.timestamp),T=u.status==="success",g=i({status:T?TransactionStatus.Success:TransactionStatus.Failed,isError:!T,pending:false,finishedTimestamp:f});T&&r&&g&&r(g),!T&&s&&g&&s(new Error("Transaction reverted"),g);},onReplaced:l=>{let u=i({status:TransactionStatus.Replaced,replacedTxHash:l.transaction.hash,pending:false});o&&u&&o(u,t);},onFailure:l=>{let u=i({status:TransactionStatus.Failed,pending:false,isError:true,error:normalizeError(l)});s&&u&&s(l,u);}})}async function B({tx:e,stopPolling:t,onSuccess:a,onFailure:n,onIntervalTick:c}){let r=e.chainId,s=typeof r=="number"?r:parseInt(String(r),10);if(!s||Number.isNaN(s)){t({withoutRemoving:true}),n({receipt:null,status:"failed",reason:`Invalid chainId: ${String(r)}`});return}let o=createBundlerRpcClient({chainId:s,apiKey:e.pimlicoApiKey,bundlerUrl:e.bundlerUrl}),i;try{i=await o.getUserOperationReceipt({hash:e.txKey});}catch(u){let p=u;if(p?.name==="UserOperationReceiptNotFoundError"||p?.message?.includes("could not be found")||p?.shortMessage?.includes("could not be found")||p?.details?.includes("could not be found")||p?.message?.includes("not been processed yet")||p?.shortMessage?.includes("not been processed yet")){c?.({receipt:null,status:"pending"});return}throw u}if(!i){c?.({receipt:null,status:"pending"});return}let l=i.receipt?.transactionHash??i.transactionHash;i.success?(t({withoutRemoving:true}),a({receipt:i,status:"success",hash:l})):(t({withoutRemoving:true}),n({receipt:i,status:"failed",hash:l,reason:i.reason??"UserOperation reverted on-chain."}));}function Bt(e){return initializePollingTracker({...e,fetcher:B,pollingInterval:e.pollingInterval??2e3,maxRetries:e.maxRetries??60})}async function L({tx:e,config:t,updateTxParams:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s}){let o=createTxUpdater({tx:e,transactionsPool:n,updateTxParams:a}),i=async u=>{if(t)return I({tx:{chainId:e.chainId,txKey:u,requiredConfirmations:e.requiredConfirmations},config:t,onTxDetailsFetched:d=>{o({to:d.to??void 0,input:d.input,value:d.value?.toString(),nonce:d.nonce,maxFeePerGas:d.maxFeePerGas?.toString(),maxPriorityFeePerGas:d.maxPriorityFeePerGas?.toString()});},onConfirmationsUpdate:d=>{o({confirmations:d});},onSuccess:async(d,f,T)=>{let g=await getBlock(T,{blockNumber:f.blockNumber}),h=Number(g.timestamp),m=f.status==="success",x=o({status:m?TransactionStatus.Success:TransactionStatus.Failed,isError:!m,pending:false,hash:u,finishedTimestamp:h});m&&c&&x&&c(x),!m&&r&&x&&r(new Error("Transaction reverted on-chain."),x);},onFailure:d=>{let f=o({status:TransactionStatus.Failed,pending:false,isError:true,hash:u,error:normalizeError(d),finishedTimestamp:y().unix()});r&&f&&r(d,f);},onReplaced:d=>{let f=o({status:TransactionStatus.Replaced,replacedTxHash:d.transaction.hash,pending:false});s&&f&&s(f,e);}});let p=o({status:TransactionStatus.Success,pending:false,isError:false,hash:u,finishedTimestamp:y().unix()});c&&p&&c(p);},l=e;if(l.hash)return i(l.hash);initializePollingTracker({tx:e,fetcher:B,pollingInterval:2e3,maxRetries:60,onSuccess:async u=>{let p=u.hash;if(!p){let d=o({status:TransactionStatus.Success,pending:false,isError:false,finishedTimestamp:y().unix()});c&&d&&c(d);return}o({hash:p}),await i(p);},onIntervalTick:u=>{u.hash&&o({hash:u.hash});},onFailure:u=>{let p=u?.reason||"UserOperation failed or was not found.",d=u?.hash,f=new Error(p),T=o({status:TransactionStatus.Failed,pending:false,isError:true,hash:d,error:normalizeError(f),finishedTimestamp:y().unix()});r&&T&&r(f,T);}});}var j=new Map,C=e=>{let{apiKey:t,baseUrl:a,timeout:n}=e,c=a||"https://api.gelato.cloud",r=`${t}:${c}`,s=j.get(r);if(s)return s;let o={timeout:n??15e3,...e.httpTransportConfig,fetchOptions:{headers:{Authorization:`Bearer ${t}`,...e.httpTransportConfig?.fetchOptions?.headers},...e.httpTransportConfig?.fetchOptions}},i=http(`${c}/rpc`,o)({});return j.set(r,i),i};var Le=(r=>(r[r.Pending=100]="Pending",r[r.Submitted=110]="Submitted",r[r.Success=200]="Success",r[r.Rejected=400]="Rejected",r[r.Reverted=500]="Reverted",r))(Le||{}),je=new Set([200,400,500]);function Ve(e){return !je.has(e)}function qe(e){return async({tx:t,stopPolling:a,onSuccess:n,onFailure:c,onIntervalTick:r})=>{let s=await e.request({method:"relayer_getStatus",params:{id:t.txKey,logs:false}});r?.(s);let{status:o,createdAt:i}=s;if(i&&y().diff(y.unix(i),"hour")>=1&&Ve(o)){c(s),a({withoutRemoving:true});return}o===200?(n(s),a({withoutRemoving:true})):(o===400||o===500)&&(c(s),a({withoutRemoving:true}));}}function G({tx:e,gelatoApiKey:t,updateTxParams:a,transactionsPool:n,onSuccess:c,onError:r}){let s=C({apiKey:t}),o=qe(s),i=createTxUpdater({tx:e,transactionsPool:n,updateTxParams:a});return initializePollingTracker({tx:e,fetcher:o,onSuccess:l=>{let u=l.status===200?l.receipt.transactionHash:void 0,p=i({status:TransactionStatus.Success,pending:false,isError:false,hash:u,finishedTimestamp:y().unix()});c&&p&&c(p);},onIntervalTick:l=>{l.status===110&&i({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):u="Gelato task was not executed within an hour.");let d=new Error(u),f=i({status:TransactionStatus.Failed,pending:false,isError:true,hash:p,error:normalizeError(d),finishedTimestamp:y().unix()});r&&f&&r(d,f);}})}var aa=G;var oa={allowedDomains:[/gnosis-safe.io$/,/app.safe.global$/,/metissafe.tech$/],debug:false},se={[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:"},ce={[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 Xe=async({tx:e,stopPolling:t,onSuccess:a,onFailure:n,onReplaced:c,onIntervalTick:r})=>{let s=ce[e.chainId];if(!s)throw new Error(`Safe Transaction Service URL not found for chainId: ${e.chainId}`);let o=await fetch(`${s}/multisig-transactions/${e.txKey}/`);if(!o.ok){if(o.status===404){n(),t({withoutRemoving:true});return}throw new Error(`Safe API responded with status: ${o.status}`)}let i=await o.json();if(r?.(i),i.isExecuted){i.isSuccessful?a(i):n(i),t({withoutRemoving:true});return}let l=await fetch(`${s}/safes/${e.from}/multisig-transactions/?nonce=${i.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){c?.(p),t({withoutRemoving:true});return}y().diff(y(i.submissionDate),"day")>=1&&(n(i),t({withoutRemoving:true}));};function ue({tx:e,updateTxParams:t,transactionsPool:a,onSuccess:n,onError:c,onReplaced:r}){let s=createTxUpdater({tx:e,transactionsPool:a,updateTxParams:t});return initializePollingTracker({tx:e,fetcher:Xe,onSuccess:o=>{let i=s({status:TransactionStatus.Success,pending:false,isError:false,hash:o.transactionHash??void 0,finishedTimestamp:o.executionDate?y(o.executionDate).unix():void 0});n&&i&&n(i);},onIntervalTick:o=>{s({hash:o.transactionHash??void 0});},onFailure:o=>{let i=o?o.isExecuted?new Error("Safe transaction failed or was rejected."):new Error("Safe transaction was not executed within a day."):new Error("Safe transaction not found, or tracking failed."),l=s({status:TransactionStatus.Failed,pending:false,isError:true,hash:o?.transactionHash??void 0,error:normalizeError(i),finishedTimestamp:o?.executionDate?y(o.executionDate).unix():void 0});c&&l&&c(i,l);},onReplaced:o=>{let i=s({status:TransactionStatus.Replaced,pending:false,hash:e.adapter===OrbitAdapter.EVM?e.hash:zeroHash,replacedTxHash:o.safeTxHash??zeroHash,finishedTimestamp:o.executionDate?y(o.executionDate).unix():void 0});r&&i&&r(i,e);}})}async function pe({tracker:e,tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,gelatoApiKey:o,...i}){switch(e){case TransactionTracker.Ethereum:return S({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i});case TransactionTracker.ERC4337:return L({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i});case TransactionTracker.Gelato:return o?G({tx:t,transactionsPool:n,onSuccess:c,onError:r,gelatoApiKey:o,...i}):(console.warn(`Gelato tracker requested for tx '${t.txKey}', but no 'gelatoApiKey' was provided. Falling back to default EVM tracker.`),S({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i}));case TransactionTracker.Safe:return ue({tx:t,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i});default:return console.warn(`Unknown tracker type: '${e}'. Falling back to default EVM tracker.`),S({tx:t,config:a,transactionsPool:n,onSuccess:c,onError:r,onReplaced:s,...i})}}function de({actionTxKey:e,connectorType:t,tracker:a,gelatoApiKey:n}){if(a&&a===TransactionTracker.Gelato&&n)return {tracker:TransactionTracker.Gelato,txKey:e};if(!isHex(e))throw new Error(`Invalid transaction key format. Expected a Hex string or a GelatoTxKey object, but received: ${JSON.stringify(e)}`);if(a&&a===TransactionTracker.ERC4337)return {tracker:TransactionTracker.ERC4337,txKey:e};let c=t.split(":");return (c.length>1?c[c.length-1]==="safe"||c[c.length-1]==="safewallet":t?.toLowerCase()==="safe")?{tracker:TransactionTracker.Safe,txKey:e}:{tracker:TransactionTracker.Ethereum,txKey:e}}var fe=({chains:e,tx:t})=>{if(t.tracker===TransactionTracker.Safe){let o=se[t.chainId];return o?`${o}${t.from}/transactions/tx?id=multisig_${t.from}_${t.txKey}`:""}let n=e.find(o=>o.id===t.chainId)?.blockExplorers?.default.url;if(!n)return "";let r=t.adapter===OrbitAdapter.EVM?t:void 0,s=r?.replacedTxHash||r?.hash||t.txKey;return s?`${n}/tx/${s}`:""};var me=1.15;async function Te({config:e,tx:t}){if(t.adapter!==OrbitAdapter.EVM)throw new Error(`Speed up is only available for EVM transactions. Received adapter type: '${t.adapter}'.`);let{nonce:a,from:n,to:c,value:r,input:s,maxFeePerGas:o,maxPriorityFeePerGas:i,chainId:l}=t;if(a===void 0||!n||!c||!r||!o||!i)throw new Error("Transaction is missing required fields for speed-up.");try{if(!e)throw new Error("Wagmi config is not provided.");if(!getAccount(e).address)throw new Error("No connected account found.");let p=BigInt(Math.ceil(Number(i)*me)),d=BigInt(Math.ceil(Number(o)*me));return await sendTransaction(e,{to:c,value:BigInt(r),data:s||"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}`,{cause:u})}}function tr(e,t){if(!e)throw new Error("EVM adapter requires a wagmi config object.");return {key:OrbitAdapter.EVM,getConnectorInfo:()=>{let a=getConnection(e),n=lastConnectedConnectorHelpers.getLastConnectedConnector();return {walletAddress:a.address??n?.address??zeroAddress,connectorType:getConnectorTypeFromName(OrbitAdapter.EVM,a.connector?.name?.toLowerCase()??"unknown")}},checkChainForTx:a=>checkAndSwitchChain(a,e),checkTransactionsTracker:a=>de(a),checkAndInitializeTrackerInStore:({tx:a,...n})=>pe({tracker:a.tracker,tx:a,config:e,...n}),getExplorerUrl:(a,n)=>{let r=(n===void 0?getConnection(e).chain:t.find(s=>s.id===Number(n)))?.blockExplorers?.default.url;if(r)return a?`${r.replace(/\/+$/,"")}/${a.replace(/^\/+/,"")}`:r},getExplorerTxUrl:a=>fe({chains:t,tx:a}),cancelTxAction:a=>U({config:e,tx:a}),speedUpTxAction:a=>Te({config:e,tx:a}),retryTxAction:async({onClose:a,txKey:n,executeTxAction:c,tx:r})=>{if(a(n),!c){console.error("Retry failed: executeTxAction function is not provided.");return}await c({actionFunction:()=>r.actionFunction({config:e,...r.payload}),params:r,defaultTracker:TransactionTracker.Ethereum});}}}var A=new Map;async function lt(e){let t=await e.request({method:"relayer_getCapabilities",params:[]}),a={};for(let[n,c]of Object.entries(t))a[Number(n)]=c;return a}async function ut(e){let t=A.get(e);if(t)return t;let a=C({apiKey:e}),n=await lt(a);return A.set(e,n),n}async function nr(e,t){try{let a=await ut(t);return e in a}catch(a){return console.error("Failed to fetch Gelato relay capabilities:",a),A.delete(t),false}}
2
+ export{Le as GelatoStatusCode,ce as SafeTransactionServiceUrls,U as cancelTxAction,pe as checkAndInitializeTrackerInStore,nr as checkIsGelatoAvailable,de as checkTransactionsTracker,C as createGelatoClient,B as erc4337Fetcher,Bt as erc4337Tracker,L as erc4337TrackerForStore,I as evmTracker,S as evmTrackerForStore,qe as gelatoFetcher,aa as gelatoTracker,G as gelatoTrackerForStore,se as gnosisSafeLinksHelper,K as isRetryableReceiptError,tr as pulsarEvmAdapter,Xe as safeFetcher,oa as safeSdkOptions,ue as safeTrackerForStore,fe as selectEvmTxExplorerLink,Te as speedUpTxAction};
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@tuwaio/pulsar-evm",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
7
- "description": "Layer 4 (L4) of the TUWA Ecosystem. Low-level EVM state trackers and lifecycle indexers powered strictly by viem and wagmi primitives.",
7
+ "description": "L4 EVM package of Pulsar (TUWA): transaction adapter and trackers for standard transactions, ERC-4337 UserOperations, Safe multisig and Gelato relay, with speed-up and cancel actions, built on viem and @wagmi/core.",
8
8
  "main": "./dist/index.js",
9
9
  "module": "./dist/index.mjs",
10
10
  "types": "./dist/index.d.ts",
@@ -16,13 +16,18 @@
16
16
  "socket.json"
17
17
  ],
18
18
  "keywords": [
19
+ "tuwa",
20
+ "pulsar",
21
+ "transaction-tracking",
19
22
  "web3",
20
23
  "evm",
21
- "transaction",
22
- "tracking",
23
- "wagmi",
24
+ "erc-4337",
25
+ "account-abstraction",
26
+ "safe",
24
27
  "viem",
25
- "zustand"
28
+ "wagmi",
29
+ "typescript",
30
+ "headless"
26
31
  ],
27
32
  "repository": {
28
33
  "type": "git",
@@ -40,29 +45,27 @@
40
45
  }
41
46
  ],
42
47
  "peerDependencies": {
43
- "@tuwaio/pulsar-core": ">=0.7",
48
+ "@tuwaio/pulsar-core": ">=0.8",
44
49
  "@tuwaio/orbit-core": ">=0.3",
45
50
  "@tuwaio/orbit-evm": ">=0.3",
46
51
  "@wagmi/core": "3.x.x",
47
52
  "dayjs": "1.x.x",
48
- "immer": "11.x.x",
49
- "viem": "2.x.x",
50
- "zustand": "5.x.x"
53
+ "viem": "2.x.x"
51
54
  },
52
55
  "devDependencies": {
53
- "@tuwaio/pulsar-core": "^0.7.0",
54
- "@tuwaio/orbit-core": "^0.3.0",
55
- "@tuwaio/orbit-evm": "^0.3.0",
56
+ "@tuwaio/pulsar-core": "^0.8.1",
57
+ "@tuwaio/orbit-core": "^0.3.1",
58
+ "@tuwaio/orbit-evm": "^0.3.1",
56
59
  "@wagmi/core": "^3.6.5",
57
60
  "dayjs": "^1.11.23",
58
61
  "immer": "^11.1.18",
59
- "jsdom": "^30.0.1",
62
+ "jsdom": "^30.1.1",
60
63
  "tsup": "^8.5.1",
61
64
  "typescript": "6.0.3",
62
- "viem": "^2.56.3",
63
- "vitest": "^4.1.11",
65
+ "viem": "^2.56.9",
66
+ "vitest": "^5.0.2",
64
67
  "zustand": "^5.0.15",
65
- "dotenv": "^17.4.2"
68
+ "dotenv": "^18.0.4"
66
69
  },
67
70
  "scripts": {
68
71
  "start": "tsup src/index.ts --watch",