@@ -97,6 +97,9 @@ async function getVotingData(initialProposals: InitialProposal[]) {
9797 ] as any ,
9898 rpcUrl : getRPCUrl (
9999 appConfig . votingMachineChainIds [ 0 ] as SupportedChainIds ,
100+ {
101+ alchemyKey : process . env . ALCHEMY_API_KEY ,
102+ } ,
100103 ) ,
101104 } ) ,
102105 } ) ,
@@ -109,7 +112,9 @@ async function getVotingData(initialProposals: InitialProposal[]) {
109112 abi : IVotingMachineDataHelper_ABI ,
110113 client : createViemClient ( {
111114 chain : ChainList [ chainId as SupportedChainIds ] as any ,
112- rpcUrl : getRPCUrl ( chainId as SupportedChainIds ) ,
115+ rpcUrl : getRPCUrl ( chainId as SupportedChainIds , {
116+ alchemyKey : process . env . ALCHEMY_API_KEY ,
117+ } ) ,
113118 } ) ,
114119 } ) ;
115120 } ) ;
@@ -449,7 +454,9 @@ async function parseProposalEvents(
449454 chain : ChainList [
450455 appConfig . govCoreChainId as SupportedChainIds
451456 ] as any ,
452- rpcUrl : getRPCUrl ( appConfig . govCoreChainId as SupportedChainIds ) ,
457+ rpcUrl : getRPCUrl ( appConfig . govCoreChainId as SupportedChainIds , {
458+ alchemyKey : process . env . ALCHEMY_API_KEY ,
459+ } ) ,
453460 } ) ,
454461 {
455462 blockHash : governanceEvents . find (
@@ -628,7 +635,9 @@ async function parseCache() {
628635 appConfig . govCoreConfig . dataHelperContractAddress ,
629636 client : createViemClient ( {
630637 chain : ChainList [ appConfig . govCoreChainId as SupportedChainIds ] ,
631- rpcUrl : getRPCUrl ( appConfig . govCoreChainId as SupportedChainIds ) ,
638+ rpcUrl : getRPCUrl ( appConfig . govCoreChainId as SupportedChainIds , {
639+ alchemyKey : process . env . ALCHEMY_API_KEY ,
640+ } ) ,
632641 } ) ,
633642 } ) ;
634643
@@ -639,7 +648,9 @@ async function parseCache() {
639648 abi : IVotingPortal_ABI ,
640649 client : createViemClient ( {
641650 chain : ChainList [ appConfig . govCoreChainId as SupportedChainIds ] ,
642- rpcUrl : getRPCUrl ( appConfig . govCoreChainId as SupportedChainIds ) ,
651+ rpcUrl : getRPCUrl ( appConfig . govCoreChainId as SupportedChainIds , {
652+ alchemyKey : process . env . ALCHEMY_API_KEY ,
653+ } ) ,
643654 } ) ,
644655 address : proposal [ 1 ] . votingPortal ,
645656 } ) ;
@@ -679,127 +690,135 @@ async function parseCache() {
679690 } ;
680691 } ) ;
681692
682- // start parsing
683- await Promise . allSettled (
684- proposalsData . map ( async ( proposal ) => {
685- const proposalIpfsData = ipfsCache [ proposal . ipfsHash ] ;
686-
687- const path = `${ proposal . votingChainId } /events` ;
688- const votingMachineAddress = getVotingMachineAddress (
689- proposal . votingChainId ,
690- proposal . id ,
691- ) ;
692- const votesCache =
693- readJSONCache < Awaited < ReturnType < typeof getVotingMachineEvents > > > (
694- path ,
695- votingMachineAddress ,
696- ) || [ ] ;
697-
698- // format VoteEmitted events to UI data format
699- const proposalVoters : VotersData [ ] = votesCache
700- . filter (
701- ( data ) =>
702- data . eventName === 'VoteEmitted' &&
703- Number ( data . args . proposalId ) === proposal . id ,
704- )
705- . sort ( ( a , b ) => Number ( b . blockNumber ) - Number ( a . blockNumber ) )
706- . map ( ( event ) => ( {
707- proposalId : Number ( event . args . proposalId ) ,
708- address : (
709- ( event . eventName === 'VoteEmitted' && event . args . voter ) ||
710- ''
711- ) . toString ( ) as Hex ,
712- support :
713- ( event . eventName === 'VoteEmitted' && event . args . support ) || false ,
714- votingPower : normalizeBN (
715- (
716- ( event . eventName === 'VoteEmitted' && event . args . votingPower ) ||
693+ // start parsing in batches to reduce peak memory usage
694+ const batchSize = 20 ;
695+ for ( let i = 0 ; i < proposalsData . length ; i += batchSize ) {
696+ const batch = proposalsData . slice ( i , i + batchSize ) ;
697+ await Promise . allSettled (
698+ batch . map ( async ( proposal ) => {
699+ const proposalIpfsData = ipfsCache [ proposal . ipfsHash ] ;
700+
701+ const path = `${ proposal . votingChainId } /events` ;
702+ const votingMachineAddress = getVotingMachineAddress (
703+ proposal . votingChainId ,
704+ proposal . id ,
705+ ) ;
706+ const votesCache =
707+ readJSONCache < Awaited < ReturnType < typeof getVotingMachineEvents > > > (
708+ path ,
709+ votingMachineAddress ,
710+ ) || [ ] ;
711+
712+ // format VoteEmitted events to UI data format
713+ const proposalVoters : VotersData [ ] = votesCache
714+ . filter (
715+ ( data ) =>
716+ data . eventName === 'VoteEmitted' &&
717+ Number ( data . args . proposalId ) === proposal . id ,
718+ )
719+ . sort ( ( a , b ) => Number ( b . blockNumber ) - Number ( a . blockNumber ) )
720+ . map ( ( event ) => ( {
721+ proposalId : Number ( event . args . proposalId ) ,
722+ address : (
723+ ( event . eventName === 'VoteEmitted' && event . args . voter ) ||
717724 ''
718- ) . toString ( ) ,
719- 18 ,
720- ) . toNumber ( ) ,
721- transactionHash : event . transactionHash ,
722- blockNumber : Number ( event . blockNumber ) ,
723- chainId : proposal . votingChainId ,
724- } ) ) ;
725-
726- // get ens name for voters
727- const proposalVotersWithEnsName = await Promise . all (
728- proposalVoters . map ( async ( vote ) => {
729- try {
730- const name = await getEnsName (
731- createViemClient ( {
732- chain : ChainList [ ChainId . mainnet ] ,
733- rpcUrl : getRPCUrl ( ChainId . mainnet ) ,
734- } ) ,
735- {
736- address : vote . address ,
737- } ,
738- ) ;
739-
740- return {
741- ...vote ,
742- ensName : name ? name : undefined ,
743- } ;
744- } catch {
745- return {
746- ...vote ,
747- ensName : undefined ,
748- } ;
749- }
750- } ) ,
751- ) ;
725+ ) . toString ( ) as Hex ,
726+ support :
727+ ( event . eventName === 'VoteEmitted' && event . args . support ) ||
728+ false ,
729+ votingPower : normalizeBN (
730+ (
731+ ( event . eventName === 'VoteEmitted' && event . args . votingPower ) ||
732+ ''
733+ ) . toString ( ) ,
734+ 18 ,
735+ ) . toNumber ( ) ,
736+ transactionHash : event . transactionHash ,
737+ blockNumber : Number ( event . blockNumber ) ,
738+ chainId : proposal . votingChainId ,
739+ } ) ) ;
740+
741+ // get ens name for voters
742+ const proposalVotersWithEnsName = await Promise . all (
743+ proposalVoters . map ( async ( vote ) => {
744+ try {
745+ const name = await getEnsName (
746+ createViemClient ( {
747+ chain : ChainList [ ChainId . mainnet ] ,
748+ rpcUrl : getRPCUrl ( ChainId . mainnet , {
749+ alchemyKey : process . env . ALCHEMY_API_KEY ,
750+ } ) ,
751+ } ) ,
752+ {
753+ address : vote . address ,
754+ } ,
755+ ) ;
756+
757+ return {
758+ ...vote ,
759+ ensName : name ? name : undefined ,
760+ } ;
761+ } catch {
762+ return {
763+ ...vote ,
764+ ensName : undefined ,
765+ } ;
766+ }
767+ } ) ,
768+ ) ;
752769
753- // get payloads data for proposal
754- const { proposalPayloadsData } = getProposalPayloads ( proposal ) ;
770+ // get payloads data for proposal
771+ const { proposalPayloadsData } = getProposalPayloads ( proposal ) ;
755772
756- const dataToWrite = {
757- payloads : proposalPayloadsData ,
758- ipfs : proposalIpfsData ,
759- proposal : proposal ,
760- } ;
773+ const dataToWrite = {
774+ payloads : proposalPayloadsData ,
775+ ipfs : proposalIpfsData ,
776+ proposal : proposal ,
777+ } ;
761778
762- const proposalCache =
763- readJSONCache < {
764- payloads : Payload [ ] ;
765- ipfs : ProposalMetadata ;
766- proposal : BasicProposal ;
767- } > ( `${ initDirName } /proposals` , `proposal_${ proposal . id } ` ) || undefined ;
768- if (
769- ! proposalCache ||
770- ! proposalCache ?. proposal . isFinished ||
771- Number ( proposalCache . proposal . cancellationFee ) > 0
772- ) {
773- writeJSONCache (
774- `${ initDirName } /proposals` ,
775- `proposal_${ proposal . id } ` ,
776- dataToWrite ,
777- ) ;
778- console . log ( `Proposal ${ proposal . id } data cached.` ) ;
779- }
779+ const proposalCache =
780+ readJSONCache < {
781+ payloads : Payload [ ] ;
782+ ipfs : ProposalMetadata ;
783+ proposal : BasicProposal ;
784+ } > ( `${ initDirName } /proposals` , `proposal_${ proposal . id } ` ) ||
785+ undefined ;
786+ if (
787+ ! proposalCache ||
788+ ! proposalCache ?. proposal . isFinished ||
789+ Number ( proposalCache . proposal . cancellationFee ) > 0
790+ ) {
791+ writeJSONCache (
792+ `${ initDirName } /proposals` ,
793+ `proposal_${ proposal . id } ` ,
794+ dataToWrite ,
795+ ) ;
796+ console . log ( `Proposal ${ proposal . id } data cached.` ) ;
797+ }
780798
781- const proposalVotersCache =
782- readJSONCache < {
783- votes : VotersData [ ] ;
784- } > ( `${ initDirName } /votes` , `vote_for_proposal_${ proposal . id } ` ) ||
785- undefined ;
786- if (
787- ! proposalVotersCache ||
788- ! isProposalFinal ( proposalCache ? proposalCache . proposal . state : 0 )
789- ) {
790- writeJSONCache (
791- `${ initDirName } /votes` ,
792- `vote_for_proposal_${ proposal . id } ` ,
793- {
794- votes : proposalVotersWithEnsName ,
795- } ,
796- ) ;
797- console . log ( `Proposal ${ proposal . id } voters data cached.` ) ;
798- }
799+ const proposalVotersCache =
800+ readJSONCache < {
801+ votes : VotersData [ ] ;
802+ } > ( `${ initDirName } /votes` , `vote_for_proposal_${ proposal . id } ` ) ||
803+ undefined ;
804+ if (
805+ ! proposalVotersCache ||
806+ ! isProposalFinal ( proposalCache ? proposalCache . proposal . state : 0 )
807+ ) {
808+ writeJSONCache (
809+ `${ initDirName } /votes` ,
810+ `vote_for_proposal_${ proposal . id } ` ,
811+ {
812+ votes : proposalVotersWithEnsName ,
813+ } ,
814+ ) ;
815+ console . log ( `Proposal ${ proposal . id } voters data cached.` ) ;
816+ }
799817
800- await parseProposalEvents ( proposal , configs , contractsConstants ) ;
801- } ) ,
802- ) ;
818+ await parseProposalEvents ( proposal , configs , contractsConstants ) ;
819+ } ) ,
820+ ) ;
821+ }
803822
804823 const proposalIds = proposalsData
805824 . filter ( ( proposal ) => proposal . isFinished )
0 commit comments