From 26cdc7f27fce975f7f8c58c2cdc02142a0281c13 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:19:58 +0100 Subject: [PATCH 01/20] Get and display resources data from OG --- .github/scripts/getResourcesOg.js | 55 +++++++++++++--------------- components/ResourceHub/Card.tsx | 6 +-- components/ResourceHub/Resources.tsx | 8 +--- 3 files changed, 31 insertions(+), 38 deletions(-) diff --git a/.github/scripts/getResourcesOg.js b/.github/scripts/getResourcesOg.js index 3471b209..d35687e1 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,35 @@ 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) + return { + name: og.ogTitle, + url: resource.url, + type: resource.type, + date: resource.date, + description: og.ogDescription ?? resource.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) + return { + name: og.ogTitle, + url: resource.url, + type: resource.type, + date: resource.date, + description: og.ogDescription ?? resource.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/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 => { ) ) : ( - resource-img + resource-img )} @@ -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[] => { From 77b3961265651d9e9f05730fd57bacdf52dcd048 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:20:35 +0100 Subject: [PATCH 02/20] Runnew getResourcesOg --- .../ResourceHub/community-resources.json | 176 ++++-------- components/ResourceHub/company-resources.json | 264 ++++++------------ 2 files changed, 135 insertions(+), 305 deletions(-) diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index 1ff6bd66..26f0990d 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 Gnosis 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", "url": "https://www.youtube.com/watch?v=FUytj_xStDI", "type": "Video", "date": "2023-04-16", + "description": "Safe muitisig wallets: * Main page: https://safe.global* Available services: https://docs.safe.global/learn/safe-core/safe-core-api/available-services* S...", "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?", + "name": "How do you add a custom network to the Gnosis 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 Gnosis Safe UI?I hope you found a solution that worked for you :) 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", + "name": "Gnosis Safe 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 Gnosis Safe, the best way to create a multisig wallet on Ethereum.Gnosis Website: https://gnosis-safe.io/Follow me on Tw...", "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", + "name": "Safe 🛠 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 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...", "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", + "name": "How to Create a MultiSig Wallet Using Gnosis 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 Gnosis 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", + "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": "Join me on Twitter: https://twitter.com/yanneth_ethDeFi newsletter:https://substack.com/@yannethSupport the channel: https://app.gmx.io/#/trade/?ref=yanneth_...", "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", + "name": "SAFE Smart Contract Multi-Sig Storage 🔒 (Better than Hardware Wallet!⭐️) Step-by-Step Setup Guide ✅", "url": "https://www.youtube.com/watch?v=EPa9I3LDplA", "type": "Video", "date": "2023-05-20", + "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 ...", "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", + "name": "Gnosis 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 Gnosis MultiSig Contract.0:00 What is MultiSig Wallet2:03 Why A MultiSig Wallet4:08 MultiSig Safe Components4:20...", "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...", "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)I hope you found a solution that worked for you :) 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?", + "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?I hope you found a solution that worked for you :) 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 HardhatI hope you found a solution that worked for you :) 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", + "name": "ERC-4337 Account Abstraction | Foundry, Next.js/Wagmi/Viem to StackUp/Candide/Alchemy", "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", + "name": "Staying safe with Safe - Ackee Blockchain", "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.", + "date": "2023-10-09", + "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", + "name": "Safe Smart Account | Aarc Documentation", "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)", + "name": "Safe Study", "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", + "name": "How to Multi-Distribute ERC-20 tokens via Gnosis 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 contributor has in a given month. From that we can calculate how many (pre-launch) token each contributor earned. Now the question is:\n", "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", + "name": "Build a treasury wallet with multisignature Gnosis Safe - LogRocket Blog", "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": "Protect your assets on the blockchain with Gnosis Safe, a tool that requires multisignature authentication for sensitive transactions.", "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", + "name": "How to Deploy Safe Contracts - Zlog", "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..b3c58a16 100644 --- a/components/ResourceHub/company-resources.json +++ b/components/ResourceHub/company-resources.json @@ -1,481 +1,375 @@ [ { - "name": "Starting with the Safe Core SDK", + "name": "Gnosis Safe 🛠 Starting with the Safe Core SDK", "url": "https://www.youtube.com/watch?v=t2LzhAFBxkI", "type": "Video", "date": "2022-04-28", + "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...", "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", + "name": "Gnosis Safe 🛠 Safe modding 101: Create your own Safe module", "url": "https://www.youtube.com/watch?v=nmDYc9PlAic", "type": "Video", "date": "2022-07-04", + "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...", "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", + "name": "Gnosis Safe Safe modding 101: Create your own Safe module", "url": "https://www.youtube.com/watch?v=QdOfuxxXVBA", "type": "Video", "date": "2022-05-09", + "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-...", "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", + "name": "Managing modules and transaction guards - Germán Martínez | Safe Core SDK | Devfolio", "url": "https://www.youtube.com/watch?v=Y4PwNkU8OVM", "type": "Video", "date": "2023-02-27", + "description": "Germán Martínez 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", + "name": "Safe Core SDK 🛠 Managing modules and transaction guards - Germán Martínez", "url": "https://www.youtube.com/watch?v=ppwE9GXC5MA", "type": "Video", "date": "2022-12-08", + "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...", "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", + "name": "Safe 🛠️ Building with the Safe{Core} SDK - Manuel Gellfart", "url": "https://www.youtube.com/watch?v=seQNBoUnwEI", "type": "Video", "date": "2023-08-01", + "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}. ...", "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", + "name": "Navigating the Future of Account Abstraction with Safe | Web3 Native Podcast | Safe | 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 strategies, ", "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", + "name": "Johannes Moormann: Safe and Account Abstraction | DeFi Drip", "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", + "name": "Richard Meissner (Safe) on Account Abstraction Adoption and Barriers (EP.440) - On the Brink Podcast", "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": "Secure your crypto fast and free with Safe{Wallet} and Google on Gnosis Chain.", "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", + "name": "The AI agent economy is coming. It 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": "More than half of all Safe transactions on Gnosis Chain are currently made by AI agents, signaling a nascent but growing \"agent economy\".", "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", + "name": "Enhancing Blockchain Security with ERC-7512: A Standard for repr…", "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": "Introduction\n", "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", + "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": "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", "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": "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.", "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", + "name": "Launching Risk Assessment on Safe{Wallet}", "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": "Scan before you send it. Safe has partnered with Redefine to integrate their automated DeFirewall transaction risk scanner right in your Safe{Wallet}.", "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": "TL;DR:\n", "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", + "name": "Account Abstraction in a Multichain Landscape - Part 1: Addresse…", "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. 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", "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. Safe{Core} SDK will offer developers direct access to a wide range of integrations.", "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": "It's time to take back ownership. Collect this manifesto to show your support for self-custody.", "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, DAO Coordination Lead at Safe‣ Brief...", "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, DAO Coordination Lead at Safe includ...", "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 ‣ Safe Gover...", "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, DAO Coordination ...", "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, DAO Coordination Lead at Safe‣ Prese...", "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, DAO Coordination Lead at Safe‣ Pres...", "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: CoinshiftAll links here:https://linktr.ee...", "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", + "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 From 694a5f87b2a7b982ad1a08b6a4457cf467021ebc Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:20:53 +0100 Subject: [PATCH 03/20] Add workflow to validate resources --- .github/scripts/validateResources.js | 46 ++++++++++++++++++++++++++++ .github/workflows/resource-check.yml | 24 +++++++++++++++ package.json | 1 + 3 files changed, 71 insertions(+) create mode 100644 .github/scripts/validateResources.js create mode 100644 .github/workflows/resource-check.yml diff --git a/.github/scripts/validateResources.js b/.github/scripts/validateResources.js new file mode 100644 index 00000000..45777749 --- /dev/null +++ b/.github/scripts/validateResources.js @@ -0,0 +1,46 @@ +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: ${resource.url}`) + return false + } + if (!resource.name) { + console.log(`Resource name is missing: ${resource.url}`) + return false + } + if (!resource.type) { + console.log(`Resource type is missing: ${resource.url}`) + return false + } + if (!resource.date) { + console.log(`Resource date is missing: ${resource.url}`) + return false + } + if (!resource.description) { + console.log(`Resource description is missing: ${resource.url}`) + return false + } + if (!resource.tags || !resource.tags.length) { + console.log(`Resource tags are missing: ${resource.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/resource-check.yml b/.github/workflows/resource-check.yml new file mode 100644 index 00000000..9eba1615 --- /dev/null +++ b/.github/workflows/resource-check.yml @@ -0,0 +1,24 @@ +name: Validate resource hub JSON on PR + +on: pull_request + +jobs: + generate-supported-networks: + runs-on: ubuntu-latest + steps: + - name: Use Node.js 20.x + uses: actions/setup-node@v4 + with: + node-version: '20.x' + - uses: pnpm/action-setup@v3 + with: + version: 8 + - name: Install dependencies + run: pnpm install + - uses: reviewdog/action-setup@v1 + with: + reviewdog_version: latest + - name: Validate resource hub JSON files + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: pnpm validate-resources | reviewdog -f=checkstyle -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file diff --git a/package.json b/package.json index abb09c2d..47ae4f1d 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "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", From 377bf8a0755f0cb0fd3780517601f44e2009f845 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:21:00 +0100 Subject: [PATCH 04/20] Minor fix --- .github/workflows/generate-supported-networks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 4a28919374e16d8493265ee16d27f4df4ebadda4 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:27:47 +0100 Subject: [PATCH 05/20] Fix github action for validating JSON resources --- .github/workflows/resource-check.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml index 9eba1615..8be79785 100644 --- a/.github/workflows/resource-check.yml +++ b/.github/workflows/resource-check.yml @@ -10,15 +10,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: '20.x' - - uses: pnpm/action-setup@v3 - with: - version: 8 - - name: Install dependencies - run: pnpm install - uses: reviewdog/action-setup@v1 with: reviewdog_version: latest - name: Validate resource hub JSON files env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: pnpm validate-resources | reviewdog -f=checkstyle -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file + run: node .github/scripts/validate-resources | reviewdog -f=checkstyle -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file From 1249cc439036b3df175ee367cf0b45c8afb67306 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:29:09 +0100 Subject: [PATCH 06/20] Fix github action for validating JSON resources --- .github/workflows/resource-check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml index 8be79785..31e9c988 100644 --- a/.github/workflows/resource-check.yml +++ b/.github/workflows/resource-check.yml @@ -13,6 +13,7 @@ jobs: - uses: reviewdog/action-setup@v1 with: reviewdog_version: latest + - uses: actions/checkout@v4 - name: Validate resource hub JSON files env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c8dd361efcaabd64149039da7ecf2ce57b9ed95a Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:30:19 +0100 Subject: [PATCH 07/20] Fix github action for validating JSON resources --- .github/workflows/resource-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml index 31e9c988..87690fc0 100644 --- a/.github/workflows/resource-check.yml +++ b/.github/workflows/resource-check.yml @@ -17,4 +17,4 @@ jobs: - name: Validate resource hub JSON files env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: node .github/scripts/validate-resources | reviewdog -f=checkstyle -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file + run: node .github/scripts/validateResources.js | reviewdog -f=checkstyle -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file From 3450964c836aae135be017c49562c9277d41215b Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:47:38 +0100 Subject: [PATCH 08/20] Fix github action for validating JSON resources --- .github/workflows/resource-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml index 87690fc0..6e9ea3d8 100644 --- a/.github/workflows/resource-check.yml +++ b/.github/workflows/resource-check.yml @@ -17,4 +17,4 @@ jobs: - name: Validate resource hub JSON files env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: node .github/scripts/validateResources.js | reviewdog -f=checkstyle -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file + run: node .github/scripts/validateResources.js | reviewdog -efm="%f:%l:%c:%m" -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file From 171086c5462c16a98e09d4180b162b2cebfbc099 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:48:49 +0100 Subject: [PATCH 09/20] Test workflow validation for resource hub --- .github/workflows/resource-check.yml | 2 +- components/ResourceHub/community-resources.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml index 6e9ea3d8..a5d6c77e 100644 --- a/.github/workflows/resource-check.yml +++ b/.github/workflows/resource-check.yml @@ -1,4 +1,4 @@ -name: Validate resource hub JSON on PR +name: Validate resource hub JSON on: pull_request diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index 26f0990d..5e7fe9da 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -208,7 +208,6 @@ "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 Gnosis SDK", "url": "https://mirror.xyz/0xa1AC2cC82249A44892802a99CA84c4ed1072B29C/lL8AYV_b4VzTbojuZEprrxD7-RTTap2IMIS8qIObfl8", "type": "Blog Post", "date": "2021-11-15", From edee0a7863b34bfc596edfebbcdb47bfeabb2896 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:56:15 +0100 Subject: [PATCH 10/20] Test workflow validation for resource hub --- .github/scripts/validateResources.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/scripts/validateResources.js b/.github/scripts/validateResources.js index 45777749..873ab389 100644 --- a/.github/scripts/validateResources.js +++ b/.github/scripts/validateResources.js @@ -5,28 +5,29 @@ const communityResourcesPath = './components/ResourceHub/community-resources.json' const validateResource = (resource, index, resources) => { + const errorMessage = 'community-resources.json:1:1:' if (resources.findIndex(r => r.url === resource.url) !== index) { - console.log(`Duplicate resource: ${resource.url}`) + console.log(errorMessage + `Duplicate resource: ${resource.url}`) return false } if (!resource.name) { - console.log(`Resource name is missing: ${resource.url}`) + console.log(errorMessage + `Resource name is missing: ${resource.url}`) return false } if (!resource.type) { - console.log(`Resource type is missing: ${resource.url}`) + console.log(errorMessage + `Resource type is missing: ${resource.url}`) return false } if (!resource.date) { - console.log(`Resource date is missing: ${resource.url}`) + console.log(errorMessage + `Resource date is missing: ${resource.url}`) return false } if (!resource.description) { - console.log(`Resource description is missing: ${resource.url}`) + console.log(errorMessage + `Resource description is missing: ${resource.url}`) return false } if (!resource.tags || !resource.tags.length) { - console.log(`Resource tags are missing: ${resource.url}`) + console.log(errorMessage + `Resource tags are missing: ${resource.url}`) return false } return true From 42fc988bfbf313f090ba021b90a347421b4bf9e6 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 14:59:45 +0100 Subject: [PATCH 11/20] Test workflow validation for resource hub --- .github/scripts/validateResources.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/validateResources.js b/.github/scripts/validateResources.js index 873ab389..b356ce02 100644 --- a/.github/scripts/validateResources.js +++ b/.github/scripts/validateResources.js @@ -5,7 +5,7 @@ const communityResourcesPath = './components/ResourceHub/community-resources.json' const validateResource = (resource, index, resources) => { - const errorMessage = 'community-resources.json:1:1:' + const errorMessage = resourcesPath + ':1:1:' if (resources.findIndex(r => r.url === resource.url) !== index) { console.log(errorMessage + `Duplicate resource: ${resource.url}`) return false From 310dc5a44e6adc0accbad11d38a513447317b4f5 Mon Sep 17 00:00:00 2001 From: louis-md Date: Thu, 21 Mar 2024 15:02:55 +0100 Subject: [PATCH 12/20] Fix github action for validating JSON resources --- .github/workflows/resource-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml index a5d6c77e..c8c9e7a8 100644 --- a/.github/workflows/resource-check.yml +++ b/.github/workflows/resource-check.yml @@ -17,4 +17,4 @@ jobs: - name: Validate resource hub JSON files env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: node .github/scripts/validateResources.js | reviewdog -efm="%f:%l:%c:%m" -name="Validate Resources" -reporter=github-pr-check -fail-on-error=true \ No newline at end of file + run: node .github/scripts/validateResources.js | reviewdog -efm="%f:%l:%c:%m" -name="Validate Resources" -reporter=github-check -fail-on-error=true \ No newline at end of file From 8e8f90cd879d1a010ed5c1c589c454fcb22ba36f Mon Sep 17 00:00:00 2001 From: louis-md Date: Fri, 22 Mar 2024 14:30:22 +0100 Subject: [PATCH 13/20] Validate resources in prepush commit hook rather than github action workflow --- .github/scripts/validateResources.js | 21 ++++++++++++++------- .github/workflows/resource-check.yml | 20 -------------------- package.json | 2 +- 3 files changed, 15 insertions(+), 28 deletions(-) delete mode 100644 .github/workflows/resource-check.yml diff --git a/.github/scripts/validateResources.js b/.github/scripts/validateResources.js index b356ce02..9572f6b6 100644 --- a/.github/scripts/validateResources.js +++ b/.github/scripts/validateResources.js @@ -5,29 +5,36 @@ const communityResourcesPath = './components/ResourceHub/community-resources.json' const validateResource = (resource, index, resources) => { - const errorMessage = resourcesPath + ':1:1:' if (resources.findIndex(r => r.url === resource.url) !== index) { - console.log(errorMessage + `Duplicate resource: ${resource.url}`) + console.log(`Duplicate resource`) return false } if (!resource.name) { - console.log(errorMessage + `Resource name is missing: ${resource.url}`) + console.log(`Resource name is missing`) return false } if (!resource.type) { - console.log(errorMessage + `Resource type is missing: ${resource.url}`) + console.log(`Resource type is missing`) return false } if (!resource.date) { - console.log(errorMessage + `Resource date is missing: ${resource.url}`) + console.log(`Resource date is missing`) return false } if (!resource.description) { - console.log(errorMessage + `Resource description is missing: ${resource.url}`) + console.log(`Resource description is missing`) return false } if (!resource.tags || !resource.tags.length) { - console.log(errorMessage + `Resource tags are missing: ${resource.url}`) + 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 diff --git a/.github/workflows/resource-check.yml b/.github/workflows/resource-check.yml deleted file mode 100644 index c8c9e7a8..00000000 --- a/.github/workflows/resource-check.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Validate resource hub JSON - -on: pull_request - -jobs: - generate-supported-networks: - runs-on: ubuntu-latest - steps: - - name: Use Node.js 20.x - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - uses: reviewdog/action-setup@v1 - with: - reviewdog_version: latest - - uses: actions/checkout@v4 - - name: Validate resource hub JSON files - env: - REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: node .github/scripts/validateResources.js | reviewdog -efm="%f:%l:%c:%m" -name="Validate Resources" -reporter=github-check -fail-on-error=true \ No newline at end of file diff --git a/package.json b/package.json index 47ae4f1d..3d61ba65 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "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": { From 1723372829e9e8859f9ce884f663cadc3ce70a3d Mon Sep 17 00:00:00 2001 From: louis-md Date: Fri, 22 Mar 2024 14:30:48 +0100 Subject: [PATCH 14/20] Restore community resource from workflow test --- components/ResourceHub/community-resources.json | 1 + 1 file changed, 1 insertion(+) diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index 5e7fe9da..26f0990d 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -208,6 +208,7 @@ "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 Gnosis SDK", "url": "https://mirror.xyz/0xa1AC2cC82249A44892802a99CA84c4ed1072B29C/lL8AYV_b4VzTbojuZEprrxD7-RTTap2IMIS8qIObfl8", "type": "Blog Post", "date": "2021-11-15", From dbbfd1f51b59ca33c3d545e6fa516ba1adafa37e Mon Sep 17 00:00:00 2001 From: louis-md Date: Fri, 22 Mar 2024 15:28:27 +0100 Subject: [PATCH 15/20] Keep existing titles for resources when getting open graph data --- .github/scripts/getResourcesOg.js | 8 ++--- .../ResourceHub/community-resources.json | 35 +++++++++---------- components/ResourceHub/company-resources.json | 30 ++++++++-------- 3 files changed, 35 insertions(+), 38 deletions(-) diff --git a/.github/scripts/getResourcesOg.js b/.github/scripts/getResourcesOg.js index d35687e1..a40a14d4 100644 --- a/.github/scripts/getResourcesOg.js +++ b/.github/scripts/getResourcesOg.js @@ -21,11 +21,11 @@ const updateResourceOg = async () => { resources.map(async resource => { const og = await getResourceOg(resource.url) return { - name: og.ogTitle, + name: resource.name ?? og.ogTitle, url: resource.url, type: resource.type, date: resource.date, - description: og.ogDescription ?? resource.description, + description: resource.description ?? og.ogDescription, tags: resource.tags, image: og.ogImage[0]?.url } @@ -36,11 +36,11 @@ const updateResourceOg = async () => { communityResources.map(async resource => { const og = await getResourceOg(resource.url) return { - name: og.ogTitle, + name: resource.name ?? og.ogTitle, url: resource.url, type: resource.type, date: resource.date, - description: og.ogDescription ?? resource.description, + description: resource.description ?? og.ogDescription, tags: resource.tags, ...(!(parseInt(og.ogImage[0].height) < 60) && { image: og.ogImage[0].url diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index 26f0990d..2504236c 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -24,7 +24,7 @@ "image": "https://i.ytimg.com/vi/FUytj_xStDI/maxresdefault.jpg" }, { - "name": "How do you add a custom network to the Gnosis Safe UI?", + "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", @@ -36,7 +36,7 @@ "image": "https://i.ytimg.com/vi/E3v6p87bsYg/maxresdefault.jpg" }, { - "name": "Gnosis Safe Tutorial | Multisig Wallet for DeFi", + "name": "Safe Wallet Tutorial | Multisig Wallet for DeFi", "url": "https://www.youtube.com/watch?v=GHyxe32Z814", "type": "Video", "date": "2022-05-02", @@ -48,7 +48,7 @@ "image": "https://i.ytimg.com/vi/GHyxe32Z814/maxresdefault.jpg" }, { - "name": "Safe 🛠 Build a Group Wallet to Buy things with Frens using Safe {Core} Account Abstraction SDK", + "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", @@ -60,7 +60,7 @@ "image": "https://i.ytimg.com/vi/czGf5YgWs7M/maxresdefault.jpg" }, { - "name": "How to Create a MultiSig Wallet Using Gnosis SAFE", + "name": "How to Create a MultiSig Wallet Using Safe", "url": "https://www.youtube.com/watch?v=JoFYldw6hVE", "type": "Video", "date": "2022-11-05", @@ -72,7 +72,7 @@ "image": "https://i.ytimg.com/vi/JoFYldw6hVE/maxresdefault.jpg" }, { - "name": "Step-by-Step Guide to SAFE: The Ultimate Multisig Wallet for DeFi", + "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", @@ -84,7 +84,7 @@ "image": "https://i.ytimg.com/vi/3edvkNc7Es0/maxresdefault.jpg" }, { - "name": "SAFE Smart Contract Multi-Sig Storage 🔒 (Better than Hardware Wallet!⭐️) Step-by-Step Setup Guide ✅", + "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", @@ -96,7 +96,7 @@ "image": "https://i.ytimg.com/vi/EPa9I3LDplA/maxresdefault.jpg" }, { - "name": "Gnosis MultiSig Contract Deep Dive", + "name": "Safe MultiSig Contract Deep Dive", "url": "https://www.youtube.com/watch?v=_2ZJ5HBEfUk", "type": "Video", "date": "2022-02-25", @@ -120,7 +120,7 @@ "image": "https://i.ytimg.com/vi/fbZBVpBgq_4/maxresdefault.jpg" }, { - "name": "Ethereum: Can a SAFE be deployed using a paymaster / gasless transaction?", + "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", @@ -146,7 +146,7 @@ "image": "https://i.ytimg.com/vi/GFkNdPAzEwI/maxresdefault.jpg" }, { - "name": "ERC-4337 Account Abstraction | Foundry, Next.js/Wagmi/Viem to StackUp/Candide/Alchemy", + "name": "ERC-4337 Account Abstraction", "url": "https://www.youtube.com/watch?v=v_V4Wqcn7vE", "type": "Video", "date": "2024-01-22", @@ -159,10 +159,10 @@ "image": "https://i.ytimg.com/vi/v_V4Wqcn7vE/maxresdefault.jpg" }, { - "name": "Staying safe with Safe - Ackee Blockchain", + "name": "Staying safe with Safe", "url": "https://ackeeblockchain.com/blog/staying-safe-with-safe/", "type": "Blog Post", - "date": "2023-10-09", + "date": "2024-03-15", "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", @@ -175,7 +175,6 @@ "url": "https://docs.pimlico.io/permissionless/how-to/accounts/use-safe-account", "type": "Blog Post", "date": "2024-02-12", - "description": "This guide will walk you through how to create and use a Safe account with permissionless.js.", "tags": [ "Tutorial", "Safe Smart Account", @@ -184,7 +183,7 @@ "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": "Safe Smart Account | Aarc Documentation", + "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", @@ -196,11 +195,10 @@ "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", + "name": "Safe Study (Japanese)", "url": "https://zenn.dev/kozayupapa/articles/877ca3c93fc4a9", "type": "Blog Post", "date": "2023-05-09", - "description": "ERC-4337(AccountAbstraction) 等のライブラリを提供しているSafeについて理解を深めるため、下記のドキュメントを要約していきたいとおもいます。", "tags": [ "Tutorial", "Safe Smart Account" @@ -208,7 +206,7 @@ "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 Gnosis SDK", + "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", @@ -220,7 +218,7 @@ "image": "https://images.mirror-media.xyz/publication-images/qRKvOeobltP7TYuezDuC0.png?height=452&width=452" }, { - "name": "Build a treasury wallet with multisignature Gnosis Safe - LogRocket Blog", + "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", @@ -232,11 +230,10 @@ "image": "https://blog.logrocket.com/wp-content/uploads/2022/03/Build-treasury-wallet-multisignature-gnosis-safe-ethereum.png" }, { - "name": "How to Deploy Safe Contracts - Zlog", + "name": "How to Deploy Safe Contracts", "url": "https://www.zlog.in/post/deploy-safe-contracts/", "type": "Blog Post", "date": "2023-10-09", - "description": "A tutorial that explains how to deploy Safe contracts on a blockchain.", "tags": [ "Tutorial", "Safe Smart Account" diff --git a/components/ResourceHub/company-resources.json b/components/ResourceHub/company-resources.json index b3c58a16..24253c5e 100644 --- a/components/ResourceHub/company-resources.json +++ b/components/ResourceHub/company-resources.json @@ -1,6 +1,6 @@ [ { - "name": "Gnosis Safe 🛠 Starting with the Safe Core SDK", + "name": "Starting with the Safe Core SDK", "url": "https://www.youtube.com/watch?v=t2LzhAFBxkI", "type": "Video", "date": "2022-04-28", @@ -12,7 +12,7 @@ "image": "https://i.ytimg.com/vi/t2LzhAFBxkI/maxresdefault.jpg" }, { - "name": "Gnosis Safe 🛠 Safe modding 101: Create your own Safe module", + "name": "Safe modding 101: Create your own Safe module", "url": "https://www.youtube.com/watch?v=nmDYc9PlAic", "type": "Video", "date": "2022-07-04", @@ -24,7 +24,7 @@ "image": "https://i.ytimg.com/vi/nmDYc9PlAic/maxresdefault.jpg" }, { - "name": "Gnosis Safe Safe modding 101: Create your own Safe module", + "name": "Safe modding 101: Create your own Safe module", "url": "https://www.youtube.com/watch?v=QdOfuxxXVBA", "type": "Video", "date": "2022-05-09", @@ -36,7 +36,7 @@ "image": "https://i.ytimg.com/vi/QdOfuxxXVBA/hqdefault.jpg" }, { - "name": "Managing modules and transaction guards - Germán Martínez | Safe Core SDK | Devfolio", + "name": "Managing modules and transaction guards | Safe Core SDK", "url": "https://www.youtube.com/watch?v=Y4PwNkU8OVM", "type": "Video", "date": "2023-02-27", @@ -49,7 +49,7 @@ "image": "https://i.ytimg.com/vi/Y4PwNkU8OVM/maxresdefault.jpg" }, { - "name": "Safe Core SDK 🛠 Managing modules and transaction guards - Germán Martínez", + "name": "Safe Core SDK 🛠 Managing modules and transaction guards", "url": "https://www.youtube.com/watch?v=ppwE9GXC5MA", "type": "Video", "date": "2022-12-08", @@ -62,7 +62,7 @@ "image": "https://i.ytimg.com/vi/ppwE9GXC5MA/maxresdefault.jpg" }, { - "name": "Safe 🛠️ Building with the Safe{Core} SDK - Manuel Gellfart", + "name": "Building with the Safe{Core} SDK", "url": "https://www.youtube.com/watch?v=seQNBoUnwEI", "type": "Video", "date": "2023-08-01", @@ -73,7 +73,7 @@ "image": "https://i.ytimg.com/vi/seQNBoUnwEI/maxresdefault.jpg" }, { - "name": "Navigating the Future of Account Abstraction with Safe | Web3 Native Podcast | Safe | Lukas Schor", + "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", @@ -85,7 +85,7 @@ "image": "https://i1.sndcdn.com/artworks-zY2xFG93XGx669QX-X1pgWw-t500x500.jpg" }, { - "name": "Johannes Moormann: Safe and Account Abstraction | DeFi Drip", + "name": "Defi Drip - Safe and Account Abstraction with Johannes Moormann", "url": "https://www.youtube.com/watch?v=G50rE0129zI", "type": "Podcast", "date": "2023-08-22", @@ -97,7 +97,7 @@ "image": "https://i.ytimg.com/vi/G50rE0129zI/maxresdefault.jpg" }, { - "name": "Richard Meissner (Safe) on Account Abstraction Adoption and Barriers (EP.440) - On the Brink Podcast", + "name": "On the brink - Account Abstraction Adoption and Barriers with Richard Meissner", "url": "https://onthebrink-podcast.com/safe/", "type": "Podcast", "date": "2023-07-26", @@ -121,7 +121,7 @@ "image": "https://images.mirror-media.xyz/nft/9kHb8UBlFkKq7EMDAnFJB.png" }, { - "name": "The AI agent economy is coming. It will run on Smart Accounts.", + "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", @@ -133,7 +133,7 @@ "image": "https://images.mirror-media.xyz/nft/iLnq-8GT4vb6kUflMzjBn.png" }, { - "name": "Enhancing Blockchain Security with ERC-7512: A Standard for repr…", + "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", @@ -145,7 +145,7 @@ "image": "https://images.mirror-media.xyz/publication-images/82e06bfQvabGWD6lCEuI5.png?height=1440&width=2880" }, { - "name": "Safe Modular Smart Account Architecture – Explained", + "name": "Safe Modular Smart Account Architecture - Explained", "url": "https://safe.mirror.xyz/t76RZPgEKdRmWNIbEzi75onWPeZrBrwbLRejuj-iPpQ", "type": "Blog Post", "date": "2023-07-10", @@ -169,7 +169,7 @@ "image": "https://images.mirror-media.xyz/nft/sxVBoT7TfTZRqUvk4UN0K.png" }, { - "name": "Launching Risk Assessment on Safe{Wallet}", + "name": "Redefine security with new Safe{Wallet} transaction risk scanner", "url": "https://safe.mirror.xyz/rInLWZwD_sf7enjoFerj6FIzCYmVMGrrV8Nhg4THdwI", "type": "Blog Post", "date": "2023-07-26", @@ -194,7 +194,7 @@ "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: Addresse…", + "name": "Account Abstraction in a Multichain Landscape - Part 1: Addresses", "url": "https://safe.mirror.xyz/4GcGAOFno-suTCjBewiYH4k4yXPDdIukC5woO5Bjc4w", "type": "Blog Post", "date": "2023-03-22", @@ -351,7 +351,7 @@ "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", + "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", From 50fe670561aa3ee41561de3689706756a7a714b3 Mon Sep 17 00:00:00 2001 From: louis-md Date: Fri, 22 Mar 2024 16:49:58 +0100 Subject: [PATCH 16/20] Keep existing descriptions for resources when getting open graph data --- .../ResourceHub/community-resources.json | 9 ++++++--- components/ResourceHub/company-resources.json | 20 +++++++++---------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index 2504236c..bb3044af 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -175,6 +175,7 @@ "url": "https://docs.pimlico.io/permissionless/how-to/accounts/use-safe-account", "type": "Blog Post", "date": "2024-02-12", + "description": "This guide will walk you through how to create and use a Safe account with permissionless.js.", "tags": [ "Tutorial", "Safe Smart Account", @@ -187,7 +188,7 @@ "url": "https://docs.aarc.xyz/developer-docs/tutorials/safe-smart-wallet", "type": "Blog Post", "date": "2024-02-06", - "description": "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" @@ -199,6 +200,7 @@ "url": "https://zenn.dev/kozayupapa/articles/877ca3c93fc4a9", "type": "Blog Post", "date": "2023-05-09", + "description": "ERC-4337(AccountAbstraction) 等のライブラリを提供しているSafeについて理解を深めるため、下記のドキュメントを要約していきたいとおもいます。", "tags": [ "Tutorial", "Safe Smart Account" @@ -210,7 +212,7 @@ "url": "https://mirror.xyz/0xa1AC2cC82249A44892802a99CA84c4ed1072B29C/lL8AYV_b4VzTbojuZEprrxD7-RTTap2IMIS8qIObfl8", "type": "Blog Post", "date": "2021-11-15", - "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", + "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: How do we distribute these tokens?", "tags": [ "Tutorial", "Safe Core SDK" @@ -222,7 +224,7 @@ "url": "https://blog.logrocket.com/build-treasury-wallet-multisignature-gnosis-safe/", "type": "Blog Post", "date": "2022-03-15", - "description": "Protect your assets on the blockchain with Gnosis Safe, a tool that requires multisignature authentication for sensitive transactions.", + "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 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.", "tags": [ "Tutorial", "Safe Core SDK" @@ -234,6 +236,7 @@ "url": "https://www.zlog.in/post/deploy-safe-contracts/", "type": "Blog Post", "date": "2023-10-09", + "description": "A tutorial that explains how to deploy Safe contracts on a blockchain.", "tags": [ "Tutorial", "Safe Smart Account" diff --git a/components/ResourceHub/company-resources.json b/components/ResourceHub/company-resources.json index 24253c5e..746ef6f8 100644 --- a/components/ResourceHub/company-resources.json +++ b/components/ResourceHub/company-resources.json @@ -113,7 +113,7 @@ "url": "https://safe.mirror.xyz/pyf0meKAyooY1v8GB7z6Ik7o4wPHGTyCOcUf--UU-IA", "type": "Blog Post", "date": "2023-11-13", - "description": "Secure your crypto fast and free with Safe{Wallet} and Google on Gnosis Chain.", + "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" @@ -125,7 +125,7 @@ "url": "https://safe.mirror.xyz/V965PykKzlE1PCuWxBjsCJR12WscLcnMxuvR9E9bP-Y", "type": "Blog Post", "date": "2023-10-25", - "description": "More than half of all Safe transactions on Gnosis Chain are currently made by AI agents, signaling a nascent but growing \"agent economy\".", + "description": "Web3's first billion users may not only be humans, but AI agents.", "tags": [ "Perspectives", "Account Abstraction" @@ -137,7 +137,7 @@ "url": "https://safe.mirror.xyz/Li4Mb4teTEmosE6dAsnJ_iz3aMKOV_4lDU84W4TSfc0", "type": "Blog Post", "date": "2023-09-21", - "description": "Introduction\n", + "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" @@ -149,7 +149,7 @@ "url": "https://safe.mirror.xyz/t76RZPgEKdRmWNIbEzi75onWPeZrBrwbLRejuj-iPpQ", "type": "Blog Post", "date": "2023-07-10", - "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", + "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", @@ -162,7 +162,7 @@ "url": "https://safe.mirror.xyz/4pgiJAEQ2Jt0ij9Ezc8FSOSiRSfVY4Im8FZ0LuICx-8", "type": "Blog Post", "date": "2023-07-06", - "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.", + "description": "Today, the Safe{Core} Account Abstraction SDK added a shiny new tool to its toolbox.", "tags": [ "Introduction" ], @@ -173,7 +173,7 @@ "url": "https://safe.mirror.xyz/rInLWZwD_sf7enjoFerj6FIzCYmVMGrrV8Nhg4THdwI", "type": "Blog Post", "date": "2023-07-26", - "description": "Scan before you send it. Safe has partnered with Redefine to integrate their automated DeFirewall transaction risk scanner right in your Safe{Wallet}.", + "description": "We're excited to bring you news of an important enhancement to your transactional security.", "tags": [ "Security", "Safe Wallet" @@ -185,7 +185,7 @@ "url": "https://safe.mirror.xyz/P83_rVQuUQJAM-SnMpWvsHlN8oLnCeSncD1txyMDqpE", "type": "Blog Post", "date": "2023-04-25", - "description": "TL;DR:\n", + "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", @@ -198,7 +198,7 @@ "url": "https://safe.mirror.xyz/4GcGAOFno-suTCjBewiYH4k4yXPDdIukC5woO5Bjc4w", "type": "Blog Post", "date": "2023-03-22", - "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", + "description": "This is the first article in a series of posts exploring account abstraction in a multichain landscape.", "tags": [ "Deep Dive", "Account Abstraction" @@ -210,7 +210,7 @@ "url": "https://safe.mirror.xyz/FLvQQ5J9qXks0izRl73oC6LiFLofbwFNorwzaEj_xL8", "type": "Blog Post", "date": "2023-03-01", - "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.", + "description": "Safe is launching Safe{Core}, a modular AA stack with Stripe, Gelato, and Web3Auth as launch partners.", "tags": [ "Introduction", "Account Abstraction" @@ -222,7 +222,7 @@ "url": "https://safe.mirror.xyz/tO26nZ4CruKCS8d49pyModJhzHw1TTm2QcMqx2lYaXQ", "type": "Blog Post", "date": "2023-01-18", - "description": "It's time to take back ownership. Collect this manifesto to show your support for self-custody.", + "description": "Not your keys, not your coins.", "tags": [ "Perspectives", "Account Abstraction" From c8fecf0adb8b6488373caa8c73ed4a32348f0a4a Mon Sep 17 00:00:00 2001 From: louis-md Date: Mon, 25 Mar 2024 11:19:04 +0100 Subject: [PATCH 17/20] Copy edit some resources descriptions --- components/ResourceHub/community-resources.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index bb3044af..b4c427fe 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -12,11 +12,11 @@ "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": "Safe muitisig wallets: * Main page: https://safe.global* Available services: https://docs.safe.global/learn/safe-core/safe-core-api/available-services* S...", + "description": "Installation guide for the Safe Transaction Service.", "tags": [ "Introduction", "Safe Transaction Service" @@ -28,7 +28,7 @@ "url": "https://www.youtube.com/watch?v=E3v6p87bsYg", "type": "Video", "date": "2022-11-21", - "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...", + "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...", "tags": [ "Introduction", "Safe Wallet" @@ -76,7 +76,7 @@ "url": "https://www.youtube.com/watch?v=3edvkNc7Es0", "type": "Video", "date": "2023-05-31", - "description": "Join me on Twitter: https://twitter.com/yanneth_ethDeFi newsletter:https://substack.com/@yannethSupport the channel: https://app.gmx.io/#/trade/?ref=yanneth_...", + "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" @@ -88,7 +88,7 @@ "url": "https://www.youtube.com/watch?v=EPa9I3LDplA", "type": "Video", "date": "2023-05-20", - "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 ...", + "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 step.", "tags": [ "Tutorial", "Safe Wallet" @@ -100,7 +100,7 @@ "url": "https://www.youtube.com/watch?v=_2ZJ5HBEfUk", "type": "Video", "date": "2022-02-25", - "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...", + "description": "In this meetup event, Jefferson presented on Gnosis MultiSig Contract...", "tags": [ "Deep Dive", "Safe Smart Account" @@ -112,7 +112,7 @@ "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)I hope you found a solution that worked for you :) The Content (e...", + "description": "Differences between createTransaction and createTransactionBatch (@safe-global/protocol-kit)I hope you found a solution that worked for you. The Content (e...", "tags": [ "Deep Dive", "Safe Smart Account" @@ -137,7 +137,7 @@ "url": "https://www.youtube.com/watch?v=GFkNdPAzEwI", "type": "Video", "date": "2023-11-13", - "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...", + "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...", "tags": [ "Tutorial", "Safe Smart Account", From ecab91251e3351816464d15b0fb7e50d5f987418 Mon Sep 17 00:00:00 2001 From: louis-md Date: Mon, 25 Mar 2024 11:36:34 +0100 Subject: [PATCH 18/20] Add resource hub validation section to CONTRIBUTING.md --- CONTRIBUTING.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0adb87db..cabfbf39 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,6 +8,15 @@ 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. +### Resource Hub approval process + +The Safe team will review the submission and provide feedback. Once the submission is approved, the Safe team will merge the submission into the Resource Hub, by: + +- Adding the new entry (`url`, `tags`, and `date`) to the [community-resources.json](./components/ResourceHub/community-resources.json) file; +- Running the `pnpm get-resources-og` script to fetch Open Graph metadata for the new resource automatically; +- (Optional) Edit the copy for `name` and `description`. + + ## Using Vale Install the [Vale CLI](https://vale.sh/docs/vale-cli/installation/) and run the following command: From fa800b65cb3284ff073a8691d66f3dc0ef3731da Mon Sep 17 00:00:00 2001 From: louis-md Date: Mon, 25 Mar 2024 11:45:04 +0100 Subject: [PATCH 19/20] Trim resource descriptions of more than 200 characters --- .github/scripts/getResourcesOg.js | 6 ++++-- .github/scripts/validateResources.js | 4 ++++ components/ResourceHub/community-resources.json | 6 +++--- components/ResourceHub/company-resources.json | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/scripts/getResourcesOg.js b/.github/scripts/getResourcesOg.js index a40a14d4..3b541810 100644 --- a/.github/scripts/getResourcesOg.js +++ b/.github/scripts/getResourcesOg.js @@ -20,12 +20,13 @@ const updateResourceOg = async () => { const updatedResources = await Promise.all( 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: resource.description ?? og.ogDescription, + description: description.length > 197 ? description.slice(0, 197) + '...' : description, tags: resource.tags, image: og.ogImage[0]?.url } @@ -35,12 +36,13 @@ const updateResourceOg = async () => { const updatedCommunityResources = await Promise.all( 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: resource.description ?? og.ogDescription, + description: description.length > 197 ? description.slice(0, 197) + '...' : description, tags: resource.tags, ...(!(parseInt(og.ogImage[0].height) < 60) && { image: og.ogImage[0].url diff --git a/.github/scripts/validateResources.js b/.github/scripts/validateResources.js index 9572f6b6..b9ee9000 100644 --- a/.github/scripts/validateResources.js +++ b/.github/scripts/validateResources.js @@ -25,6 +25,10 @@ const validateResource = (resource, index, resources) => { 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 diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index b4c427fe..6919c24e 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -88,7 +88,7 @@ "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 step.", + "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" @@ -212,7 +212,7 @@ "url": "https://mirror.xyz/0xa1AC2cC82249A44892802a99CA84c4ed1072B29C/lL8AYV_b4VzTbojuZEprrxD7-RTTap2IMIS8qIObfl8", "type": "Blog Post", "date": "2021-11-15", - "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: 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" @@ -224,7 +224,7 @@ "url": "https://blog.logrocket.com/build-treasury-wallet-multisignature-gnosis-safe/", "type": "Blog Post", "date": "2022-03-15", - "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 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" diff --git a/components/ResourceHub/company-resources.json b/components/ResourceHub/company-resources.json index 746ef6f8..c9ef385e 100644 --- a/components/ResourceHub/company-resources.json +++ b/components/ResourceHub/company-resources.json @@ -77,7 +77,7 @@ "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 strategies, ", + "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" From 7d2bf34336e6d18af12f5d29dc872f6ef3a8f22f Mon Sep 17 00:00:00 2001 From: Tanay Pant Date: Mon, 25 Mar 2024 15:09:39 +0100 Subject: [PATCH 20/20] fix: minor updates --- CONTRIBUTING.md | 24 ++++++++----- .../ResourceHub/community-resources.json | 20 +++++------ components/ResourceHub/company-resources.json | 36 +++++++++---------- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cabfbf39..4b5a741c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,14 +8,22 @@ 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. -### Resource Hub approval process - -The Safe team will review the submission and provide feedback. Once the submission is approved, the Safe team will merge the submission into the Resource Hub, by: - -- Adding the new entry (`url`, `tags`, and `date`) to the [community-resources.json](./components/ResourceHub/community-resources.json) file; -- Running the `pnpm get-resources-og` script to fetch Open Graph metadata for the new resource automatically; -- (Optional) Edit the copy for `name` and `description`. - +### 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 diff --git a/components/ResourceHub/community-resources.json b/components/ResourceHub/community-resources.json index 6919c24e..57340749 100644 --- a/components/ResourceHub/community-resources.json +++ b/components/ResourceHub/community-resources.json @@ -4,7 +4,7 @@ "url": "https://www.youtube.com/watch?v=zn6omKzm3BI", "type": "Video", "date": "2022-11-30", - "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...", + "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" @@ -28,7 +28,7 @@ "url": "https://www.youtube.com/watch?v=E3v6p87bsYg", "type": "Video", "date": "2022-11-21", - "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...", + "description": "How do you add a custom network to the Safe UI? The Content (except music & images) is licensed unde...", "tags": [ "Introduction", "Safe Wallet" @@ -40,7 +40,7 @@ "url": "https://www.youtube.com/watch?v=GHyxe32Z814", "type": "Video", "date": "2022-05-02", - "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...", + "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" @@ -52,7 +52,7 @@ "url": "https://www.youtube.com/watch?v=czGf5YgWs7M", "type": "Video", "date": "2023-05-05", - "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...", + "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" @@ -64,7 +64,7 @@ "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 Gnosis SAFE. Multisig wallets are more secure than regular wallets because they require m...", + "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" @@ -100,7 +100,7 @@ "url": "https://www.youtube.com/watch?v=_2ZJ5HBEfUk", "type": "Video", "date": "2022-02-25", - "description": "In this meetup event, Jefferson presented on Gnosis MultiSig Contract...", + "description": "In this meetup event, Jefferson presented on MultiSig Contract...", "tags": [ "Deep Dive", "Safe Smart Account" @@ -108,11 +108,11 @@ "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)I hope you found a solution that worked for you. The Content (e...", + "description": "Differences between createTransaction and createTransactionBatch (@safe-global/protocol-kit). The Content (e...", "tags": [ "Deep Dive", "Safe Smart Account" @@ -124,7 +124,7 @@ "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?I hope you found a solution that worked for you :) The Content (except music & images) is lice...", + "description": "Can a Safe be deployed using a paymaster / gasless transaction? The Content (except music & images) is lice...", "tags": [ "Tutorial", "Safe Smart Account", @@ -137,7 +137,7 @@ "url": "https://www.youtube.com/watch?v=GFkNdPAzEwI", "type": "Video", "date": "2023-11-13", - "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...", + "description": "How to deploy a Safe on Hardhat. The Content (except music & images) is licensed under (https://meta.stackex...", "tags": [ "Tutorial", "Safe Smart Account", diff --git a/components/ResourceHub/company-resources.json b/components/ResourceHub/company-resources.json index c9ef385e..85ad0f9a 100644 --- a/components/ResourceHub/company-resources.json +++ b/components/ResourceHub/company-resources.json @@ -4,7 +4,7 @@ "url": "https://www.youtube.com/watch?v=t2LzhAFBxkI", "type": "Video", "date": "2022-04-28", - "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...", + "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" @@ -16,7 +16,7 @@ "url": "https://www.youtube.com/watch?v=nmDYc9PlAic", "type": "Video", "date": "2022-07-04", - "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...", + "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" @@ -28,7 +28,7 @@ "url": "https://www.youtube.com/watch?v=QdOfuxxXVBA", "type": "Video", "date": "2022-05-09", - "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-...", + "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" @@ -40,7 +40,7 @@ "url": "https://www.youtube.com/watch?v=Y4PwNkU8OVM", "type": "Video", "date": "2023-02-27", - "description": "Germán Martínez sheds light on modules, architecture and transaction flow on Safe Core SDK.", + "description": "This workshop sheds light on modules, architecture and transaction flow on Safe Core SDK.", "tags": [ "Deep Dive", "Modules", @@ -53,7 +53,7 @@ "url": "https://www.youtube.com/watch?v=ppwE9GXC5MA", "type": "Video", "date": "2022-12-08", - "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...", + "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", @@ -66,7 +66,7 @@ "url": "https://www.youtube.com/watch?v=seQNBoUnwEI", "type": "Video", "date": "2023-08-01", - "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}. ...", + "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" ], @@ -234,7 +234,7 @@ "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, DAO Coordination Lead at Safe‣ Brief...", + "description": "Safe Community Call #1 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...", "tags": [ "Community Call" ], @@ -245,7 +245,7 @@ "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, DAO Coordination Lead at Safe includ...", + "description": "Safe Community Call #2 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...", "tags": [ "Community Call" ], @@ -256,7 +256,7 @@ "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 ‣ Safe Gover...", + "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" ], @@ -267,7 +267,7 @@ "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, DAO Coordination ...", + "description": "Safe Community Call #4 features updates from the Safe Ecosystem including: ETHIndia Recap and Safe Governance updates from Theodor Beutel...", "tags": [ "Community Call" ], @@ -278,7 +278,7 @@ "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, DAO Coordination Lead at Safe‣ Prese...", + "description": "Safe Community Call #5 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...", "tags": [ "Community Call" ], @@ -289,7 +289,7 @@ "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, DAO Coordination Lead at Safe‣ Pres...", + "description": "Safe Community Call #6 features updates from the Safe Ecosystem including: Safe Governance updates from Theodor Beutel...", "tags": [ "Community Call" ], @@ -300,7 +300,7 @@ "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...", + "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" ], @@ -311,7 +311,7 @@ "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...", + "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" ], @@ -322,7 +322,7 @@ "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...", + "description": "Safe Community Call #9 features updates from the Safe Ecosystem including: Grants Council Election Updates, SafeDAO Governance, Ecosystem Spotlight: BrahmaL...", "tags": [ "Community Call" ], @@ -333,7 +333,7 @@ "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: CoinshiftAll links here:https://linktr.ee...", + "description": "Agenda includes:- Community Updates- Grants- Safe{Wallet} x Redefine Demo- SafeDAO Governance- Ecosystem Spotlight: Coinshift...", "tags": [ "Community Call" ], @@ -344,7 +344,7 @@ "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‣...", + "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" ], @@ -355,7 +355,7 @@ "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 ...", + "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" ],