diff --git a/.github/ISSUE_TEMPLATE/docs_request.yml b/.github/ISSUE_TEMPLATE/docs_request.yml index c2fc35229c..2f36b47d88 100644 --- a/.github/ISSUE_TEMPLATE/docs_request.yml +++ b/.github/ISSUE_TEMPLATE/docs_request.yml @@ -30,4 +30,4 @@ body: id: other attributes: label: Additional context - description: Add any other context or screenshots about the concern can be added here. + description: Add any additional context or screenshots about the concern here. diff --git a/README.md b/README.md index c61cfdd9c7..aa06b1f34c 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Base is a secure, low-cost, developer-friendly Ethereum L2 built to bring the ne ## Setup -1. Ensure `nvm` is [installed](https://github.com/nvm-sh/nvm#install--update-script). +1. Ensure that `nvm` is [installed](https://github.com/nvm-sh/nvm#install--update-script). 2. Clone the repository. 3. If `nvm` doesn't auto-load the Node.js environment when changing to the repo directory, run `nvm use`. 4. Enable Yarn by running `corepack enable`. @@ -71,7 +71,7 @@ yarn workspace @app/bridge dev ## Contributing -We welcome contributions to Base! To contribute, please see [CONTRIBUTING.md](CONTRIBUTING.md). +We welcome contributions to Base! For guidelines on how to contribute please refer to [CONTRIBUTING.md](CONTRIBUTING.md). ### Updating the Base Ecosystem Page @@ -81,7 +81,7 @@ If you're a builder who wants to add or update your project on the [Base Ecosyst 2. Create a new branch for your changes. -3. Update the `web/apps/web/src/data/ecosystem.json` with your project information. All fields are required. Each entry should follow this format: +3. Update the `web/apps/web/src/data/ecosystem.json` with your project information. All fields are required. Each entry should follow the format below: ```json { @@ -100,11 +100,11 @@ If you're a builder who wants to add or update your project on the [Base Ecosyst - imageUrl: Path to your project's logo image - category: Your project's category, _one_ of: `consumer`, `defi`, `infra`, `onramp`, `wallet` - subcategory: Your project's subcategory, with the following options associated with each category - - `consumer`: _One_ of `creator`, `crypto taxes`, `dao`, `gaming`, `messaging`, `music`, `nft`, `payments`, `real world`, `social` - - `defi`: _One_ of `dex`, `dex aggregator`, `insurance`, `lending/borrowing`, `liquidity management`, `portfolio`, `stablecoin`, `yield vault` - - `infra`: _One_ of `ai`, `bridge`, `data`, `depin`, `developer tool`, `identity`, `node provider`, `raas`, `security` - - `onramp`: _One_ of `centralized exchange`, `fiat on-ramp` - - `wallet`: _One_ of `account abstraction`, `multisig`, `self-custody` + - `consumer`: _One_ of `creator`, `crypto taxes`, `dao`, `gaming`, `messaging`, `music`, `nft`, `payments`, `real world`, `social` + - `defi`: _One_ of `dex`, `dex aggregator`, `insurance`, `lending/borrowing`, `liquidity management`, `portfolio`, `stablecoin`, `yield vault` + - `infra`: _One_ of `ai`, `bridge`, `data`, `depin`, `developer tool`, `identity`, `node provider`, `raas`, `security` + - `onramp`: _One_ of `centralized exchange`, `fiat on-ramp` + - `wallet`: _One_ of `account abstraction`, `multisig`, `self-custody` 4. When adding and/or updating a logo, place a 192x192 pixel PNG file in the `web/apps/web/public/images/partners/`. The file should be named appropriately (e.g., your-project-name.png). The logo should be an App Store or Play Store iconographic version, not a full wordmark. @@ -114,12 +114,14 @@ By opening a PR to add your project, you authorize and license Coinbase on a non **Note:** Submissions do not guarantee inclusion and all submissions are subject to review. Your project must be live on Base to potentially be included. Ensure all information is accurate and up-to-date. -#### Tips for a successful submission +#### Submission requirements +- App content adheres to the [Base Editorial Style Guide](https://github.com/base-org/brand-kit/blob/main/guides/editorial-style-guide.md) - App has been live on Base for at least 30 days - App has a Terms of Service and Privacy Policy - App supports HTTPS and 301 redirects HTTP requests -- App is not a TGE, ICO, airdrop, claim, or similar +- App is not a TGE (Token Generation Event), ICO (Initial Coin Offering), airdrop, claim, or similar +- Landing page is a Base-specific page for users who will becoming from base.org - Active development and community engagement can be observed without issue --- diff --git a/apps/base-docs/base-learn/docs/arrays/arrays-exercise.md b/apps/base-docs/base-learn/docs/arrays/arrays-exercise.md index eefecff938..dbb3e6016a 100644 --- a/apps/base-docs/base-learn/docs/arrays/arrays-exercise.md +++ b/apps/base-docs/base-learn/docs/arrays/arrays-exercise.md @@ -50,7 +50,7 @@ Write a function called `appendToNumbers` that takes a `uint[] calldata` array c At the contract level, add an `address` array called `senders` and a `uint` array called `timestamps`. -Write a function called `saveTimestamp` that takes a `uint` called `_unixTimestamp` as an argument. When called, it should add the address of the caller to the end of `senders` and the `_unixTimeStamp` to `timestamps`. +Write a function called `saveTimestamp` that takes a `uint` called `_unixTimestamp` as an argument. When called, it should add the address of the caller to the end of `senders` and the `_unixTimestamp` to `timestamps`. :::tip diff --git a/apps/base-docs/base-learn/docs/imports/imports-sbs.md b/apps/base-docs/base-learn/docs/imports/imports-sbs.md index 9444062239..83e5aba229 100644 --- a/apps/base-docs/base-learn/docs/imports/imports-sbs.md +++ b/apps/base-docs/base-learn/docs/imports/imports-sbs.md @@ -31,7 +31,7 @@ Find the documentation for the `EnumerableSet` under _Utils_. This library will Create a new file to work in and add the `pragma` and license identifier. -In Remix, you can import libraries directly from Github! +In Remix, you can import libraries directly from GitHub! ```solidity import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/EnumerableSet.sol"; diff --git a/apps/base-docs/base-learn/docs/storage/simple-storage-sbs.md b/apps/base-docs/base-learn/docs/storage/simple-storage-sbs.md index 82605b02cd..bea6deeba4 100644 --- a/apps/base-docs/base-learn/docs/storage/simple-storage-sbs.md +++ b/apps/base-docs/base-learn/docs/storage/simple-storage-sbs.md @@ -149,7 +149,7 @@ Review the **Warning** in the [layout] section of the docs for more details! ### Add a Function to Update `age` -It would also be good to be able to update the `age` value. This problem has slightly different considerations. Sadly, `age` will never go down. It should also probably only go up by one year for each update. The `++` operator works in Solidity, so we can use that to create a function that simple increments age when called. +It would also be good to be able to update the `age` value. This problem has slightly different considerations. Sadly, `age` will never go down. It should also probably only go up by one year for each update. The `++` operator works in Solidity, so we can use that to create a function that simply increments age when called.
diff --git a/apps/base-docs/docs/tools/block-explorers.md b/apps/base-docs/docs/tools/block-explorers.md index 1cac84bd67..5117b755ee 100644 --- a/apps/base-docs/docs/tools/block-explorers.md +++ b/apps/base-docs/docs/tools/block-explorers.md @@ -84,7 +84,7 @@ A testnet explorer for [Base Sepolia](https://sepolia.basescan.org/) is also ava ## Routescan -[Routescan](https://superscan.network/) superchain explorer allows you to search for transactions, addresses, tokens, prices and other activities taking place across all Superchain blockchains, including Base. +[Routescan](https://routescan.io) superchain explorer allows you to search for transactions, addresses, tokens, prices and other activities taking place across all Superchain blockchains, including Base. --- diff --git a/apps/base-docs/docs/tools/data-indexers.md b/apps/base-docs/docs/tools/data-indexers.md index 1ebbd3a908..cd04a28c69 100644 --- a/apps/base-docs/docs/tools/data-indexers.md +++ b/apps/base-docs/docs/tools/data-indexers.md @@ -98,7 +98,7 @@ To get started, visit the [documentation](https://docs.envio.dev/docs/overview) ## GhostGraph -[GhostGraph](https://GhostGraph.xyz/) makes it easy to build blazingly fast indexers (subgraphs) for smart contracts. +[GhostGraph](https://ghostgraph.xyz/) makes it easy to build blazingly fast indexers (subgraphs) for smart contracts. GhostGraph is the first indexing solution that lets you write your index transformations in **Solidity**. Base dApps can query data with GraphQL using our hosted endpoints. diff --git a/apps/base-docs/docs/tools/network-faucets.md b/apps/base-docs/docs/tools/network-faucets.md index cf3a104f40..3899211627 100644 --- a/apps/base-docs/docs/tools/network-faucets.md +++ b/apps/base-docs/docs/tools/network-faucets.md @@ -27,11 +27,11 @@ hide_table_of_contents: true ## Coinbase Developer Platform -The [Coinbase Developer Platform Faucet](https://portal.cdp.coinbase.com/products/faucet) provides free testnet ETH on Base Sepolia - one claim per 24 hours. +The [Coinbase Developer Platform Faucet](https://portal.cdp.coinbase.com/products/faucet) provides free testnet ETH on Base Sepolia - one claim every 7 days. :::info -Requests to Coinbase Developer Platform's Faucet are limited to one claim per 24 hours. +Requests to Coinbase Developer Platform's Faucet are limited to one every 7 days. ::: diff --git a/apps/base-docs/tutorials/docs/0_deploy-with-hardhat.md b/apps/base-docs/tutorials/docs/0_deploy-with-hardhat.md index ffb994f2c9..9cbf8f4ddf 100644 --- a/apps/base-docs/tutorials/docs/0_deploy-with-hardhat.md +++ b/apps/base-docs/tutorials/docs/0_deploy-with-hardhat.md @@ -291,7 +291,7 @@ etherscan: { :::info -When verifying a contract with Basescan on testnet (Sepolia), an API key is not required. You can leave the value as `PLACEHOLDER_STRING`. On mainnet, you can get your Basescan API key from [here](https://basescan.org/myapikey) after you sign up for an account. +You can get your Basescan API key from [basescan.org](https://basescan.org/myapikey) when you sign up for an account. ::: diff --git a/apps/base-docs/tutorials/docs/0_deploy-with-tenderly.md b/apps/base-docs/tutorials/docs/0_deploy-with-tenderly.md index c45d258051..69fc704dcf 100644 --- a/apps/base-docs/tutorials/docs/0_deploy-with-tenderly.md +++ b/apps/base-docs/tutorials/docs/0_deploy-with-tenderly.md @@ -417,4 +417,4 @@ For more information on the Tenderly full-stack infrastructure, check out the fo - [Documentation](https://docs.tenderly.co/) - [Blog](https://blog.tenderly.co/) -- [Twitter](https://twitter.com/TenderlyApp) +- [Twitter](https://x.com/TenderlyApp) diff --git a/apps/base-docs/tutorials/docs/1_1_coinbase-smart-wallet.md b/apps/base-docs/tutorials/docs/1_1_coinbase-smart-wallet.md index 641a7b3f9c..2b111062dd 100644 --- a/apps/base-docs/tutorials/docs/1_1_coinbase-smart-wallet.md +++ b/apps/base-docs/tutorials/docs/1_1_coinbase-smart-wallet.md @@ -433,7 +433,7 @@ In this tutorial, you've learned how to connect users to your onchain app with t [Testnet Opensea]: https://testnets.opensea.io/ [deploy]: https://docs.base.org/tutorials?tag=smart%20contracts [Sepolia Basescan]: https://sepolia.basescan.org/ -[BOAT]: https://www.smartwallet.dev/guides/create-app/using-boat +[BOAT]: https://www.smartwallet.dev/guides/create-app/using-onchain-app-template [wagmi template]: https://www.smartwallet.dev/guides/create-app/using-wagmi [Coinbase Developer Platform (CDP)]: https://portal.cdp.coinbase.com/ [Base Gasless Campaign]: https://www.smartwallet.dev/base-gasless-campaign diff --git a/apps/base-docs/tutorials/docs/2_email-campaign-with-resend.md b/apps/base-docs/tutorials/docs/2_email-campaign-with-resend.md index 47d0866ec3..f4c0a6f23a 100644 --- a/apps/base-docs/tutorials/docs/2_email-campaign-with-resend.md +++ b/apps/base-docs/tutorials/docs/2_email-campaign-with-resend.md @@ -288,7 +288,7 @@ export const EmailTemplate: React.FC> = ({ firstNam ); ``` -In `src/app/page.tsx` add the following section to display wether the user is a member or not: +In `src/app/page.tsx` add the following section to display whether the user is a member or not: ```html
{code && (
- Claim your free creator basename — See you{' '} - Friday at Botanica + Claim your free basename — Thanks for joining us!
)} diff --git a/apps/web/src/components/Basenames/RegistrationSearchInput/index.tsx b/apps/web/src/components/Basenames/RegistrationSearchInput/index.tsx index 70bf4844c1..9332d2f122 100644 --- a/apps/web/src/components/Basenames/RegistrationSearchInput/index.tsx +++ b/apps/web/src/components/Basenames/RegistrationSearchInput/index.tsx @@ -33,7 +33,7 @@ function SuggestionEntry({ }, [handleSelectName, suggestion]); return ( - @@ -217,8 +217,8 @@ export default function RegistrationSearchInput({ const handleSelectName = useCallback( (name: string) => { - setDropdownOpen(false); setSelectedName(name.trim()); + setDropdownOpen(false); }, [setSelectedName], ); @@ -298,7 +298,7 @@ export default function RegistrationSearchInput({ ) : isNameAvailable === true ? ( <> - diff --git a/apps/web/src/components/Basenames/RegistrationSuccessMessage/USDCClaimModal.tsx b/apps/web/src/components/Basenames/RegistrationSuccessMessage/USDCClaimModal.tsx new file mode 100644 index 0000000000..3ec6a9082b --- /dev/null +++ b/apps/web/src/components/Basenames/RegistrationSuccessMessage/USDCClaimModal.tsx @@ -0,0 +1,42 @@ +import classNames from 'classnames'; +import { Button, ButtonVariants } from 'apps/web/src/components/Button/Button'; + +type USDCClaimModalProps = { + message: string; + onClose: () => void; +}; + +function handleButtonClick() { + window.open('https://www.coinbase.com/usdc', '_blank', 'noopener noreferrer'); +} + +function USDCClaimModal({ message, onClose }: USDCClaimModalProps) { + const popupClasses = classNames( + 'fixed top-0 left-0 w-full h-full flex items-center justify-center', + ); + + return ( +
+
+ +

{message}

+ +
+
+ ); +} + +export default USDCClaimModal; diff --git a/apps/web/src/components/Basenames/RegistrationSuccessMessage/index.tsx b/apps/web/src/components/Basenames/RegistrationSuccessMessage/index.tsx index ce8e030181..8280961bdf 100644 --- a/apps/web/src/components/Basenames/RegistrationSuccessMessage/index.tsx +++ b/apps/web/src/components/Basenames/RegistrationSuccessMessage/index.tsx @@ -5,13 +5,40 @@ import { } from 'apps/web/src/components/Basenames/RegistrationContext'; import { Button, ButtonVariants } from 'apps/web/src/components/Button/Button'; import { ActionType } from 'libs/base-ui/utils/logEvent'; -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; +import { useAccount } from 'wagmi'; +import USDCClaimModal from './USDCClaimModal'; export default function RegistrationSuccessMessage() { - const { setRegistrationStep, redirectToProfile } = useRegistration(); + const { setRegistrationStep, redirectToProfile, code } = useRegistration(); + + const { address } = useAccount(); const { logEventWithContext } = useAnalytics(); + const [popupMessage, setPopupMessage] = useState(null); + + const claimUSDC = useCallback(() => { + setPopupMessage('USDC is being sent to your wallet'); + fetch(`${process.env.NEXT_PUBLIC_USDC_URL}?address=${address}`, { + method: 'GET', + headers: { 'Content-Type': 'application/json' }, + }) + .then(async (response) => { + if (!response.ok) { + const resp = (await response.json()) as { error: string }; + throw new Error(resp.error); + } + setPopupMessage('USDC claimed successfully!'); + }) + .catch((error) => { + setPopupMessage(`${error.message}`); + console.error('Error:', error); + }); + }, [address]); + + const closePopup = useCallback(() => setPopupMessage(null), []); + const customizeProfileOnClick = useCallback(() => { logEventWithContext('customize_profile', ActionType.click); setRegistrationStep(RegistrationSteps.Profile); @@ -23,19 +50,28 @@ export default function RegistrationSuccessMessage() { }, [logEventWithContext, redirectToProfile]); return ( -
-

- Congrats! -
This name is yours! -

-
- - + <> + {popupMessage && } +
+

+ Congrats! +
This name is yours! +

+
+ {code ? ( + + ) : ( + + )} + +
-
+ ); } diff --git a/apps/web/src/components/GetStarted/GetInvolved.tsx b/apps/web/src/components/GetStarted/GetInvolved.tsx index b7e0e1d12e..e57c115c56 100644 --- a/apps/web/src/components/GetStarted/GetInvolved.tsx +++ b/apps/web/src/components/GetStarted/GetInvolved.tsx @@ -21,13 +21,21 @@ export default async function GetInvolved() { topRight={} classnames="bg-teal-80 border-teal-80" /> + 04} + topRight={} + classnames="bg-teal-60 border-teal-60" + /> 02} topRight={} - classnames="bg-teal-60 border-teal-60" + classnames="bg-teal-80 border-teal-80" /> 03} topRight={} - classnames="bg-teal-80 border-teal-80" + classnames="bg-teal-60 border-teal-60" />
diff --git a/apps/web/src/components/GetStarted/GetNoticed.tsx b/apps/web/src/components/GetStarted/GetNoticed.tsx index f3c889ffd1..38b9a16e52 100644 --- a/apps/web/src/components/GetStarted/GetNoticed.tsx +++ b/apps/web/src/components/GetStarted/GetNoticed.tsx @@ -21,13 +21,21 @@ export default async function GetNoticed() { topRight={} classnames="bg-pink-60 border-pink-60" /> + 02} + topRight={} + classnames="bg-pink-80 border-pink-80" + /> 02} + topLeft={03} topRight={} - classnames="bg-pink-80 border-pink-80" + classnames="bg-pink-60 border-pink-60" /> diff --git a/apps/web/src/components/NeymarFrame/index.tsx b/apps/web/src/components/NeymarFrame/index.tsx index eda5ea92bf..1bf5b99696 100644 --- a/apps/web/src/components/NeymarFrame/index.tsx +++ b/apps/web/src/components/NeymarFrame/index.tsx @@ -1,7 +1,7 @@ import ImageWithLoading from 'apps/web/src/components/ImageWithLoading'; import { NeynarFrame } from 'apps/web/src/utils/frames'; -// Frame displayed from Neymar API data +// Frame displayed from Neynar API data // No buttons or interactions for now, just a link to the frame source export default function NeymarFrame({ frame }: { hash: string; frame: NeynarFrame }) { return ( diff --git a/apps/web/src/components/base-org/root/SlidingTextSection/index.tsx b/apps/web/src/components/base-org/root/SlidingTextSection/index.tsx index c4e92bd0a5..01f4229573 100644 --- a/apps/web/src/components/base-org/root/SlidingTextSection/index.tsx +++ b/apps/web/src/components/base-org/root/SlidingTextSection/index.tsx @@ -8,7 +8,7 @@ import { CSSProperties, useRef } from 'react'; export default function SlidingTextSection() { const containerRef = useRef(null); - const text = ' Base is for everyone - بایس للجمیع - Base es para todos - 基地适合所有人 - La Base è per tutti - Base est pour tout le monde - Base ni ya kila mtu - Base yɛ ma obiara - Base nye amesiame tɔ - Base ji he ni mɔ fɛɛ mɔ yɔɔ - Base är för alla - Base สำหรับทุกคน - బేస్ అందరి కోసం - बेस सबके लिए है - '; + const text = ' Base is for everyone - بایس للجمیع - Base es para todos - 基地适合所有人 - La Base è per tutti - Base est pour tout le monde - Base ni ya kila mtu - Base yɛ ma obiara - Base nye amesiame tɔ - Base ji he ni mɔ fɛɛ mɔ yɔɔ - Base är för alla - Base สำหรับทุกคน - Бейз для каждого - Бейз для кожного - బేస్ అందరి కోసం - बेस सबके लिए है - '; const containerClasses = classNames( 'relative w-full overflow-hidden rounded-2xl bg-blue p-8', diff --git a/apps/web/src/data/ecosystem.json b/apps/web/src/data/ecosystem.json index d8895ea915..6cdcad6691 100644 --- a/apps/web/src/data/ecosystem.json +++ b/apps/web/src/data/ecosystem.json @@ -1025,8 +1025,8 @@ }, { "name": "Alien Base", - "url": "https://app.alienbase.xyz/", - "description": "Alien Base is the Base-native decentralized exchange ecosystem. Use it to trade blue chip assets and derivatives, or check out Area 51 to play with experimental tokens, predictions and lotteries", + "url": "https://alienbase.xyz/", + "description": "Alien Base is building a Base trading hub for efficiently trading tokens and memecoins onchain. Offering aggregated liquidity, limit orders, yield farming and more, Alien technology helps you use Base.", "category": "defi", "subcategory": "dex", "imageUrl": "/images/partners/alienbase.webp" @@ -3630,5 +3630,29 @@ "imageUrl": "/images/partners/ethgastracker.png", "category": "infra", "subcategory": "data" + }, + { + "name": "BlockAI", + "category": "infra", + "subcategory": "ai", + "description": "BlockAI combines blockchain and AI to offer decentralized access to innovative tools like Text and image generation, video summarization, games, etc.", + "url": "https://base.blockai.dev", + "imageUrl": "/images/partners/blockai.png" + }, + { + "name": "Turnkey", + "category": "infra", + "subcategory": "developer tool", + "description": "Turnkey is an enterprise-grade operating system for wallets: powerful, modular, and built to adapt to any use case from embedded wallets to programmatic backend crypto automation.", + "url": "https://www.turnkey.com/", + "imageUrl": "/images/partners/turnkey.png" + }, + { + "name": "Virtuals Protocol", + "category": "infra", + "subcategory": "ai", + "description": "Virtuals Protocol is building a Society of AI Agents onchain", + "url": "https://app.virtuals.io/", + "imageUrl": "/images/partners/virtuals.png" } ] diff --git a/apps/web/src/hooks/useWriteContractsWithLogs.ts b/apps/web/src/hooks/useWriteContractsWithLogs.ts index 9f187782c2..ee0751e7b3 100644 --- a/apps/web/src/hooks/useWriteContractsWithLogs.ts +++ b/apps/web/src/hooks/useWriteContractsWithLogs.ts @@ -150,7 +150,7 @@ export default function useWriteContractsWithLogs({ return; } - // Onchain TransactionReceipt Successfull with logs + // Onchain TransactionReceipt Successful with logs if (transactionReceipt?.status === 'success' && sendCallsResult?.receipts?.length) { const logs = transactionReceipt.logs; const decodedUserOperationEventLog = logs