{"id":14958566,"url":"https://github.com/ethereum/esp-website","last_synced_at":"2025-04-06T07:12:49.912Z","repository":{"id":37842227,"uuid":"222621196","full_name":"ethereum/esp-website","owner":"ethereum","description":"Website for the Ethereum Foundation's Ecosystem Support Program (ESP):","archived":false,"fork":false,"pushed_at":"2025-03-03T15:17:32.000Z","size":65069,"stargazers_count":54,"open_issues_count":14,"forks_count":38,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-13T07:02:05.515Z","etag":null,"topics":["blockchain","ethereum","gatsby","react"],"latest_commit_sha":null,"homepage":"https://esp.ethereum.foundation/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ethereum.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-19T06:07:58.000Z","updated_at":"2025-03-10T15:43:42.000Z","dependencies_parsed_at":"2024-12-30T20:12:53.496Z","dependency_job_id":"009bbc4e-3c4f-4d6e-a4e0-98d261139b47","html_url":"https://github.com/ethereum/esp-website","commit_stats":{"total_commits":1211,"total_committers":19,"mean_commits":63.73684210526316,"dds":0.6614368290668868,"last_synced_commit":"70d60acd5d5e139738d4d6c2cf56496010e4f8a2"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethereum%2Fesp-website","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethereum%2Fesp-website/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethereum%2Fesp-website/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ethereum%2Fesp-website/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ethereum","download_url":"https://codeload.github.com/ethereum/esp-website/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247445671,"owners_count":20939958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","ethereum","gatsby","react"],"created_at":"2024-09-24T13:17:24.988Z","updated_at":"2025-04-06T07:12:49.888Z","avatar_url":"https://github.com/ethereum.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Netlify Status](https://api.netlify.com/api/v1/badges/dc4a526c-394c-4001-8452-b63ce3c1c77b/deploy-status)](https://app.netlify.com/sites/ecosystem-support/deploys)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/8097623/69177629-c137a400-0abc-11ea-9bcd-da3ba03d2688.png\" width=\"60%\" alt=\"Ethereum Ecosystem Support Program\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e\n  Ethereum Ecosystem Support Program\n\u003c/h1\u003e\n\nThe Ethereum Ecosystem Support Program exists to provide both financial and non-financial support to projects and entities within the greater Ethereum community, in order to accelerate the growth of the ecosystem. The Ecosystem Support Program is an expansion of the original Ethereum Grants Program which mainly focused on financial support. Our focus is on deploying our resources where they will have the biggest impact.\n\nThis repository holds the codebase to our website, [esp.ethereum.foundation](https://esp.ethereum.foundation)\n\n## Stack\n\nThe main stack used in the project includes:\n\n- [Next.js](https://nextjs.org/).\n- [TypeScript](https://www.typescriptlang.org/).\n- [ChakraUI](https://chakra-ui.com/) as component library.\n- [react-hook-form](https://react-hook-form.com/) to validate forms.\n- [Framer Motion](https://www.framer.com/motion/) to animate buttons.\n- [ESLint](https://eslint.org/) and [Prettier](https://prettier.io/) for linting and code formatting.\n\n## Local development\n\nThe project is bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app), with a custom scaffolding.\n\n### Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\nYou can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.\n\n[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.\n\nThe `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.\n\n### testing w/hCaptcha locally\n\nWe can use [hCaptcha testing keys](https://docs.hcaptcha.com/#test-key-set-publisher-account) (already defined on `.env.local.example`) to be able to test forms locally.\n\n## Project Structure\n\nThe following list describes the main elements of the project structure:\n\n- `public`: contains static assets like fonts and images.\n- `src`: contains the source code.\n  - `components`: React components.\n    - components with state are directly located inside `/components`.\n    - `forms`: components used in forms.\n      - `api.ts`: this file contains the api fetching logic details used when submitting the forms data.\n    - `layout`: components used to contain and apply different layouts to different pages.\n    - `UI`: stateless (functional) components.\n  - `hooks`: custom hooks.\n  - `middlewares`: custom middlewares (required for captcha input validation).\n  - `pages`: includes components that renders to pages and [NextJS API Routes](https://nextjs.org/docs/api-routes/introduction).\n  - `theme`: contains the [Chakra UI custom theme](https://chakra-ui.com/docs/styled-system/theming/customize-theme), organized in `foundations` and `components` for better scaling.\n  - `utils`\n  - `constants.ts`: this is the _global_ constants file (we have another one for specific _form constants_), containing URLs and lists of elements we use across the site.\n  - `global.css`: global stylesheet.\n  - `types.ts`: contains the custom defined TypeScript types and interfaces.\n\n## Salesforce Integration\n\nFor the custom integration with the Salesforce API, we rely on the [JSforce](https://jsforce.github.io/) library. Some operations are not documented and were the result of lots of googling, SO and [Github issues scanning](https://github.com/jsforce/jsforce/issues).\n\nThe Salesforce API field names (listed on `types.ts`) are defined in Salesforce for each corresponding object (Lead, Contract, etc).\n\n### Connected App\n\nTo enable a custom API integration with Salesforce, you need to create a [Connected App](https://help.salesforce.com/s/articleView?id=sf.connected_app_overview.htm\u0026type=5). You'll need an account with admin permissions. Go to `Setup \u003e App Manager \u003e New connected app` to create a new one.\n\n#### Configuration\n\nCheck that your Connected App is configured with the following parameters\n\n- **Callback URL:** https://salesforce.com\n- **Selected OAuth Scopes:**\n  - Manage user data via APIs (api)\n  - Manage user data via Web browsers (web)\n  - Perform requests at any time (refresh_token, offline_access)\n- **Connected App policies:**\n  - IP Relaxation: Relax IP Restrictions\n  - Permitted Users: All users may self-authorized\n  - Refresh Token Policy: Refresh token is valid until revoked\n\n### Common issues\n\nSome common issues regarding Salesforce data types\n\n- `Picklist`: if you get the error\n\n```\nError 'bad value for restricted picklist field' appears when a record is created\n```\n\nwhen creating a new record, try disabling the _'Restrict picklist to the values defined in the value set'_ option for the corresponding field.\n\n- `Checkbox`: besides how you're handling this input on the UI (e.g.: a radio button), Salesforce expects the value to be a boolean (`true`, `false`), so remember to convert the string before submitting the data.\n\n#### When adding new Grants\n\nCheck that the hardwired string value of `Proactive_Community_Grants_Round__c` is defined on Salesforce, otherwise submission will fail.\n\n## Grantees List data source\n\nThe data published in the [Latest Grantees](https://esp.ethereum.foundation/about/who-we-support#latest-grantees) list is being pulled from a Google Spreadsheet maintained by the ESP Team. This document uses Markdown syntax as it's also being used as source for other pages.\n\nTo accomplish that, we [publish the content of the document as CSV](https://support.google.com/a/users/answer/9308870?hl=en) and then render it in the `LatestGranteesList` component. This includes some parsing work, from CSV to JSON and then rendering the Markdown. This process happens server-side only, [on build time](https://nextjs.org/docs/basic-features/data-fetching/get-static-props), so the [resulting page](https://esp.ethereum.foundation/about/who-we-support) is completely static.\n\n## Tutorials\n\n### Learning NextJS\n\nTo learn more about Next.js, take a look at the following resources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n\n### Adding ChakraUI to a NextJS project\n\n[This](https://chakra-ui.com/guides/getting-started/nextjs-guide) is a very clear and step-by-step guide on it.\n\n### Learning ChakraUI\n\nWe recommend checking the [official docs](https://chakra-ui.com/docs/getting-started).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fethereum%2Fesp-website","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fethereum%2Fesp-website","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fethereum%2Fesp-website/lists"}