October 25

БОЛЬШОЙ ГАЙД ПО BASE

НАВИГАЦИЯ по посту:

  1. Вступление
    / Анонс токена, обзор проекта.
    / Кто есть внутри Base и Сoinbase
  2. ГАЙД ПО ОТРАБОТКЕ и ПОЛУЧЕНИЮ ДРОПА ОТ BASE

/ Подготовка к фарму
/ ОСНОВНЫЕ АКТИВНОСТИ ПОД ДРОП
/ ГАЙД ПО Base Guild + Base Developers

3. ЕБЕМ BASE 2025 / Прокрут Base на каждый день / Прокрут Base раз в неделю / Прокрут Base раз в месяц

4. Конец гайда.

1. Вступление (Анонс токена, обзор проекта).

Так всем привет, сегодня у нас Base. Да-да, та самая сеть от Coinbase, и по которой уже пошел прогрев в связи с анонсом будущего токена $BASE.

Пока одни только ждут дроп, мы разберёмся, как реально подготовиться и залутать дроп.

Base запустилась ещё в 2023, но только в 2025 году экосистема начала разгоняться по-настоящему, до этого были различные ивенты по типу Onchain Summer и других не серьезных как для нас ретродроперов, активностей.

Base это не просто чейн. Это кусок империи Coinbase.

Coinbase = одна из самых жирных компаний в крипте, публичная, с миллиардами оборота.

Они не cделали “чейн ради прикола”. Base это их способ зайти в ончейн, чтобы не просто хранить бабки юзеров, а контролить трафик, комиссии и экосистему проектов.

Короче, если говорить прямо Base это ончейн-дочка Coinbase.

Их движуха выглядит так:

  • Coinbase даёт инфраструктуру, ликвидность, маркетинг, юзеров.
  • Base ончейн сеть, где всё это крутится.

Теперь к цифрам, чтоб понимал масштаб: Coinbase за последний квартал заработали 2 млрд $ выручки и держит 8+ млрд $ чистого кэша.

Это тебе не гаражный проект очередного ненужного L2. У них ресурсы, чтобы сделать Base новым центром ончейна.

Вот даже если сравнивать по количеству билдеров в разные года:

2023:

2024:

2025:

Так что давайте честно: если Coinbase реально выведет Base в топ-3 L2 (а они могут это сделать очень просто, всё что нужно у них уже есть) дроп будет очень жирный.

Также сегодня на момент написания гайда вышла инфа что По данным JPMorgan, токен $BASE от Coinbase может стоить до $34млрд. Но получат его не те, кто “просто почитал про Base”, а те, кто жил там, фармил, бриджил, деплоил, короче, вдохнул Base как родной чейн.

Для начала ещё нужно разобраться кто есть внутри Base и Сoinbase:

Нас интересуют 2е головы, одна лысая и похожая на инопрешеленца, вторая похожая на Стива из Майнкрафта который делал mewing всё детство.

Первая голова(слева), Brian Armstrong: Главный CEO, сооснователь Coinbase.

👉 Он решает:

  • Куда идут миллиарды из Coinbase Ventures.
  • Как распределяется трафик и интеграции.
  • Какого курса придерживается вся корпорация.

Если кратко — он даёт ресурс, связи и крышу.


Вторая голова(справа), Jesse Pollak: Создатель Base. Тот, кто реально строит сеть Base изнутри.

👉 Он отвечает за:

  • Как работает и куда двигается сама сеть Base.
  • Какие проекты получают поддержку и гранты.
  • Как проходят квесты, ивенты и самое главное кому раздавать $BASE.

Если коротко он отвечает, что мы фармим, за что и сколько получим дроп $BASE.

По этому третья часть нашего гайда и будет посвящена ему, его твитам и то как он видит раздачу дропа.

Команда Coinbase делает всё красиво: интеграции с крупными проектами, активные кампании с разработчиками, и куча ончейн-метрик которые растут каждый день.

Дальше переходим к анонсу токена Base

Раньше команда Base стояла на позиции: “никакого токена не будет”.

Теперь всё поменялось. На BaseCamp 2025 Jesse Pollak официально сказал, что они начали рассматривать запуск собственного токена.

При этом Coinbase (а это Brian Armstrong и вся их империя) уже несколько раз намекала, что Base будет двигаться в сторону большей децентрализации. А без токена это невозможно. Так что направление понятно, вопрос только во времени.

Если кратко:

● Токен Base будет. Вопрос уже не “если”, а “когда”.

● Jesse Pollak уже дал сигнал, процесс пошёл.

● Armstrong готовит почву через инфраструктуру и фонды.

Для нас это значит одно: отрабатывать точно нужно, и если вы ранее не занимались этим плотно, то нужно начать уже сейчас.

Так мы плавно и переходим к основной части нашего гайда по фарму токена $BASE.

ГАЙД ПО ОТРАБОТКЕ и ПОЛУЧЕНИЮ ДРОПА ОТ BASE

Тоже состоит из разных частей, от А до Я. По этому в идеале прочитать и сделать всё, но если нету такой возможности, смотрим что хотим сделать и делаем.

Нету точных требований, за что будет дроп. Но если вы постараетесь зацепить всё, дроп вам точно упадёт. По этому советую юзать различные варианты и категории прокрута. Вперёд:

Подготовка к фарму

Самое главное это правильно подготовиться, думаю базовое вы уже сделали, а это имеете $ETH в сети Base. Если нет, идём на любую биржу, покупаем и выводим себе на кошелёк. Либо бриджим через любые мосты из других сетей.

Если у вас на кошельке нету сети Base, что очень маловероятно, то добавляем себе через Chainlist.

Если вы собрались отрабатывать проект не только на 1 аккаунт, в этом случае важно не забыть за правильную отработку, а имено за Антидект Браузер и Прокси.

Можете взять у наших друзей, со скидкой:

- Прокси для мультиакков: 📱 Proxy скидка 10%

- Антидетект браузер: 📱 Ads Power

Сколько нужно $ для отработки 1 аккаунта:

Для полноценного прокрута, с нуля, покупая домены, токены, выполняя Гильдию, минт NFT и тд. Вам понадобится примерно 50-100$ именно по затратам.

Для дополнительного прокрута, который будет ниже в гайде, по дням, неделям и месяцам вам понадобится:

На ежедневный прокрут: 0.2-0.4$

На еженедельный прокрут: 2-4$

На ежемесячный прокрут: 15-20$

В основном затраты на комиссию, в основном они маленькие, но когда есть нагрузка сети, цена за газ, может подскочить.

ОСНОВНЫЕ АКТИВНОСТИ (ВЫСОКИЙ ПРИОРИТЕТ)

Ниже собраны основные активности с высоким приоритетом, которые вы просто обязаны сделать для получения дропа. В идеале каждый день взаимодействовать с Base, а эти активности будут стартом для вас, погнали:

DEFI / NFT

🔵 Набиваем обычные транзакции используя DEXы: Aerodrome, AlienBase, BSX Exchange, либо же свапы через Metamask либо Rabby Wallet, тем самым фармя сразу же 2 дропа одновременно.

🔵 Деплоим смарт-контракты на Owlto, также уникальные транзакции НУЖНО получить сминтив эти NFT:

- Are you onchain?
- BASE GM
- Base and Mono RSA
- Base is for
- Boost Onchain Score
- THE BASE ECOSYSTEM IS GROWING
- Base Universe NFT

🔵 Бриджи делаем через Jumper, Relay, Stargate Finance.

🔵 Активничаем в Zora, Base App, BaseName и Farcaster(ниже будут полноценные гайды)

Zora

Zora сейчас, это не просто NFT-площадка, а целая ончейн-система, где контент стал валютой. Формально она построена как L2-решение и маркетплейс, но сейчас её главный смысл, дать возможность монетизировать посты напрямую.

После интеграции с Base App проект реально ожил: токен, который раньше пылился мёртвым, снова в обороте, а пользователи начали активно торговать и искать гемы.

Каждый пост и юзер на Zora, это не просто картинка или видео как было ранее, а отдельный токен. У каждого своя эмиссия: 1 000 000 000 монет. При публикации автор сразу получает 10 000 000 токенов, остальные попадают в оборот. Все остальные могут покупать и продавать эти токены, а создатель получает процент с каждой сделки. То есть чем выше интерес к твоему контенту, тем больше сделок и выше доход.

Здесь работает та же логика, что и у мем-коинов: внимание = ценность. Если ты попал в тренд, сделал что-то вирусное или просто собрал вокруг себя аудиторию, токен твоего поста начинает жить собственной жизнью.

Для отработки:

- Переходим на Zora, создаем аккаунт и активируем его. После этого твой профиль получает свой собственный токен, у него есть график, рыночная капитализация и адрес контракта. На вкладке Trade можно покупать и продавать токены профиля, а в Market Cap смотреть объём, supply и переходить в терминал.

- Дальше, публикуй контент. Нажми слева “+”, загрузи файл (изображение, видео, трек, что угодно), придумай название, описание и тикер. Нажми Post, и контент автоматически превращается в токен, доступный для торговли. Всё просто: создаёшь, выкладываешь, и рынок сам решает, сколько это стоит.

- Торгуй токенами других юзеров, можете торговать моим токеном, буду торговать с вами взаимно, в течении 1-2 дней покупаю взаимно, думаю максимально смарт это делать.

Base Name

Обязательно зарегистрируйте себе домен через официальный доменный сервис сети Base 👉 https://www.base.org/names. Эта активность уже учитывается в Onchain Score, поэтому пропускать не стоит точно, на текущий момент

Также кликнув на ваш домен, можно посмотреть Onchain Score и ачивки которые получил ваш кошелёк, о том как их прокачивать будет ниже в гайде.

В основном для билдеров, но как видите и без создания приложений, можно получить большую часть ачивок, ещё раз повторюсь, о них будет ниже

Base App

Начнём с самого свежего апдейта, ребрендинг. Coinbase Wallet теперь называется Base App.

Post, trade, chat and earn - всё в одном месте.

Base App объединяет всё, что нужно крипто-юзеру: создавай контент, торгуй, фарми, общайся и зарабатывай, прямо из одного приложения.

После регистрации ты автоматически получаешь Base Account это твоя ончейн-идентичность, и Base Pay, мгновенные платежи в USDC. Пока вход по инвайтам, но можно встать в очередь на сайте 👉 join.base.app.


💬 Что внутри

Base App — это не просто кошелёк. Это связка из трёх мощных направлений:

  • Кошелёк: управление активами и ончейн-операциями.
  • Соцсеть (Farcaster): твоя лента, как в твиттере.
  • Креативная площадка (Zora): место, где контент превращается в токены, крипто инстаграм.

Лента в приложении работает на базе Farcaster: создаёшь пост, он становится NFT, который можно купить или продать на Zora.

Farcaster

Фаркастер полноценно интегрировались в Base, по этому скипать его не нужно. Отдельно писать про него не буду, у нас есть ПОЛНОЦЕННЫЙ ГАЙД ПО FARCASTER, в нём будет вся вам нужная инфа.

Кстати недавно он стал бесплатным, по этому теперь каждый может создать свой профиль и постить контент.

ГАЙД ПО Base Guild + Base Developers

Гильдию вообще смарт сделать, зацепите многочисленные активности в Base и ещё зафармить миллион ролей для Discord Base.

Переходим к ним на сайт, подключаем заранее, все социалки, кошельки и почту.

Начнем с категории Home, посмотреть категории можно слева в столбце и дальше по гайду будем переключаться по ним.

Home

🔵Become Based

Стартовое простое задание, нужно просто подписаться на твиттер Base и перейти по ссылке на их сайт.

🔵 Based

Задание которое вы могли уже заранее выполнить, когда смотрели категорию ДОМЕНЫ. Сделать себе любой домен, всё просто.

🔵 Onchain

Держать в сети Base на своем кошельке, минимум 0,001 $ETH и сделать любую транзакцию, тоже просто забираем.

🔵 Builders & Founders

• Иметь аккаунт Github, который был создан позднее 1 июля, 2025 года. Если у вас такого нету, можно купить либо попросить друга Айтишника, пусть свой привяжет вам.

• Сделать 1 коммит, как это сделать, можете посмотреть здесь в гайде.

• И просто кликнуть по ссылке Base.


🔵 Creators & Voices

Задание сейчас не доступно, но ранее были критерии по типу 1000 подписчиков в Farcaster либо Смарт Подписчики в X. Следим как обновят, сразу же обновим и гайд.
🔵 Coinbase Onchain Verified

Нужно пройти KYC на Coinbase и подвязать по ссылке ваш кошелёк, который используете в Guild. Где достать Coinbase аккаунт? Купить! Либо если ваша страна не в бане, то самому пройти KYC.

Stay Connected


🔵Base Redditor

Создаем либо входим в свой аккаунт Reddit и просто подписываемся на Base.

Onchain

🔵 Active on Base

Иметь минимум 1 транзакцию за крайние 30 дней.

🔵 Based transactions

Тут целых 4 роли, за 10, 50, 100 и 1000 транзакций в сети Base. Думаю как набивать транзакции рассказывать не нужно.

Builders & Founders

🔵 Based Developer & Recognized by Base

Делаем подписки в X, максимально просто.

Base Programs

А вот это уже очень интересная активность, ведь мы выполняем квесты для билдеров. Выполнило их не слишком много людей, так что сделать максимально смарт.

Отедельно по каждому Pins расписывать не буду, даю полноценный гайд сразу же по всем, потом просто перейдете и заклеймите в Гильдии. По Onchain Summer, активность которая была позапрошлым летом, сейчас ничего уже не сделать.

ПОДГОТОВКА

ВНИМАНИЕ: ВСЕ ДЕЙСТВИЯ НИЖЕ ДЕЛАЕМ В СЕТИ BASE SEPOLIA. Переключаем сеть на Sepolia перед деплоем кода, вручную руками в кошельке.

Добавляем сеть Base Sepolia в кошелёк.

Тестовые токены для Base Sepolia можно взять здесь:

■ QuickNode Нужно иметь минимум 0.001 ETH в дефолтной сети эфира

■ Alchemy Нужно иметь минимум 0.001 ETH в BASE сети

■ Chain.link Нужно иметь минимум 1 LINK в дефолтной сети эфира

Далее идёт универсальный гайд по всем заданиям ниже, отличается только код внутри, название файлов и количество:

1. Создаем файл

2. Вводим название файла(будет указано для каждого разное ниже в гайде)

3. В созданом файле вводим код(тоже указан для каждого разный в гайде)

4. Кликаем по Compile

5. Выбираем нужную версию Компайлера(если простыми словами, смотрим на цифры справа в коде вверху, и ищем такие же в списке слева). И снова кликаем Compile.

6. Переходим во вкладку Deploy, подключаем свой кошелёк вверху. Смотрим название Contract выбираем нужный(той который вы называли на картинке под номером 2.

7. Подтверждаем транзакцию, смотрим в нужной ли вы сети.

8. Далее идём ниже и ищем созданный нами Contract Address. Копируем его.

9. Под каждым заданиям будет отдельная ссылка куда вставлять созданный Контракт, для получения бейджа.

Гайд универсальный под все задания ниже, как я и писал в самом начале. А теперь переходим к самим заданиям:

1. (Deploying to a Testnet)

  1. Открой Remix и создай новый файл contract.sol.
  2. Вставь следующий код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract BasicMath {
uint256 constant MAX_INT = type(uint256).max;

function adder(uint256 _a, uint256 _b) external pure returns (uint256 sum, bool error) {
if (_b > MAX_INT - _a) {
return (0, true); // Overflow occurred
}
return (_a + _b, false);
}

function subtractor(uint256 _a, uint256 _b) external pure returns (uint256 difference, bool error) {
if (_b > _a) {
return (0, true); // Underflow occurred
}
return (_a - _b, false);
}
}

После деплоя проверь контракт здесь:
👉 https://docs.base.org/learn/deployment-to-testnet/deployment-to-testnet-exercise

2. (Control Structures)

Создай файл control.sol и вставь следующий код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract ControlStructures {
// Define custom errors for use within the contract
error AfterHours(uint256 time);
error AtLunch();

// Function to determine the response based on the input number
function fizzBuzz(uint256 _number) public pure returns (string memory response) {
// Check if the number is divisible by both 3 and 5
if (_number % 3 == 0 && _number % 5 == 0) {
return "FizzBuzz"; // Return "FizzBuzz" if divisible by both 3 and 5
}
// Check if the number is divisible by 3
else if (_number % 3 == 0) {
return "Fizz"; // Return "Fizz" if divisible by 3
}
// Check if the number is divisible by 5
else if (_number % 5 == 0) {
return "Buzz"; // Return "Buzz" if divisible by 5
}
// If none of the above conditions are met
else {
return "Splat"; // Return "Splat" if none of the conditions are met
}
}

// Function to determine the response based on the input time
function doNotDisturb(uint256 _time) public pure returns (string memory result) {
// Ensure the input time is within valid bounds (less than 2400)
assert(_time < 2400);

// Check different time ranges and return appropriate responses or revert with errors
if (_time > 2200 || _time < 800) {
revert AfterHours(_time); // Revert with custom error if it's after 10:00 PM or before 8:00 AM
}
else if (_time >= 1200 && _time <= 1299) {
revert AtLunch(); // Revert with custom error if it's between 12:00 PM and 1:00 PM
}
else if (_time >= 800 && _time <= 1199) {
return "Morning!"; // Return "Morning!" if it's between 8:00 AM and 11:59 AM
}
else if (_time >= 1300 && _time <= 1799) {
return "Afternoon!"; // Return "Afternoon!" if it's between 1:00 PM and 5:59 PM
}
else if (_time >= 1800 && _time <= 2200) {
return "Evening!"; // Return "Evening!" if it's between 6:00 PM and 10:00 PM
}
}
}

После деплоя проверь контракт:
👉 https://docs.base.org/learn/control-structures/control-structures-exercise

3. Хранение данных (Storage)

Создай файл storage.sol, вставь код и перед деплоем введи параметры рядом с кнопкой Deploy: 1000,"Pat",50000,112358132134

Код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract EmployeeStorage {
// Declare private state variables to store employee data
uint16 private shares; // Number of shares owned by the employee (private to contract)
uint32 private salary; // Monthly salary of the employee (private to contract)
uint256 public idNumber; // Unique identification number of the employee (publicly accessible)
string public name; // Name of the employee (publicly accessible)

// Constructor to initialize employee data when contract is deployed
constructor(uint16 _shares, string memory _name, uint32 _salary, uint _idNumber) {
shares = _shares; // Initialize shares
name = _name; // Initialize name
salary = _salary; // Initialize salary
idNumber = _idNumber; // Initialize idNumber
}

// View function to retrieve the number of shares owned by the employee
function viewShares() public view returns (uint16) {
return shares;
}

// View function to retrieve the monthly salary of the employee
function viewSalary() public view returns (uint32) {
return salary;
}

// Custom error declaration
error TooManyShares(uint16 _shares);

// Function to grant additional shares to the employee
function grantShares(uint16 _newShares) public {
// Check if the requested shares exceed the limit
if (_newShares > 5000) {
revert("Too many shares"); // Revert with error message
} else if (shares + _newShares > 5000) {
revert TooManyShares(shares + _newShares); // Revert with custom error message
}
shares += _newShares; // Grant the new shares
}

// Function used for testing packing of storage variables (not relevant to main functionality)
function checkForPacking(uint _slot) public view returns (uint r) {
assembly {
r := sload(_slot) // ✅ fixed: no space between sload and ()
}
}

// Function to reset shares for debugging purposes (not relevant to main functionality)
function debugResetShares() public {
shares = 1000; // Reset shares to 1000
}
}

Проверь контракт:
👉 https://docs.base.org/learn/storage/storage-exercise


4. (Arrays)

Создай файл arrays.sol, вставь код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract ArraysExercise {
// Declare state variables to store arrays of numbers, timestamps, and senders
uint[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Array of numbers initialized with values
uint[] timestamps; // Dynamic array to store timestamps
address[] senders; // Dynamic array to store sender addresses

uint256 constant Y2K = 946702800; // Constant representing the Unix timestamp for the year 2000

// Function to retrieve the array of numbers
function getNumbers() external view returns (uint[] memory) {
// Create a memory array to hold the numbers
uint[] memory results = new uint[](numbers.length);

// Copy the numbers from the state array to the memory array
for(uint i=0; i<numbers.length; i++) {
results[i] = numbers[i];
}

// Return the memory array
return results;
}

// Function to reset the numbers array to its initial values
function resetNumbers() public {
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
}

// Function to append new numbers to the numbers array
function appendToNumbers(uint[] calldata _toAppend) public {
// Iterate through the array to be appended
for (uint i = 0; i < _toAppend.length; i++) {
// Push each element of the array to be appended to the numbers array
numbers.push(_toAppend[i]);
}
}

// Function to save a timestamp along with the sender's address
function saveTimestamp(uint _unixTimestamp) public {
// Push the timestamp and sender's address to their respective arrays
timestamps.push(_unixTimestamp);
senders.push(msg.sender);
}

// Function to retrieve timestamps and senders after the year 2000
function afterY2K() public view returns (uint256[] memory, address[] memory) {
// Initialize counter for timestamps after Y2K
uint256 counter = 0;

// Count the number of timestamps after Y2K
for (uint i = 0; i < timestamps.length; i++) {
if (timestamps[i] > Y2K) {
counter++;
}
}

// Initialize memory arrays to hold timestamps and senders after Y2K
uint256[] memory timestampsAfterY2K = new uint256[](counter);
address[] memory sendersAfterY2K = new address[](counter);

// Initialize index for inserting elements into memory arrays
uint256 index = 0;

// Iterate through timestamps and senders arrays to extract elements after Y2K
for (uint i = 0; i < timestamps.length; i++) {
if (timestamps[i] > Y2K) {
timestampsAfterY2K[index] = timestamps[i];
sendersAfterY2K[index] = senders[i];
index++;
}
}

// Return timestamps and senders after Y2K
return (timestampsAfterY2K, sendersAfterY2K);
}

// Function to reset the senders array
function resetSenders() public {
delete senders;
}

// Function to reset the timestamps array
function resetTimestamps() public {
delete timestamps;
}
}

После деплоя проверь контракт здесь:
👉 https://docs.base.org/learn/arrays/arrays-exercise

5. (Mappings)

Создай файл mapping.sol, вставь код и задеплой:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
* @title FavoriteRecords
* @dev Contract to manage a list of approved music records and allow users to add them to their favorites
*/
contract FavoriteRecords {
// Mapping to store whether a record is approved
mapping(string => bool) private approvedRecords;
// Array to store the index of approved records
string[] private approvedRecordsIndex;

// Mapping to store user's favorite records
mapping(address => mapping(string => bool)) public userFavorites;
// Mapping to store the index of user's favorite records
mapping(address => string[]) private userFavoritesIndex;

// Custom error to handle unapproved records
error NotApproved(string albumName);

/**
* @dev Constructor that initializes the approved records list
*/
constructor() {
// Predefined list of approved records
approvedRecordsIndex = [
"Thriller",
"Back in Black",
"The Bodyguard",
"The Dark Side of the Moon",
"Their Greatest Hits (1971-1975)",
"Hotel California",
"Come On Over",
"Rumours",
"Saturday Night Fever"
];
// Initialize the approved records mapping
for (uint i = 0; i < approvedRecordsIndex.length; i++) {
approvedRecords[approvedRecordsIndex[i]] = true;
}
}

/**
* @dev Returns the list of approved records
* @return An array of approved record names
*/
function getApprovedRecords() public view returns (string[] memory) {
return approvedRecordsIndex;
}

/**
* @dev Adds an approved record to the user's favorites
* @param _albumName The name of the album to be added
*/
function addRecord(string memory _albumName) public {
// Check if the record is approved
if (!approvedRecords[_albumName]) {
revert NotApproved({albumName: _albumName});
}
// Check if the record is not already in the user's favorites
if (!userFavorites[msg.sender][_albumName]) {
// Add the record to the user's favorites
userFavorites[msg.sender][_albumName] = true;
// Add the record to the user's favorites index
userFavoritesIndex[msg.sender].push(_albumName);
}
}

/**
* @dev Returns the list of a user's favorite records
* @param _address The address of the user
* @return An array of user's favorite record names
*/
function getUserFavorites(address _address) public view returns (string[] memory) {
return userFavoritesIndex[_address];
}

/**
* @dev Resets the caller's list of favorite records
*/
function resetUserFavorites() public {
// Iterate through the user's favorite records
for (uint i = 0; i < userFavoritesIndex[msg.sender].length; i++) {
// Delete each record from the user's favorites mapping
delete userFavorites[msg.sender][userFavoritesIndex[msg.sender][i]];
}
// Delete the user's favorites index
delete userFavoritesIndex[msg.sender];
}
}

Проверка:
👉 https://docs.base.org/learn/mappings/mappings-exercise

6. (Structs)

Создай файл structs.sol, вставь код и задеплой:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
* @title GarageManager
* @dev Contract to manage a garage of cars for each user
*/
contract GarageManager {
// Mapping to store the garage of cars for each user
mapping(address => Car[]) private garages;

// Struct to represent a car
struct Car {
string make; // Make of the car
string model; // Model of the car
string color; // Color of the car
uint numberOfDoors; // Number of doors of the car
}

// Custom error for handling invalid car index
error BadCarIndex(uint256 index);

/**
* @dev Adds a new car to the caller's garage
* @param _make The make of the car
* @param _model The model of the car
* @param _color The color of the car
* @param _numberOfDoors The number of doors of the car
*/
function addCar(string memory _make, string memory _model, string memory _color, uint _numberOfDoors) external {
// Push a new car struct with the provided details to the caller's garage
garages[msg.sender].push(Car(_make, _model, _color, _numberOfDoors));
}

/**
* @dev Retrieves the caller's array of cars
* @return An array of `Car` structs
*/
function getMyCars() external view returns (Car[] memory) {
// Return the array of cars stored in the caller's garage
return garages[msg.sender];
}

/**
* @dev Retrieves a specific user's array of cars
* @param _user The address of the user
* @return An array of `Car` structs
*/
function getUserCars(address _user) external view returns (Car[] memory) {
// Return the array of cars stored in the garage of the specified user
return garages[_user];
}

/**
* @dev Updates a specific car in the caller's garage
* @param _index The index of the car in the garage array
* @param _make The new make of the car
* @param _model The new model of the car
* @param _color The new color of the car
* @param _numberOfDoors The new number of doors of the car
*/
function updateCar(uint256 _index, string memory _make, string memory _model, string memory _color, uint _numberOfDoors) external {
// Check if the provided index is valid
if (_index >= garages[msg.sender].length) {
revert BadCarIndex({index: _index}); // Revert with custom error if the index is invalid
}
// Update the specified car with the new details
garages[msg.sender][_index] = Car(_make, _model, _color, _numberOfDoors);
}

/**
* @dev Deletes all cars in the caller's garage
*/
function resetMyGarage() external {
// Delete all cars from the caller's garage
delete garages[msg.sender];
}
}

Проверка:
👉 https://docs.base.org/learn/structs/structs-exercise

7. (Inheritance Exercise)

Создаем файл Inheritance.sol И вставляем код внизу, возвращаемся к гайду: Данные для ввода:

Salesperson:

Hourly rate is 20
Id number is 55555
Manager Id number is 12345

EngineeringManager:

salary is 200000
Id number is 54321
Manager Id is 11111

Вводить данные числа, во вкладке Deploy. Будут соотвествующие столбцы, вот для примера:

Код:

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

/**
* @title Employee
* @dev Abstract contract defining common properties and behavior for employees.
*/
abstract contract Employee {
uint public idNumber; // Unique identifier for the employee
uint public managerId; // Identifier of the manager overseeing the employee

/**
* @dev Constructor to initialize idNumber and managerId.
* @param _idNumber The unique identifier for the employee.
* @param _managerId The identifier of the manager overseeing the employee.
*/
constructor(uint _idNumber, uint _managerId) {
idNumber = _idNumber;
managerId = _managerId;
}

/**
* @dev Abstract function to be implemented by derived contracts to get the annual cost of the employee.
* @return The annual cost of the employee.
*/
function getAnnualCost() public virtual returns (uint);
}

/**
* @title Salaried
* @dev Contract representing employees who are paid an annual salary.
*/
contract Salaried is Employee {
uint public annualSalary; // The annual salary of the employee

/**
* @dev Constructor to initialize the Salaried contract.
* @param _idNumber The unique identifier for the employee.
* @param _managerId The identifier of the manager overseeing the employee.
* @param _annualSalary The annual salary of the employee.
*/
constructor(uint _idNumber, uint _managerId, uint _annualSalary) Employee(_idNumber, _managerId) {
annualSalary = _annualSalary;
}

/**
* @dev Overrides the getAnnualCost function to return the annual salary of the employee.
* @return The annual salary of the employee.
*/
function getAnnualCost() public override view returns (uint) {
return annualSalary;
}
}

/**
* @title Hourly
* @dev Contract representing employees who are paid an hourly rate.
*/
contract Hourly is Employee {
uint public hourlyRate; // The hourly rate of the employee

/**
* @dev Constructor to initialize the Hourly contract.
* @param _idNumber The unique identifier for the employee.
* @param _managerId The identifier of the manager overseeing the employee.
* @param _hourlyRate The hourly rate of the employee.
*/
constructor(uint _idNumber, uint _managerId, uint _hourlyRate) Employee(_idNumber, _managerId) {
hourlyRate = _hourlyRate;
}

/**
* @dev Overrides the getAnnualCost function to calculate the annual cost based on the hourly rate.
* Assuming a full-time workload of 2080 hours per year.
* @return The annual cost of the employee.
*/
function getAnnualCost() public override view returns (uint) {
return hourlyRate * 2080;
}
}

/**
* @title Manager
* @dev Contract managing a list of employee IDs.
*/
contract Manager {
uint[] public employeeIds; // List of employee IDs

/**
* @dev Function to add a new employee ID to the list.
* @param _reportId The ID of the employee to be added.
*/
function addReport(uint _reportId) public {
employeeIds.push(_reportId);
}

/**
* @dev Function to reset the list of employee IDs.
*/
function resetReports() public {
delete employeeIds;
}
}

/**
* @title Salesperson
* @dev Contract representing salespeople who are paid hourly.
*/
contract Salesperson is Hourly {
/**
* @dev Constructor to initialize the Salesperson contract.
* @param _idNumber The unique identifier for the employee.
* @param _managerId The identifier of the manager overseeing the employee.
* @param _hourlyRate The hourly rate of the employee.
*/
constructor(uint _idNumber, uint _managerId, uint _hourlyRate)
Hourly(_idNumber, _managerId, _hourlyRate) {}
}

/**
* @title EngineeringManager
* @dev Contract representing engineering managers who are paid an annual salary and have managerial responsibilities.
*/
contract EngineeringManager is Salaried, Manager {
/**
* @dev Constructor to initialize the EngineeringManager contract.
* @param _idNumber The unique identifier for the employee.
* @param _managerId The identifier of the manager overseeing the employee.
* @param _annualSalary The annual salary of the employee.
*/
constructor(uint _idNumber, uint _managerId, uint _annualSalary)
Salaried(_idNumber, _managerId, _annualSalary) {}
}

/**
* @title InheritanceSubmission
* @dev Contract for deploying instances of Salesperson and EngineeringManager.
*/
contract InheritanceSubmission {
address public salesPerson; // Address of the deployed Salesperson instance
address public engineeringManager; // Address of the deployed EngineeringManager instance

/**
* @dev Constructor to initialize the InheritanceSubmission contract.
* @param _salesPerson Address of the deployed Salesperson instance.
* @param _engineeringManager Address of the deployed EngineeringManager instance.
*/
constructor(address _salesPerson, address _engineeringManager) {
salesPerson = _salesPerson;
engineeringManager = _engineeringManager;
}
}


Далее тыкаем на Contract выбираем InheritanceSubmission и вставляем 2 контракт адресса, которые получили с Salesperson и EngineeringManager:

Копируем контракт и делаем проверку. Проверка:
👉 https://docs.base.org/learn/inheritance/inheritance-exercise

8. (Imports Exercise)

Создай файл SillyStringUtils.sol и вставь код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;

library SillyStringUtils {
struct Haiku {
string line1;
string line2;
string line3;
}

function shruggie(string memory _input) internal pure returns (string memory) {
return string.concat(_input, unicode" 🤷");
}
}

Затем создай imports.sol и вставь код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;

// Importing the SillyStringUtils library
import "./SillyStringUtils.sol";

contract ImportsExercise {
// Using the SillyStringUtils library for string manipulation
using SillyStringUtils for string;

// Declaring a public variable to store a Haiku
SillyStringUtils.Haiku public haiku;

// Function to save a Haiku
function saveHaiku(string memory _line1, string memory _line2, string memory _line3) public {
haiku.line1 = _line1;
haiku.line2 = _line2;
haiku.line3 = _line3;
}

// Function to retrieve the saved Haiku
function getHaiku() public view returns (SillyStringUtils.Haiku memory) {
return haiku;
}

// Function to append a shrugging emoji to the third line of the Haiku
function shruggieHaiku() public view returns (SillyStringUtils.Haiku memory) {
// Creating a copy of the Haiku
SillyStringUtils.Haiku memory newHaiku = haiku;
// Appending the shrugging emoji to the third line using the shruggie function from the SillyStringUtils library
newHaiku.line3 = newHaiku.line3.shruggie();
return newHaiku;
}
}

Проверка:
👉 https://docs.base.org/learn/imports/imports-exercise

9. (Error Triage Exercise)

Создай файл errors.sol, вставь код и задеплой:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

contract ErrorTriageExercise {
/**
* @dev Finds the difference between each uint with its neighbor (a to b, b to c, etc.)
* and returns a uint array with the absolute integer difference of each pairing.
*
* @param _a The first unsigned integer.
* @param _b The second unsigned integer.
* @param _c The third unsigned integer.
* @param _d The fourth unsigned integer.
*
* @return results An array containing the absolute differences between each pair of integers.
*/
function diffWithNeighbor(
uint _a,
uint _b,
uint _c,
uint _d
) public pure returns (uint[] memory) {
// Initialize an array to store the differences
uint[] memory results = new uint[](3);

// Calculate the absolute difference between each pair of integers and store it in the results array
results[0] = _a > _b ? _a - _b : _b - _a;
results[1] = _b > _c ? _b - _c : _c - _b;
results[2] = _c > _d ? _c - _d : _d - _c;

// Return the array of differences
return results;
}

/**
* @dev Changes the base by the value of the modifier. Base is always >= 1000. Modifiers can be
* between positive and negative 100.
*
* @param _base The base value to be modified.
* @param _modifier The value by which the base should be modified.
*
* @return returnValue The modified value of the base.
*/
function applyModifier(
uint _base,
int _modifier
) public pure returns (uint returnValue) {
// Apply the modifier to the base value
if(_modifier > 0) {
return _base + uint(_modifier);
}
return _base - uint(-_modifier);
}

uint[] arr;

function popWithReturn() public returns (uint returnNum) {
if(arr.length > 0) {
uint result = arr[arr.length - 1];
arr.pop();
return result;
}
}

// The utility functions below are working as expected
function addToArr(uint _num) public {
arr.push(_num);
}

function getArr() public view returns (uint[] memory) {
return arr;
}

function resetArr() public {
delete arr;
}
}

Проверка:
👉 https://docs.base.org/learn/error-triage/error-triage-exercise

10. (New Exercise)

Создай файл AddressBook.sol, не деплой.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";

contract AddressBook is Ownable {
mapping(string => address) private addresses;

constructor(address initialOwner) Ownable(initialOwner) {}

function addAddress(string memory name, address addr) external onlyOwner {
addresses[name] = addr;
}

function getAddress(string memory name) external view returns (address) {
return addresses[name];

Затем создай AddressBookFactory.sol и задеплой его.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "./AddressBook.sol";

contract AddressBookFactory {
string private salt = "value";

function deploy() external returns (AddressBook) {
// deploy AddressBook, owner = msg.sender
AddressBook newAddressBook = new AddressBook(msg.sender);

return newAddressBook;
}
}

Проверка: 👉 https://docs.base.org/learn/new-keyword/new-keyword-exercise

11. (Minimal Tokens Exercise)

Создай файл Minimal token Exercise.sol, вставь код и задеплой:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Contract for an unburnable token
contract UnburnableToken {
string private salt = "value"; // A private string variable

// Mapping to track token balances of addresses
mapping(address => uint256) public balances;

uint256 public totalSupply; // Total supply of tokens
uint256 public totalClaimed; // Total number of tokens claimed
mapping(address => bool) private claimed; // Mapping to track whether an address has claimed tokens

// Custom errors
error TokensClaimed(); // Error for attempting to claim tokens again
error AllTokensClaimed(); // Error for attempting to claim tokens when all are already claimed
error UnsafeTransfer(address _to); // Error for unsafe token transfer

// Constructor to set the total supply of tokens
constructor() {
totalSupply = 100000000; // Set the total supply of tokens
}

// Public function to claim tokens
function claim() public {
// Check if all tokens have been claimed
if (totalClaimed >= totalSupply) revert AllTokensClaimed();

// Check if the caller has already claimed tokens
if (claimed[msg.sender]) revert TokensClaimed();

// Update balances and claimed status
balances[msg.sender] += 1000;
totalClaimed += 1000;
claimed[msg.sender] = true;
}

// Public function for safe token transfer
function safeTransfer(address _to, uint256 _amount) public {
// Check for unsafe transfer conditions, including if the target address has a non-zero ether balance
if (_to == address(0) || _to.balance == 0) revert UnsafeTransfer(_to);

// Ensure the sender has enough balance to transfer
require(balances[msg.sender] >= _amount, "Insufficient balance");

// Perform the transfer
balances[msg.sender] -= _amount;
balances[_to] += _amount;
}
}

Проверка:
👉 https://docs.base.org/learn/token-development/minimal-tokens/minimal-tokens-exercise

12. (ERC-20 Tokens Exercise)

Создай файл ERC20.sol, вставь код.

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;

// Importing OpenZeppelin contracts for ERC20 and EnumerableSet functionalities
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";

// Contract for weighted voting using ERC20 token
contract WeightedVoting is ERC20 {
string private salt = "value"; // A private string variable
using EnumerableSet for EnumerableSet.AddressSet; // Importing EnumerableSet for address set functionality

// Custom errors
error TokensClaimed(); // Error for attempting to claim tokens again
error AllTokensClaimed(); // Error for attempting to claim tokens when all are already claimed
error NoTokensHeld(); // Error for attempting to perform an action without holding tokens
error QuorumTooHigh(); // Error for setting a quorum higher than total supply
error AlreadyVoted(); // Error for attempting to vote more than once
error VotingClosed(); // Error for attempting to vote on a closed issue

// Struct to represent an issue
struct Issue {
EnumerableSet.AddressSet voters; // Set of voters
string issueDesc; // Description of the issue
uint256 quorum; // Quorum required to close the issue
uint256 totalVotes; // Total number of votes casted
uint256 votesFor; // Total number of votes in favor
uint256 votesAgainst; // Total number of votes against
uint256 votesAbstain; // Total number of abstained votes
bool passed; // Flag indicating if the issue passed
bool closed; // Flag indicating if the issue is closed
}

// Struct to represent a serialized issue
struct SerializedIssue {
address[] voters; // Array of voters
string issueDesc; // Description of the issue
uint256 quorum; // Quorum required to close the issue
uint256 totalVotes; // Total number of votes casted
uint256 votesFor; // Total number of votes in favor
uint256 votesAgainst; // Total number of votes against
uint256 votesAbstain; // Total number of abstained votes
bool passed; // Flag indicating if the issue passed
bool closed; // Flag indicating if the issue is closed
}

// Enum to represent different vote options
enum Vote {
AGAINST,
FOR,
ABSTAIN
}

// Array to store all issues
Issue[] internal issues;

// Mapping to track if tokens are claimed by an address
mapping(address => bool) public tokensClaimed;

uint256 public maxSupply = 1000000; // Maximum supply of tokens
uint256 public claimAmount = 100; // Amount of tokens to be claimed

string saltt = "any"; // Another string variable

// Constructor to initialize ERC20 token with a name and symbol
constructor(string memory _name, string memory _symbol)
ERC20(_name, _symbol)
{
issues.push(); // Pushing an empty issue to start from index 1
}

// Function to claim tokens
function claim() public {
// Check if all tokens have been claimed
if (totalSupply() + claimAmount > maxSupply) {
revert AllTokensClaimed();
}
// Check if the caller has already claimed tokens
if (tokensClaimed[msg.sender]) {
revert TokensClaimed();
}
// Mint tokens to the caller
_mint(msg.sender, claimAmount);
tokensClaimed[msg.sender] = true; // Mark tokens as claimed
}

// Function to create a new voting issue
function createIssue(string calldata _issueDesc, uint256 _quorum)
external
returns (uint256)
{
// Check if the caller holds any tokens
if (balanceOf(msg.sender) == 0) {
revert NoTokensHeld();
}
// Check if the specified quorum is higher than total supply
if (_quorum > totalSupply()) {
revert QuorumTooHigh();
}
// Create a new issue and return its index
Issue storage _issue = issues.push();
_issue.issueDesc = _issueDesc;
_issue.quorum = _quorum;
return issues.length - 1;
}

// Function to get details of a voting issue
function getIssue(uint256 _issueId)
external
view
returns (SerializedIssue memory)
{
Issue storage _issue = issues[_issueId];
return
SerializedIssue({
voters: _issue.voters.values(),
issueDesc: _issue.issueDesc,
quorum: _issue.quorum,
totalVotes: _issue.totalVotes,
votesFor: _issue.votesFor,
votesAgainst: _issue.votesAgainst,
votesAbstain: _issue.votesAbstain,
passed: _issue.passed,
closed: _issue.closed
});
}

// Function to cast a vote on a voting issue
function vote(uint256 _issueId, Vote _vote) public {
Issue storage _issue = issues[_issueId];

// Check if the issue is closed
if (_issue.closed) {
revert VotingClosed();
}
// Check if the caller has already voted
if (_issue.voters.contains(msg.sender)) {
revert AlreadyVoted();
}

uint256 nTokens = balanceOf(msg.sender);
// Check if the caller holds any tokens
if (nTokens == 0) {
revert NoTokensHeld();
}

// Update vote counts based on the vote option
if (_vote == Vote.AGAINST) {
_issue.votesAgainst += nTokens;
} else if (_vote == Vote.FOR) {
_issue.votesFor += nTokens;
} else {
_issue.votesAbstain += nTokens;
}

// Add the caller to the list of voters and update total votes count
_issue.voters.add(msg.sender);
_issue.totalVotes += nTokens;

// Close the issue if quorum is reached and determine if it passed
if (_issue.totalVotes >= _issue.quorum) {
_issue.closed = true;
if (_issue.votesFor > _issue.votesAgainst) {
_issue.passed = true;
}
}
}
}

Проверка:
👉 https://docs.base.org/learn/token-development/erc-20-token/erc-20-exercise

13. (ERC-721 Tokens Exercise)

Создай файл ERC721.sol, вставь код:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Importing OpenZeppelin ERC721 contract
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";// Interface for interacting with a submission contract
interface ISubmission {
// Struct representing a haiku
struct Haiku {
address author; // Address of the haiku author
string line1; // First line of the haiku
string line2; // Second line of the haiku
string line3; // Third line of the haiku
} // Function to mint a new haiku
function mintHaiku(
string memory _line1,
string memory _line2,
string memory _line3
) external; // Function to get the total number of haikus
function counter() external view returns (uint256); // Function to share a haiku with another address
function shareHaiku(uint256 _id, address _to) external; // Function to get haikus shared with the caller
function getMySharedHaikus() external view returns (Haiku[] memory);
}// Contract for managing Haiku NFTs
contract HaikuNFT is ERC721, ISubmission {
Haiku[] public haikus; // Array to store haikus
mapping(address => mapping(uint256 => bool)) public sharedHaikus; // Mapping to track shared haikus
uint256 public haikuCounter; // Counter for total haikus minted // Constructor to initialize the ERC721 contract
constructor() ERC721("HaikuNFT", "HAIKU") {
haikuCounter = 1; // Initialize haiku counter
} string salt = "value"; // A private string variable // Function to get the total number of haikus
function counter() external view override returns (uint256) {
return haikuCounter;
} // Function to mint a new haiku
function mintHaiku(
string memory _line1,
string memory _line2,
string memory _line3
) external override {
// Check if the haiku is unique
string[3] memory haikusStrings = [_line1, _line2, _line3];
for (uint256 li = 0; li < haikusStrings.length; li++) {
string memory newLine = haikusStrings[li];
for (uint256 i = 0; i < haikus.length; i++) {
Haiku memory existingHaiku = haikus[i];
string[3] memory existingHaikuStrings = [
existingHaiku.line1,
existingHaiku.line2,
existingHaiku.line3
];
for (uint256 eHsi = 0; eHsi < 3; eHsi++) {
string memory existingHaikuString = existingHaikuStrings[
eHsi
];
if (
keccak256(abi.encodePacked(existingHaikuString)) ==
keccak256(abi.encodePacked(newLine))
) {
revert HaikuNotUnique();
}
}
}
} // Mint the haiku NFT
_safeMint(msg.sender, haikuCounter);
haikus.push(Haiku(msg.sender, _line1, _line2, _line3));
haikuCounter++;
} // Function to share a haiku with another address
function shareHaiku(uint256 _id, address _to) external override {
require(_id > 0 && _id <= haikuCounter, "Invalid haiku ID"); Haiku memory haikuToShare = haikus[_id - 1];
require(haikuToShare.author == msg.sender, "NotYourHaiku"); sharedHaikus[_to][_id] = true;
} // Function to get haikus shared with the caller
function getMySharedHaikus()
external
view
override
returns (Haiku[] memory)
{
uint256 sharedHaikuCount;
for (uint256 i = 0; i < haikus.length; i++) {
if (sharedHaikus[msg.sender][i + 1]) {
sharedHaikuCount++;
}
} Haiku[] memory result = new Haiku[](sharedHaikuCount);
uint256 currentIndex;
for (uint256 i = 0; i < haikus.length; i++) {
if (sharedHaikus[msg.sender][i + 1]) {
result[currentIndex] = haikus[i];
currentIndex++;
}
} if (sharedHaikuCount == 0) {
revert NoHaikusShared();
} return result;
} // Custom errors
error HaikuNotUnique(); // Error for attempting to mint a non-unique haiku
error NotYourHaiku(); // Error for attempting to share a haiku not owned by the caller
error NoHaikusShared(); // Error for no haikus shared with the caller
}//CHASE

Проверка:
👉 https://docs.base.org/learn/token-development/erc-721-token/erc-721-exercise

Если вы всё сделали, молодцы, таких профессиональных деплоеров не так уж и много как для тестнета, по этому идём дальше по гайду

ЕБЕМ BASE 2025

Ниже предоставлены варианты прокрута на каждый день, неделю и месяц. Ещё раз повторюсь как писал в начале гайда.

Для дополнительного прокрута, по дням, неделям и месяцам вам понадобится:

На ежедневный прокрут: 0.2-0.4$

На еженедельный прокрут: 2-4$

На ежемесячный прокрут: 15-20$

В основном затраты на комиссию, в основном они маленькие, но когда есть нагрузка сети, цена за газ, может подскочить.

Вы можете модифицировать прокрут под себя, меняя маршруты и выполняе паралельно либо вместе другие активности в сети Base, погнали:

ЕЖЕДНЕВНО

  1. Свопы / транзы: сделай 1–2 обмена на любом DEX (Aerodrome, Uniswap).
  2. Зайди в Zora / Farcaster / Base App: поставь пост, реакцию, лайк, любой ончейн-экшен.
  3. Сделай 1 бридж: с другого кошелька или обратно (через Jumper, Relay).
  4. NFT-минт: минть что-нибудь недорогое, вот для примера:

- Are you onchain?
- BASE GM
- Base and Mono RSA
- Base is for
- Boost Onchain Score
- THE BASE ECOSYSTEM IS GROWING
- Base Universe NFT

5. Активность в Base App(если дали доступ) чекни ленту, лайкни пост, сделай хоть минимальный постинг.

💡 Цель на день, показать “живую активность”, будто реально пользуешься сетью.

ЕЖЕНЕДЕЛЬНО

  1. Фарм DeFi
    • Зайди на Aerodrome, добавь ликвидность или застейкай токены.
  2. Layer3 / Galxe / Zealy / Intract
    • Пройди свежие квесты, особенно с тегами Base, Onchain Summer, Coinbase.
  3. Проверка домена (Base Name Service)
    • Обнови или зарегай новый, если не сделал.
  4. Mint новых NFT
    • Мониторь X (Twitter) @buildonbase.

💡 Цель недели, расширять footprint: разные dApp, разные типы активностей, чтобы сеть “видела” разнообразие.

ЕЖЕМЕСЯЧНО

  1. Проверить новые проекты на Base
    • Проанализируй, что появилось за месяц (DeFi, GameFi, SocialFi, NFT). Либо просто читай Альфа выжимки, там вся топовая инфа.
  2. Деплой контракта
    • Через Remix или ThirdWeb, более dev-активность.
  3. Сделай 1–2 крупных транзакции
    • Чтобы не было ощущения “пустого кошелька” обьем имеет значение.
  4. Обнови ликву
    • Перераспредели пулы, купи пару щитков.

💡 Цель месяца, укрепить “историю присутствия”: чтобы выглядели как реальный пользователь сети.


КОНЕЦ ГАЙДА

Очевидно, что Base, это не просто ещё одна L2-сеть. Это проект с сильнейшей поддержкой Coinbase, живой экосистемой и реальной ставкой на ончейн-будущее. Тут уже формируется экономика нового формата, где контент, активность и билдинг приносят реальные деньги.

Base, это не хайп на пару месяцев, а фундамент, на котором сейчас строится весь новый onchain-движ. Так что не тормози, отрабатывай активности, строй, пость, двигайся по всем направлениям.

Вперёд отрабатывать и, как всегда — GBase, GCoinCase Community! 🚀

Ну и не забываем про подписку на нас, где много альфа инфы - подписываемся на наш канал Coincase в телеграме.