Skip to content

Latest commit

 

History

History
1022 lines (804 loc) · 23.6 KB

ZUSDToken.md

File metadata and controls

1022 lines (804 loc) · 23.6 KB

ZUSDToken.sol

View Source: contracts/ZUSDToken.sol

↗ Extends: ZUSDTokenStorage, CheckContract, IZUSDToken, Ownable

ZUSDToken

Events

event TroveManagerAddressChanged(address  _troveManagerAddress);
event StabilityPoolAddressChanged(address  _newStabilityPoolAddress);
event BorrowerOperationsAddressChanged(address  _newBorrowerOperationsAddress);

Functions


initialize

function initialize(address _troveManagerAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress) public nonpayable initializer onlyOwner 

Arguments

Name Type Description
_troveManagerAddress address
_stabilityPoolAddress address
_borrowerOperationsAddress address
Source Code
function initialize(
        address _troveManagerAddress,
        address _stabilityPoolAddress,
        address _borrowerOperationsAddress
    ) public initializer onlyOwner {
        checkContract(_troveManagerAddress);
        checkContract(_stabilityPoolAddress);
        checkContract(_borrowerOperationsAddress);

        troveManagerAddress = _troveManagerAddress;
        emit TroveManagerAddressChanged(_troveManagerAddress);

        stabilityPoolAddress = _stabilityPoolAddress;
        emit StabilityPoolAddressChanged(_stabilityPoolAddress);

        borrowerOperationsAddress = _borrowerOperationsAddress;
        emit BorrowerOperationsAddressChanged(_borrowerOperationsAddress);

        bytes32 hashedName = keccak256(bytes(_NAME));
        bytes32 hashedVersion = keccak256(bytes(_VERSION));

        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = _chainID();
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(_TYPE_HASH, hashedName, hashedVersion);
    }

mint

function mint(address _account, uint256 _amount) external nonpayable

Arguments

Name Type Description
_account address
_amount uint256
Source Code
function mint(address _account, uint256 _amount) external override {
        _requireCallerIsBorrowerOperations();
        _mint(_account, _amount);
    }

burn

function burn(address _account, uint256 _amount) external nonpayable

Arguments

Name Type Description
_account address
_amount uint256
Source Code
function burn(address _account, uint256 _amount) external override {
        _requireCallerIsBOorTroveMorSP();
        _burn(_account, _amount);
    }

sendToPool

function sendToPool(address _sender, address _poolAddress, uint256 _amount) external nonpayable

Arguments

Name Type Description
_sender address
_poolAddress address
_amount uint256
Source Code
function sendToPool(
        address _sender,
        address _poolAddress,
        uint256 _amount
    ) external override {
        _requireCallerIsStabilityPool();
        _transfer(_sender, _poolAddress, _amount);
    }

returnFromPool

function returnFromPool(address _poolAddress, address _receiver, uint256 _amount) external nonpayable

Arguments

Name Type Description
_poolAddress address
_receiver address
_amount uint256
Source Code
function returnFromPool(
        address _poolAddress,
        address _receiver,
        uint256 _amount
    ) external override {
        _requireCallerIsTroveMorSP();
        _transfer(_poolAddress, _receiver, _amount);
    }

totalSupply

function totalSupply() external view
returns(uint256)
Source Code
function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

balanceOf

function balanceOf(address account) external view
returns(uint256)

Arguments

Name Type Description
account address
Source Code
function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

transfer

function transfer(address recipient, uint256 amount) external nonpayable
returns(bool)

Arguments

Name Type Description
recipient address
amount uint256
Source Code
function transfer(address recipient, uint256 amount) external override returns (bool) {
        _requireValidRecipient(recipient);
        _transfer(msg.sender, recipient, amount);
        return true;
    }

allowance

function allowance(address owner, address spender) external view
returns(uint256)

Arguments

Name Type Description
owner address
spender address
Source Code
function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

approve

function approve(address spender, uint256 amount) external nonpayable
returns(bool)

Arguments

Name Type Description
spender address
amount uint256
Source Code
function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

transferFrom

function transferFrom(address sender, address recipient, uint256 amount) external nonpayable
returns(bool)

Arguments

Name Type Description
sender address
recipient address
amount uint256
Source Code
function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _requireValidRecipient(recipient);
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            msg.sender,
            _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance")
        );
        return true;
    }

increaseAllowance

function increaseAllowance(address spender, uint256 addedValue) external nonpayable
returns(bool)

Arguments

Name Type Description
spender address
addedValue uint256
Source Code
function increaseAllowance(address spender, uint256 addedValue)
        external
        override
        returns (bool)
    {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

decreaseAllowance

function decreaseAllowance(address spender, uint256 subtractedValue) external nonpayable
returns(bool)

Arguments

Name Type Description
spender address
subtractedValue uint256
Source Code
function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        override
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

domainSeparator

function domainSeparator() public view
returns(bytes32)
Source Code
function domainSeparator() public view override returns (bytes32) {
        if (_chainID() == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

permit

function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external nonpayable

Arguments

Name Type Description
owner address
spender address
amount uint256
deadline uint256
v uint8
r bytes32
s bytes32
Source Code
function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(deadline >= now, "ZUSD: expired deadline");
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator(),
                keccak256(
                    abi.encode(_PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner]++, deadline)
                )
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress == owner, "ZUSD: invalid signature");
        _approve(owner, spender, amount);
    }

nonces

function nonces(address owner) external view
returns(uint256)

Arguments

Name Type Description
owner address
Source Code
function nonces(address owner) external view override returns (uint256) {
        // FOR EIP 2612
        return _nonces[owner];
    }

_chainID

function _chainID() private pure
returns(chainID uint256)
Source Code
function _chainID() private pure returns (uint256 chainID) {
        assembly {
            chainID := chainid()
        }
    }

_buildDomainSeparator

function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view
returns(bytes32)

Arguments

Name Type Description
typeHash bytes32
name bytes32
version bytes32
Source Code
function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 name,
        bytes32 version
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, name, version, _chainID(), address(this)));
    }

_transfer

function _transfer(address sender, address recipient, uint256 amount) internal nonpayable

Arguments

Name Type Description
sender address
recipient address
amount uint256
Source Code
function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        assert(sender != address(0));
        assert(recipient != address(0));

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

_mint

function _mint(address account, uint256 amount) internal nonpayable

Arguments

Name Type Description
account address
amount uint256
Source Code
function _mint(address account, uint256 amount) internal {
        assert(account != address(0));

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

_burn

function _burn(address account, uint256 amount) internal nonpayable

Arguments

Name Type Description
account address
amount uint256
Source Code
function _burn(address account, uint256 amount) internal {
        assert(account != address(0));

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

_approve

function _approve(address owner, address spender, uint256 amount) internal nonpayable

Arguments

Name Type Description
owner address
spender address
amount uint256
Source Code
function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        assert(owner != address(0));
        assert(spender != address(0));

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

_requireValidRecipient

function _requireValidRecipient(address _recipient) internal view

Arguments

Name Type Description
_recipient address
Source Code
function _requireValidRecipient(address _recipient) internal view {
        require(
            _recipient != address(0) && _recipient != address(this),
            "ZUSD: Cannot transfer tokens directly to the ZUSD token contract or the zero address"
        );
        require(
            _recipient != stabilityPoolAddress &&
                _recipient != troveManagerAddress &&
                _recipient != borrowerOperationsAddress,
            "ZUSD: Cannot transfer tokens directly to the StabilityPool, TroveManager or BorrowerOps"
        );
    }

_requireCallerIsBorrowerOperations

function _requireCallerIsBorrowerOperations() internal view
Source Code
function _requireCallerIsBorrowerOperations() internal view {
        require(
            msg.sender == borrowerOperationsAddress,
            "ZUSDToken: Caller is not BorrowerOperations"
        );
    }

_requireCallerIsBOorTroveMorSP

function _requireCallerIsBOorTroveMorSP() internal view
Source Code
function _requireCallerIsBOorTroveMorSP() internal view {
        require(
            msg.sender == borrowerOperationsAddress ||
                msg.sender == troveManagerAddress ||
                msg.sender == stabilityPoolAddress,
            "ZUSD: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool"
        );
    }

_requireCallerIsStabilityPool

function _requireCallerIsStabilityPool() internal view
Source Code
function _requireCallerIsStabilityPool() internal view {
        require(msg.sender == stabilityPoolAddress, "ZUSD: Caller is not the StabilityPool");
    }

_requireCallerIsTroveMorSP

function _requireCallerIsTroveMorSP() internal view
Source Code
function _requireCallerIsTroveMorSP() internal view {
        require(
            msg.sender == troveManagerAddress || msg.sender == stabilityPoolAddress,
            "ZUSD: Caller is neither TroveManager nor StabilityPool"
        );
    }

name

function name() external view
returns(string)
Source Code
function name() external view override returns (string memory) {
        return _NAME;
    }

symbol

function symbol() external view
returns(string)
Source Code
function symbol() external view override returns (string memory) {
        return _SYMBOL;
    }

decimals

function decimals() external view
returns(uint8)
Source Code
function decimals() external view override returns (uint8) {
        return _DECIMALS;
    }

version

function version() external view
returns(string)
Source Code
function version() external view override returns (string memory) {
        return _VERSION;
    }

permitTypeHash

function permitTypeHash() external view
returns(bytes32)
Source Code
function permitTypeHash() external view override returns (bytes32) {
        return _PERMIT_TYPEHASH;
    }

Contracts