diff --git a/package-lock.json b/package-lock.json index ba2bd04c..48410014 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,9 @@ "i18next": "^17.0.12", "i18next-browser-languagedetector": "^3.0.3", "i18next-xhr-backend": "^3.1.2", - "react": "^16.8.6", + "react": "^17.0.2", "react-collapsible": "^2.6.0", - "react-dom": "^16.8.6", + "react-dom": "^17.0.2", "react-enroute": "^3.0.2", "react-i18next": "^10.12.2", "react-render-html": "^0.6.0", @@ -17673,14 +17673,12 @@ } }, "node_modules/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "object-assign": "^4.1.1" }, "engines": { "node": ">=0.10.0" @@ -18019,14 +18017,16 @@ } }, "node_modules/react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" } }, "node_modules/react-enroute": { @@ -19419,9 +19419,9 @@ } }, "node_modules/scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -37217,14 +37217,12 @@ } }, "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "object-assign": "^4.1.1" } }, "react-app-polyfill": { @@ -37475,14 +37473,13 @@ } }, "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "scheduler": "^0.20.2" } }, "react-enroute": { @@ -38604,9 +38601,9 @@ } }, "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" diff --git a/package.json b/package.json index 38670b7c..c1b7cef6 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "i18next": "^17.0.12", "i18next-browser-languagedetector": "^3.0.3", "i18next-xhr-backend": "^3.1.2", - "react": "^16.8.6", + "react": "^17.0.2", "react-collapsible": "^2.6.0", - "react-dom": "^16.8.6", + "react-dom": "^17.0.2", "react-enroute": "^3.0.2", "react-i18next": "^10.12.2", "react-render-html": "^0.6.0", diff --git a/public/img/bounty_chart.png b/public/img/bounty_chart.png new file mode 100644 index 00000000..516f774d Binary files /dev/null and b/public/img/bounty_chart.png differ diff --git a/public/img/bounty_chart.svg b/public/img/bounty_chart.svg new file mode 100644 index 00000000..d15219b7 --- /dev/null +++ b/public/img/bounty_chart.svg @@ -0,0 +1 @@ +bounty_chart \ No newline at end of file diff --git a/public/img/icons/bounty_green.png b/public/img/icons/bounty_green.png new file mode 100644 index 00000000..b780f99d Binary files /dev/null and b/public/img/icons/bounty_green.png differ diff --git a/public/img/icons/bounty_white.png b/public/img/icons/bounty_white.png new file mode 100644 index 00000000..6410bff3 Binary files /dev/null and b/public/img/icons/bounty_white.png differ diff --git a/public/locales/en-US/translation.json b/public/locales/en-US/translation.json index 6a5c9da6..fde8a16f 100644 --- a/public/locales/en-US/translation.json +++ b/public/locales/en-US/translation.json @@ -37,6 +37,7 @@ "projects": "Projects", "blog": "Blog", "peercoinFoundation": "Peercoin Foundation", + "bounty": "Bug Bounty", "contactUs": "Contact Us", "contribute": "Contribute" }, @@ -133,6 +134,42 @@ "contactUsTitle": "Contact Us", "addressCountry": "The Netherlands" }, + "bountyPage": { + "bountyTitle": "Peercoin Bug Bounty Program", + "bountyDescription": "How You Can Help Make Peercoin Better", + "bountyDisclosureHeader": "Responsible Disclosure Policy", + "bountyDisclosureIntro": "Participants must comply with the following rules to qualify for a bug bounty reward.", + "bountyDisclosurePoint1": "Participants must give a reasonable amount of time for the Peercoin Team to investigate the reported issue before sharing or making the bug public knowledge.", + "bountyDisclosurePoint2": "Participants must not exploit a bug they discover for any reason.", + + "bountySubmissionHeader": "Bug Submission Rules", + "bountySubmissionPoint1": "Adhere to the Responsible Disclosure Policy (see above).", + "bountySubmissionPoint2": "If a participant has found a bug, please write a detailed report of the bug/vulnerability and email it to the foundation email provided below. The email should include both [Bug Bounty], followed by a short description of the bug/vulnerability in the title. Please allow three business days for a response.", + "bountySubmissionPoint3": "Known or previously submitted bugs are not eligible for rewards.", + "bountySubmissionPoint4": "Members of the Peercoin Foundation are not eligible to receive bug bounty rewards.", + + "bountyGuidelinesHeader": "Our Guidelines", + "bountyGuidelinesIntro1": "The Peercoin Team recognizes and appreciates the researchers that help maintain the integrity of the project.", + "bountyGuidelinesPoint1": "The Peercoin Team will investigate and respond to all valid and clearly submitted bug reports.", + "bountyGuidelinesPoint2": "Payout amounts are determined by a number of factors, including scope, impact, likelihood, etc… Ultimately it will be determined according to the Peercoin Team’s judgement, following the OWASP risk rating model.", + + "bountyGuidelinesIntro2": "Reward sizes are estimated by the guidelines, but the Peercoin Team will have the sole and final discretion for payouts.", + "bountyGuidelinesPoint3": "Critical: Money amount here", + "bountyGuidelinesPoint4": "High: Money amount here", + "bountyGuidelinesPoint5": "Medium: Money amount here", + "bountyGuidelinesPoint6": "Low: Money amount here", + "bountyGuidelinesPoint7": "Minimum Payout: Money amount here", + + "bountyGuidelinesIntro3": "In addition, other variables may be considered:", + "bountyGuidelinesPoint8": "Description: Well-written, clear submissions will always have a higher reward.", + "bountyGuidelinesPoint9": "Reproducibility: The easier a solution can be implemented, the higher the reward", + + "bountyScopeHeader": "Out of Scope", + "bountyScopeIntro": "The Bug Bounty program only pertains to core protocol related issues. Website or social engineering related vulnerabilities are not eligible for a reward at this time.", + "bountyContactHeader": "Contact Us", + "bountyContactIntro": "To submit a bug report, contact the foundation below", + "bountyContactEmail": "foundation@peercoin.net" + }, "contributePage": { "contributeTitle": "Contribute ", "contributeDescription": "How You Can Help Make Peercoin Better", diff --git a/src/App.jsx b/src/App.jsx index b6f41240..937cf9bb 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -5,6 +5,7 @@ import Index from "./pages/Index/Index.jsx"; import Resources from "./pages/Resources/Resources.jsx"; import Projects from "./pages/Projects/Projects"; import Foundation from "./pages/Foundation/Foundation"; +import Bounty from "./pages/Bounty/Bounty"; import Contact from "./pages/Contact/Contact"; import Wallet from "./pages/Wallet/Wallet"; import ScrollTop from "./components/ScrollTop/ScrollTop"; @@ -28,6 +29,7 @@ function App() { + diff --git a/src/components/Menu/Menu.jsx b/src/components/Menu/Menu.jsx index 33a58dea..bfd3e455 100644 --- a/src/components/Menu/Menu.jsx +++ b/src/components/Menu/Menu.jsx @@ -153,6 +153,12 @@ function Menu() { {t("menuComponent.links.project.peercoinFoundation")} +
  • + + + {t("menuComponent.links.project.bounty")} + +
  • diff --git a/src/pages/Bounty/Bounty.jsx b/src/pages/Bounty/Bounty.jsx new file mode 100644 index 00000000..5a9e0dd4 --- /dev/null +++ b/src/pages/Bounty/Bounty.jsx @@ -0,0 +1,105 @@ +import React, { Suspense } from "react"; +import { useTranslation, Trans } from "react-i18next"; +import renderHTML from "react-render-html"; +import "./Bounty.scss"; +import Menu from "../../components/Menu/Menu"; +import Address from "../../components/Address/Address"; +import Footer from "../../components/Footer/Footer"; +import Loader from "../../components/Loader/Loader"; + +function Foundation() { + const { t } = useTranslation(); + + return ( + <> + +
    +

    {t('bountyPage.bountyTitle')}

    +

    + {t('bountyPage.bountyDescription')} +

    +
    + +
    +
    +
    +
    +

    + {t("bountyPage.bountyDisclosureHeader")} +

    +

    {t("bountyPage.bountyDisclosureIntro")}

    +
      +
    • {t("bountyPage.bountyDisclosurePoint1")}
    • +
    • {t("bountyPage.bountyDisclosurePoint2")}
    • +
    + +

    + {t("bountyPage.bountySubmissionHeader")} +

    +
      +
    • {t("bountyPage.bountySubmissionPoint1")}
    • +
    • {t("bountyPage.bountySubmissionPoint2")}
    • +
    • {t("bountyPage.bountySubmissionPoint3")}
    • +
    • {t("bountyPage.bountySubmissionPoint4")}
    • +
    + +

    + {t("bountyPage.bountyGuidelinesHeader")} +

    +

    {t("bountyPage.bountyGuidelinesIntro1")}

    +
      +
    • {t("bountyPage.bountyGuidelinesPoint1")}
    • +
    • {t("bountyPage.bountyGuidelinesPoint2")}
    • +
    + +
    + Peercoin Bounty Chart +
    + +

    {t("bountyPage.bountyGuidelinesIntro2")}

    +
      +
    • {t("bountyPage.bountyGuidelinesPoint3")}
    • +
    • {t("bountyPage.bountyGuidelinesPoint4")}
    • +
    • {t("bountyPage.bountyGuidelinesPoint5")}
    • +
    • {t("bountyPage.bountyGuidelinesPoint6")}
    • +
    • {t("bountyPage.bountyGuidelinesPoint7")}
    • +
    + +

    {t("bountyPage.bountyGuidelinesIntro3")}

    +
      +
    • {t("bountyPage.bountyGuidelinesPoint8")}
    • +
    • {t("bountyPage.bountyGuidelinesPoint9")}
    • +
    + +

    + {t("bountyPage.bountyScopeHeader")} +

    +

    {t("bountyPage.bountyScopeIntro")}

    + +

    + {t("bountyPage.bountyContactHeader")} +

    +

    {t("bountyPage.bountyContactIntro")}

    +

    {renderHTML(t("bountyPage.bountyContactEmail"))}

    +
    +
    +
    +
    +