当前位置: 首页 > article >正文

solidity call使用

solidity call使用

<address>.call(bytes memory payload) returns (bool, bytes memory)

call 仅发送ETH,不传入data

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

contract SendEther {
    // 构造函数,payable使得部署的时候可以转eth进去
    constructor() payable {}

    function callEther(address payable recipient, uint256 amount)
        public
        returns (bool)
    {
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Transfer failed.");
        return success;
    }
}

1、部署合约时附带 value

2、调用合约,给接收地址recipient转账

call 传入data,附带发送ETH

在合约中调用其他的合约的方法

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

contract Callee {
    uint256 value;

    function getValue() public view returns (uint256) {
        return value;
    }

    function setValue(uint256 value_) public payable {
        require(msg.value > 0, "msg.value must > 0");
        value = value_;
    }
    // 获取合约地址的eth余额
    function getBalance() public view returns (uint256) {
        return address(this).balance;
    }

}

contract Caller006 {

    // 构造函数,payable使得部署的时候可以转eth进去
    constructor() payable {}

    function callSetValue(address callee, uint256 value)
        public
        returns (bool)
    {
        Callee meta = Callee(callee);

        // 对函数签名和参数进行编码
        bytes memory methodop = abi.encodeWithSignature(
            "setValue(uint256)",
            value
        );
        (bool flg, ) = address(meta).call{value: 1 ether}(methodop);

        if (!flg) {
            revert("call function failed");
        }

        return flg;
    }

    // 获取合约地址的eth余额
    function getBalance() public view returns (uint256) {
        return address(this).balance;
    }

}

staticcall调用其他合约的方法

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

contract Callee {
    function getData() public pure returns (uint256) {
        return 42;
    }
}

contract Caller {
    function callGetData(address callee) public view returns (uint256 data) {
        // call by staticcall
        // 对函数签名和参数进行编码
        bytes memory methodop = abi.encodeWithSignature("getData()");
        (bool flg, bytes memory result) = callee.staticcall(methodop);

        if(!flg){
            revert("staticcall function failed");
        }
        data = bytesToUint(result);

        return data;
    }

    function bytesToUint(bytes memory b) public pure returns (uint256) {
        uint256 number;
        for (uint256 i = 0; i < b.length; i++) {
            number = number + uint8(b[i]) * (2**(8 * (b.length - (i + 1))));
        }
        return number;
    }
}


http://www.kler.cn/a/375667.html

相关文章:

  • 「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图
  • WonderWorld: Interactive 3D Scene Generation from a Single Image 论文解读
  • Android使用timer和thread实现定时器
  • 如何在Linux系统中使用Apache HTTP Server
  • Python | Leetcode Python题解之第513题找树左下角的值
  • 【Linux刷题练习】
  • 初始JavaEE篇——多线程(6):线程池
  • SpringCloudAlibaba-Sentinel-熔断与限流
  • 【ShuQiHere】 如何理解渐进符号及其应用:大 O、大 Ω 和大 Θ
  • ResNet(残差网络)
  • 采用STM32CubeMX和HAL库的定时器应用实例
  • 竞赛管理新篇章:Spring Boot大学生竞赛平台
  • 【深度学习基础】深入理解 卷积与卷积核
  • 鸿蒙基础篇-ArkTS-语句-类型进阶与渲染控制
  • 生物信息与机器学习6 - 有监督学习算法和无监督学习算法
  • 强势改进!TCN-Transformer时间序列预测
  • 新能源汽车充电桩安装限流式保护器如何选配-安科瑞黄安南
  • 网络安全战略论文学习笔记day2
  • 013:开发软件Visual Studio 2012安装教程
  • 动态规划 - 编辑距离
  • PHP面试题总结
  • 三大专项计划助力教育公平,你准备好了吗?
  • 数字ic/FPGA,Windows/Linux系统,其他相关领域,软件安装包(matlab、vivado、modelsim。。。)
  • MacOS/Macbook用户自定义字体安装教程
  • T级别DDoS攻击与大型DDoS防御
  • 保持HTTP会话状态:缓存策略与实践