使用 BNB 从合约购买代币时出现问题

2024-06-20

我正在创建这个智能合约,它创建所有代币并将其添加到我的钱包中。 然后我将钱包中的所有代币发送到我的合约中。

然而,当我从另一个钱包向合约发送 BNB 时,我希望他返回我合约中的一些代币。

当我这样做时,传输失败并发送以下错误消息:

警告!合约执行过程中遇到错误[out ofgas]

Queria saber se estou fazendo algo errado, ou como devo fazer para que meu contrato tenhagas.

交易明细:https://testnet.bscscan.com/tx/0x7ef36e49e3c6f77716aee79cefbde6c298c3ddeef16ed12dbe613573661135bb https://testnet.bscscan.com/tx/0x7ef36e49e3c6f77716aee79cefbde6c298c3ddeef16ed12dbe613573661135bb

智能合约:

pragma solidity ^0.8.0;

interface IERC20 {

function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);

function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);


event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value); }


contract ERC20Basic is IERC20 {

string public constant name = "ByeSeel";
string public constant symbol = "BYS";
uint8 public constant decimals = 18;


event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
event Transfer(address indexed from, address indexed to, uint tokens);


mapping(address => uint256) balances;

mapping(address => mapping (address => uint256)) allowed;

uint256 totalSupply_ = 100 * 10 ** 18;

using SafeMath for uint256;

constructor() public {
balances[msg.sender] = totalSupply_;
}

function totalSupply() public override view returns (uint256) {
return totalSupply_;
}

function balanceOf(address tokenOwner) public override view returns (uint256) {
    return balances[tokenOwner];
}

function transfer(address receiver, uint256 numTokens) public override returns (bool) {
    require(numTokens <= balances[msg.sender]);
    balances[msg.sender] = balances[msg.sender].sub(numTokens);
    balances[receiver] = balances[receiver].add(numTokens);
    emit Transfer(msg.sender, receiver, numTokens);
    return true;
}

function approve(address delegate, uint256 numTokens) public override returns (bool) {
    allowed[msg.sender][delegate] = numTokens;
    emit Approval(msg.sender, delegate, numTokens);
    return true;
}

function allowance(address owner, address delegate) public override view returns (uint) {
    return allowed[owner][delegate];
}

function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
    require(numTokens <= balances[owner]);
    require(numTokens <= allowed[owner][msg.sender]);

    balances[owner] = balances[owner].sub(numTokens);
    allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
    balances[buyer] = balances[buyer].add(numTokens);
    emit Transfer(owner, buyer, numTokens);
    return true;
}

event Received(address, uint);
 receive() external payable {
 emit Received(msg.sender, msg.value);
}

 }

library SafeMath {
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
  assert(b <= a);
  return a - b;
}

function add(uint256 a, uint256 b) internal pure returns (uint256) {
  uint256 c = a + b;
  assert(c >= a);
  return c;
} }

contract DEX {

event Bought(uint256 amount);
event Sold(uint256 amount);


IERC20 public token;

constructor() public {
    token = new ERC20Basic();
}

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "You need to send some Ether");
    require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

function sell(uint256 amount) public {
    require(amount > 0, "You need to sell at least some tokens");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Check the token allowance");
    token.transferFrom(msg.sender, address(this), amount);
    msg.sender.transfer(amount);
    emit Sold(amount);
}

}

根据 BscScan 上的交易详细信息,您正在尝试发送 0.1 BNB 并且不调用任何函数。

你的合同没有收到() https://docs.soliditylang.org/en/v0.8.4/contracts.html#receive-ether-function,也不倒退() https://docs.soliditylang.org/en/v0.8.4/contracts.html#fallback-function函数,它将接受传入的 BNB。

所以你需要做的就是实施receive()功能。注意payable允许该函数接受 BNB 的修饰符。

contract ERC20Basic is IERC20 {
    // rest of your code

    receive() external payable {
        // can call the buy() function
        buy();
    }
}

您可以在截屏 https://i.stack.imgur.com/dr3HO.jpg当您向合约发送 100 wei(或 100 jager,如果是 BNB)时,receive()函数执行buy()函数并产生Bought事件日志。

这是在您的合约上实现的完整代码:

pragma solidity ^0.8.0;

interface IERC20 {

function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);

function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);


event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
    
}


contract ERC20Basic is IERC20 {

string public constant name = "ByeSeel";
string public constant symbol = "BYS";
uint8 public constant decimals = 18;


//event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
//event Transfer(address indexed from, address indexed to, uint tokens);


mapping(address => uint256) balances;

mapping(address => mapping (address => uint256)) allowed;

uint256 totalSupply_ = 100 * 10 ** 18;

using SafeMath for uint256;

constructor() public {
balances[msg.sender] = totalSupply_;
}

function totalSupply() public override view returns (uint256) {
return totalSupply_;
}

function balanceOf(address tokenOwner) public override view returns (uint256) {
    return balances[tokenOwner];
}

function transfer(address receiver, uint256 numTokens) public override returns (bool) {
    require(numTokens <= balances[msg.sender]);
    balances[msg.sender] = balances[msg.sender].sub(numTokens);
    balances[receiver] = balances[receiver].add(numTokens);
    emit Transfer(msg.sender, receiver, numTokens);
    return true;
}

function approve(address delegate, uint256 numTokens) public override returns (bool) {
    allowed[msg.sender][delegate] = numTokens;
    emit Approval(msg.sender, delegate, numTokens);
    return true;
}

function allowance(address owner, address delegate) public override view returns (uint) {
    return allowed[owner][delegate];
}

function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
    require(numTokens <= balances[owner]);
    require(numTokens <= allowed[owner][msg.sender]);

    balances[owner] = balances[owner].sub(numTokens);
    allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
    balances[buyer] = balances[buyer].add(numTokens);
    emit Transfer(owner, buyer, numTokens);
    return true;
}

event Received(address, uint);
 receive() external payable {
 emit Received(msg.sender, msg.value);
}

 }

library SafeMath {
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
  assert(b <= a);
  return a - b;
}

function add(uint256 a, uint256 b) internal pure returns (uint256) {
  uint256 c = a + b;
  assert(c >= a);
  return c;
} }

contract DEX {

    event Bought(uint256 amount);
    event Sold(uint256 amount);
    
    
    IERC20 public token;
    
    constructor() public {
        token = new ERC20Basic();
    }
    
    function buy() payable public {
        uint256 amountTobuy = msg.value;
        uint256 dexBalance = token.balanceOf(address(this));
        require(amountTobuy > 0, "You need to send some Ether");
        require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
        token.transfer(msg.sender, amountTobuy);
        emit Bought(amountTobuy);
    }
    
    function sell(uint256 amount) public {
        require(amount > 0, "You need to sell at least some tokens");
        uint256 allowance = token.allowance(msg.sender, address(this));
        require(allowance >= amount, "Check the token allowance");
        token.transferFrom(msg.sender, address(this), amount);
        payable(msg.sender).transfer(amount);
        emit Sold(amount);
    }
    
    receive() external payable {
        buy();
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BNB 从合约购买代币时出现问题 的相关文章

  • 区块链可以存储在 SQL 甚至 noSQL 数据库中吗?

    我读过 区块链数据库不存储在任何单一位置 这意味着它保存的记录是真正公开的并且易于验证 此信息不存在可供黑客破坏的集中版本 它的数据由数百万台计算机同时托管 互联网上的任何人都可以访问 所以我的问题是我们可以将区块链存储在例如 sql 中吗
  • 区块链为何如此安全? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 昨天我读到一篇关于区块链的文章 根据它 区块链非常安全 我无法理解它如何安全 区块链如何确保数据安全 即使普通人也可以使用 saura
  • 如何使用 Python 和 web3.py 调用智能合约函数

    我在以太坊测试网络上部署了一个合约 其中包含一些功能 并且它们在使用 Remix 界面时都恰好可以工作 当尝试在 Python 中使用 web3 py 调用这些函数时 我只能调用公共函数 并且该部分工作正常 问题是调用具有 限制 的函数 例
  • Remix 上没有自动完成/代码完成功能?

    我在 Youtube 上观看 Remix 上的教程 他在输入代码时具有自动完成功能 但我没有 有谁知道如何启用它 这将帮助我更轻松地编写代码 但我在任何地方都找不到解决方案 对我来说 只需点击左下角的 设置 按钮并启用 在编辑器中启用代码完
  • 指定的输入源无效

    使用 remix IDE 构建智能合约时 通过以下导入收到无效的输入源指定错误 import https github com aave flashloan box blob Remix contracts aave FlashLoanRe
  • 构建图像时出错:在存储库 docker.io/hyperledger/fabric-baseimage 中找不到最新标签

    我将链代码部署到对等网络 但没有成功 我查看了同行的日志 看到了一条错误消息 构建镜像时出错 在存储库 docker io hyperledger fabric baseimage 中找不到最新标签 从中提取特定的基础镜像https hub
  • Solidity 中的状态变量是什么?

    我读过一些关于storage memory and view pure 但我并不完全理解它们 我有以下代码 contract struct Random uint32 state uint8 i function main pure int
  • Solidity - 输入 JSON 描述的 Solidity 代码

    我想编译我的以太坊 HelloWorld sol 智能合约 在所有教程中 您都是这样做的 var solc require solc var compiledContract solc compile fs readFileSync Hel
  • 恢复发送至自部署合约的BNB

    我正在尝试创建 BOT 因此在 BSC 中从 eatamask 创建并部署了一个合约 我向该合约发送了一些 BNB 来检查 但没有成功 我怎样才能拿回BNB 感谢帮助 因为我对此很陌生 除非您在合约中具有允许您提取资金的自定义功能 否则它们
  • IBM Blockchain Marble 演示中的交易存储在哪里?

    我正在运行下面链接中提到的 IBM 提供的区块链演示 https github com IBM Blockchain marbles https github com IBM Blockchain marbles 我在一个 Linux 系统
  • Solidity有HTTP请求功能吗?

    我正在使用以太坊制作一个项目 在这个项目中 我正在签订一份名为 A 的合同 当我向 A 发送消息时 我希望 A 发出网络请求 Solidity 是否可以使用 http 请求 方法 GET POST 以太坊区块链无法与外界交互 否则它将不再是
  • Fabric 上的事件中心已关闭 编写您的第一个应用程序

    我目前正在尝试在此处运行 Hyperledger Fabric 的第一个应用程序示例 gt http hyperledger fabric readthedocs io en release 1 1 write first app html
  • Solidity ParserError:预期为“;”但得到了“{”

    使用版本0 6 0 pragma solidity 0 6 0 contract Test function sendValue address payable recipient uint256 amount external bool
  • 在 Hedera 区块链中创建智能合约时出现错误“Transaction Oversize”

    我的 bin 文件大小只有 18kb 我还得到了使用 IPFS 的解决方案 但不知道如何使用它 如果有任何使用 IPFS 的参考 请分享给我 错误 PrecheckStatusError 交易 电子邮件受保护 cdn cgi l email
  • 区块链是分布式数据库吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 大多数文章都将区块链视为分布式数据库 这是否意味着我们可以在区块链中存储任何类型的数据 例如音频 视频 pdf 将区块链视为相对较慢
  • 类型错误:无法读取未定义的属性“长度” - 使用安全帽部署时

    我在尝试在安全帽开发链上部署模拟合约时收到以下错误 我正在关注 使用 JavaScript 学习区块链 Solidity 和全栈 Web3 开发 Patrick Collins 在 FreeCodeCamp YT 频道上的 32 小时课程
  • 如何导入 AggregatorV3Interface

    我正在尝试导入 AggregatorV3 但找不到该文件 这是我的代码 提前抱歉 我仍然是一名初学者程序员 SPDX License Identifier MIT pragma solidity 0 8 9 import chainlink
  • 区块链是否包含 websocket 服务器?

    我最近阅读了有关区块链的文章 并对这项技术非常感兴趣 我有几个关于区块链的问题 区块链是否使用网络套接字在用户之间传输信息 如果是 那么发送的信息 块 总是 JSON 对象吗 是否所有用户都拥有区块链的完整副本 他们每个人是否只看到区块链的
  • 错误:无法检测网络(事件=“noNetwork”,代码=NETWORK_ERROR,版本=providers/5.6.8)

    我想连接到ganache我得到一个error我不知道如何解决它 这是我的deploy js代码 它是脚本node js const ethers require ethers const solc require solc const fs
  • 我试图获取某个 tron 地址的所有交易

    我找不到一种方法来获取某个 Tron 地址所涉及的交易历史记录 我尝试了 tronweb API 但这没有做任何事情 那么有人设法找到一种方法来做到这一点吗 这很简单 只需做一个GET请求以下网址 https api trongrid io

随机推荐

  • 使用healpy通过HEALPix像素化制作2D直方图

    数据是天空中物体的坐标 例如如下 import pylab as plt import numpy as np l np random uniform 180 180 2000 b np random uniform 90 90 2000
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 是否可以@Lazy 初始化Spring @Value?

    是否有可能 Lazy初始化一个Spring Value e g Lazy Value someConfig private String someConfig 我特别提到的场景是通过 JNDI 设置的变量 并且一个嵌入式 Tomcat 容器
  • 强制 Mpeg2 解复用器使用 ffdshow 渲染 H 264 数字电视视频

    不幸的是 我花了很多时间尝试使 DirectShow 的 DTVViewer 示例正常工作 但没有成功 DVBT网络的视频格式是H264 我发现IntelliConnect行为IFilterGraph更喜欢使用 Mpeg2 视频格式 对于那
  • 错误域=kAFAssistantErrorDomain 代码=209“(空)”

    我面临着一个问题SFSpeechRecognizer 启动应用程序几秒钟后 我开始收到错误消息 错误域 kAFAssistantErrorDomain 代码 209 空 和 错误 域 kAFAssistantErrorDomain 代码 2
  • python 单击帮助格式化换行符

    我发现我的 EPILOG 中没有保留换行符 我想知道为什么如果我看到只有当一行有换行符时才会保留74人物 http click pocoo org 5 commands import click sys def main caller ar
  • Celery工人变量共享问题

    我正在使用Python并且celery http www celeryproject org在一个项目中 在项目中 我有两个文件 celeryconfig py BROKER URL amqp guest guest localhost 5
  • fread 将空导入为 NA

    我正在尝试导入带有空白的 csv 读取为 不幸的是他们都读作 NA now 为了更好地演示问题 我还展示了如何NA NA and 都映射到同一事物 除了最底部的示例 这将妨碍简单的解决方法dt is na dt lt gt write cs
  • 如何使用导航组件在单一活动设计中使用偏好?

    我想使用导航组件迁移到单一活动设计 我正在使用一项活动 其他活动是片段 对于某些屏幕 我只有布局 没有偏好 使碎片膨胀没有问题 但当我尝试按偏好工作时 我遇到了问题 我的要求是 我需要在片段中膨胀工具栏和首选项列表 我的做法 使用以下代码添
  • 同域策略如何应用于 Firefox 和 Chrome 扩展程序中的后台脚本(非内容脚本)?

    据我了解 扩展中有两种类型的脚本 一种是从网页中的 DOM 运行并与之交互的 内容脚本 它们受同源策略的约束 另一种是 内容脚本 其他的是脚本 调用它们 扩展脚本 在后台运行 可能会也可能不会与网页交互 例如main js在火狐或背景 js
  • 为 M1 mac 签署 Electron 构建会导致渲染器崩溃

    一段时间以来 我一直在使用 Electron Builder 对我们的 Electron 应用程序进行英特尔构建 对它们进行签名 并且能够毫无问题地运行它们 我现在正在尝试进行 M1 arm 构建 但事实证明签署该构建会导致渲染器崩溃 不签
  • React:隐藏特定路由上的组件

    新的反应 我有一个
  • 如何将 CLI 参数传递给 GDB 中“定义”内的“命令”?

    E g define mycmd break arg0 commands print arg0 end end mycmd myfunc continue Prints 1 void 而不是预期的myfunc 因为 arg0当命令被点击时被
  • 如何保持纱线工作区依赖关系同步

    假设我的包中有多个包yarn workspaces mycompany utils mycompany app mycompany serv 假设每个包都有一个dependency on lodash 我想确保他们都有相同的lodash版本
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • 如何验证地图中的集合

    我有一个问题 ValidJSR 303 的注释 这注解 http docs jboss org hibernate validator 4 3 reference en US html single d0e425对于普通列表或集合工作正常
  • Jquery:选择器找不到类?

    我正在尝试推进 Jquery autcomplete 功能 我希望 Jquery 自动完成在表中创建新行 到目前为止 这有效 但我希望 Jquery 添加一个删除按钮 因此用户可以删除他添加的项目之一 document ready func
  • 为 Symfony 指定备用后备路径以查找捆绑包的树枝模板

    基本问题 如何让 symfony 在非标准目录中查找 最佳 自定义 Twig 模板来加载捆绑视图 Symfony 文档说默认情况下它会在两个位置查找覆盖 Twig 模板 http symfony com doc current book t
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • 使用 BNB 从合约购买代币时出现问题

    我正在创建这个智能合约 它创建所有代币并将其添加到我的钱包中 然后我将钱包中的所有代币发送到我的合约中 然而 当我从另一个钱包向合约发送 BNB 时 我希望他返回我合约中的一些代币 当我这样做时 传输失败并发送以下错误消息 警告 合约执行过