最近有个新的需求
已经有一个代币合约如C,需要实现一个合约,在这个合约中调用代币合约C中的transfer函数,即转代币的函数。
要在一个合约中调用另一个合约,可用用以下三种方式调用。
- CALL:最常用调用,内置变量msg的值会被修改为调用者,执行环境为被调用者的运行环境。
- DELEGATECALL:调用后内置变量msg的值不会修改为调用者,但执行环境为调用者的运行环境。
- CALLCODE和DELEGATECALL: 是在调用者的上下文中执行, 可以修改调用者的storage; CALLCODE 阻止msg.sender和msg.value传递;
而DELEGATECALL不阻止;
在A的合约中,B.callcode(c的函数): c看到msg.sender是B;
在A的合约中,B.delegatecall(c的函数): c看到msg.sender是A;
可以看到,这三种方式都并不符合我们的需求。
方法只有,先让用户调用代币合约C中的approve方法,再调用下面实现的合约中的depositToken方法。
pragma solidity ^0.4.25;
contract Deposit {
bool public stopped = false;
uint256 public totalDeposit=0;
uint256 minDepositValue;
address owner;
address cTokenAddr=0x01c2ce7bd1bc34eed8a99d0ea0abee305362c143;
uint256 minBlockGap;
mapping(address => mapping(string=>uint256)) depositRecords;
mapping(address=>mapping(string=>uint256)) withdrawRecords;
uint256 public account=0;
uint256 public blocknum ;
constructor(uint256 _minValue,uint256 _minBlockGap) public {
owner=msg.sender;
minDepositValue=_minValue;
minBlockGap=_minBlockGap;
}
event Withdraw(address indexed _from, string indexed _pk, uint indexed _value);
event DepositToken(address indexed _from,address indexed _to,uint256 indexed _value);
function depositToken(address _to,uint256 _value,string pk) public isRunning validAddres