diff options
Diffstat (limited to 'contracts/extensions/test/extensions/balance_threshold_filter.ts')
-rw-r--r-- | contracts/extensions/test/extensions/balance_threshold_filter.ts | 1644 |
1 files changed, 0 insertions, 1644 deletions
diff --git a/contracts/extensions/test/extensions/balance_threshold_filter.ts b/contracts/extensions/test/extensions/balance_threshold_filter.ts deleted file mode 100644 index adeb7c422..000000000 --- a/contracts/extensions/test/extensions/balance_threshold_filter.ts +++ /dev/null @@ -1,1644 +0,0 @@ -import { BlockchainLifecycle } from '@0x/dev-utils'; -import { assetDataUtils } from '@0x/order-utils'; -import { Order, RevertReason, SignedOrder } from '@0x/types'; -import { BigNumber } from '@0x/utils'; -import { Web3Wrapper } from '@0x/web3-wrapper'; -import * as chai from 'chai'; -import { TransactionReceiptWithDecodedLogs } from 'ethereum-types'; -import * as _ from 'lodash'; - -import { - artifacts as protocolArtifacts, - ERC20Wrapper, - ERC721Wrapper, - ExchangeContract, - ExchangeWrapper, -} from '@0x/contracts-protocol'; -import { - chaiSetup, - constants, - ContractName, - ERC20BalancesByOwner, - expectTransactionFailedAsync, - OrderFactory, - OrderStatus, - provider, - TransactionFactory, - txDefaults, - web3Wrapper, -} from '@0x/contracts-test-utils'; -import { DummyERC20TokenContract } from '@0x/contracts-tokens'; - -import { BalanceThresholdFilterContract } from '../../generated-wrappers/balance_threshold_filter'; -import { artifacts } from '../../src/artifacts'; -import { BalanceThresholdWrapper } from '../utils/balance_threshold_wrapper'; - -chaiSetup.configure(); -const expect = chai.expect; -const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); -const DECIMALS_DEFAULT = 18; - -interface ValidatedAddressesLog { - args: { addresses: string[] }; -} - -describe(ContractName.BalanceThresholdFilter, () => { - const takerAssetAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(500), DECIMALS_DEFAULT); - const makerAssetAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(1000), DECIMALS_DEFAULT); - const takerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(250), DECIMALS_DEFAULT); - - let validMakerAddress: string; - let validMakerAddress2: string; - let owner: string; - let validTakerAddress: string; - let feeRecipientAddress: string; - let invalidAddress: string; - let defaultMakerAssetAddress: string; - let defaultTakerAssetAddress: string; - let zrxAssetData: string; - let zrxToken: DummyERC20TokenContract; - let exchangeInstance: ExchangeContract; - let exchangeWrapper: ExchangeWrapper; - - let orderFactory: OrderFactory; - let orderFactory2: OrderFactory; - let invalidOrderFactory: OrderFactory; - let erc20Wrapper: ERC20Wrapper; - let erc20Balances: ERC20BalancesByOwner; - let erc20TakerBalanceThresholdWrapper: BalanceThresholdWrapper; - let erc721TakerBalanceThresholdWrapper: BalanceThresholdWrapper; - let erc721MakerBalanceThresholdWrapper: BalanceThresholdWrapper; - let erc721NonValidBalanceThresholdWrapper: BalanceThresholdWrapper; - - let defaultOrderParams: Partial<Order>; - let validSignedOrder: SignedOrder; - let validSignedOrder2: SignedOrder; - - let erc721BalanceThresholdFilterInstance: BalanceThresholdFilterContract; - let erc20BalanceThresholdFilterInstance: BalanceThresholdFilterContract; - - const assertValidatedAddressesLog = async ( - txReceipt: TransactionReceiptWithDecodedLogs, - expectedValidatedAddresses: string[], - ) => { - expect(txReceipt.logs.length).to.be.gte(1); - const validatedAddressesLog = (txReceipt.logs[0] as any) as ValidatedAddressesLog; - const validatedAddresses = validatedAddressesLog.args.addresses; - // @HACK-hysz: Nested addresses are not translated to lower-case but this will change once - // the new ABI Encoder/Decoder is used by the contract templates. - const validatedAddressesNormalized: string[] = []; - _.each(validatedAddresses, address => { - const normalizedAddress = _.toLower(address); - validatedAddressesNormalized.push(normalizedAddress); - }); - expect(validatedAddressesNormalized).to.be.deep.equal(expectedValidatedAddresses); - }; - - before(async () => { - // Create accounts - await blockchainLifecycle.startAsync(); - const accounts = await web3Wrapper.getAvailableAddressesAsync(); - const usedAddresses = ([ - owner, - validMakerAddress, - validMakerAddress2, - validTakerAddress, - feeRecipientAddress, - invalidAddress, - ] = accounts); - const takerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(validTakerAddress)]; - const makerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(validMakerAddress)]; - const secondMakerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(validMakerAddress2)]; - const invalidAddressPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(invalidAddress)]; - // Create wrappers - erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner); - const validAddresses = _.cloneDeepWith(usedAddresses); - _.remove(validAddresses, (address: string) => { - return address === invalidAddress; - }); - const erc721Wrapper = new ERC721Wrapper(provider, validAddresses, owner); - // Deploy ERC20 tokens - const numDummyErc20ToDeploy = 4; - let erc20TokenA: DummyERC20TokenContract; - let erc20TokenB: DummyERC20TokenContract; - let erc20BalanceThresholdAsset: DummyERC20TokenContract; - [erc20TokenA, erc20TokenB, zrxToken, erc20BalanceThresholdAsset] = await erc20Wrapper.deployDummyTokensAsync( - numDummyErc20ToDeploy, - constants.DUMMY_TOKEN_DECIMALS, - ); - defaultMakerAssetAddress = erc20TokenA.address; - defaultTakerAssetAddress = erc20TokenB.address; - zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address); - // Create proxies - const erc20Proxy = await erc20Wrapper.deployProxyAsync(); - await erc20Wrapper.setBalancesAndAllowancesAsync(); - // Deploy Exchange contract - exchangeInstance = await ExchangeContract.deployFrom0xArtifactAsync( - protocolArtifacts.Exchange, - provider, - txDefaults, - zrxAssetData, - ); - exchangeWrapper = new ExchangeWrapper(exchangeInstance, provider); - // Register proxies - await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner); - await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeInstance.address, { - from: owner, - }); - // Deploy Balance Threshold Filters - // One uses an ERC721 token as its balance threshold asset; the other uses an ERC20 - const erc721alanceThreshold = new BigNumber(1); - await erc721Wrapper.deployProxyAsync(); - const [erc721BalanceThresholdAsset] = await erc721Wrapper.deployDummyTokensAsync(); - await erc721Wrapper.setBalancesAndAllowancesAsync(); - erc721BalanceThresholdFilterInstance = await BalanceThresholdFilterContract.deployFrom0xArtifactAsync( - artifacts.BalanceThresholdFilter, - provider, - txDefaults, - exchangeInstance.address, - erc721BalanceThresholdAsset.address, - erc721alanceThreshold, - ); - const erc20BalanceThreshold = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 10); - erc20BalanceThresholdFilterInstance = await BalanceThresholdFilterContract.deployFrom0xArtifactAsync( - artifacts.BalanceThresholdFilter, - provider, - txDefaults, - exchangeInstance.address, - erc20BalanceThresholdAsset.address, - erc20BalanceThreshold, - ); - // Default order parameters - defaultOrderParams = { - exchangeAddress: exchangeInstance.address, - feeRecipientAddress, - makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress), - takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress), - makerAssetAmount, - takerAssetAmount, - makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), DECIMALS_DEFAULT), - takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(150), DECIMALS_DEFAULT), - senderAddress: erc721BalanceThresholdFilterInstance.address, - }; - // Create two order factories with valid makers (who meet the threshold balance), and - // one factory for an invalid address (that does not meet the threshold balance) - // Valid order factory #1 - const defaultOrderParams1 = { - makerAddress: validMakerAddress, - ...defaultOrderParams, - }; - orderFactory = new OrderFactory(makerPrivateKey, defaultOrderParams1); - // Valid order factory #2 - const defaultOrderParams2 = { - makerAddress: validMakerAddress2, - ...defaultOrderParams, - }; - orderFactory2 = new OrderFactory(secondMakerPrivateKey, defaultOrderParams2); - // Invalid order factory - const defaultNonValidOrderParams = { - makerAddress: invalidAddress, - ...defaultOrderParams, - }; - invalidOrderFactory = new OrderFactory(invalidAddressPrivateKey, defaultNonValidOrderParams); - // Create Balance Thresold Wrappers - erc20TakerBalanceThresholdWrapper = new BalanceThresholdWrapper( - erc20BalanceThresholdFilterInstance, - exchangeInstance, - new TransactionFactory(takerPrivateKey, exchangeInstance.address), - provider, - ); - erc721TakerBalanceThresholdWrapper = new BalanceThresholdWrapper( - erc721BalanceThresholdFilterInstance, - exchangeInstance, - new TransactionFactory(takerPrivateKey, exchangeInstance.address), - provider, - ); - erc721MakerBalanceThresholdWrapper = new BalanceThresholdWrapper( - erc721BalanceThresholdFilterInstance, - exchangeInstance, - new TransactionFactory(makerPrivateKey, exchangeInstance.address), - provider, - ); - erc721NonValidBalanceThresholdWrapper = new BalanceThresholdWrapper( - erc721BalanceThresholdFilterInstance, - exchangeInstance, - new TransactionFactory(invalidAddressPrivateKey, exchangeInstance.address), - provider, - ); - }); - beforeEach(async () => { - await blockchainLifecycle.startAsync(); - }); - afterEach(async () => { - await blockchainLifecycle.revertAsync(); - }); - - describe('General Sanity Checks', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both maker/taker when both maker and taker exceed the balance threshold of an ERC20 token', async () => { - const validSignedOrderERC20Sender = await orderFactory.newSignedOrderAsync({ - ...defaultOrderParams, - makerAddress: validMakerAddress, - senderAddress: erc20TakerBalanceThresholdWrapper.getBalanceThresholdAddress(), - }); - // Execute a valid fill - const txReceipt = await erc20TakerBalanceThresholdWrapper.fillOrderAsync( - validSignedOrderERC20Sender, - validTakerAddress, - { takerAssetFillAmount }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [validSignedOrder.makerAddress, validTakerAddress]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerAssetFillAmount = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.plus(takerFeePaid)), - ); - }); - it('should revert if the Exchange transaction function is not supported', async () => { - // Create signed order without the fillOrder function selector - const salt = new BigNumber(0); - const badSelectorHex = '0x00000000'; - const signatureHex = '0x'; - // Call valid forwarder - return expectTransactionFailedAsync( - erc721BalanceThresholdFilterInstance.executeTransaction.sendTransactionAsync( - salt, - validTakerAddress, - badSelectorHex, - signatureHex, - ), - RevertReason.InvalidOrBlockedExchangeSelector, - ); - }); - it('should revert if senderAddress is not set to the valid forwarding contract', async () => { - // Create signed order with incorrect senderAddress - const notBalanceThresholdFilterAddress = zrxToken.address; - const signedOrderWithBadSenderAddress = await orderFactory.newSignedOrderAsync({ - senderAddress: notBalanceThresholdFilterAddress, - }); - // Call valid forwarder - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.fillOrderAsync(signedOrderWithBadSenderAddress, validTakerAddress, { - takerAssetFillAmount, - }), - RevertReason.FailedExecution, - ); - }); - }); - - describe('batchFillOrders', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both maker and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - const txReceipt = await erc721TakerBalanceThresholdWrapper.batchFillOrdersAsync(orders, validTakerAddress, { - takerAssetFillAmounts, - }); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const cumulativeTakerAssetFillAmount = takerAssetFillAmount.times(2); - const makerAssetFillAmount = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount) - .times(2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount.times(2)), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.times(2).plus(takerFeePaid)), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.batchFillOrdersAsync(orders, validTakerAddress, { - takerAssetFillAmounts, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.batchFillOrdersAsync(orders, invalidAddress, { - takerAssetFillAmounts, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('batchFillOrdersNoThrow', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both maker and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - const txReceipt = await erc721TakerBalanceThresholdWrapper.batchFillOrdersNoThrowAsync( - orders, - validTakerAddress, - { - takerAssetFillAmounts, - // HACK(albrow): We need to hardcode the gas estimate here because - // the Geth gas estimator doesn't work with the way we use - // delegatecall and swallow errors. - gas: 600000, - }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const cumulativeTakerAssetFillAmount = takerAssetFillAmount.times(2); - const makerAssetFillAmount = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount) - .times(2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount.times(2)), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.times(2).plus(takerFeePaid)), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.batchFillOrdersNoThrowAsync(orders, validTakerAddress, { - takerAssetFillAmounts, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.batchFillOrdersNoThrowAsync(orders, invalidAddress, { - takerAssetFillAmounts, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('batchFillOrKillOrders', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both makers and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - const txReceipt = await erc721TakerBalanceThresholdWrapper.batchFillOrKillOrdersAsync( - orders, - validTakerAddress, - { takerAssetFillAmounts }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const cumulativeTakerAssetFillAmount = takerAssetFillAmount.times(2); - const makerAssetFillAmount = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount) - .times(2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount.times(2)), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.times(2).plus(takerFeePaid)), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.batchFillOrKillOrdersAsync(orders, validTakerAddress, { - takerAssetFillAmounts, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, takerAssetFillAmount]; - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.batchFillOrKillOrdersAsync(orders, invalidAddress, { - takerAssetFillAmounts, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if one takerAssetFillAmount is not fully filled', async () => { - const tooBigTakerAssetFillAmount = validSignedOrder.takerAssetAmount.times(2); - const orders = [validSignedOrder, validSignedOrder2]; - const takerAssetFillAmounts = [takerAssetFillAmount, tooBigTakerAssetFillAmount]; - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.batchFillOrKillOrdersAsync(orders, validTakerAddress, { - takerAssetFillAmounts, - }), - RevertReason.FailedExecution, - ); - }); - }); - - describe('fillOrder', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both maker/taker when both maker and taker meet the balance threshold', async () => { - // Execute a valid fill - const txReceipt = await erc721TakerBalanceThresholdWrapper.fillOrderAsync( - validSignedOrder, - validTakerAddress, - { takerAssetFillAmount }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [validSignedOrder.makerAddress, validTakerAddress]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerAssetFillAmount = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.plus(takerFeePaid)), - ); - }); - it('should revert if maker does not meet the balance threshold', async () => { - // Create signed order with non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - senderAddress: erc721BalanceThresholdFilterInstance.address, - makerAddress: invalidAddress, - }); - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.fillOrderAsync(signedOrderWithBadMakerAddress, validTakerAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.fillOrderAsync(validSignedOrder, invalidAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('fillOrderNoThrow', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both maker/taker when both maker and taker meet the balance threshold', async () => { - // Execute a valid fill - const txReceipt = await erc721TakerBalanceThresholdWrapper.fillOrderNoThrowAsync( - validSignedOrder, - validTakerAddress, - { - takerAssetFillAmount, - // HACK(albrow): We need to hardcode the gas estimate here because - // the Geth gas estimator doesn't work with the way we use - // delegatecall and swallow errors. - gas: 600000, - }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [validSignedOrder.makerAddress, validTakerAddress]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerAssetFillAmount = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.plus(takerFeePaid)), - ); - }); - it('should revert if maker does not meet the balance threshold', async () => { - // Create signed order with non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - senderAddress: erc721BalanceThresholdFilterInstance.address, - makerAddress: invalidAddress, - }); - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.fillOrderNoThrowAsync( - signedOrderWithBadMakerAddress, - validTakerAddress, - { takerAssetFillAmount }, - ), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.fillOrderNoThrowAsync(validSignedOrder, invalidAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('fillOrKillOrder', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both maker/taker when both maker and taker meet the balance threshold', async () => { - // Execute a valid fill - const takerAssetFillAmount_ = validSignedOrder.takerAssetAmount; - const txReceipt = await erc721TakerBalanceThresholdWrapper.fillOrKillOrderAsync( - validSignedOrder, - validTakerAddress, - { takerAssetFillAmount: takerAssetFillAmount_ }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [validSignedOrder.makerAddress, validTakerAddress]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerAssetFillAmount = takerAssetFillAmount_ - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid = validSignedOrder.makerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee - .times(makerAssetFillAmount) - .dividedToIntegerBy(validSignedOrder.makerAssetAmount); - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(takerAssetFillAmount_), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(makerFeePaid), - ); - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount_), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address].plus(makerFeePaid.plus(takerFeePaid)), - ); - }); - it('should revert if maker does not meet the balance threshold', async () => { - // Create signed order with non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - senderAddress: erc721BalanceThresholdFilterInstance.address, - makerAddress: invalidAddress, - }); - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.fillOrKillOrderAsync( - signedOrderWithBadMakerAddress, - validTakerAddress, - { takerAssetFillAmount }, - ), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.fillOrKillOrderAsync(validSignedOrder, invalidAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if takerAssetFillAmount is not fully filled', async () => { - const tooBigTakerAssetFillAmount = validSignedOrder.takerAssetAmount.times(2); - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.fillOrKillOrderAsync(validSignedOrder, validTakerAddress, { - takerAssetFillAmount: tooBigTakerAssetFillAmount, - }), - RevertReason.FailedExecution, - ); - }); - }); - - describe('marketSellOrders', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both makers and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const cumulativeTakerAssetFillAmount = validSignedOrder.takerAssetAmount.plus(takerAssetFillAmount); - const txReceipt = await erc721TakerBalanceThresholdWrapper.marketSellOrdersAsync( - orders, - validTakerAddress, - { takerAssetFillAmount: cumulativeTakerAssetFillAmount }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerAssetFillAmount2 = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid2 = validSignedOrder2.makerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid2 = validSignedOrder2.takerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee.plus(takerFeePaid2); - const cumulativeMakerAssetFillAmount = validSignedOrder.makerAssetAmount.plus(makerAssetFillAmount2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(validSignedOrder.makerAssetAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(validSignedOrder.takerAssetAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(validSignedOrder.makerFee), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount2), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid2), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(cumulativeMakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address] - .plus(validSignedOrder.makerFee) - .plus(makerFeePaid2) - .plus(takerFeePaid), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.marketSellOrdersAsync(orders, validTakerAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.marketSellOrdersAsync(orders, invalidAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('marketSellOrdersNoThrow', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both makers and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const cumulativeTakerAssetFillAmount = validSignedOrder.takerAssetAmount.plus(takerAssetFillAmount); - const txReceipt = await erc721TakerBalanceThresholdWrapper.marketSellOrdersNoThrowAsync( - orders, - validTakerAddress, - { - takerAssetFillAmount: cumulativeTakerAssetFillAmount, - // HACK(albrow): We need to hardcode the gas estimate here because - // the Geth gas estimator doesn't work with the way we use - // delegatecall and swallow errors. - gas: 600000, - }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerAssetFillAmount2 = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const makerFeePaid2 = validSignedOrder2.makerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid2 = validSignedOrder2.takerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee.plus(takerFeePaid2); - const cumulativeMakerAssetFillAmount = validSignedOrder.makerAssetAmount.plus(makerAssetFillAmount2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(validSignedOrder.makerAssetAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(validSignedOrder.takerAssetAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(validSignedOrder.makerFee), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount2), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid2), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(cumulativeMakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address] - .plus(validSignedOrder.makerFee) - .plus(makerFeePaid2) - .plus(takerFeePaid), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.marketSellOrdersNoThrowAsync(orders, validTakerAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.marketSellOrdersNoThrowAsync(orders, invalidAddress, { - takerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('marketBuyOrders', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both makers and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const cumulativeTakerAssetFillAmount = validSignedOrder.takerAssetAmount.plus(takerAssetFillAmount); - const makerAssetFillAmount2 = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const cumulativeMakerAssetFillAmount = validSignedOrder.makerAssetAmount.plus(makerAssetFillAmount2); - const txReceipt = await erc721TakerBalanceThresholdWrapper.marketBuyOrdersAsync(orders, validTakerAddress, { - makerAssetFillAmount: cumulativeMakerAssetFillAmount, - }); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerFeePaid2 = validSignedOrder2.makerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid2 = validSignedOrder2.takerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee.plus(takerFeePaid2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(validSignedOrder.makerAssetAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(validSignedOrder.takerAssetAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(validSignedOrder.makerFee), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount2), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid2), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(cumulativeMakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address] - .plus(validSignedOrder.makerFee) - .plus(makerFeePaid2) - .plus(takerFeePaid), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - const dummyMakerAssetFillAmount = new BigNumber(0); - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.marketBuyOrdersAsync(orders, validTakerAddress, { - makerAssetFillAmount: dummyMakerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - const dummyMakerAssetFillAmount = new BigNumber(0); - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.marketBuyOrdersAsync(orders, invalidAddress, { - makerAssetFillAmount: dummyMakerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('marketBuyOrdersNoThrowAsync', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('should transfer the correct amounts and validate both makers/taker when both makers and taker meet the balance threshold', async () => { - // Execute a valid fill - const orders = [validSignedOrder, validSignedOrder2]; - const cumulativeTakerAssetFillAmount = validSignedOrder.takerAssetAmount.plus(takerAssetFillAmount); - const makerAssetFillAmount2 = takerAssetFillAmount - .times(validSignedOrder.makerAssetAmount) - .dividedToIntegerBy(validSignedOrder.takerAssetAmount); - const cumulativeMakerAssetFillAmount = validSignedOrder.makerAssetAmount.plus(makerAssetFillAmount2); - const txReceipt = await erc721TakerBalanceThresholdWrapper.marketBuyOrdersNoThrowAsync( - orders, - validTakerAddress, - { - makerAssetFillAmount: cumulativeMakerAssetFillAmount, - // HACK(albrow): We need to hardcode the gas estimate here because - // the Geth gas estimator doesn't work with the way we use - // delegatecall and swallow errors. - gas: 600000, - }, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [ - validSignedOrder.makerAddress, - validSignedOrder2.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - const makerFeePaid2 = validSignedOrder2.makerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid2 = validSignedOrder2.takerFee - .times(makerAssetFillAmount2) - .dividedToIntegerBy(validSignedOrder2.makerAssetAmount); - const takerFeePaid = validSignedOrder.takerFee.plus(takerFeePaid2); - // Maker #1 - expect(newBalances[validMakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultMakerAssetAddress].minus(validSignedOrder.makerAssetAmount), - ); - expect(newBalances[validMakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][defaultTakerAssetAddress].plus(validSignedOrder.takerAssetAmount), - ); - expect(newBalances[validMakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress][zrxToken.address].minus(validSignedOrder.makerFee), - ); - // Maker #2 - expect(newBalances[validMakerAddress2][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultMakerAssetAddress].minus(makerAssetFillAmount2), - ); - expect(newBalances[validMakerAddress2][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][defaultTakerAssetAddress].plus(takerAssetFillAmount), - ); - expect(newBalances[validMakerAddress2][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validMakerAddress2][zrxToken.address].minus(makerFeePaid2), - ); - // Taker - expect(newBalances[validTakerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultTakerAssetAddress].minus(cumulativeTakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus(cumulativeMakerAssetFillAmount), - ); - expect(newBalances[validTakerAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address].minus(takerFeePaid), - ); - // Fee recipient - expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address] - .plus(validSignedOrder.makerFee) - .plus(makerFeePaid2) - .plus(takerFeePaid), - ); - }); - it('should revert if one maker does not meet the balance threshold', async () => { - // Create order set with one non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - makerAddress: invalidAddress, - }); - const orders = [validSignedOrder, signedOrderWithBadMakerAddress]; - // Execute transaction - const dummyMakerAssetFillAmount = new BigNumber(0); - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.marketBuyOrdersNoThrowAsync(orders, validTakerAddress, { - makerAssetFillAmount: dummyMakerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - const orders = [validSignedOrder, validSignedOrder2]; - const dummyMakerAssetFillAmount = new BigNumber(0); - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.marketBuyOrdersNoThrowAsync(orders, invalidAddress, { - makerAssetFillAmount: dummyMakerAssetFillAmount, - }), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('matchOrders', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('Should transfer correct amounts when both makers and taker meet the balance threshold', async () => { - // Test values/results taken from Match Orders test: - // 'Should transfer correct amounts when right order is fully filled and values pass isRoundingErrorFloor but fail isRoundingErrorCeil' - // Create orders to match - const signedOrderLeft = await orderFactory.newSignedOrderAsync({ - makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(17), 0), - takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(98), 0), - makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18), - takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18), - feeRecipientAddress, - }); - const signedOrderRight = await orderFactory2.newSignedOrderAsync({ - makerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress), - takerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress), - makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0), - takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), - makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18), - takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18), - feeRecipientAddress, - }); - // Compute expected transfer amounts - const expectedTransferAmounts = { - // Left Maker - amountSoldByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), - amountBoughtByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0), - feePaidByLeftMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber('76.4705882352941176'), 16), // 76.47% - // Right Maker - amountSoldByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(75), 0), - amountBoughtByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(13), 0), - feePaidByRightMaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% - // Taker - amountReceivedByTaker: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), 0), - feePaidByTakerLeft: Web3Wrapper.toBaseUnitAmount(new BigNumber('76.5306122448979591'), 16), // 76.53% - feePaidByTakerRight: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 16), // 100% - }; - const txReceipt = await erc721TakerBalanceThresholdWrapper.matchOrdersAsync( - signedOrderLeft, - signedOrderRight, - validTakerAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses = [ - signedOrderLeft.makerAddress, - signedOrderRight.makerAddress, - validTakerAddress, - ]; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check balances - const newBalances = await erc20Wrapper.getBalancesAsync(); - expect( - newBalances[signedOrderLeft.makerAddress][defaultMakerAssetAddress], - 'Checking left maker egress ERC20 account balance', - ).to.be.bignumber.equal( - erc20Balances[signedOrderLeft.makerAddress][defaultMakerAssetAddress].minus( - expectedTransferAmounts.amountSoldByLeftMaker, - ), - ); - expect( - newBalances[signedOrderRight.makerAddress][defaultTakerAssetAddress], - 'Checking right maker ingress ERC20 account balance', - ).to.be.bignumber.equal( - erc20Balances[signedOrderRight.makerAddress][defaultTakerAssetAddress].minus( - expectedTransferAmounts.amountSoldByRightMaker, - ), - ); - expect( - newBalances[validTakerAddress][defaultMakerAssetAddress], - 'Checking taker ingress ERC20 account balance', - ).to.be.bignumber.equal( - erc20Balances[validTakerAddress][defaultMakerAssetAddress].plus( - expectedTransferAmounts.amountReceivedByTaker, - ), - ); - expect( - newBalances[signedOrderLeft.makerAddress][defaultTakerAssetAddress], - 'Checking left maker ingress ERC20 account balance', - ).to.be.bignumber.equal( - erc20Balances[signedOrderLeft.makerAddress][defaultTakerAssetAddress].plus( - expectedTransferAmounts.amountBoughtByLeftMaker, - ), - ); - expect( - newBalances[signedOrderRight.makerAddress][defaultMakerAssetAddress], - 'Checking right maker egress ERC20 account balance', - ).to.be.bignumber.equal( - erc20Balances[signedOrderRight.makerAddress][defaultMakerAssetAddress].plus( - expectedTransferAmounts.amountBoughtByRightMaker, - ), - ); - // Paid fees - expect( - newBalances[signedOrderLeft.makerAddress][zrxToken.address], - 'Checking left maker egress ERC20 account fees', - ).to.be.bignumber.equal( - erc20Balances[signedOrderLeft.makerAddress][zrxToken.address].minus( - expectedTransferAmounts.feePaidByLeftMaker, - ), - ); - expect( - newBalances[signedOrderRight.makerAddress][zrxToken.address], - 'Checking right maker egress ERC20 account fees', - ).to.be.bignumber.equal( - erc20Balances[signedOrderRight.makerAddress][zrxToken.address].minus( - expectedTransferAmounts.feePaidByRightMaker, - ), - ); - expect( - newBalances[validTakerAddress][zrxToken.address], - 'Checking taker egress ERC20 account fees', - ).to.be.bignumber.equal( - erc20Balances[validTakerAddress][zrxToken.address] - .minus(expectedTransferAmounts.feePaidByTakerLeft) - .minus(expectedTransferAmounts.feePaidByTakerRight), - ); - // Received fees - expect( - newBalances[signedOrderLeft.feeRecipientAddress][zrxToken.address], - 'Checking left fee recipient ingress ERC20 account fees', - ).to.be.bignumber.equal( - erc20Balances[feeRecipientAddress][zrxToken.address] - .plus(expectedTransferAmounts.feePaidByLeftMaker) - .plus(expectedTransferAmounts.feePaidByRightMaker) - .plus(expectedTransferAmounts.feePaidByTakerLeft) - .plus(expectedTransferAmounts.feePaidByTakerRight), - ); - }); - it('should revert if left maker does not meet the balance threshold', async () => { - // Create signed order with non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - senderAddress: erc721BalanceThresholdFilterInstance.address, - makerAddress: invalidAddress, - }); - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.matchOrdersAsync( - validSignedOrder, - signedOrderWithBadMakerAddress, - validTakerAddress, - ), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if right maker does not meet the balance threshold', async () => { - // Create signed order with non-valid maker address - const signedOrderWithBadMakerAddress = await orderFactory.newSignedOrderAsync({ - senderAddress: erc721BalanceThresholdFilterInstance.address, - makerAddress: invalidAddress, - }); - // Execute transaction - return expectTransactionFailedAsync( - erc721TakerBalanceThresholdWrapper.matchOrdersAsync( - signedOrderWithBadMakerAddress, - validSignedOrder, - validTakerAddress, - ), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - it('should revert if taker does not meet the balance threshold', async () => { - return expectTransactionFailedAsync( - erc721NonValidBalanceThresholdWrapper.matchOrdersAsync( - validSignedOrder, - validSignedOrder, - invalidAddress, - ), - RevertReason.AtLeastOneAddressDoesNotMeetBalanceThreshold, - ); - }); - }); - - describe('cancelOrder', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - validSignedOrder = await orderFactory.newSignedOrderAsync(); - validSignedOrder2 = await orderFactory2.newSignedOrderAsync(); - }); - it('Should successfully cancel order if maker meets balance threshold', async () => { - // Verify order is not cancelled - const orderInfoBeforeCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - validSignedOrder, - ); - expect(orderInfoBeforeCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - // Cancel - const txReceipt = await erc721MakerBalanceThresholdWrapper.cancelOrderAsync( - validSignedOrder, - validSignedOrder.makerAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses: string[] = []; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check that order was cancelled - const orderInfoAfterCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - validSignedOrder, - ); - expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Cancelled); - }); - it('Should successfully cancel order if maker does not meet balance threshold', async () => { - // Create order where maker does not meet balance threshold - const signedOrderWithBadMakerAddress = await invalidOrderFactory.newSignedOrderAsync({}); - // Verify order is not cancelled - const orderInfoBeforeCancelling = await erc721NonValidBalanceThresholdWrapper.getOrderInfoAsync( - signedOrderWithBadMakerAddress, - ); - expect(orderInfoBeforeCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - // Cancel - const txReceipt = await erc721NonValidBalanceThresholdWrapper.cancelOrderAsync( - signedOrderWithBadMakerAddress, - signedOrderWithBadMakerAddress.makerAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses: string[] = []; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check that order was cancelled - const orderInfoAfterCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - signedOrderWithBadMakerAddress, - ); - expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Cancelled); - }); - }); - - describe('batchCancelOrders', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - }); - it('Should successfully batch cancel orders if maker meets balance threshold', async () => { - // Create orders to cancel - const validSignedOrders = [ - await orderFactory.newSignedOrderAsync(), - await orderFactory.newSignedOrderAsync(), - await orderFactory.newSignedOrderAsync(), - ]; - // Verify orders are not cancelled - _.each(validSignedOrders, async signedOrder => { - const orderInfoBeforeCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - return expect(orderInfoBeforeCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - }); - // Cancel - const txReceipt = await erc721MakerBalanceThresholdWrapper.batchCancelOrdersAsync( - validSignedOrders, - validSignedOrders[0].makerAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses: string[] = []; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check that order was cancelled - _.each(validSignedOrders, async signedOrder => { - const orderInfoAfterCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - return expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Cancelled); - }); - }); - it('Should successfully batch cancel order if maker does not meet balance threshold', async () => { - // Create orders to cancel - const invalidSignedOrders = [ - await invalidOrderFactory.newSignedOrderAsync(), - await invalidOrderFactory.newSignedOrderAsync(), - await invalidOrderFactory.newSignedOrderAsync(), - ]; - // Verify orders are not cancelled - _.each(invalidSignedOrders, async signedOrder => { - const orderInfoBeforeCancelling = await erc721NonValidBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - return expect(orderInfoBeforeCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - }); - // Cancel - const txReceipt = await erc721NonValidBalanceThresholdWrapper.batchCancelOrdersAsync( - invalidSignedOrders, - invalidAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses: string[] = []; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check that order was cancelled - _.each(invalidSignedOrders, async signedOrder => { - const orderInfoAfterCancelling = await erc721NonValidBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - return expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Cancelled); - }); - }); - }); - - describe('cancelOrdersUpTo', () => { - beforeEach(async () => { - erc20Balances = await erc20Wrapper.getBalancesAsync(); - }); - it('Should successfully batch cancel orders if maker meets balance threshold', async () => { - // Create orders to cancel - const validSignedOrders = [ - await orderFactory.newSignedOrderAsync({ salt: new BigNumber(0) }), - await orderFactory.newSignedOrderAsync({ salt: new BigNumber(1) }), - await orderFactory.newSignedOrderAsync({ salt: new BigNumber(2) }), - ]; - // Verify orders are not cancelled - _.each(validSignedOrders, async signedOrder => { - const orderInfoBeforeCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - return expect(orderInfoBeforeCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - }); - // Cancel - const cancelOrdersUpToThisSalt = new BigNumber(1); - const txReceipt = await erc721MakerBalanceThresholdWrapper.cancelOrdersUpToAsync( - cancelOrdersUpToThisSalt, - validSignedOrders[0].makerAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses: string[] = []; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check that order was cancelled - _.each(validSignedOrders, async (signedOrder, salt: number) => { - const orderInfoAfterCancelling = await erc721MakerBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - const saltAsBigNumber = new BigNumber(salt); - if (saltAsBigNumber.isLessThanOrEqualTo(cancelOrdersUpToThisSalt)) { - return expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Cancelled); - } else { - return expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - } - }); - }); - it('Should successfully batch cancel order if maker does not meet balance threshold', async () => { - // Create orders to cancel - const invalidSignedOrders = [ - await invalidOrderFactory.newSignedOrderAsync({ salt: new BigNumber(0) }), - await invalidOrderFactory.newSignedOrderAsync({ salt: new BigNumber(1) }), - await invalidOrderFactory.newSignedOrderAsync({ salt: new BigNumber(2) }), - ]; - // Verify orders are not cancelled - _.each(invalidSignedOrders, async signedOrder => { - const orderInfoBeforeCancelling = await erc721NonValidBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - return expect(orderInfoBeforeCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - }); - // Cancel - const cancelOrdersUpToThisSalt = new BigNumber(1); - const txReceipt = await erc721NonValidBalanceThresholdWrapper.cancelOrdersUpToAsync( - cancelOrdersUpToThisSalt, - invalidAddress, - ); - // Assert validated addresses - const expectedValidatedAddresseses: string[] = []; - await assertValidatedAddressesLog(txReceipt, expectedValidatedAddresseses); - // Check that order was cancelled - _.each(invalidSignedOrders, async (signedOrder, salt: number) => { - const orderInfoAfterCancelling = await erc721NonValidBalanceThresholdWrapper.getOrderInfoAsync( - signedOrder, - ); - const saltAsBigNumber = new BigNumber(salt); - if (saltAsBigNumber.isLessThanOrEqualTo(cancelOrdersUpToThisSalt)) { - return expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Cancelled); - } else { - return expect(orderInfoAfterCancelling.orderStatus).to.be.equal(OrderStatus.Fillable); - } - }); - }); - }); -}); -// tslint:disable:max-file-line-count -// tslint:enable:no-unnecessary-type-assertion |