`

UUPS

 
阅读更多
a.Proxy直接把所有的请求都通过delegatecall丢给Implementation(如果是升级,Implementation的升级函数会确认一下是否为管理员)
b.需要实现_authorizeUpgrade函数以确保只有管理员账户可以进行升级
c.升级函数upgradeTo在Implementation合约中

// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;

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

contract UUPSImplement is Initializable, UUPSUpgradeable, OwnableUpgradeable {
    uint256 public num;

    function initialize() initializer public {
      __Ownable_init();
      __UUPSUpgradeable_init();
    }

    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() initializer {
    }

    function _authorizeUpgrade(address) internal override onlyOwner {}

    function setNum(uint256 _num) external{
        num = _num;
    }

    function fun() external{
        console.log("fun");
    }
}


// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;

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

contract UUPSImplementNew is Initializable, UUPSUpgradeable, OwnableUpgradeable {
    uint256 public num;
    address public addr;

    function initialize() initializer public {
      __Ownable_init();
      __UUPSUpgradeable_init();
      num = 3;
    }

    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() initializer {
        addr = msg.sender;
    }

    function _authorizeUpgrade(address) internal override onlyOwner {
        console.log("_authorizeUpgrade");
        console.log(owner());
    }

    function setAddr(address _addr) external {
        addr = _addr;
    }

    function fun() external{
        console.log("new fun");
    }
}


test
const { ethers, upgrades } = require('hardhat');

contractImpl = "UUPSImplement";
contractImplNew = "UUPSImplementNew";


describe("contractProxy", function () {
  it("UUPS ", async function () {
    const ContractImpl = await ethers.getContractFactory(contractImpl);
    const impl = (await upgrades.deployProxy(ContractImpl, {kind: 'uups'}));
    await impl.fun();
    await impl.setNum(8);
    console.log("num:",await impl.num());

    const ContractImplNew = await ethers.getContractFactory(contractImplNew);
    implNew = (await upgrades.upgradeProxy(impl, ContractImplNew));
    await implNew.fun();
    await implNew.setAddr(implNew.address);
    console.log("num:",await implNew.num());
    console.log("addr:",await implNew.addr());
  });
});

需要在hardhat.config.js最上面加上
require('@openzeppelin/hardhat-upgrades');

contractProxy
fun
num: BigNumber { value: "8" }
new fun
num: BigNumber { value: "8" }
addr: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
分享到:
评论

相关推荐

    开发bilibili网站爬虫,大数据分析研究.zip

    开发bilibili网站爬虫,大数据分析研究比利蜘蛛【本项目孵化自想法#4】简介这里是UUPs爬虫主项目组,任何新的均会首先应用在B站爬虫上。我们的目标是为达到up主的创作道路助力,主要体现在数据获取与管理利用爬虫...

    开发 bilibili 网站爬虫,大数据分析研究.rar

    这里是UUPs爬虫主项目组,任何新技术均会首先应用在B站爬虫上。我们的目标是为每位up主的创作之路助力,主要体现在: 1. 数据获取与管理:利用爬虫技术获取全B站的视频与用户数据,并用维护数据库的方法管理它们,...

    树莓派安装win10及其他系统

    你可以从UUP Dump (UUPs官网)找到这个系统镜像,这是一个非官方的微软Windows更新镜像下载站点。请确保下载的是针对树莓派的正确版本,并注意系统的兼容性,如4B型号的树莓派可能需要特定的IoT Core版本。 在下载并...

    converter:多平台UUP转换器

    用法./convert.sh [compression] [uups_directory] [create_virtual_editions]压缩选项: wim-标准wim压缩( /Compress:max DISM中的/Compress:max )(默认) esd-固态esd压缩( /Compress:recovery DISM中的/...

    2025最新全国水利安全生产知识竞赛题库(含答案).docx

    2025最新全国水利安全生产知识竞赛题库(含答案).docx

    【雷达】非相干多视处理(CSA)Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    使用 MATLAB 的实时人脸识别考勤系统Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    elasticsearch8.17.1 docker镜像资源

    因为文件过大所以使用bz2进行了2次压缩,请解压成tar包后在上传到服务器

    基于java+ssm+mysql的校园二手交易平台 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    iostat打印解析画图工具

    iostat打印解析画图工具

    fence-agents-compute-4.2.1-41.el7-9.6.x64-86.rpm.tar.gz

    1、文件内容:fence-agents-compute-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-compute-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    从倾斜边缘或倾斜狭缝计算 MTFMatlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    维控HMI和PLC在各行业的应用

    PDF格式,229页,包括有环保,新能源,木工,包装等行业的应用。适用于电气自动化行业。

    dropwatch-1.4-9.el7.x64-86.rpm.tar.gz

    1、文件内容:dropwatch-1.4-9.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/dropwatch-1.4-9.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    fence-agents-emerson-4.2.1-41.el7-9.6.x64-86.rpm.tar.gz

    1、文件内容:fence-agents-emerson-4.2.1-41.el7_9.6.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/fence-agents-emerson-4.2.1-41.el7_9.6.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    航空发动机磨粒荷电特性研究.pdf

    航空发动机磨粒荷电特性研究.pdf

    第十一届蓝桥杯大赛个人赛校内选拔(软件类)真题

    第十一届蓝桥杯大赛个人赛校内选拔(软件类)真题全面考察了参赛选手的编程与算法能力,涵盖多个热门编程语言,为选手提供了展现自身实力的舞台。 考察范围与方向 真题在编程语言上聚焦于 C/C++、Java、Python 等主流语言。考察内容广泛,既有基础的语法运用,也涉及复杂的数据结构和算法。数据结构方面,对数组、链表、栈、队列、哈希表等的使用有不同程度的考察;算法上,动态规划、贪心算法、搜索算法等经典算法是考察重点。 题型示例与特点 在具体题型上,有数值计算类题目,例如给定条件计算特定数值,要求选手有较强的逻辑思维和数学运算能力;字符串处理类题目,如字符串匹配、替换等,考验选手对字符串操作函数的熟悉程度;还有图论与搜索类题目,像最短路径问题,需要选手掌握相应的搜索算法。 考察目的与意义 这次校内选拔真题旨在筛选出编程能力强、算法思维敏捷的选手,为后续的正式比赛储备人才。通过解答这些真题,选手能发现自身知识短板,明确学习方向。对于学校而言,能了解学生的编程水平,为教学改进提供参考。同时,这也为学生提供了与同龄人交流切磋的机会,激发他们学习编程的热情,提升解决实际问题的能力。

    一种采用耦合电感的开关电路分析.pdf

    一种采用耦合电感的开关电路分析.pdf

    rancher-active-proxy

    rancher-active-proxy

    RSSIIndoorLocation-master

    RSSIIndoorLocation-master

Global site tag (gtag.js) - Google Analytics