contract DssBlow {
    DaiJoinLike public immutable daiJoin;
    DaiLike     public immutable dai;
    address     public immutable vow;

    // --- Events ---
    event Blow(uint256 amount);

    // --- Init ---
    constructor(address daiJoin_, address vow_) public { 
        daiJoin = DaiJoinLike(daiJoin_);
        dai = DaiLike(DaiJoinLike(daiJoin_).dai());
        vow = vow_;
        DaiLike(DaiJoinLike(daiJoin_).dai()).approve(daiJoin_, uint256(-1));
    }

    // `join` Dai deposited in this contract to the `vow`
    function blow() public {
        uint256 balance = dai.balanceOf(address(this));
        daiJoin.join(vow, balance);
        emit Blow(balance);
    }

    // `join` `wad` amount of Dai from your wallet to the `vow`. Requires Dai approval of this contract.
    function blow(uint256 wad) public {
        dai.transferFrom(msg.sender, address(this), wad);
        daiJoin.join(vow, wad);
        emit Blow(wad);
    }
}
function blow(uint256 wad) public {
    dai.transferFrom(msg.sender, address(this), wad);
    daiJoin.join(vow, wad);
    emit Blow(wad);
}

// `join` `wad` amount of Dai from your wallet to the `vow`. Requires Dai approval of this contract.