diff --git a/.github/scripts/getResourcesOg.js b/.github/scripts/getResourcesOg.js
index 3471b209..3b541810 100644
--- a/.github/scripts/getResourcesOg.js
+++ b/.github/scripts/getResourcesOg.js
@@ -1,6 +1,5 @@
const ogs = require('open-graph-scraper')
const fs = require('fs')
-const path = require('path')
const resourcesPath = './components/ResourceHub/company-resources.json'
const communityResourcesPath =
@@ -19,37 +18,37 @@ const updateResourceOg = async () => {
)
const updatedResources = await Promise.all(
- resources
- .filter(r => r.type !== 'video')
- .map(async resource => {
- const og = await getResourceOg(resource.url)
- return {
- ...resource,
- og: {
- title: og.ogTitle,
- description: og.ogDescription,
- image: og.ogImage[0]?.url
- }
- }
- })
+ resources.map(async resource => {
+ const og = await getResourceOg(resource.url)
+ const description = resource.description ?? og.ogDescription
+ return {
+ name: resource.name ?? og.ogTitle,
+ url: resource.url,
+ type: resource.type,
+ date: resource.date,
+ description: description.length > 197 ? description.slice(0, 197) + '...' : description,
+ tags: resource.tags,
+ image: og.ogImage[0]?.url
+ }
+ })
)
const updatedCommunityResources = await Promise.all(
- communityResources
- .filter(r => r.type !== 'video')
- .map(async resource => {
- const og = await getResourceOg(resource.url)
- return {
- ...resource,
- og: {
- title: og.ogTitle,
- description: og.ogDescription,
- ...(!(parseInt(og.ogImage[0].height) < 60) && {
- image: og.ogImage[0].url
- })
- }
- }
- })
+ communityResources.map(async resource => {
+ const og = await getResourceOg(resource.url)
+ const description = resource.description ?? og.ogDescription
+ return {
+ name: resource.name ?? og.ogTitle,
+ url: resource.url,
+ type: resource.type,
+ date: resource.date,
+ description: description.length > 197 ? description.slice(0, 197) + '...' : description,
+ tags: resource.tags,
+ ...(!(parseInt(og.ogImage[0].height) < 60) && {
+ image: og.ogImage[0].url
+ })
+ }
+ })
)
fs.writeFileSync(resourcesPath, JSON.stringify(updatedResources, null, 2))
diff --git a/.github/scripts/validateResources.js b/.github/scripts/validateResources.js
new file mode 100644
index 00000000..b9ee9000
--- /dev/null
+++ b/.github/scripts/validateResources.js
@@ -0,0 +1,58 @@
+const fs = require('fs')
+
+const resourcesPath = './components/ResourceHub/company-resources.json'
+const communityResourcesPath =
+ './components/ResourceHub/community-resources.json'
+
+const validateResource = (resource, index, resources) => {
+ if (resources.findIndex(r => r.url === resource.url) !== index) {
+ console.log(`Duplicate resource`)
+ return false
+ }
+ if (!resource.name) {
+ console.log(`Resource name is missing`)
+ return false
+ }
+ if (!resource.type) {
+ console.log(`Resource type is missing`)
+ return false
+ }
+ if (!resource.date) {
+ console.log(`Resource date is missing`)
+ return false
+ }
+ if (!resource.description) {
+ console.log(`Resource description is missing`)
+ return false
+ }
+ if (resource.description.length > 200) {
+ console.log(`Resource description is too long`)
+ return false
+ }
+ if (!resource.tags || !resource.tags.length) {
+ console.log(errorMessage + `Resource tags are missing`)
+ return false
+ }
+ if (
+ resource.url.includes('youtube') &&
+ (!resource.url.startsWith('https://www.youtube.com/watch?v=') ||
+ resource.url.length !== 43)
+ ) {
+ console.log(`Invalid YouTube URL`)
+ return false
+ }
+ return true
+}
+
+const validateResources = () => {
+ const resources = [
+ ...JSON.parse(fs.readFileSync(resourcesPath, 'utf8')),
+ ...JSON.parse(fs.readFileSync(communityResourcesPath, 'utf8'))
+ ]
+
+ if (resources.map(validateResource).some(valid => !valid)) {
+ process.exit(1)
+ }
+}
+
+validateResources()
diff --git a/.github/workflows/generate-supported-networks.yml b/.github/workflows/generate-supported-networks.yml
index d4fcb9a8..94c4c905 100644
--- a/.github/workflows/generate-supported-networks.yml
+++ b/.github/workflows/generate-supported-networks.yml
@@ -10,10 +10,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Use Node.js 20.x
- uses: actions/setup-node@v2
+ uses: actions/setup-node@v4
with:
node-version: '20.x'
- - uses: pnpm/action-setup@v2
+ - uses: pnpm/action-setup@v3
with:
version: 8
- name: Install dependencies
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0adb87db..4b5a741c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -8,6 +8,23 @@ We use the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide
Please open an [issue](https://github.com/safe-global/safe-docs/issues/new?assignees=&labels=resource-hub&projects=&template=resource-hub-submission.yml&title=%5BResource+Hub%5D+) to submit a resource to our Resource Hub.
+### Adding Resources to Resource Hub
+
+[For the Safe team] To add a new resource to the Resource Hub, follow these steps:
+- Add the new entry (`type`, `url`, `tags`, and `date`) to the [community-resources.json](./components/ResourceHub/community-resources.json) or [company-resources.json](./components/ResourceHub/company-resources.json) file.
+ ```
+ {
+ "url": "https://example.com",
+ "type": "Blog Post",
+ "date": "2023-10-09",
+ "tags": [
+ "Tutorial"
+ ]
+ }
+ ```
+- Run `pnpm get-resources-og` to fetch open graph metadata for the new resource automatically.
+- Copy edit the automatically generated copy for `name` and `description`.
+
## Using Vale
Install the [Vale CLI](https://vale.sh/docs/vale-cli/installation/) and run the following command:
diff --git a/components/ResourceHub/Card.tsx b/components/ResourceHub/Card.tsx
index af6e986c..864eb615 100644
--- a/components/ResourceHub/Card.tsx
+++ b/components/ResourceHub/Card.tsx
@@ -46,7 +46,7 @@ export const ProjectCard = (resource: KnowledgeResource): JSX.Element => {
{resource.type === 'Video' ? (
- ) : resource?.og?.image == null ? (
+ ) : resource?.image == null ? (
resource.type === 'Blog Post' ? (
) : (
@@ -54,7 +54,7 @@ export const ProjectCard = (resource: KnowledgeResource): JSX.Element => {
)
) : (
-
+
)}
@@ -80,7 +80,7 @@ export const ProjectCard = (resource: KnowledgeResource): JSX.Element => {
color='text.secondary'
className={css.description}
>
- {resource.abstract}
+ {resource.description}
>
)}
diff --git a/components/ResourceHub/Resources.tsx b/components/ResourceHub/Resources.tsx
index be4c0e1d..0c7b9148 100644
--- a/components/ResourceHub/Resources.tsx
+++ b/components/ResourceHub/Resources.tsx
@@ -47,13 +47,9 @@ export interface KnowledgeResource {
type: string
date: string
origin: string
- abstract?: string
+ description: string
tags: string[]
- og?: {
- title?: string
- description?: string
- image?: string
- }
+ image?: string
}
const getUniqueStrings = (entries: string[]): string[] => {
diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json
index 1ff6bd66..57340749 100644
--- a/components/ResourceHub/community-resources.json
+++ b/components/ResourceHub/community-resources.json
@@ -4,307 +4,243 @@
"url": "https://www.youtube.com/watch?v=zn6omKzm3BI",
"type": "Video",
"date": "2022-11-30",
+ "description": "Learn how easy deploying smart contracts from a Safe multi-sig wallet can be with this easy-to-follow tutorial! thirdweb will walk you through the ste...",
"tags": [
"Introduction",
"Safe Smart Account"
],
- "og": {
- "title": "How To Deploy a Smart Contract From a Web3 Multi-Sig Wallet",
- "description": "Learn how easy deploying smart contracts from a Gnosis Safe multi-sig wallet can be with this easy-to-follow tutorial! thirdweb will walk you through the ste...",
- "image": "https://i.ytimg.com/vi/zn6omKzm3BI/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/zn6omKzm3BI/maxresdefault.jpg"
},
{
- "name": "Safe transaction service installation guide",
+ "name": "Safe Transaction Service installation guide",
"url": "https://www.youtube.com/watch?v=FUytj_xStDI",
"type": "Video",
"date": "2023-04-16",
+ "description": "Installation guide for the Safe Transaction Service.",
"tags": [
"Introduction",
"Safe Transaction Service"
],
- "og": {
- "title": "Safe transaction service installation guide",
- "description": "Safe muitisig wallets: * Main page: https://safe.global* Available services: https://docs.safe.global/learn/safe-core/safe-core-api/available-services* S...",
- "image": "https://i.ytimg.com/vi/FUytj_xStDI/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/FUytj_xStDI/maxresdefault.jpg"
},
{
"name": "How do you add a custom network to the Safe UI?",
"url": "https://www.youtube.com/watch?v=E3v6p87bsYg",
"type": "Video",
"date": "2022-11-21",
+ "description": "How do you add a custom network to the Safe UI? The Content (except music & images) is licensed unde...",
"tags": [
"Introduction",
"Safe Wallet"
],
- "og": {
- "title": "How do you add a custom network to the Gnosis Safe UI?",
- "description": "How do you add a custom network to the Gnosis Safe UI?I hope you found a solution that worked for you :) The Content (except music & images) is licensed unde...",
- "image": "https://i.ytimg.com/vi/E3v6p87bsYg/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/E3v6p87bsYg/maxresdefault.jpg"
},
{
"name": "Safe Wallet Tutorial | Multisig Wallet for DeFi",
"url": "https://www.youtube.com/watch?v=GHyxe32Z814",
"type": "Video",
"date": "2022-05-02",
+ "description": "In this video, I show you how to use Safe, the best way to create a multisig wallet on Ethereum.",
"tags": [
"Tutorial",
"Safe Wallet"
],
- "og": {
- "title": "Gnosis Safe Tutorial | Multisig Wallet for DeFi",
- "description": "In this video, I show you how to use Gnosis Safe, the best way to create a multisig wallet on Ethereum.Gnosis Website: https://gnosis-safe.io/Follow me on Tw...",
- "image": "https://i.ytimg.com/vi/GHyxe32Z814/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/GHyxe32Z814/maxresdefault.jpg"
},
{
"name": "Build a Group Wallet to Buy things with Frens using Safe {Core} Account Abstraction SDK",
"url": "https://www.youtube.com/watch?v=czGf5YgWs7M",
"type": "Video",
"date": "2023-05-05",
+ "description": "Join us for a workshop titled \"Build a Group Wallet to Buy things with Frens using Safe {Core} Account Abstraction SDK\".",
"tags": [
"Tutorial",
"Safe Core SDK"
],
- "og": {
- "title": "Safe 🛠 Build a Group Wallet to Buy things with Frens using Safe {Core} Account Abstraction SDK",
- "description": "Join Tomiwa Ademidun from Safe for a workshop titled \"Build a Group Wallet to Buy things with Frens using Safe {Core} Account Abstraction SDK\".Thank you to e...",
- "image": "https://i.ytimg.com/vi/czGf5YgWs7M/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/czGf5YgWs7M/maxresdefault.jpg"
},
{
"name": "How to Create a MultiSig Wallet Using Safe",
"url": "https://www.youtube.com/watch?v=JoFYldw6hVE",
"type": "Video",
"date": "2022-11-05",
+ "description": "In this video, we'll show you how to create a multisig wallet using Safe. Multisig wallets are more secure than regular wallets because they require m...",
"tags": [
"Tutorial",
"Safe Wallet"
],
- "og": {
- "title": "How to Create a MultiSig Wallet Using Gnosis SAFE",
- "description": "In this video, we'll show you how to create a multisig wallet using Gnosis SAFE. Multisig wallets are more secure than regular wallets because they require m...",
- "image": "https://i.ytimg.com/vi/JoFYldw6hVE/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/JoFYldw6hVE/maxresdefault.jpg"
},
{
"name": "Step-by-Step Guide to Safe: The Ultimate Multisig Wallet for DeFi",
"url": "https://www.youtube.com/watch?v=3edvkNc7Es0",
"type": "Video",
"date": "2023-05-31",
+ "description": "In this comprehensive tutorial, I walk you through the ins and outs of Safe, a powerful tool for creating multi-sig wallets on the Ethereum blockchain.",
"tags": [
"Tutorial",
"Safe Wallet"
],
- "og": {
- "title": "Step-by-Step Guide to SAFE: The Ultimate Multisig Wallet for DeFi",
- "description": "Join me on Twitter: https://twitter.com/yanneth_ethDeFi newsletter:https://substack.com/@yannethSupport the channel: https://app.gmx.io/#/trade/?ref=yanneth_...",
- "image": "https://i.ytimg.com/vi/3edvkNc7Es0/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/3edvkNc7Es0/maxresdefault.jpg"
},
{
"name": "Safe Smart Contract Multi-Sig Storage. Step-by-Step Setup Guide",
"url": "https://www.youtube.com/watch?v=EPa9I3LDplA",
"type": "Video",
"date": "2023-05-20",
+ "description": "In this important video, we explore the differences between storing crypto in wallets with private keys versus wallets with smart contracts enforced by computer code and how to set one up step by s...",
"tags": [
"Tutorial",
"Safe Wallet"
],
- "og": {
- "title": "SAFE Smart Contract Multi-Sig Storage 🔒 (Better than Hardware Wallet!⭐️) Step-by-Step Setup Guide ✅",
- "description": "💳 Tangem ► https://bit.ly/Tangem-x1⭐⭐ NFC-based hardware wallet, size of a bank card!! ✔️ Simply tap the card to your phone and you’re in! ✔️ Store and ...",
- "image": "https://i.ytimg.com/vi/EPa9I3LDplA/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/EPa9I3LDplA/maxresdefault.jpg"
},
{
"name": "Safe MultiSig Contract Deep Dive",
"url": "https://www.youtube.com/watch?v=_2ZJ5HBEfUk",
"type": "Video",
"date": "2022-02-25",
+ "description": "In this meetup event, Jefferson presented on MultiSig Contract...",
"tags": [
"Deep Dive",
"Safe Smart Account"
],
- "og": {
- "title": "Gnosis MultiSig Contract Deep Dive",
- "description": "In this meetup event, Jefferson presented on Gnosis MultiSig Contract.0:00 What is MultiSig Wallet2:03 Why A MultiSig Wallet4:08 MultiSig Safe Components4:20...",
- "image": "https://i.ytimg.com/vi/_2ZJ5HBEfUk/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/_2ZJ5HBEfUk/hqdefault.jpg"
},
{
- "name": "Ethereum: differences between createTransaction and createTransactionBatch (@safe-global/protocol...",
+ "name": "Ethereum: differences between createTransaction and createTransactionBatch",
"url": "https://www.youtube.com/watch?v=fbZBVpBgq_4",
"type": "Video",
"date": "2023-11-10",
+ "description": "Differences between createTransaction and createTransactionBatch (@safe-global/protocol-kit). The Content (e...",
"tags": [
"Deep Dive",
"Safe Smart Account"
],
- "og": {
- "title": "Ethereum: differences between createTransaction and createTransactionBatch (@safe-global/protocol...",
- "description": "differences between createTransaction and createTransactionBatch (@safe-global/protocol-kit)I hope you found a solution that worked for you :) The Content (e...",
- "image": "https://i.ytimg.com/vi/fbZBVpBgq_4/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/fbZBVpBgq_4/maxresdefault.jpg"
},
{
"name": "Ethereum: Can a Safe be deployed using a paymaster / gasless transaction?",
"url": "https://www.youtube.com/watch?v=VL2EkErsWaM",
"type": "Video",
"date": "2023-10-17",
+ "description": "Can a Safe be deployed using a paymaster / gasless transaction? The Content (except music & images) is lice...",
"tags": [
"Tutorial",
"Safe Smart Account",
"Gasless Transactions"
],
- "og": {
- "title": "Ethereum: Can a SAFE be deployed using a paymaster / gasless transaction?",
- "description": "Can a SAFE be deployed using a paymaster / gasless transaction?I hope you found a solution that worked for you :) The Content (except music & images) is lice...",
- "image": "https://i.ytimg.com/vi/VL2EkErsWaM/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/VL2EkErsWaM/maxresdefault.jpg"
},
{
"name": "Ethereum: How to deploy a Safe on Hardhat",
"url": "https://www.youtube.com/watch?v=GFkNdPAzEwI",
"type": "Video",
"date": "2023-11-13",
+ "description": "How to deploy a Safe on Hardhat. The Content (except music & images) is licensed under (https://meta.stackex...",
"tags": [
"Tutorial",
"Safe Smart Account",
"Hardhat"
],
- "og": {
- "title": "Ethereum: How to deploy a Safe on Hardhat",
- "description": "How to deploy a Safe on HardhatI hope you found a solution that worked for you :) The Content (except music & images) is licensed under (https://meta.stackex...",
- "image": "https://i.ytimg.com/vi/GFkNdPAzEwI/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/GFkNdPAzEwI/maxresdefault.jpg"
},
{
"name": "ERC-4337 Account Abstraction",
"url": "https://www.youtube.com/watch?v=v_V4Wqcn7vE",
"type": "Video",
"date": "2024-01-22",
+ "description": "Dive into the world of ERC-4337 Account Abstraction and level up your dApp development skills with this comprehensive tutorial. In this session, we're conver...",
"tags": [
"Tutorial",
"Safe Smart Account",
"4337"
],
- "og": {
- "title": "ERC-4337 Account Abstraction | Foundry, Next.js/Wagmi/Viem to StackUp/Candide/Alchemy",
- "description": "Dive into the world of ERC-4337 Account Abstraction and level up your dApp development skills with this comprehensive tutorial. In this session, we're conver...",
- "image": "https://i.ytimg.com/vi/v_V4Wqcn7vE/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/v_V4Wqcn7vE/maxresdefault.jpg"
},
{
"name": "Staying safe with Safe",
"url": "https://ackeeblockchain.com/blog/staying-safe-with-safe/",
"type": "Blog Post",
"date": "2024-03-15",
- "abstract": "Since we audited Safe version 1.4.0, we realized its importance in the ecosystem. Here is the list of tips and resources for those who decide to go deeper.",
+ "description": "Since we audited Safe version 1.4.0, we realized its importance in the ecosystem. Here is the list of tips and resources for those who decide to go deeper.",
"tags": [
"Safe Smart Account",
"Security"
],
- "og": {
- "title": "Staying safe with Safe - Ackee Blockchain",
- "description": "Since we audited Safe version 1.4.0, we realized its importance in the ecosystem. Here is the list of tips and resources for those who decide to go deeper.",
- "image": "https://ackeeblockchain.com/blog/wp-content/uploads/2023/10/Safe-1.png"
- }
+ "image": "https://abchprod.wpengine.com/wp-content/uploads/2023/10/Safe-1.png"
},
{
"name": "How to create and use a Safe account with permissionless.js",
"url": "https://docs.pimlico.io/permissionless/how-to/accounts/use-safe-account",
"type": "Blog Post",
"date": "2024-02-12",
- "abstract": "This guide will walk you through how to create and use a Safe account with permissionless.js.",
+ "description": "This guide will walk you through how to create and use a Safe account with permissionless.js.",
"tags": [
"Tutorial",
"Safe Smart Account",
"4337"
],
- "og": {
- "title": "How to create and use a Safe account with permissionless.js",
- "image": "https://docs-og-pimlico.vercel.app/api/og?logo=/pimlico-white.svg&title=How to create and use a Safe account with permissionless.js&description="
- }
+ "image": "https://docs-og-pimlico.vercel.app/api/og?logo=/pimlico-white.svg&title=How to create and use a Safe account with permissionless.js&description="
},
{
"name": "Migrate an EOA to a Safe Smart Account using Aarc",
"url": "https://docs.aarc.xyz/developer-docs/tutorials/safe-smart-wallet",
"type": "Blog Post",
"date": "2024-02-06",
- "abstract": "A tutorial on integrating Safe Smart Account for an EOA with Aarc SDK.",
+ "description": "A tutorial on integrating Safe Smart Account for an EOA with Aarc SDK.",
"tags": [
"Tutorial",
"Safe Smart Account"
],
- "og": {
- "title": "Safe Smart Account",
- "description": "A tutorial on integrating Safe Smart Account for an EOA with Aarc SDK ❇️",
- "image": "https://www.gitbook.com/cdn-cgi/image/width=1280,dpr=2,height=640,fit=contain,format=auto/https%3A%2F%2F2121962569-files.gitbook.io%2F~%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FfkVTcYLDkf0mcGW9zUvc%252Fsocialpreview%252FjEO2ZH66FYxGI0XkXIrp%252FCover%2520Image%2520Twitter.png%3Falt%3Dmedia%26token%3D4d81d546-5eeb-487e-8759-1936f71acde9"
- }
+ "image": "https://2121962569-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfkVTcYLDkf0mcGW9zUvc%2Fsocialpreview%2FjEO2ZH66FYxGI0XkXIrp%2FCover%20Image%20Twitter.png?alt=media&token=4d81d546-5eeb-487e-8759-1936f71acde9"
},
{
"name": "Safe Study (Japanese)",
"url": "https://zenn.dev/kozayupapa/articles/877ca3c93fc4a9",
"type": "Blog Post",
"date": "2023-05-09",
- "abstract": "ERC-4337(AccountAbstraction) 等のライブラリを提供しているSafeについて理解を深めるため、下記のドキュメントを要約していきたいとおもいます。",
+ "description": "ERC-4337(AccountAbstraction) 等のライブラリを提供しているSafeについて理解を深めるため、下記のドキュメントを要約していきたいとおもいます。",
"tags": [
"Tutorial",
"Safe Smart Account"
],
- "og": {
- "title": "Safe Study",
- "image": "https://res.cloudinary.com/zenn/image/upload/s--WqPpvoE---/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_80:Safe%2520Study%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:kozayupapa%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2M1Y2ZkMTM5ZTEuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png"
- }
+ "image": "https://res.cloudinary.com/zenn/image/upload/s--WqPpvoE---/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_80:Safe%2520Study%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:kozayupapa%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2M1Y2ZkMTM5ZTEuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png"
},
{
"name": "How to Multi-Distribute ERC-20 tokens via Safe Core SDK",
"url": "https://mirror.xyz/0xa1AC2cC82249A44892802a99CA84c4ed1072B29C/lL8AYV_b4VzTbojuZEprrxD7-RTTap2IMIS8qIObfl8",
"type": "Blog Post",
"date": "2021-11-15",
- "abstract": "As part of the Atem.green project I'm helping to build, we want to incentivize early contributors by handing out (pre-launch) ERC-20 tokens. We use Coordinape to determine the impact every contributor has in a given month. From that we can calculate how many (pre-launch) token each contributor earned. Now the question is: How do we distribute these tokens?",
+ "description": "As part of the Atem.green project I'm helping to build, we want to incentivize early contributors by handing out (pre-launch) ERC-20 tokens. We use Coordinape to determine the impact every contribu...",
"tags": [
"Tutorial",
"Safe Core SDK"
],
- "og": {
- "title": "How to Multi-Distribute ERC-20 tokens via Gnosis SDK",
- "description": "As part of the Atem.green project I’m helping to build, we want to incentivize early contributors by handing out (pre-launch) ERC-20 tokens. We use Coordinape to determine the impact every contributor has in a given month. From that we can calculate how many (pre-launch) token each contributor earned. Now the question is:\n",
- "image": "https://images.mirror-media.xyz/publication-images/qRKvOeobltP7TYuezDuC0.png?height=452&width=452"
- }
+ "image": "https://images.mirror-media.xyz/publication-images/qRKvOeobltP7TYuezDuC0.png?height=452&width=452"
},
{
"name": "Build a treasury wallet with multi-signature Safe",
"url": "https://blog.logrocket.com/build-treasury-wallet-multisignature-gnosis-safe/",
"type": "Blog Post",
"date": "2022-03-15",
- "abstract": "Imagine you and your friends are building an NFT marketplace. You are the CEO and your friend works as a Solidity engineer who writes the smart contract. The NFT marketplace becomes popular, and your revenue builds from the market fee of every NFT sale transaction. You store your profit inside a smart contract, and boast to the media about your company that has enough money to buy a private island. Then, the Solidity engineer disappears and withdraws all the funds from the treasury. You watch in horror.",
+ "description": "Imagine you and your friends are building an NFT marketplace. You are the CEO and your friend works as a Solidity engineer who writes the smart contract. The NFT marketplace becomes popular, and yo...",
"tags": [
"Tutorial",
"Safe Core SDK"
],
- "og": {
- "title": "Build a treasury wallet with multisignature Gnosis Safe - LogRocket Blog",
- "description": "Protect your assets on the blockchain with Gnosis Safe, a tool that requires multisignature authentication for sensitive transactions.",
- "image": "https://blog.logrocket.com/wp-content/uploads/2022/03/Build-treasury-wallet-multisignature-gnosis-safe-ethereum.png"
- }
+ "image": "https://blog.logrocket.com/wp-content/uploads/2022/03/Build-treasury-wallet-multisignature-gnosis-safe-ethereum.png"
},
{
"name": "How to Deploy Safe Contracts",
"url": "https://www.zlog.in/post/deploy-safe-contracts/",
"type": "Blog Post",
"date": "2023-10-09",
- "abstract": "A tutorial that explains how to deploy Safe contracts on a blockchain.",
+ "description": "A tutorial that explains how to deploy Safe contracts on a blockchain.",
"tags": [
"Tutorial",
"Safe Smart Account"
],
- "og": {
- "title": "How to Deploy Safe Contracts - Zlog",
- "image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png"
- }
+ "image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png"
}
]
\ No newline at end of file
diff --git a/components/ResourceHub/company-resources.json b/components/ResourceHub/company-resources.json
index 3cf35ed3..85ad0f9a 100644
--- a/components/ResourceHub/company-resources.json
+++ b/components/ResourceHub/company-resources.json
@@ -4,478 +4,372 @@
"url": "https://www.youtube.com/watch?v=t2LzhAFBxkI",
"type": "Video",
"date": "2022-04-28",
+ "description": "Join us for a workshop titled \"Starting with the Safe Core SDK\". Learn how to interact with the Safe contracts using TypeScript to...",
"tags": [
"Introduction",
"Safe Core SDK"
],
- "og": {
- "title": "Gnosis Safe 🛠 Starting with the Safe Core SDK",
- "description": "Join Germán Martínez of Gnosis Safe for a workshop titled \"Starting with the Safe Core SDK\" Learn how to interact with the Safe contracts using TypeScript to...",
- "image": "https://i.ytimg.com/vi/t2LzhAFBxkI/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/t2LzhAFBxkI/maxresdefault.jpg"
},
{
"name": "Safe modding 101: Create your own Safe module",
"url": "https://www.youtube.com/watch?v=nmDYc9PlAic",
"type": "Video",
"date": "2022-07-04",
+ "description": "Join us for a workshop titled, \"Safe modding 101: Create your own Safe module.\" This workshop is part of ETHNewYork 2022, a three...",
"tags": [
"Introduction",
"Modules"
],
- "og": {
- "title": "Gnosis Safe 🛠 Safe modding 101: Create your own Safe module",
- "description": "Join Germán Martínez of Gnosis Safe for a workshop titled, \"Safe modding 101: Create your own Safe module.\" This workshop is part of ETHNewYork 2022, a three...",
- "image": "https://i.ytimg.com/vi/nmDYc9PlAic/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/nmDYc9PlAic/maxresdefault.jpg"
},
{
"name": "Safe modding 101: Create your own Safe module",
"url": "https://www.youtube.com/watch?v=QdOfuxxXVBA",
"type": "Video",
"date": "2022-05-09",
+ "description": "Join us for a workshop titled, \"Safe modding 101: Create your own Safe module.\" This workshop is part of HackMoney 2022, a three-...",
"tags": [
"Introduction",
"Modules"
],
- "og": {
- "title": "Gnosis Safe Safe modding 101: Create your own Safe module",
- "description": "Join Germán Martínez of Gnosis Safe for a workshop titled, \"Safe modding 101: Create your own Safe module.\" This workshop is part of HackMoney 2022, a three-...",
- "image": "https://i.ytimg.com/vi/QdOfuxxXVBA/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/QdOfuxxXVBA/hqdefault.jpg"
},
{
"name": "Managing modules and transaction guards | Safe Core SDK",
"url": "https://www.youtube.com/watch?v=Y4PwNkU8OVM",
"type": "Video",
"date": "2023-02-27",
+ "description": "This workshop sheds light on modules, architecture and transaction flow on Safe Core SDK.",
"tags": [
"Deep Dive",
"Modules",
"Guards"
],
- "og": {
- "title": "Managing modules and transaction guards - Germán Martínez | Safe Core SDK | Devfolio",
- "description": "Germán Martínez sheds light on modules, architecture and transaction flow on Safe Core SDK.",
- "image": "https://i.ytimg.com/vi/Y4PwNkU8OVM/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/Y4PwNkU8OVM/maxresdefault.jpg"
},
{
"name": "Safe Core SDK 🛠 Managing modules and transaction guards",
"url": "https://www.youtube.com/watch?v=ppwE9GXC5MA",
"type": "Video",
"date": "2022-12-08",
+ "description": "Join us for a workshop titled \"Managing modules and transaction guards\".And that wraps up 2022! ETHIndia 2022, the biggest Ethereum hac...",
"tags": [
"Deep Dive",
"Modules",
"Guards"
],
- "og": {
- "title": "Safe Core SDK 🛠 Managing modules and transaction guards - Germán Martínez",
- "description": "Join Germán Martínez from Safe for a workshop titled \"Managing modules and transaction guards\".And that wraps up 2022! ETHIndia 2022⎯the biggest Ethereum hac...",
- "image": "https://i.ytimg.com/vi/ppwE9GXC5MA/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/ppwE9GXC5MA/maxresdefault.jpg"
},
{
"name": "Building with the Safe{Core} SDK",
"url": "https://www.youtube.com/watch?v=seQNBoUnwEI",
"type": "Video",
"date": "2023-08-01",
+ "description": "Join us for a workshop titled \"Building with the Safe{Core} SDK\". This talk covers the difference between Safe{Wallet} and Safe{Core}. ...",
"tags": [
"Safe Core SDK"
],
- "og": {
- "title": "Safe 🛠️ Building with the Safe{Core} SDK - Manuel Gellfart",
- "description": "Join Manuel Gellfart from Safe for a workshop titled \"Building with the Safe{Core} SDK\".This talk covers the difference between Safe{Wallet} and Safe{Core}. ...",
- "image": "https://i.ytimg.com/vi/seQNBoUnwEI/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/seQNBoUnwEI/maxresdefault.jpg"
},
{
"name": "Web3 Native - Navigation the Future of Account Abstraction with Lukas Schor",
"url": "https://soundcloud.com/longhashventures_podcast/navigating-the-future-of-account-abstraction-with-safe-web3-native-podcast-safe-lukas-schor",
"type": "Podcast",
"date": "2023-08-24",
+ "description": "Join us on the Safe Podcast as we delve deep into the transformative world of account abstraction (AA) with Lukas Schor from Safe. Unravel discussions around the intricacies of multichain strategie...",
"tags": [
"Perspectives",
"Account Abstraction"
],
- "og": {
- "title": "Navigating the Future of Account Abstraction with Safe | Web3 Native Podcast | Safe | Lukas Schor",
- "description": "Join us on the Safe Podcast as we delve deep into the transformative world of account abstraction (AA) with Lukas Schor from Safe. Unravel discussions around the intricacies of multichain strategies, ",
- "image": "https://i1.sndcdn.com/artworks-zY2xFG93XGx669QX-X1pgWw-t500x500.jpg"
- }
+ "image": "https://i1.sndcdn.com/artworks-zY2xFG93XGx669QX-X1pgWw-t500x500.jpg"
},
{
"name": "Defi Drip - Safe and Account Abstraction with Johannes Moormann",
"url": "https://www.youtube.com/watch?v=G50rE0129zI",
"type": "Podcast",
"date": "2023-08-22",
+ "description": "Johannes Moormann of Safe and Cassidy Daly of Centrifuge discuss implementing account abstraction, improving security and privacy, and real-world asset use c...",
"tags": [
"Perspectives",
"Account Abstraction"
],
- "og": {
- "title": "Johannes Moormann: Safe and Account Abstraction | DeFi Drip",
- "description": "Johannes Moormann of Safe and Cassidy Daly of Centrifuge discuss implementing account abstraction, improving security and privacy, and real-world asset use c...",
- "image": "https://i.ytimg.com/vi/G50rE0129zI/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/G50rE0129zI/maxresdefault.jpg"
},
{
"name": "On the brink - Account Abstraction Adoption and Barriers with Richard Meissner",
"url": "https://onthebrink-podcast.com/safe/",
"type": "Podcast",
"date": "2023-07-26",
+ "description": "Richard Meissner, CTO of Safe, joins the show to cover the roll out of account abstraction on Ethereum",
"tags": [
"Perspectives",
"Account Abstraction"
],
- "og": {
- "title": "Richard Meissner (Safe) on Account Abstraction Adoption and Barriers (EP.440) - On the Brink Podcast",
- "description": "Richard Meissner, CTO of Safe, joins the show to cover the roll out of account abstraction on Ethereum",
- "image": "https://onthebrink-podcast.com/wp-content/uploads/safe_otb.png"
- }
+ "image": "https://onthebrink-podcast.com/wp-content/uploads/safe_otb.png"
},
{
"name": "Get the most secure web3 account in <30 seconds",
"url": "https://safe.mirror.xyz/pyf0meKAyooY1v8GB7z6Ik7o4wPHGTyCOcUf--UU-IA",
"type": "Blog Post",
"date": "2023-11-13",
- "abstract": "Introducing self-custody for everyone. From today, you can secure your crypto fast and free with Safe{Wallet} on Gnosis Chain using just your Google Account.",
+ "description": "Introducing self-custody for everyone. From today, you can secure your crypto fast and free with Safe{Wallet} on Gnosis Chain using just your Google Account.",
"tags": [
"Tutorial",
"Account Abstraction"
],
- "og": {
- "title": "Get the most secure web3 account in <30 seconds",
- "description": "Secure your crypto fast and free with Safe{Wallet} and Google on Gnosis Chain.",
- "image": "https://images.mirror-media.xyz/nft/9kHb8UBlFkKq7EMDAnFJB.png"
- }
+ "image": "https://images.mirror-media.xyz/nft/9kHb8UBlFkKq7EMDAnFJB.png"
},
{
"name": "The new AI agent economy will run on smart accounts",
"url": "https://safe.mirror.xyz/V965PykKzlE1PCuWxBjsCJR12WscLcnMxuvR9E9bP-Y",
"type": "Blog Post",
"date": "2023-10-25",
- "abstract": "Web3's first billion users may not only be humans, but AI agents.",
+ "description": "Web3's first billion users may not only be humans, but AI agents.",
"tags": [
"Perspectives",
"Account Abstraction"
],
- "og": {
- "title": "The AI agent economy is coming. It will run on Smart Accounts.",
- "description": "More than half of all Safe transactions on Gnosis Chain are currently made by AI agents, signaling a nascent but growing \"agent economy\".",
- "image": "https://images.mirror-media.xyz/nft/iLnq-8GT4vb6kUflMzjBn.png"
- }
+ "image": "https://images.mirror-media.xyz/nft/iLnq-8GT4vb6kUflMzjBn.png"
},
{
"name": "Enhancing Blockchain Security with ERC-7512: A Standard for representing smart contract audits onchain",
"url": "https://safe.mirror.xyz/Li4Mb4teTEmosE6dAsnJ_iz3aMKOV_4lDU84W4TSfc0",
"type": "Blog Post",
"date": "2023-09-21",
- "abstract": "In a significant stride towards fortifying blockchain security, we at Safe, along with top security experts have introduced ERC-7512, a standard for onchain audit report representations.",
+ "description": "In a significant stride towards fortifying blockchain security, we at Safe, along with top security experts have introduced ERC-7512, a standard for onchain audit report representations.",
"tags": [
"Safe Smart Account",
"Security"
],
- "og": {
- "title": "Enhancing Blockchain Security with ERC-7512: A Standard for repr…",
- "description": "Introduction\n",
- "image": "https://images.mirror-media.xyz/publication-images/82e06bfQvabGWD6lCEuI5.png?height=1440&width=2880"
- }
+ "image": "https://images.mirror-media.xyz/publication-images/82e06bfQvabGWD6lCEuI5.png?height=1440&width=2880"
},
{
"name": "Safe Modular Smart Account Architecture - Explained",
"url": "https://safe.mirror.xyz/t76RZPgEKdRmWNIbEzi75onWPeZrBrwbLRejuj-iPpQ",
"type": "Blog Post",
"date": "2023-07-10",
- "abstract": "Safe is at the forefront of modular smart account infrastructure, paving the way for developers to create a diverse range of applications and wallets.",
+ "description": "Safe is at the forefront of modular smart account infrastructure, paving the way for developers to create a diverse range of applications and wallets.",
"tags": [
"Deep Dive",
"Account Abstraction",
"Safe Smart Account"
],
- "og": {
- "title": "Safe Modular Smart Account Architecture – Explained",
- "description": "Uncover Safe's Modular Smart Account Architecture. Learn about Plugins, Hooks, Function Handlers, and Signature Verifiers–the elements that unlock the full potential of Smart Accounts.\n\n\n\n\n",
- "image": "https://images.mirror-media.xyz/nft/27RD2g-DuOqbqhvJPR2PB.jpeg"
- }
+ "image": "https://images.mirror-media.xyz/nft/27RD2g-DuOqbqhvJPR2PB.jpeg"
},
{
"name": "Launching Monerium on Safe{Core}: Connecting Safes to Euro IBAN accounts",
"url": "https://safe.mirror.xyz/4pgiJAEQ2Jt0ij9Ezc8FSOSiRSfVY4Im8FZ0LuICx-8",
"type": "Blog Post",
"date": "2023-07-06",
- "abstract": "Today, the Safe{Core} Account Abstraction SDK added a shiny new tool to its toolbox.",
+ "description": "Today, the Safe{Core} Account Abstraction SDK added a shiny new tool to its toolbox.",
"tags": [
"Introduction"
],
- "og": {
- "title": "Launching Monerium on Safe{Core}: Connecting Safes to Euro IBAN accounts",
- "description": "Safe{Core} account abstraction SDK adds the Monerium pack to enable the seamless onramp and offramp between EUR (in IBAN bank accounts) and EURe (ERC-20 authorised euro e-money token) in Safes.",
- "image": "https://images.mirror-media.xyz/nft/sxVBoT7TfTZRqUvk4UN0K.png"
- }
+ "image": "https://images.mirror-media.xyz/nft/sxVBoT7TfTZRqUvk4UN0K.png"
},
{
"name": "Redefine security with new Safe{Wallet} transaction risk scanner",
"url": "https://safe.mirror.xyz/rInLWZwD_sf7enjoFerj6FIzCYmVMGrrV8Nhg4THdwI",
"type": "Blog Post",
"date": "2023-07-26",
- "abstract": "We're excited to bring you news of an important enhancement to your transactional security.",
+ "description": "We're excited to bring you news of an important enhancement to your transactional security.",
"tags": [
"Security",
"Safe Wallet"
],
- "og": {
- "title": "Launching Risk Assessment on Safe{Wallet}",
- "description": "Scan before you send it. Safe has partnered with Redefine to integrate their automated DeFirewall transaction risk scanner right in your Safe{Wallet}.",
- "image": "https://images.mirror-media.xyz/publication-images/Efdea-Sf1JbaDe93zVLTf.png?height=1000&width=1999"
- }
+ "image": "https://images.mirror-media.xyz/publication-images/Efdea-Sf1JbaDe93zVLTf.png?height=1000&width=1999"
},
{
"name": "Safe Smart Accounts & Diamond Proxies",
"url": "https://safe.mirror.xyz/P83_rVQuUQJAM-SnMpWvsHlN8oLnCeSncD1txyMDqpE",
"type": "Blog Post",
"date": "2023-04-25",
- "abstract": "Safe is a modular smart account protocol that uses Account Abstraction to build a wide range of wallets and other solutions through a shared plugin interface.",
+ "description": "Safe is a modular smart account protocol that uses Account Abstraction to build a wide range of wallets and other solutions through a shared plugin interface.",
"tags": [
"Deep Dive",
"Safe Smart Account",
"Account Abstraction"
],
- "og": {
- "title": "Safe Smart Accounts & Diamond Proxies",
- "description": "TL;DR:\n",
- "image": "https://images.mirror-media.xyz/publication-images/q6Bho-3wXGhu_1pvBwMix.png?height=1440&width=2880"
- }
+ "image": "https://images.mirror-media.xyz/publication-images/q6Bho-3wXGhu_1pvBwMix.png?height=1440&width=2880"
},
{
"name": "Account Abstraction in a Multichain Landscape - Part 1: Addresses",
"url": "https://safe.mirror.xyz/4GcGAOFno-suTCjBewiYH4k4yXPDdIukC5woO5Bjc4w",
"type": "Blog Post",
"date": "2023-03-22",
- "abstract": "This is the first article in a series of posts exploring account abstraction in a multichain landscape.",
+ "description": "This is the first article in a series of posts exploring account abstraction in a multichain landscape.",
"tags": [
"Deep Dive",
"Account Abstraction"
],
- "og": {
- "title": "Account Abstraction in a Multichain Landscape - Part 1: Addresse…",
- "description": "This is the first article in a series of posts exploring account abstraction in a multichain landscape. A base level knowledge on the topic of account abstraction is presumed, here’s a good summary to get up-to-speed, if required.\n",
- "image": "https://images.mirror-media.xyz/publication-images/Fi-Z9FwMkDU6ClXmmhCp_.png?height=1440&width=2880"
- }
+ "image": "https://images.mirror-media.xyz/publication-images/Fi-Z9FwMkDU6ClXmmhCp_.png?height=1440&width=2880"
},
{
"name": "Launching Safe{Core} Account Abstraction Stack with Stripe, Gelato and Web3Auth",
"url": "https://safe.mirror.xyz/FLvQQ5J9qXks0izRl73oC6LiFLofbwFNorwzaEj_xL8",
"type": "Blog Post",
"date": "2023-03-01",
- "abstract": "Safe is launching Safe{Core}, a modular AA stack with Stripe, Gelato, and Web3Auth as launch partners.",
+ "description": "Safe is launching Safe{Core}, a modular AA stack with Stripe, Gelato, and Web3Auth as launch partners.",
"tags": [
"Introduction",
"Account Abstraction"
],
- "og": {
- "title": "Launching Safe{Core} Account Abstraction Stack with Stripe, Gelato and Web3Auth",
- "description": "Safe is launching Safe{Core}, a modular AA stack with Stripe, Gelato, and Web3Auth as launch partners. Safe{Core} SDK will offer developers direct access to a wide range of integrations.",
- "image": "https://images.mirror-media.xyz/nft/ZfRdO8WA9bCbm_tvQPWYv.png"
- }
+ "image": "https://images.mirror-media.xyz/nft/ZfRdO8WA9bCbm_tvQPWYv.png"
},
{
"name": "Take Back Ownership Manifesto",
"url": "https://safe.mirror.xyz/tO26nZ4CruKCS8d49pyModJhzHw1TTm2QcMqx2lYaXQ",
"type": "Blog Post",
"date": "2023-01-18",
- "abstract": "Not your keys, not your coins.",
+ "description": "Not your keys, not your coins.",
"tags": [
"Perspectives",
"Account Abstraction"
],
- "og": {
- "title": "Take Back Ownership Manifesto",
- "description": "It's time to take back ownership. Collect this manifesto to show your support for self-custody.",
- "image": "https://images.mirror-media.xyz/nft/8HEwVv3Onyd4Dc0QQYt0q.png"
- }
+ "image": "https://images.mirror-media.xyz/nft/8HEwVv3Onyd4Dc0QQYt0q.png"
},
{
"name": "Safe Community Call #1 with Castle NFT Platform",
"url": "https://www.youtube.com/watch?v=PCtjRs0BpHE",
"type": "Video",
"date": "2022-11-17",
+ "description": "Safe Community Call #1 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #1 with Castle NFT Platform",
- "description": "Safe Community Call #1 features updates from the Safe Ecosystem including:‣ Safe Governance updates from Theodor Beutel, DAO Coordination Lead at Safe‣ Brief...",
- "image": "https://i.ytimg.com/vi/PCtjRs0BpHE/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/PCtjRs0BpHE/hqdefault.jpg"
},
{
"name": "Safe Community Call #2 with Onchain Den",
"url": "https://www.youtube.com/watch?v=o18qA1bvNXI",
"type": "Video",
"date": "2022-11-17",
+ "description": "Safe Community Call #2 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #2 with Onchain Den",
- "description": "Safe Community Call #2 features updates from the Safe Ecosystem including:‣ Safe Governance updates from Theodor Beutel, DAO Coordination Lead at Safe includ...",
- "image": "https://i.ytimg.com/vi/o18qA1bvNXI/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/o18qA1bvNXI/hqdefault.jpg"
},
{
"name": "Safe Community Call #3 announcing Safe Grants and Liminal updates",
"url": "https://www.youtube.com/watch?v=nzT9HAb9lVw",
"type": "Video",
"date": "2022-11-22",
+ "description": "Safe Community Call #3 features updates from the Safe Ecosystem including: $1M in Safe Grants announcement from Lukas Schor, Co-founder at Safe...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #3 announcing Safe Grants and Liminal updates",
- "description": "Safe Community Call #3 features updates from the Safe Ecosystem including:‣ $1M in Safe Grants announcement from Lukas Schor, Co-founder at Safe ‣ Safe Gover...",
- "image": "https://i.ytimg.com/vi/nzT9HAb9lVw/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/nzT9HAb9lVw/hqdefault.jpg"
},
{
"name": "Safe Community Call #4 with NinDAO",
"url": "https://www.youtube.com/watch?v=eosjuOocH1Y",
"type": "Video",
"date": "2022-12-05",
+ "description": "Safe Community Call #4 features updates from the Safe Ecosystem including: ETHIndia Recap and Safe Governance updates from Theodor Beutel...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #4 with NinDAO",
- "description": "Safe Community Call #4 features updates from the Safe Ecosystem including:‣ ETHIndia Recap and Safe Governance updates from Theodor Beutel, DAO Coordination ...",
- "image": "https://i.ytimg.com/vi/eosjuOocH1Y/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/eosjuOocH1Y/hqdefault.jpg"
},
{
"name": "Safe Community Call #5 with Richard Meissner",
"url": "https://www.youtube.com/watch?v=9XUXkfwDixA",
"type": "Video",
"date": "2023-01-10",
+ "description": "Safe Community Call #5 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #5 with Richard Meissner",
- "description": "Safe Community Call #5 features updates from the Safe Ecosystem including:‣ Safe Governance updates from Theodor Beutel, DAO Coordination Lead at Safe‣ Prese...",
- "image": "https://i.ytimg.com/vi/9XUXkfwDixA/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/9XUXkfwDixA/hqdefault.jpg"
},
{
"name": "Safe Community Call #6 with Tribes Co-Wallet",
"url": "https://www.youtube.com/watch?v=j44PnR-aGL8",
"type": "Video",
"date": "2023-02-07",
+ "description": "Safe Community Call #6 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #6 with Tribes Co-Wallet",
- "description": "Safe Community Call #6 features updates from the Safe Ecosystem including:‣ Safe Governance updates from Theodor Beutel, DAO Coordination Lead at Safe‣ Pres...",
- "image": "https://i.ytimg.com/vi/j44PnR-aGL8/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/j44PnR-aGL8/hqdefault.jpg"
},
{
"name": "Safe Community Call #7 announcing Safe Core and Account Abstraction Hackathon",
"url": "https://www.youtube.com/watch?v=XOkVwtJOHSI",
"type": "Video",
"date": "2023-03-07",
+ "description": "Safe Community Call #7 features updates from the Safe Ecosystem including: Safe{Core} March for Account Abstraction Hackathon, SafeDAO and Safe Governan...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #7 announcing Safe Core and Account Abstraction Hackathon",
- "description": "Safe Community Call #7 features updates from the Safe Ecosystem including:‣ Safe{Core}‣ March for Account Abstraction Hackathon 🚀‣ SafeDAO and Safe Governan...",
- "image": "https://i.ytimg.com/vi/XOkVwtJOHSI/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/XOkVwtJOHSI/hqdefault.jpg"
},
{
"name": "Safe Community Call #8 with Podarchy Explorer demo from Metropolis",
"url": "https://www.youtube.com/watch?v=l6jKLPp-ZbQ",
"type": "Video",
"date": "2023-05-05",
+ "description": "Safe Community Call #8 features updates from the Safe Ecosystem including: SafeDAO and Safe Governance updates including [SEP#6] Safe Grants Program, Safe A...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #8 with Podarchy Explorer demo from Metropolis",
- "description": "Safe Community Call #8 features updates from the Safe Ecosystem including:‣ SafeDAO and Safe Governance updates including [SEP#6] Safe Grants Program‣ Safe A...",
- "image": "https://i.ytimg.com/vi/l6jKLPp-ZbQ/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/l6jKLPp-ZbQ/hqdefault.jpg"
},
{
"name": "Safe Community Call #9 with Brahma Fi Console",
"url": "https://www.youtube.com/watch?v=vt0F0MnIB9I",
"type": "Video",
"date": "2023-06-19",
+ "description": "Safe Community Call #9 features updates from the Safe Ecosystem including: Grants Council Election Updates, SafeDAO Governance, Ecosystem Spotlight: BrahmaL...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #9 with Brahma Fi Console",
- "description": "Safe Community Call #9 features updates from the Safe Ecosystem including:‣ Grants Council Election Updates‣ SafeDAO Governance‣ Ecosystem Spotlight: BrahmaL...",
- "image": "https://i.ytimg.com/vi/vt0F0MnIB9I/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/vt0F0MnIB9I/hqdefault.jpg"
},
{
"name": "Safe Community Call #10 with Redefine and Coinshift",
"url": "https://www.youtube.com/watch?v=-M0xBi3lH1s",
"type": "Video",
"date": "2023-07-13",
+ "description": "Agenda includes:- Community Updates- Grants- Safe{Wallet} x Redefine Demo- SafeDAO Governance- Ecosystem Spotlight: Coinshift...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #10 with Redefine and Coinshift",
- "description": "Agenda includes:- Community Updates- Grants- Safe{Wallet} x Redefine Demo- SafeDAO Governance- Ecosystem Spotlight: CoinshiftAll links here:https://linktr.ee...",
- "image": "https://i.ytimg.com/vi/-M0xBi3lH1s/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/-M0xBi3lH1s/hqdefault.jpg"
},
{
"name": "Safe Community Call #11 on Safe{Core} Protocol, Safe{Con}, Safe Grants Program and more",
"url": "https://www.youtube.com/watch?v=8_5H0Y1THEo",
"type": "Video",
"date": "2023-08-16",
+ "description": "Safe Community Call #11 features updates from the Safe Ecosystem including: Grants Program Launch‣ Safe{Wallet} + Demo, Safe{Protocol}, SafeDAO Governance‣...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #11 on Safe{Core} Protocol, Safe{Con}, Safe Grants Program and more",
- "description": "Safe Community Call #11 features updates from the Safe Ecosystem including:‣ Grants Program Launch‣ Safe{Wallet} + Demo‣ Safe{Protocol} ‣ SafeDAO Governance‣...",
- "image": "https://i.ytimg.com/vi/8_5H0Y1THEo/hqdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/8_5H0Y1THEo/hqdefault.jpg"
},
{
"name": "Community Call #12: Grants Council and Safe DAO updates, ZK integrations & DAAta and AI Hackathon",
"url": "https://www.youtube.com/watch?v=_WbnF_qyjeQ",
"type": "Video",
"date": "2023-09-21",
+ "description": "Safe Community Call #12 features updates from the Safe Ecosystem including: Grants Council Update, Community Updates, Safe{Wallet} News: ZK Integrations ...",
"tags": [
"Community Call"
],
- "og": {
- "title": "Community Call #12: Grants Council and Safe DAO updates, ZK integrations, & DAAta and AI Hackathon",
- "description": "Safe Community Call #12 features updates from the Safe Ecosystem including: ‣ Grants Council Update ‣ Community Updates ‣ Safe{Wallet} News: ZK Integrations ...",
- "image": "https://i.ytimg.com/vi/_WbnF_qyjeQ/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/_WbnF_qyjeQ/maxresdefault.jpg"
},
{
"name": "Safe Community Call #13",
"url": "https://www.youtube.com/watch?v=5UaCdug2LPA",
"type": "Video",
"date": "2023-10-12",
+ "description": "Safe Community Call #139Updates on the Safe Grants Program, Safe DAO Governance, Safe{Wallet}, upcoming Community Events, and an Ecosystem Spotlight from HOPR.",
"tags": [
"Community Call"
],
- "og": {
- "title": "Safe Community Call #13",
- "description": "Safe Community Call #139Updates on the Safe Grants Program, Safe DAO Governance, Safe{Wallet}, upcoming Community Events, and an Ecosystem Spotlight from HOPR.",
- "image": "https://i.ytimg.com/vi/5UaCdug2LPA/maxresdefault.jpg"
- }
+ "image": "https://i.ytimg.com/vi/5UaCdug2LPA/maxresdefault.jpg"
}
]
\ No newline at end of file
diff --git a/package.json b/package.json
index abb09c2d..3d61ba65 100644
--- a/package.json
+++ b/package.json
@@ -6,12 +6,13 @@
"dev": "next dev",
"generate-supported-networks": "node .github/scripts/generateSupportedNetworks.js",
"get-resources-og": "node .github/scripts/getResourcesOg.js",
+ "validate-resources": "node .github/scripts/validateResources.js",
"linkcheck": "find ./pages -name '*.md*' -print0 | xargs -0 -n1 pnpm markdown-link-check --quiet --progress --config linkchecker-config.json",
"lint": "eslint . && vale pages/ --minAlertLevel=error",
"start": "serve out",
"test": "env-cmd cypress run --headless",
"typecheck": "tsc --noEmit --incremental false",
- "prepush": "pnpm lint && pnpm typecheck",
+ "prepush": "pnpm lint && pnpm typecheck && pnpm validate-resources",
"prepare": "husky install"
},
"repository": {