ERC20:津贴不足

2024-05-06

我创建了两个代币 (YAY e sYAY) 和一个 StakeRewards 智能合约。 代码如下:

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract YAYToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("YAY", "YAY") {
        _mint(msg.sender, initialSupply);
    }
}

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract stkYAYToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("Stake YAY", "sYAY") {
        _mint(msg.sender, initialSupply);
    }
}

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

// Hero Prime Staking v1.0

contract StakingRewards {
    IERC20 public stakingToken;
    IERC20 public rewardsToken;
    
    uint public rewardRate = 100;
    uint public lastUpdateTime;
    uint public rewardPerTokenStored;
    uint public lockedTime = 120; // 2 Min
    // uint public lockedTime = 1209600; // 14 days
    uint public initialTime = 60; // 1 Min
    // uint public initialTime = 604800; // 7 days
    
    address public owner;
    
    bool public isAvailable = true;
    
    mapping(address => uint) public userRewardPerTokenPaid;
    mapping(address => uint) public rewards;
    mapping(address => uint) public stakeStart;

    uint public _totalSupply;
    mapping(address => uint) public _balances;
    
    
    event StartStaked(address indexed owner, uint _amount, uint _time);
    event WitdrawStaked(address indexed owner, uint _amount, uint _time, bool _withPenalty);
    event WitdrawRewards(address indexed owner, uint _amount, uint _time, bool _withPenalty);
    
    
    constructor(address _stakingToken, address _rewardsToken) {
        owner = msg.sender;
        stakingToken = IERC20(_stakingToken);
        rewardsToken = IERC20(_rewardsToken);
    }
    
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
    function transferOwnership(address _newOwner) external onlyOwner{
        owner = _newOwner;
    }
    function pause() public onlyOwner{
        isAvailable = false;
    }
    function unpause() public onlyOwner{
        isAvailable = true;
    }
    
    function rewardPerToken() public view returns (uint) {
        if (_totalSupply == 0) {
            return 0;
        }
        return
            rewardPerTokenStored +
            (((block.timestamp - lastUpdateTime) * rewardRate * 1e18) / _totalSupply);
    }

    function earned(address account) public view returns (uint) {
        return
            ((_balances[account] *
                (rewardPerToken() - userRewardPerTokenPaid[account])) / 1e18) +
            rewards[account];
    }
    
    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = block.timestamp;

        rewards[account] = earned(account);
        userRewardPerTokenPaid[account] = rewardPerTokenStored;
        _;
    }
    
    function changeRate(uint _newRate) public onlyOwner{
        rewardRate = _newRate;
    }
    
    function stake(uint _amount) external updateReward(msg.sender) {
        require(isAvailable == true, "The Staking is Paused");
        _totalSupply += _amount;
        _balances[msg.sender] += _amount;
        stakeStart[msg.sender] = block.timestamp;
        stakingToken.transferFrom(msg.sender, address(this), _amount);
        
        emit StartStaked(msg.sender, _amount, block.timestamp);
    }
    
    function withdraw(uint256 _amount) external updateReward(msg.sender) {
        require( (block.timestamp - stakeStart[msg.sender]) >= initialTime, "Not time yet" ); 
        require(_balances[msg.sender] > 0, "You don't have any tokens Staked");
        require(_balances[msg.sender] >= _amount, "You don't have enought tokens in Staking");
        
        if((block.timestamp - stakeStart[msg.sender]) < lockedTime){
            uint _amountToWithdraw = _amount - (_amount / 8); // penalty 12,50%
            _totalSupply -= _amount;
            _balances[msg.sender] -= _amount;
            stakingToken.transfer(msg.sender, _amountToWithdraw);
            
            emit WitdrawStaked(msg.sender, _amountToWithdraw, block.timestamp, true);
            
        }else{
            _totalSupply -= _amount;
            _balances[msg.sender] -= _amount;
            stakingToken.transfer(msg.sender, _amount); // without penalty
            
            emit WitdrawStaked(msg.sender, _amount, block.timestamp, false);
            
        }
        
    }

    function getReward() external updateReward(msg.sender) {
        require( (block.timestamp - stakeStart[msg.sender]) >= initialTime, "Not time yet" ); 
        
        if((block.timestamp - stakeStart[msg.sender]) < lockedTime){
            uint reward = rewards[msg.sender] - (rewards[msg.sender] / 8); // penalty 12,50%
            rewards[msg.sender] = 0;
            rewardsToken.transfer(msg.sender, reward);
            
            emit WitdrawRewards(msg.sender, reward, block.timestamp, true);
            
        }else{
            uint reward = rewards[msg.sender];
            rewards[msg.sender] = 0;
            rewardsToken.transfer(msg.sender, reward); // without penalty
            
            emit WitdrawRewards(msg.sender, reward, block.timestamp, false);
        }
        
    }
    
    
    function changeLockedTime(uint _newLockedTime) public onlyOwner{
        lockedTime = _newLockedTime;
    }
    
    function changeInitialReward(uint _newInitialReward) public onlyOwner{
        initialTime = _newInitialReward;
    }
    
    function getStaked(address _account) external view returns(uint){
        return _balances[_account];
    }
    
    
}



interface IERC20 {
    function totalSupply() external view returns (uint);

    function balanceOf(address account) external view returns (uint);

    function transfer(address recipient, uint amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool);

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

我在 remix 中部署了这些智能合约,但是当我尝试使用低值(例如 1000)调用 stake 方法时,remix 返回以下错误: 交易至 StakeRewards.stake 待处理... 交易到 StakeRewards.stake 时出错:虚拟机错误:恢复。

恢复 交易已恢复到初始状态。 合同给出的原因:“ERC20:津贴不足”。 调试事务以获取更多信息。

你知道为什么吗?

非常感谢。


合同抛出“津贴不足”,因为没有指定津贴msg.sender花费from地址(在这种情况下,也msg.sender)

To call transferFrom, the from地址应该事先获得批准,但似乎您没有。

您有 2 个选择:

  • Approve msg.sender for msg.sender.
  • 只需使用transfer方法。这更有意义,因为from地址是msg.sender

查看EIP-20标准 https://eips.ethereum.org/EIPS/eip-20了解每种方法的用途

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

ERC20:津贴不足 的相关文章

  • Web3.py:使用待处理过滤器时出现 ValueError

    我正在尝试使用 web3 py 查找 BEP20 网络中的待处理交易 如中所述在这个堆栈溢出问题中 https stackoverflow com questions 57201888 different ways of getting e
  • Remix 上没有自动完成/代码完成功能?

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

    使用 remix IDE 构建智能合约时 通过以下导入收到无效的输入源指定错误 import https github com aave flashloan box blob Remix contracts aave FlashLoanRe
  • 如何在 Python 和 web3.py 中获取 Solidity 恢复/需要错误原因

    我正在努力抓住要求 交易恢复时出错 但我得到了交易的哈希值 我正在使用web3 py def addParticipants request web3 Web3 HTTPProvider settings Blockchain IP add
  • 如何修复Hyperledger Fabric中“执行End-2-End场景失败”的问题?

    我正在尝试运行此处提供的 Fabric 示例 https github com hyperledger fabric samples tree release 1 2 first network https github com hyper
  • Solidity - 输入 JSON 描述的 Solidity 代码

    我想编译我的以太坊 HelloWorld sol 智能合约 在所有教程中 您都是这样做的 var solc require solc var compiledContract solc compile fs readFileSync Hel
  • Node.js 还是 Go 来进行 Hyperledger Fabric 的链码开发?

    其中哪一种语言Node js and Go在可维护性 可扩展性和更好的支持方面更适合 链码 开发 这是个人喜好的问题 但我会说 Golang 因为 Node js chaincode 在容器构建时使用 npm install 速度很慢 并且
  • 如何获取交易结果和状态

    我正在尝试使用以太坊区块链和 Solidity 合约 我目前正在部署合约并对其执行一些操作 但我想知道如何获取特定交易的一些 反馈 回调 返回 例如 有没有办法将事务的状态设置为 0 错误 并仍然获取事件 if id length lt 0
  • 私有区块链与 Hashgraph、Ripple、BigChainDb

    我一直在研究不同区块链的一些用例 最后我得出的结论是 建立一个私有区块链相当于拥有一个分布式数据库 在其之上添加了区块链概念 如不可篡改 数字签名等 例如 Bigchaindb 好吧 如果我们确实需要智能合约功能 那么分布式数据库可能无法工
  • 如何删除solidity中的数组项

    我正在尝试删除 Solidity 数组中的某个项目 我正在探索一些文章 https ethereum stackexchange com questions 1527 how to delete an element at a certai
  • Metamask 停止注入 web3.js

    据我们所知 从2020年1月13日开始 metamask将不再注入web3 js 我们应该采取哪些方法来停止对web3的依赖 另外 我们如何使用目前正在注入 web3 js 的现有 Metamask 来测试它 window ethereum
  • Hyperledger Composer:尚未为此连接指定业务网络

    我已经在本地安装了 hyperledger 作曲家 但在本地主机上它给出错误 错误 尝试 ping 时出错 错误 没有业务网络 为此连接指定 我也无法添加模型和脚本文件 这是终端中显示的错误 error Hyperledger Compos
  • 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
  • 在 Corda 中,哪些数据会发送到非验证公证服务?

    这个问题经常出现在对话中 当 Corda 交易被发送到非验证公证服务进行最终确定时 公证服务可以看到并推断出关于世界的什么 在将交易发送给非验证公证人之前 会按如下方式进行过滤 stx buildFilteredTransaction Pr
  • 如何获取以太坊账户余额?

    如何以编程方式发现以太坊区块链上给定账户中有多少 ETH 在网上 不是程序化的 而是为了完整性 如果您只想获取帐户或合约的余额 您可以访问http etherchain org http etherchain org or http eth
  • 在 C# 中解析 Cryptocompare API Json 数据

    我正在加载数据 这是返回 Response Success Type 100 Aggregated false Data time 1504979760 high 14 26 low 14 26 open 14 26 volumefrom
  • 如何通过 Web3-react 保持 MetaMask 与 UI 的连接持久?

    我正在使用 web3 react 但我不知道如何在浏览器刷新时保持与 MetaMask 钱包的连接持续 这是代码 define the injectedConnectors const injectedConnector new Injec
  • 如何发送wei/eth到合约地址? (使用truffle javascript测试)

    我正在尝试将 wei eth 发送到我的 Solidity 合约的地址 该合约具有外部应付回退功能 我下面的 truffle javascript 测试不会导致 instance address 的余额获得任何 wei instance a
  • NPM 无法在 Windows 上安装“truffle”

    我正在尝试使用 npm 安装 truffle 但我不熟悉 NodeJS 并且不明白为什么 npm 不会安装它 我尝试npm install g truffle在具有管理员权限的 Powershell 中 经过几行输出后 我收到以下错误消息块

随机推荐

  • 在电子邮件中设置 html 样式

    我正在为有能力的客户发送 HTML 版本的电子邮件 现在这不是几乎全部吗 我担心的是如何设计它 我使用内联CSS吗 我可以在 html 中包含样式表吗 html 是否以 or 我可以阅读这方面的标准吗 我在造型方面能走多远 我有边框半径 背
  • C++ 中的模块路径到 Java JNI 调用

    当我用 C 创建 Java 8 JVM 时 我通常使用类似以下代码的内容来告诉 JVM 类路径 JavaVMOption options new JavaVMOption 1 JVM invocation options options 0
  • 指向二维数组的指针和手动内存管理 - C

    我认为用纯 C 语言构建一个库来处理各种矩阵计算将是一个很好的挑战 现在 尽管我在 Objective C 和 Cocoa 方面有一些很好的经验 但我对 C 的了解正是我所需要的与 Objective C 一起工作 仅此而已 例如 我熟悉
  • 编译错误:computeFrames 选项不支持 JSR/RET

    当我编译 java 文件时 在 IntelliJ 项目上出现此错误 没有列出特定的源文件 但它失败并出现此错误 删除以下编译器标志可修复该错误 source 1 5 target 1 5 然而 这些需要在那里 因为我们的目标是 Java 5
  • Hibernate vs JPA vs JDO - 各自的优缺点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉 ORM 这个概念 几年前我什至在 NET 项目中使用过 nHibernate 然而 我还没有跟上 Java 中 ORM 的主题
  • iOS Objective-C 对象:何时使用release,何时不使用它

    我在 iOS 下 正在使用 delphi Tokyo 进行开发 这是我的代码 aUIImage TUIImage Wrap TUIImage alloc initWithCGImage aCGImageRef try aData TNSDa
  • Hibernate/JPA 在启动时不验证数据库架构

    由于某种原因 hibernate 无法捕获诸如将实体映射到不存在的表之类的问题 我的 persistence xml 文件看起来像这样
  • 通过 adb 将触摸事件发送到设备[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下方式将触摸事件发送到设备adb shell命令 这样我就可以为 UI 测试做一些基本的自动化 我已经关注了之前一些关于此问题的讨论 我确认了获取事件并使用sendevent 为每次触摸发送 6
  • ANSI C,整数到字符串,不带可变参数函数

    我目前正在使用支持 ANSI C 的 PLC 但使用它自己的 GNU 编译器风格 它不编译任何可变参数函数和 itoa 之类的东西 所以使用 sprintf co 不是将整数转换为字符串的选项 任何人都可以引导我到一个列出了健壮的 无 sp
  • NotificationCompact.Builder 和 ActionBarSherlock 的问题

    在下面的代码中 Eclipse发现错误 The method build is undefined for the type NotificationCompat Builder 在添加之前一切正常ActionBarSherlock htt
  • onClick 在 p 标签上无法正常工作

    我想为每个绑定一个点击事件 p 但它似乎不能正常工作 当我运行脚本时 我立即收到三个警报 我只想在单击三个中的任何一个时获得它们 p p s 谁能告诉我我做错了什么 编辑 抱歉 这就是它的样子 HTML 应该是这样的 p p class s
  • Laravel 4 JSON 响应与 Cookie

    如何设置带有 json 响应的 cookie 我注意到 至少对我来说 以下命令是唯一可以设置 cookie 的命令 return Redirect to gt withCookie Cookie make blog cookie value
  • 将 Typescript 项目打包为可执行文件

    如何将 Typescript 项目打包成可执行文件 由于我找了一段时间没有找到 所以我使用了 now 节点来实现上述目的 我正在发布我所做的事情 希望有人会觉得它有用 将Typescript项目编译成node 根据this https me
  • 使用 ABAddressBookRegisterExternalChangeCallback 注册的地址簿更改回调永远不会被调用 (iOS 8)

    我已经找到了很多与此相关的示例 但在阅读整个 ABAddressBook 文档后 我仍然无法弄清楚为什么在我的情况下 我的更改回调没有被调用 我只是设置了一个地址簿并为其注册了一个回调函数 我可以很好地访问地址簿 但无论我在 联系人 应用程
  • Vue 3:“defineProps”引用本地声明的变量

    为什么我收到警告错误消息 defineProps引用本地声明的变量 eslint vue valid define props 当我在 props 中使用自定义验证器时SFC
  • escape()、encodeURI()、encodeURIComponent() 之间的区别

    在 JavaScript 中 它们之间有什么区别 escape unescape encodeuri decodeuri encodeURIComponent decodeURIComponent 对于有视觉头脑的人来说 这里有一个表格显示
  • 使用分组的多列熊猫绘制堆积条形图

    我有两个数据框 我需要获取它们之间的差异 然后在该差异之上绘制其中一个数据框 这是一个最小的例子 import pandas as pd import matplotlib pyplot as plt df1 pd DataFrame 2
  • java列表中的addAll方法

    我一直在研究java中的addAll方法 但这让我感到奇怪 到底有什么区别public void addAll List
  • 在yii2的视图中添加模型中没有的自定义字段

    我在 yii2 中保存表单时遇到问题 我创建了一个自定义字段 其名称与其他字段相同Myposts categoryLevel2 该字段不在模型中 它是一个条件字段 当我发布我的内容时 我将其值分配给模型属性 例如 categoryLevel
  • ERC20:津贴不足

    我创建了两个代币 YAY e sYAY 和一个 StakeRewards 智能合约 代码如下 SPDX License Identifier MIT pragma solidity 0 8 0 import openzeppelin con