contract Depositor is Context, IERC20, IERC20Metadata {
    MultiverseToken private _multiverseToken;
    string private _name;

    constructor(MultiverseToken multiverseToken_, string memory name_) {
        _multiverseToken = multiverseToken_;
        _name = name_;
    }

    /**
     * @dev The Despositor fulfills the ERC20 `transfer` operation by transferring
     * the specified `value` from the `msg.sender` to the Depositor's `depository`,
     * destined for specified `account`.
     */
    function transfer(address account, uint256 value) public virtual override returns (bool) {
        return _multiverseToken.depositFrom(_msgSender(), account, value);
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _multiverseToken.symbol();
    }

    function decimals() public view virtual override returns (uint8) {
        return _multiverseToken.decimals();
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _multiverseToken.totalSupply();
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _multiverseToken.balanceOf(account);
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _multiverseToken.allowance(owner, spender);
    }

    function approve(address, uint256) public virtual override returns (bool) {
        require(false, "approve() is not supported. call the MultiverseToken directly");
        return false;
    }

    function transferFrom(address, address, uint256) public virtual override returns (bool) {
        require(false, "transferFrom() is not supported. call the MultiverseToken directly");
        return false;
    }
}
/**
 * Depositor is a ERC20 proxy for the MultiverseToken whose only supported transaction is
 * `transfer()`, which is converted to a `MultiverseToken.depositFrom()` call with the
 * `depository` associated via `MultiverseToken.createDepositor()`.
 */
function transfer(address account, uint256 value) public virtual override returns (bool) {
    return _multiverseToken.depositFrom(_msgSender(), account, value);
}

/**
 * @dev The Despositor fulfills the ERC20 `transfer` operation by transferring
 * the specified `value` from the `msg.sender` to the Depositor's `depository`,
 * destined for specified `account`.
 */