Sharing Notes # POSSIBLE SOLUTION FOR REVIEW SYSTEM: ## Emit event on factory instead - Easy - Too much work to retrieve - Introduces dependecy on round contract to factory - Factory gets flooeded with all events from all rounds - fetch approved grants is a nightmare ## Fire an event for each approval / rejection Reason to not do this: Expensive for operator Cost: k + unindexedBytes * a + indexedTopics * b k = 375 a = 8 b = 375 ``` contract Round{ questionaireSchemaMetaPtr; function applyToRound(projectID, answerToQuestionareHash) { // emit APPLY with ( // msg.sender, // projectID`, // answerToQuestionareHash // ) } // To be invoked only by ROUND_OPERATOR function approveProjects([projectId]) { for (...) { // emit APPROVED } } function rejectProjects([grantId]) { for (...) { // emits REJECTED } } } ``` ### How would it work ? **STEP 1:** Create entity by looking at Approval Event ``` { projectID : 123 answerProtcol: 1 answerMetaPtr: "XYZ..." status: pending } ``` **STEP 2-a:** WHEN GRAPH SEES APPROVE EVENT for project 123 - load object 123 - set status approved **STEP 2-b:** WHEN GRAPH SEES REJECT for project 123 - load object 123 - set status reject - feedbackMetaPtr // NOT REQUEST ## Can subgraph fetch Data from IPFS ``` contract Round { // [{ question: "your name? ", type: "text" }] questionaireSchemaMetaPtr // IPFS hash of => [ // "projectId": { // "status": "approved/deny", // "reason": "..." // } // ] /// THIS IS MEANT IDEALLY TO SERVER AS READ FOR SUBGRAPH grantsMetaPtr function applyToRound(projectID, answerToQuestionareHash) { // emit event APPLY_TO_ROUND with (msg.sender, projectID`, answerToQuestionareHash) // used to build initial index on subgraph } // invoked by round operator function reviewProjects(updatedIPFS) { // update grantsMetaPtr with new hash // fire event UPDATED_GRANT_METAPTR // will be consumed by subgraph which in turn will fetch grantsMetaPtr -> and update entity state } } ```