Skip to content

Latest commit

 

History

History
383 lines (336 loc) · 14 KB

SwapsImplLocal.md

File metadata and controls

383 lines (336 loc) · 14 KB

Swaps Implementation Local contract.

  • (SwapsImplLocal.sol)

View Source: contracts/swaps/connectors/testnet/SwapsImplLocal.sol

↗ Extends: State, ISwapsImpl

SwapsImplLocal contract

This contract code comes from bZx. bZx is a protocol for tokenized margin trading and lending https://bzx.network similar to the dYdX protocol.

  • This contract contains the implementation of swap process and rate calculations.

Functions


internalSwap

⤾ overrides ISwapsImpl.internalSwap

Swap two tokens. *

function internalSwap(address sourceTokenAddress, address destTokenAddress, address , address returnToSenderAddress, uint256 minSourceTokenAmount, uint256 maxSourceTokenAmount, uint256 requiredDestTokenAmount) public payable
returns(destTokenAmountReceived uint256, sourceTokenAmountUsed uint256)

Arguments

Name Type Description
sourceTokenAddress address The address of the source tokens.
destTokenAddress address The address of the destiny tokens. *
address sourceTokenAddress The address of the source tokens.
returnToSenderAddress address
minSourceTokenAmount uint256
maxSourceTokenAmount uint256
requiredDestTokenAmount uint256

Returns

destTokenAmountReceived The amount of destiny tokens sent.

Source Code
function internalSwap(
        address sourceTokenAddress,
        address destTokenAddress,
        address, /*receiverAddress*/
        address returnToSenderAddress,
        uint256 minSourceTokenAmount,
        uint256 maxSourceTokenAmount,
        uint256 requiredDestTokenAmount
    ) public payable returns (uint256 destTokenAmountReceived, uint256 sourceTokenAmountUsed) {
        require(sourceTokenAddress != destTokenAddress, "source == dest");

        (uint256 tradeRate, uint256 precision) =
            IPriceFeeds(priceFeeds).queryRate(sourceTokenAddress, destTokenAddress);

        if (requiredDestTokenAmount == 0) {
            sourceTokenAmountUsed = minSourceTokenAmount;
            destTokenAmountReceived = minSourceTokenAmount.mul(tradeRate).div(precision);
        } else {
            destTokenAmountReceived = requiredDestTokenAmount;
            sourceTokenAmountUsed = requiredDestTokenAmount.mul(precision).div(tradeRate);
            require(sourceTokenAmountUsed <= minSourceTokenAmount, "destAmount too great");
        }

        TestToken(sourceTokenAddress).burn(address(this), sourceTokenAmountUsed);
        TestToken(destTokenAddress).mint(address(this), destTokenAmountReceived);

        if (returnToSenderAddress != address(this)) {
            if (sourceTokenAmountUsed < maxSourceTokenAmount) {
                /// Send unused source token back.
                IERC20(sourceTokenAddress).safeTransfer(
                    returnToSenderAddress,
                    maxSourceTokenAmount - sourceTokenAmountUsed
                );
            }
        }
    }

internalExpectedRate

⤾ overrides ISwapsImpl.internalExpectedRate

Calculate the expected price rate of swapping a given amount of tokens. *

function internalExpectedRate(address sourceTokenAddress, address destTokenAddress, uint256 sourceTokenAmount, address unused) public view
returns(uint256)

Arguments

Name Type Description
sourceTokenAddress address The address of the source tokens.
destTokenAddress address The address of the destiny tokens.
sourceTokenAmount uint256 The amount of source tokens.
unused address Fourth parameter ignored. *

Returns

precision The expected price rate.

Source Code
function internalExpectedRate(
        address sourceTokenAddress,
        address destTokenAddress,
        uint256 sourceTokenAmount,
        address unused
    ) public view returns (uint256) {
        (uint256 sourceToDestRate, uint256 sourceToDestPrecision) =
            IPriceFeeds(priceFeeds).queryRate(sourceTokenAddress, destTokenAddress);

        return sourceTokenAmount.mul(sourceToDestRate).div(sourceToDestPrecision);
    }

internalExpectedReturn

⤾ overrides ISwapsImpl.internalExpectedReturn

Calculate the expected return of swapping a given amount of tokens. *

function internalExpectedReturn(address sourceTokenAddress, address destTokenAddress, uint256 sourceTokenAmount, address unused, IERC20[] defaultPath) public view
returns(uint256)

Arguments

Name Type Description
sourceTokenAddress address The address of the source tokens.
destTokenAddress address The address of the destiny tokens.
sourceTokenAmount uint256 The amount of source tokens.
unused address Fourth parameter ignored.
defaultPath IERC20[] defaultPath for swap. *

Returns

precision The expected return.

Source Code
function internalExpectedReturn(
        address sourceTokenAddress,
        address destTokenAddress,
        uint256 sourceTokenAmount,
        address unused,
        IERC20[] memory defaultPath
    ) public view returns (uint256) {
        (uint256 sourceToDestRate, uint256 sourceToDestPrecision) =
            IPriceFeeds(priceFeeds).queryRate(sourceTokenAddress, destTokenAddress);

        return sourceTokenAmount.mul(sourceToDestRate).div(sourceToDestPrecision);
    }

Contracts