require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/protocol.constants.cjs`),t=require(`../../types/cache.types.cjs`),n=require(`../../functions/utils/caseInsensitive.utils.cjs`),r=require(`../../API/API.cjs`),i=require(`../../functions/utils/erc20tokenFunctions.cjs`),a=require(`../../constants/events.constants.cjs`);require(`../../constants/index.cjs`);const o=require(`../../error-handling/logger.cjs`),s=require(`../../functions/utils/string.utils.cjs`),c=require(`./token-visibility-db.cjs`),l=require(`../../functions/utils/create-provider.cjs`);require(`../../functions/index.cjs`);let u=require(`async-mutex`),d=require(`ethers`),f=require(`idb-keyval`);var p=new class{fetchedTokens={};updateMutexes={};transferEventTopic=d.ethers.id(`Transfer(address,address,uint256)`);chunkSize=2e3;getMutex(e){return this.updateMutexes[e]||(this.updateMutexes[e]=new u.Mutex),this.updateMutexes[e]}withRegistryOverlay(e,t){let n=i.getERC20Token(e.erc20TokenAddress,t);return n?{...e,name:n.name,symbol:n.symbol,logoURI:n.logoURI,decimals:n.decimals}:e}async getPublicTokens(e,n){let r=s.getStateKey(n,e);return((await(0,f.get)(t.StorageKeys.EVENTS_PUBLIC_TOKENS))?.[r]||[]).map(t=>i.overlayTokenWithRegistryData(t,e))}getFetchedTokens(e,t){let n=s.getStateKey(t,e);return(this.fetchedTokens[n]||[]).map(t=>i.overlayTokenWithRegistryData(t,e))}async fetchAndUpdatePublicTokens(e,r){let i=s.getStateKey(e,r);await this.getMutex(i).runExclusive(async()=>{try{let a=(await this.getPublicTokens(r,e)).map(e=>e.erc20TokenAddress),{toEvents:o,fromEvents:s,latestBlock:l}=await this.getEvents(e,r),u=[...o,...s],{erc20Tokens:d}=await this.fetchPublicTokens(u,r,a),p=await c.tokenVisibilityStorage.hideSpamsAndFetchHiddenTokensAddresses(r,d),m=d.filter(e=>!n.lowerCaseIncludes(p,e.erc20TokenAddress));await(0,f.update)(t.StorageKeys.EVENTS_PUBLIC_TOKENS,(e={})=>{let t=e[i]||[],r=t.map(e=>e.erc20TokenAddress),a=m.filter(e=>!n.lowerCaseIncludes(r,e.erc20TokenAddress));t.push(...a);let c=this.updateTokenIds(s,o,t),l={...e,[i]:c};return this.fetchedTokens=l,l}),l&&await this.updateLastProcessedBlock(r,e,l)}catch(e){o.Logger.error(`public tokens db error`,e)}})}async getLastProcessedBlock(e,n){return(await(0,f.get)(t.StorageKeys.PUBLIC_TOKENS_LAST_PROCESSED_BLOCKS)||{})[s.getStateKey(n,e)]||a.EVENTS_INITIAL_BLOCKS[e]}async updateLastProcessedBlock(e,n,r){await(0,f.update)(t.StorageKeys.PUBLIC_TOKENS_LAST_PROCESSED_BLOCKS,(t={})=>{let i=s.getStateKey(n,e);return{...t,[i]:r}})}async getEvents(e,t){try{let n=l.createJsonRpcProvider(t),r=await this.getLastProcessedBlock(t,e)+1,i=await n.getBlockNumber(),a=d.ethers.zeroPadValue(e.toLowerCase(),32),o=[],s=[];for(let e=r;e<=i;e+=this.chunkSize){let t=Math.min(e+this.chunkSize-1,i),r={topics:[this.transferEventTopic,null,a],fromBlock:e,toBlock:t},c={topics:[this.transferEventTopic,a,null],fromBlock:e,toBlock:t},[l,u]=await Promise.all([n.getLogs(r),n.getLogs(c)]);o.push(...l),s.push(...u)}return{toEvents:o,fromEvents:s,latestBlock:i}}catch(n){return o.Logger.error(`Error fetching events:`,n,`chainId`,t,`walletAddress`,e),{toEvents:[],fromEvents:[],latestBlock:void 0}}}updateTokenIds(e,t,n){let r=new Map;return n.forEach(e=>{if(i.isNFTToken(e)&&e.tokenIds){let t=e.erc20TokenAddress.toLowerCase();r.set(t,[...e.tokenIds])}}),t.forEach(e=>{if(e.topics.length<=3)return;let t=e.address.toLowerCase(),n=BigInt(e.topics[3]).toString();r.has(t)||r.set(t,[]),r.get(t)?.push(n)}),e.forEach(e=>{if(e.topics.length<=3)return;let t=e.address.toLowerCase(),n=r.get(t);if(n?.length){let t=BigInt(e.topics[3]).toString(),r=n.indexOf(t);r!==-1&&n.splice(r,1)}}),n.forEach(e=>{if(i.isNFTToken(e)){let t=e.erc20TokenAddress.toLowerCase(),n=r.get(t);e.tokenIds=n?.length&&n.length>0?n:void 0}}),n}async fetchPublicTokens(t,i,a){try{let o=[e.zeroAddress,...new Set(t.map(e=>e.address))].filter(e=>e&&!n.lowerCaseIncludes(a,e));return o.length?{erc20Tokens:(await r.API.tokensInfoCall(i,o)).filter(e=>!!e)}:{erc20Tokens:[]}}catch(e){return o.Logger.error(`Error fetching public tokens:`,e),{erc20Tokens:[]}}}};exports.eventsPublicTokensDB=p;