NetworkConfig.s.sol
Обзор
Данный файл содержит контракт на языке Solidity под названием NetworkConfig, который предназначен для хранения и предоставления конфигурационных данных для различных блокчейн-сетей (сетей Ethereum и совместимых с ней). Контракт реализует централизованное хранилище настроек для разных сетей, включая параметры администратора, адреса существующих контрактов, объем начального выпуска токенов MANA, идентификатор сети (chainId), URL для подключения к RPC и индикатор тестовой сети.
Этот контракт облегчает управление параметрами развертывания и взаимодействия с разными сетями и упрощает доступ к этим данным для других частей системы.
Описание классов и структур
Контракт NetworkConfig
Наследует от Script из библиотеки forge-std, что указывает на использование в процессе скриптов развертывания и тестирования в рамках Foundry.
Структура Config
Структура содержит конфигурационные параметры для каждой сети:
Поле | Тип | Описание |
|---|---|---|
|
| Адрес администратора сети |
|
| Адрес существующего контракта Settlement (если есть) |
|
| Начальное количество токенов MANA (с учётом decimals) |
|
| Идентификатор цепочки Ethereum-сети |
|
| URL RPC для подключения к данной сети |
|
| Флаг, указывающий, является ли сеть тестовой |
Переменная configs
mapping(uint256 => Config) public configs;
Отображение из chainId в соответствующую конфигурацию Config. Позволяет быстро получать настройки по идентификатору сети.
Конструктор
В конструкторе предварительно инициализируются конфигурации для пяти сетей:
Ethereum Mainnet (chainId: 1)
1 000 000 MANA
RPC Alchemy для mainnet
isTestnet = false
Ethereum Sepolia Testnet (chainId: 11155111)
10 000 000 MANA
RPC Alchemy для Sepolia
isTestnet = true
Arbitrum One (chainId: 42161)
1 000 000 MANA
RPC Alchemy для Arbitrum Mainnet
isTestnet = false
Arbitrum Sepolia (chainId: 421614)
10 000 000 MANA
RPC Alchemy для Arbitrum Sepolia
isTestnet = true
Local Anvil (chainId: 31337)
100 000 000 MANA
RPC локального сервера
Адрес администратора — дефолтный аккаунт Anvil
isTestnet = true
Методы
function getConfig(uint256 chainId) external view returns (Config memory)
Описание: Возвращает конфигурацию сети по переданному
chainId.Параметры:
chainId— идентификатор сети Ethereum.
Возвращаемое значение: Структура
Configс настройками сети.Исключения: Если для переданного
chainIdнет конфигурации, функция вызывает ошибку с сообщением"Unsupported chain ID".Пример использования:
NetworkConfig networkConfig = NetworkConfig(address);
NetworkConfig.Config memory config = networkConfig.getConfig(1); // Получить конфигурацию для Ethereum Mainnet
function getCurrentConfig() external view returns (Config memory)
Описание: Возвращает конфигурацию для текущей сети, на которой выполняется контракт (использует
block.chainid).Параметры: нет.
Возвращаемое значение: Структура
Config.Пример использования:
NetworkConfig.Config memory currentConfig = networkConfig.getCurrentConfig();
function isTestnet(uint256 chainId) external view returns (bool)
Описание: Проверяет, является ли сеть с данным
chainIdтестовой.Параметры:
chainId— идентификатор сети.
Возвращаемое значение:
true, если сеть тестовая, иначеfalse.Пример использования:
bool testnet = networkConfig.isTestnet(11155111); // true для Sepolia
Важные детали реализации
Все данные конфигураций хранятся в памяти контракта и инициализируются только в конструкторе, что делает контракт статичным и безопасным для чтения.
Адреса администратора и существующего Settlement по умолчанию установлены в
address(0)и должны быть заданы внешними процессами после развертывания.Использование
10**18для подсчёта начального количества токенов соответствует стандартному числу десятичных знаков для Ethereum токенов (18 decimals).Из-за отсутствия функций для изменения конфигураций после развертывания, контракт служит исключительно для чтения и не предусматривает динамического управления.
Взаимодействие с другими частями системы
Контракт
NetworkConfigиспользуется, чтобы стандартизировать и централизовать информацию о различных сетях, облегчая развертывание и тестирование других контрактов и компонентов.Скрипты развертывания и тесты могут обращаться к этому контракту для получения параметров, таких как RPC URL или начальный запас токенов.
Адреса
adminиexistingSettlementмогут использоваться другими контрактами для контроля и интеграции с уже существующими системами.
Диаграмма структуры контракта
classDiagram
class NetworkConfig {
+mapping(uint256 => Config) configs
+constructor()
+getConfig(chainId uint256) Config
+getCurrentConfig() Config
+isTestnet(chainId uint256) bool
}
class Config {
+address admin
+address existingSettlement
+uint256 initialManaSupply
+uint256 chainId
+string rpcUrl
+bool isTestnet
}
NetworkConfig o-- Config : "configs"
Итог
Контракт NetworkConfig — это удобный инструмент для хранения и предоставления конфигурационных данных по разным Ethereum-сетям, с акцентом на стандартизацию параметров и поддержку тестовых и основных сетей. Его использование упрощает процессы развертывания и интеграции в многоцелевых проектах, где необходимо учитывать разные окружения.