怎么样才会把代币合约内创建的合约里的代币转走

image.png

image.png

image.png

image.png

我使用这个方法在合约内部创建了个分发合约,里面放了一些币,今天发现被别人使用其他合约调用转走了,请问怎么样才会把这个给转走

请先 登录 后评论

最佳答案 2024-04-16 19:08

0xbCbCb0e7E28414e084c4a40C1cCC30B75629a7DE 这个合约提供一下,我看到他调用setRewardgenerateReward

你好,谢谢,我疏忽了

请先 登录 后评论

其它 4 个回答

Meta - 风是自由的,你也是

问题出自 Reward 合约的 setReward函数的可见性

具体调用流程可看https://app.blocksec.com/explorer/tx/bsc/0xe15d6f7fa891c2626819209edf2d5ded6948310eaada067b400062aa022ce718?line=0

1. setReward 是 public,任何人都能改,操纵了reward[rewardSender]。

    function setReward(address rewardSender, uint256 amount, uint256 remain, uint256 price) public {
        if(reward[rewardSender].length == 0) {
            rewardKeys.push(rewardSender);
        }

        reward[rewardSender].push(RewardData(rewardSender, amount, remain, price, block.timestamp));
        _totalRemainCnt += remain;
    }

2. generateReward函数的计算依赖于 reward[rewardSender],并更改了waitRelease[rewardKeys[i]]。

    function generateReward(uint256 coinPrice) public{
        coinPrice = coinPrice == 0 ? 1 * 10 ** _decimals : coinPrice;
        for (uint i = 0; i < rewardKeys.length; i++) 
        {
            for (uint j = 0; j < reward[rewardKeys[i]].length; j++) 
            {
                if (reward[rewardKeys[i]][j].remain == 0) {
                    continue;
                }

                uint256 pawnPrice = reward[rewardKeys[i]][j].price;
                uint256 targetRelease = reward[rewardKeys[i]][j].amount.mul(_mineDaliyRatio) / 100;
                uint256 fixMineCoin = targetRelease.mul(_fixMineCoinRatio).div(100);
                uint256 sameCoinValue = (((targetRelease - fixMineCoin) * pawnPrice).div(coinPrice));

                uint256 release = sameCoinValue + fixMineCoin;
                if (reward[rewardKeys[i]][j].remain < release) {
                    release = reward[rewardKeys[i]][j].remain;
                }

                if(waitRelease[rewardKeys[i]] != 0) {
                  waitRelease[rewardKeys[i]] += release;
                } else {
                  waitRelease[rewardKeys[i]] = release;
                }

                if (historyTotal[rewardKeys[i]] != 0) {
                    historyTotal[rewardKeys[i]] += release;
                } else {
                    historyTotal[rewardKeys[i]] = release;
                }
                reward[rewardKeys[i]][j].remain = reward[rewardKeys[i]][j].remain - release;
                history[rewardKeys[i]].push(RewardHistory(release, sameCoinValue, fixMineCoin, coinPrice, block.timestamp));
                _totalMineCnt += release;
                emit CoinReward(rewardKeys[i], release, coinPrice, sameCoinValue, fixMineCoin);
            }
        }
    }

3. getWaitReleaseCoin

    function getWaitReleaseCoin(address sender) public view returns(uint256) {
        return waitRelease[sender];
    }

4. transfer(GFA, 10000)依赖 reward.getWaitReleaseCoin(sender)。

 else if (recipient == contractAddress) {
      if (amount == releaseAmount) {
        uint256 waitRelease = reward.getWaitReleaseCoin(sender);
        uint256 poolBalance =  _balances[address(_tokenDistributor)];
        if (poolBalance < waitRelease) {
            waitRelease = poolBalance;
        }

        reward.releaseCoin(sender);
        _basicTransfer(address(_tokenDistributor), sender, waitRelease);
        _basicTransfer(sender, recipient, amount);
      }

你好,谢谢,我疏忽了

请先 登录 后评论
Jeack

贴代码

你好,这个是合约地址,代码已经开源了 0x278ce7151Bfd1b035e8Bc99e15b4d9773969D4eD

Jeack 回复 Helius

提问请补充好信息, 那条链 , 还有 你觉得的异常的 hash 是那个

Helius 回复 Jeack

你好,币安链,合约地址 0x278ce7151Bfd1b035e8Bc99e15b4d9773969D4eD,问题hash:0xe15d6f7fa891c2626819209edf2d5ded6948310eaada067b400062aa022ce718,麻烦你抽空看一下

Helius 回复 Jeack

我这边目前分析到的是,他创建了一个合约0xbF65cADB3F637e87271A4D9a62F03a634A61A19C,然后通过合约把我tokenDistributer(地址是0xE83d8a3C45b77d95C850C00aca53A57cE9D49314)里的代币地址全转出来,然后在博饼交易所卖出了

请先 登录 后评论
SharkTeam

应该是0xbcbc这个合约逻辑有问题,计算的reward结果太大了,我们的系统也检测到了这笔攻击交易。

WechatIMG137.png

你好,谢谢,我疏忽了

请先 登录 后评论
SharkTeam
请先 登录 后评论
  • 4 关注
  • 0 收藏,2216 浏览
  • Helius 提出于 2024-04-15 13:16