diff --git a/contracts/asset-proxy/contracts/src/libs/LibAssetData.sol b/contracts/asset-proxy/contracts/src/libs/LibAssetData.sol index 1f82c55af3..0b223cde77 100644 --- a/contracts/asset-proxy/contracts/src/libs/LibAssetData.sol +++ b/contracts/asset-proxy/contracts/src/libs/LibAssetData.sol @@ -29,6 +29,8 @@ import "./LibAssetProxyIds.sol"; contract LibAssetData is LibAssetProxyIds { + uint256 constant internal _MAX_UINT256 = uint256(-1); + using LibBytes for bytes; /// @dev Returns the owner's balance of the token(s) specified in @@ -132,10 +134,14 @@ contract LibAssetData is } else if (proxyId == ERC721_PROXY_ID) { (, address tokenAddress, uint256 tokenId) = decodeERC721AssetData(assetData); IERC721Token token = IERC721Token(tokenAddress); - allowance = (token.getApproved(tokenId) != address(0) || token.isApprovedForAll(owner, spender)) ? 1 : 0; + if (token.isApprovedForAll(owner, spender)) { + allowance = _MAX_UINT256; + } else if (token.getApproved(tokenId) == spender) { + allowance = 1; + } } else if (proxyId == ERC1155_PROXY_ID) { (, address tokenAddress, , , ) = decodeERC1155AssetData(assetData); - allowance = IERC1155(tokenAddress).isApprovedForAll(owner, spender) ? 1 : 0; + allowance = IERC1155(tokenAddress).isApprovedForAll(owner, spender) ? _MAX_UINT256 : 0; } else if (proxyId == MULTI_ASSET_PROXY_ID) { ( , diff --git a/contracts/asset-proxy/test/lib_asset_data.ts b/contracts/asset-proxy/test/lib_asset_data.ts index b19379c504..d744ba3769 100644 --- a/contracts/asset-proxy/test/lib_asset_data.ts +++ b/contracts/asset-proxy/test/lib_asset_data.ts @@ -325,7 +325,7 @@ describe('LibAssetData', () => { anotherApprovedSpenderAddress, await libAssetData.encodeERC721AssetData.callAsync(erc721TokenAddress, firstERC721TokenId), ), - ).to.bignumber.equal(1); + ).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); it('should query ERC1155 allowances by asset data', async () => { @@ -348,7 +348,7 @@ describe('LibAssetData', () => { '0x', ), ), - ).to.bignumber.equal(1); + ).to.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); it('should query multi-asset allowances by asset data', async () => { diff --git a/contracts/extensions/test/dev_utils.ts b/contracts/extensions/test/dev_utils.ts index 82c1155bad..6f4edf6db0 100644 --- a/contracts/extensions/test/dev_utils.ts +++ b/contracts/extensions/test/dev_utils.ts @@ -46,7 +46,6 @@ describe('DevUtils', () => { const tokenId = new BigNumber(123456789); const tokenId2 = new BigNumber(987654321); const ERC721_BALANCE = new BigNumber(1); - const ERC721_ALLOWANCE = new BigNumber(1); before(async () => { await blockchainLifecycle.startAsync(); @@ -188,7 +187,7 @@ describe('DevUtils', () => { ); expect(newBalance).to.be.bignumber.equal(ERC721_BALANCE); }); - it('should return an allowance of 1 when ERC721Proxy is approved for all', async () => { + it('should return an allowance of MAX_UINT256 when ERC721Proxy is approved for all', async () => { const isApproved = true; await web3Wrapper.awaitTransactionSuccessAsync( await erc721Token.setApprovalForAll.sendTransactionAsync(erc721Proxy.address, isApproved, { @@ -201,10 +200,9 @@ describe('DevUtils', () => { erc721Proxy.address, erc721AssetData, ); - expect(newAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(newAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); - // TODO(abandeali1): determine if a single allowance should return true or false - it.skip('should return an allowance of 0 when ERC721Proxy is approved for specific tokenId', async () => { + it('should return an allowance of 1 when ERC721Proxy is approved for specific tokenId', async () => { await web3Wrapper.awaitTransactionSuccessAsync( await erc721Token.mint.sendTransactionAsync(makerAddress, tokenId), constants.AWAIT_TRANSACTION_MINED_MS, @@ -220,7 +218,7 @@ describe('DevUtils', () => { erc721Proxy.address, erc721AssetData, ); - expect(newAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); + expect(newAllowance).to.be.bignumber.equal(new BigNumber(1)); }); }); }); @@ -274,7 +272,7 @@ describe('DevUtils', () => { expect(erc20Balance).to.be.bignumber.equal(balance); expect(erc721Balance).to.be.bignumber.equal(ERC721_BALANCE); expect(erc20Allowance).to.be.bignumber.equal(allowance); - expect(erc721Allowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(erc721Allowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); }); }); describe('getTraderInfo', () => { @@ -332,7 +330,7 @@ describe('DevUtils', () => { expect(traderInfo.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); - expect(traderInfo.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo.takerAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); expect(traderInfo.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); expect(traderInfo.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); @@ -410,7 +408,7 @@ describe('DevUtils', () => { expect(traderInfo1.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo1.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo1.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); - expect(traderInfo1.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo1.takerAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); expect(traderInfo1.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); expect(traderInfo1.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); @@ -418,7 +416,7 @@ describe('DevUtils', () => { expect(traderInfo2.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo2.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo2.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); - expect(traderInfo2.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo2.takerAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); expect(traderInfo2.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); expect(traderInfo2.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); @@ -507,7 +505,7 @@ describe('DevUtils', () => { expect(traderInfo.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); - expect(traderInfo.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo.takerAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); expect(traderInfo.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); expect(traderInfo.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); @@ -622,7 +620,7 @@ describe('DevUtils', () => { expect(traderInfo1.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo1.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo1.takerBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); - expect(traderInfo1.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo1.takerAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); expect(traderInfo1.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); expect(traderInfo1.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo1.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT); @@ -630,7 +628,7 @@ describe('DevUtils', () => { expect(traderInfo2.makerBalance).to.be.bignumber.equal(makerBalance); expect(traderInfo2.makerAllowance).to.be.bignumber.equal(makerAllowance); expect(traderInfo2.takerBalance).to.be.bignumber.equal(ERC721_BALANCE); - expect(traderInfo2.takerAllowance).to.be.bignumber.equal(ERC721_ALLOWANCE); + expect(traderInfo2.takerAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS); expect(traderInfo2.makerZrxBalance).to.be.bignumber.equal(makerZrxBalance); expect(traderInfo2.makerZrxAllowance).to.be.bignumber.equal(constants.ZERO_AMOUNT); expect(traderInfo2.takerZrxBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);