阅读WETH合约

使用WETH合约可以授权第三方划走自己账户的weth。这个功能就像银行的第三方划扣功能。WETH合约比较简单,代码如下:

pragma solidity ^0.4.18;

contract WETH9 {
    string public name     = "Wrapped Ether";//定义合约名词
    string public symbol   = "WETH";//定义币种名称
    uint8  public decimals = 18;//定义小数位,因为此合约和要ETH一一对应,所以要定18
    //下面四个事件发生后,可以通过getLogs接口获取。
    event  Approval(address indexed src, address indexed guy, uint wad);
    event  Transfer(address indexed src, address indexed dst, uint wad);
    event  Deposit(address indexed dst, uint wad);
    event  Withdrawal(address indexed src, uint wad);

    mapping (address => uint)                       public  balanceOf;//余额字典,地址-余额
    mapping (address => mapping (address => uint))  public  allowance;//授权字典,某个地址授权其他地址的限额,第一个address表示授权人,第二个address表示被授权人。

    function() public payable {
        deposit();
    }
    //存入weth,把自己的eth换成weth,1:1兑换
    function deposit() public payable {
        balanceOf[msg.sender] += msg.value;//更改余额
        Deposit(msg.sender, msg.value);//发送事件
    }
    //提取weth,把weth换成ETH,1:1兑换
    function withdraw(uint wad) public {
        require(balanceOf[msg.sender] >= wad);//要求余额要大于等于提取额
        balanceOf[msg.sender] -= wad;//减少weth余额
        msg.sender.transfer(wad);    //增加eth
        Withdrawal(msg.sender, wad);//发送事件
    }

    function totalSupply() public view returns (uint) {
        return this.balance;
    }
    //授权guy地址wad限额
    function approve(address guy, uint wad) public returns (bool) {
        allowance[msg.sender][guy] = wad;//更改限额
        Approval(msg.sender, guy, wad);//发送事件
        return true;
    }

    function transfer(address dst, uint wad) public returns (bool) {
        return transferFrom(msg.sender, dst, wad);
    }
    //转账,两种情况:自己转,第三方转 如果src是当前操作者,则自己转,如果不是则第三方转。
    function transferFrom(address src, address dst, uint wad)
        public
        returns (bool)
    {
        require(balanceOf[src] >= wad);//余额要大于当前转账金额
        //第三方转帐,需要修改限额
        if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
            require(allowance[src][msg.sender] >= wad);//要求限额要大于转帐金额
            allowance[src][msg.sender] -= wad;//减少限额
        }

        balanceOf[src] -= wad;//减少源地址余额
        balanceOf[dst] += wad;//增加目标地址余额

        Transfer(src, dst, wad);//发送事件

        return true;
    }
}