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 @@
+
\ 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() {
+ {t('bountyPage.bountyDescription')} +
+{t("bountyPage.bountyDisclosureIntro")}
+{t("bountyPage.bountyGuidelinesIntro1")}
+{t("bountyPage.bountyGuidelinesIntro2")}
+{t("bountyPage.bountyGuidelinesIntro3")}
+{t("bountyPage.bountyScopeIntro")}
+ +{t("bountyPage.bountyContactIntro")}
+{renderHTML(t("bountyPage.bountyContactEmail"))}
+