Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

번개멍

UUPS Pattern 본문

카테고리 없음

UUPS Pattern

번개멍 2022. 12. 27. 17:11

 

 

실행하고자하는 곳에 디렉토리 생성후 Hardhat을 사용할 수 있도록 셋팅을 진행합니다.

mkdir proxy_uups_contract
npx hardhat

저는 typescript 로 진행하였습니다.

 

yarn add @openzeppelin/contracts-upgradeable @openzeppelin/hardhat-upgrades @nomiclabs/hardhat-etherscan dotenv --save-dev

 

 

 

pragma solidity ^0.8.10;

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

contract TestV1 is Initializable, UUPSUpgradeable, OwnableUpgradeable {
    uint256 public count;

    function initialize(uint256 _Count) public initializer {
        count = _Count;

    	__Ownable_init();
    }

    function _authorizeUpgrade(address) internal override onlyOwner {}

    function oneAdd() external {
        count += 1;
    }
}

Contracts 폴더 안에 TestV1.sol

scripts 폴더 안에 deploy_test_v1.ts 파일을 각각 생성해줍니다.

import {ethers, upgrades} from "hardhat";

const count = 7;

async function main() {
    const Test = await ethers.getContractFactory("TestV1");

    console.log("Deploying...");

    const test = await upgrades.deployProxy(Test, [count], {
        initializer: "initialize",
    });
    await test.deployed();

    console.log("deployed to:", test.address);
}
main();

해당 컨트랙트를 실행하기 위해 hardhat.config.ts 파일을 아래와 같이 설정해줍니다. 

env 관련해서는 인터넷에 검색해서 지정하면 됩니다.

import * as dotenv from "dotenv";
import {HardhatUserConfig, task} from "hardhat/config";
import "@nomiclabs/hardhat-etherscan";
import "@typechain/hardhat";
import "@nomiclabs/hardhat-ethers"
import "@openzeppelin/hardhat-upgrades";

dotenv.config();

task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

const config: HardhatUserConfig = {
  solidity: "0.8.12",
  networks: {
    polygon: {
      url: process.env.POLYGON_URL,
      accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
    },
    polygon_mumbai: {
      url: process.env.POLYGON_MUMBAI_URL || "",
      accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
      allowUnlimitedContractSize: true,
      gas: 2100000,
      gasPrice: 8000000000,
    },
  },
  etherscan: {
    apiKey: process.env.POLYGONSCAN_API_KEY,
  },
};
export default config;

 

yarn hardhat run script/deploy_test_v1.ts --network polygon_mumbai

저는 Polygon Testnet 인 Mumbai 에서 테스트 하기에 위와 같이 명령어를 입력합니다.

Proxy Contract : 0x71A671a65dFEc9BaaaE8EED0eb7c76543469d2BE

 

해당 지갑 주소를 이용해서 Polygon Scan에서 확인해봅니다.

 

사진을 보면 아래에 보이는 Hash값은 TestV1에 해당하는 값이고 위에 0x04는 Proxy Contract의 주소 입니다.

 

프록시 컨트랙트 주소를 검색한뒤 Contract 탭을 보면 Proxy 라면 활성화 하라는 팝업이 뜨게 됩니다. 아래 사진처럼 Proxy 검증을 진행합니다.

 

 

TestV1의 컨트랙트에 대해 검증을 진행해줍니다.

yarn hardhat verify --network polygon_mumbai 0x3ca1CEf78B4924f8138c734493317B8B7c916c8b

TestV1에 대해서 검증된 컨트랙트를 확인할 수 있으며 위에 과정을 다시한번 거쳐 proxy tab을 열어줍니다.

 

 

ProxyContract의 스캔사진이면 Read as Proxy 탭이 새로 생겼습니다.

 


Upgredable Proxy 를 이용하여 TestV1 -> TestV2로 upgrade를 진행합니다.

 

pragma solidity ^0.8.10;

import "./TestV1.sol";

contract TestV2 is TestV1 {
    function twoAdd() external {
        count += 2;
    }

    function testVersion() external pure returns (uint256) {
        return 2;
    }
}

contracts 폴더에 TestV2.sol

scripts 폴더에 upgrade_contract_v2.ts 파일을 생성해줍니다.

import { ethers, upgrades } from "hardhat";

const proxyAddress = '0x71A671a65dFEc9BaaaE8EED0eb7c76543469d2BE';

async function main() {
    const TestV2 = await ethers.getContractFactory("TestV2");
    console.log("Upgrading...");
    await upgrades.upgradeProxy(proxyAddress, TestV2);
    console.log("successfully");
}
main();
yarn hardhat run scripts/upgrade_contract_v2.ts --network polygon_mumbai

 

yarn hardhat verify --network polygon_mumbai {testv2Address}

 

위와 같이 upgrade contract 까지 진행하게 되면 프록시 컨트랙트를 확인해보면 교체된것을 확인 할 수 있습니다.

Comments