Special case unlimited allowance for Chai

This commit is contained in:
Amir 2020-01-11 15:38:36 -08:00
parent e834fa0050
commit 5dd3b8cf9d
3 changed files with 24 additions and 3 deletions

View File

@ -18,6 +18,9 @@
pragma solidity ^0.5.9; pragma solidity ^0.5.9;
import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
contract PotLike { contract PotLike {
function chi() external returns (uint256); function chi() external returns (uint256);
function rho() external returns (uint256); function rho() external returns (uint256);
@ -27,8 +30,9 @@ contract PotLike {
} }
// The actual Chai contract can be found here: https://github.com/dapphub/chai // The actual Chai contract can be found here: https://github.com/dapphub/chai
contract IChai { contract IChai is
IERC20Token
{
/// @dev Withdraws Dai owned by `src` /// @dev Withdraws Dai owned by `src`
/// @param src Address that owns Dai. /// @param src Address that owns Dai.
/// @param wad Amount of Dai to withdraw. /// @param wad Amount of Dai to withdraw.
@ -49,4 +53,13 @@ contract IChai {
function pot() function pot()
external external
returns (PotLike); returns (PotLike);
/// @dev Deposits Dai in exchange for Chai
/// @param dst Address to receive Chai.
/// @param wad Amount of Dai to deposit.
function join(
address dst,
uint256 wad
)
external;
} }

View File

@ -15,6 +15,7 @@ export {
UniswapBridgeContract, UniswapBridgeContract,
KyberBridgeContract, KyberBridgeContract,
ChaiBridgeContract, ChaiBridgeContract,
IChaiContract,
} from './wrappers'; } from './wrappers';
export { ERC20Wrapper } from './erc20_wrapper'; export { ERC20Wrapper } from './erc20_wrapper';

View File

@ -254,6 +254,7 @@ contract LibAssetData is
// Query allowance // Query allowance
(bool success, bytes memory returnData) = tokenAddress.staticcall(allowanceData); (bool success, bytes memory returnData) = tokenAddress.staticcall(allowanceData);
allowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; allowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0;
} else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) { } else if (assetProxyId == IAssetData(address(0)).ERC721Token.selector) {
// Get ERC721 token address and id // Get ERC721 token address and id
(, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData); (, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData);
@ -279,6 +280,7 @@ contract LibAssetData is
// Allowance is 2^256 - 1 if `isApprovedForAll` returned true // Allowance is 2^256 - 1 if `isApprovedForAll` returned true
allowance = _MAX_UINT256; allowance = _MAX_UINT256;
} }
} else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) { } else if (assetProxyId == IAssetData(address(0)).ERC1155Assets.selector) {
// Get ERC1155 token address // Get ERC1155 token address
(, address tokenAddress, , , ) = decodeERC1155AssetData(assetData); (, address tokenAddress, , , ) = decodeERC1155AssetData(assetData);
@ -293,9 +295,11 @@ contract LibAssetData is
// Query allowance // Query allowance
(bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData); (bool success, bytes memory returnData) = tokenAddress.staticcall(isApprovedForAllData);
allowance = success && returnData.length == 32 && returnData.readUint256(0) == 1 ? _MAX_UINT256 : 0; allowance = success && returnData.length == 32 && returnData.readUint256(0) == 1 ? _MAX_UINT256 : 0;
} else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) { } else if (assetProxyId == IAssetData(address(0)).StaticCall.selector) {
// The StaticCallProxy does not require any approvals // The StaticCallProxy does not require any approvals
allowance = _MAX_UINT256; allowance = _MAX_UINT256;
} else if (assetProxyId == IAssetData(address(0)).ERC20Bridge.selector) { } else if (assetProxyId == IAssetData(address(0)).ERC20Bridge.selector) {
// Get address of ERC20 token and bridge contract // Get address of ERC20 token and bridge contract
(, address tokenAddress, address bridgeAddress,) = decodeERC20BridgeAssetData(assetData); (, address tokenAddress, address bridgeAddress,) = decodeERC20BridgeAssetData(assetData);
@ -307,7 +311,8 @@ contract LibAssetData is
); );
(bool success, bytes memory returnData) = _getChaiAddress().staticcall(allowanceData); (bool success, bytes memory returnData) = _getChaiAddress().staticcall(allowanceData);
uint256 chaiAllowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0; uint256 chaiAllowance = success && returnData.length == 32 ? returnData.readUint256(0) : 0;
allowance = _convertChaiToDaiAmount(chaiAllowance); // Dai allowance is unlimited if Chai allowance is unlimited
allowance = chaiAllowance == _MAX_UINT256 ? _MAX_UINT256 : _convertChaiToDaiAmount(chaiAllowance);
} }
// Allowance will be 0 if bridge is not supported // Allowance will be 0 if bridge is not supported
} }
@ -662,6 +667,8 @@ contract LibAssetData is
); );
} }
/// @dev Reverts if assetData is not of a valid format for its given proxy id.
/// @param assetData AssetProxy compliant asset data.
function revertIfInvalidAssetData(bytes memory assetData) function revertIfInvalidAssetData(bytes memory assetData)
public public
pure pure