contract HelperConfig is Script {
NetworkConfig public activeNetworkConfig;
uint8 public constant DECIMALS = 8;
int256 public constant INITIAL_PRICE = 2000e8;
struct NetworkConfig {
address priceFeed;
}
event HelperConfig__CreatedMockPriceFeed(address priceFeed);
constructor() {
if (block.chainid == 11155111) {
activeNetworkConfig = getSepoliaEthConfig();
} else {
activeNetworkConfig = getOrCreateAnvilEthConfig();
}
}
function getSepoliaEthConfig() public pure returns (NetworkConfig memory sepoliaNetworkConfig) {
sepoliaNetworkConfig = NetworkConfig({
priceFeed: 0x694AA1769357215DE4FAC081bf1f309aDC325306
});
}
function getOrCreateAnvilEthConfig() public returns (NetworkConfig memory anvilNetworkConfig) {
if (activeNetworkConfig.priceFeed != address(0)) {
return activeNetworkConfig;
}
vm.startBroadcast();
MockV3Aggregator mockPriceFeed = new MockV3Aggregator(
DECIMALS,
INITIAL_PRICE
);
vm.stopBroadcast();
emit HelperConfig__CreatedMockPriceFeed(address(mockPriceFeed));
anvilNetworkConfig = NetworkConfig({priceFeed: address(mockPriceFeed)});
}
}Здесь через конструктор мы определяем сеть для деплоя и с помощью дополнительных функций решаем, что возвращать: либо адрес задеплоенного контракта в реальной сети, либо mock контракт, который мы можем использовать в локальной сети Anvil!
В общем получается, что мы создали специальные скриптовые контракты для определения сети деплоя и разворачивания нашего основного контракта с правильным адресами ChainlinkPriceFeed.
После этого мы можем выполнять в консоли команды для теста, всего лишь меняя нашу ссылку rpc-link, вместо того, чтобы каждый раз изменять код контракта.
Если вы создаете свой протокол сразу для нескольких сетей, крайне рекомендую этот паттерн для проведения тестов.
Более подробно можно посмотреть по ссылке на видео в начале поста.
#foundry #lesson31