* Add WooFI interface for sampling
* WooFi Sampler
* Add mixin
* Update bridge adapters
* fix some bugs
* update transformer_utils
* Add BSC support
* yarn prettier
* Capitalize WOOFI in bridge adapters
* Put rebateAddress in a constant, fixed some other stylistic errors
* bug fixes
* Updated CHANGELOGS & MD docs
* Publish
- @0x/contracts-erc20@3.3.33
- @0x/contracts-test-utils@5.4.24
- @0x/contracts-treasury@1.4.16
- @0x/contracts-utils@4.8.14
- @0x/contracts-zero-ex@0.36.0
- @0x/asset-swapper@16.64.0
- @0x/contract-addresses@6.17.0
- @0x/contract-wrappers@13.20.5
- @0x/protocol-utils@11.16.0
* Update reference.mdx (#531)
Align with `DEFAULT_QUOTE_SLIPPAGE_PERCENTAGE` value from c74e31c219/src/constants.ts (L26)
* code cleanup
* remove deusdc curve pool from this pr
* Refactor PoolsCache (part 1) [TKR-500] (#525)
* Make _refreshPoolCacheIfRequiredAsync type-safe and remove Promise.all
* Factor out PoolsCache key logic into a function
* Use Map instead of object in PoolsCache and increase the default timeout
* Clean up PoolsCache and simplify its public interface
* Refactor PoolsCache (part 2) [TKR-500] (#526)
* Introduce NoOpPoolsCache and use it in unsupported chains for BeethovenX
* Use `NoOpPoolsCache` for `CreamPoolsCache` and `BalancerPoolsCache` on unsupported chains
* Remove `getBidAskLiquidityForMakerTakerAssetPairAsync` (#528)
* Add transfer approval for quote token for multi-hops and fix buy sampler typo
* Use 0x gas api instead of eth gas station api [TKR-502] (#532)
* Use 0x gas api instead of eth gas station api
* Add integration test for `ProtocolFeeUtils`
* Update CHANGELOG.json
* Add polygon, fantom, avalanche support
* yarn prettier
* Updated CHANGELOGS & MD docs
* Publish
- @0x/asset-swapper@16.65.0
* Remove references to `custom-no-magic-numbers` ts lint rule [TKR-484] (#533)
* Remove references to `custom-no-magic-numbers ts` lint rule
* Run prettier
* resolve Kyu's comments
* remove fqt change
* Add WooFI interface for sampling
* WooFi Sampler
* Add mixin
* Update bridge adapters
* fix some bugs
* update transformer_utils
* Add BSC support
* yarn prettier
* Capitalize WOOFI in bridge adapters
* Put rebateAddress in a constant, fixed some other stylistic errors
* bug fixes
* code cleanup
* remove deusdc curve pool from this pr
* Add transfer approval for quote token for multi-hops and fix buy sampler typo
* Add polygon, fantom, avalanche support
* yarn prettier
* resolve Kyu's comments
* remove fqt change
* merge types.ts
* WOOFi -> WOOFI
* fix lerna run lint
* Changelog
* nit changes
Co-authored-by: Github Actions <github-actions@github.com>
Co-authored-by: Pavel <51318041+pavel-bc@users.noreply.github.com>
Co-authored-by: Kyu <kyuhyun217@gmail.com>
122 lines
4.5 KiB
Solidity
122 lines
4.5 KiB
Solidity
// SPDX-License-Identifier: UNLICENSED
|
|
pragma solidity ^0.6;
|
|
pragma experimental ABIEncoderV2;
|
|
import "./SamplerUtils.sol";
|
|
import "./ApproximateBuys.sol";
|
|
|
|
interface IWooPP {
|
|
/// @dev get the quote token address (immutable)
|
|
/// @return address of quote token
|
|
function quoteToken() external view returns (address);
|
|
|
|
/// @dev Query the amount for selling the base token amount.
|
|
/// @param baseToken the base token to sell
|
|
/// @param baseAmount the amount to sell
|
|
/// @return quoteAmount the swapped quote amount
|
|
function querySellBase(address baseToken, uint256 baseAmount) external view returns (uint256 quoteAmount);
|
|
|
|
/// @dev Query the amount for selling the quote token.
|
|
/// @param baseToken the base token to receive (buy)
|
|
/// @param quoteAmount the amount to sell
|
|
/// @return baseAmount the swapped base token amount
|
|
function querySellQuote(address baseToken, uint256 quoteAmount) external view returns (uint256 baseAmount);
|
|
}
|
|
|
|
contract WooPPSampler is SamplerUtils, ApproximateBuys{
|
|
|
|
function query(
|
|
uint amountIn,
|
|
address tokenIn,
|
|
address tokenOut,
|
|
address pool
|
|
) internal view returns (uint256 amountOut) {
|
|
if (amountIn == 0) {
|
|
return 0;
|
|
}
|
|
address quoteToken = IWooPP(pool).quoteToken();
|
|
if (tokenIn == quoteToken) {
|
|
amountOut = IWooPP(pool).querySellQuote(tokenOut, amountIn);
|
|
} else if (tokenOut == quoteToken) {
|
|
amountOut = IWooPP(pool).querySellBase(tokenIn, amountIn);
|
|
} else {
|
|
uint quoteAmount = IWooPP(pool).querySellBase(tokenIn, amountIn);
|
|
amountOut = IWooPP(pool).querySellQuote(tokenOut, quoteAmount);
|
|
}
|
|
}
|
|
|
|
/// @dev Sample sell quotes from WooFI.
|
|
/// @param pool Address of the pool we are sampling from
|
|
/// @param takerToken Address of the taker token (what to sell).
|
|
/// @param makerToken Address of the maker token (what to buy).
|
|
/// @param takerTokenAmounts Taker token sell amount for each sample (sorted in ascending order).
|
|
/// @return makerTokenAmounts Maker amounts bought at each taker token
|
|
/// amount.
|
|
function sampleSellsFromWooPP(
|
|
address pool,
|
|
address takerToken,
|
|
address makerToken,
|
|
uint256[] memory takerTokenAmounts
|
|
)
|
|
public
|
|
view
|
|
returns (uint256[] memory makerTokenAmounts)
|
|
{
|
|
uint256 numSamples = takerTokenAmounts.length;
|
|
makerTokenAmounts = new uint256[](numSamples);
|
|
for (uint256 i = 0; i < numSamples; i++) {
|
|
makerTokenAmounts[i] = query(takerTokenAmounts[i], takerToken, makerToken, pool);
|
|
|
|
if (makerTokenAmounts[i] == 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// @dev Sample buy quotes from WooFI.
|
|
/// @param pool Address of the pool we are sampling from
|
|
/// @param takerToken Address of the taker token (what to sell).
|
|
/// @param makerToken Address of the maker token (what to buy).
|
|
/// @param makerTokenAmounts Maker token sell amount for each sample (sorted in ascending order).
|
|
/// @return takerTokenAmounts Taker amounts bought at each taker token
|
|
/// amount.
|
|
function sampleBuysFromWooPP(
|
|
address pool,
|
|
address takerToken,
|
|
address makerToken,
|
|
uint256[] memory makerTokenAmounts
|
|
)
|
|
public
|
|
view
|
|
returns (uint256[] memory takerTokenAmounts)
|
|
{
|
|
uint256 numSamples = makerTokenAmounts.length;
|
|
takerTokenAmounts = _sampleApproximateBuys(
|
|
ApproximateBuyQuoteOpts({
|
|
takerTokenData: abi.encode(pool,takerToken, makerToken),
|
|
makerTokenData: abi.encode(pool, makerToken, takerToken),
|
|
getSellQuoteCallback: _sampleSellForApproximateBuyFromWoofi
|
|
}),
|
|
makerTokenAmounts
|
|
);
|
|
}
|
|
|
|
function _sampleSellForApproximateBuyFromWoofi(
|
|
bytes memory takerTokenData,
|
|
bytes memory makerTokenData,
|
|
uint256 sellAmount
|
|
) internal view returns (uint256) {
|
|
(address _pool, address _takerToken, address _makerToken) = abi.decode(takerTokenData, (address, address, address));
|
|
(bool success, bytes memory resultData) = address(this).staticcall(abi.encodeWithSelector(
|
|
this.sampleSellsFromWooPP.selector,
|
|
_pool,
|
|
_takerToken,
|
|
_makerToken,
|
|
_toSingleValueArray(sellAmount)
|
|
));
|
|
if(!success) {
|
|
return 0;
|
|
}
|
|
return abi.decode(resultData, (uint256[]))[0];
|
|
}
|
|
}
|