Special case unlimited allowance for Chai
This commit is contained in:
parent
e834fa0050
commit
5dd3b8cf9d
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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';
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user