118 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
 | 
						|
import { BlockParamLiteral } from '@0xproject/types';
 | 
						|
import { BigNumber } from '@0xproject/utils';
 | 
						|
import * as chai from 'chai';
 | 
						|
 | 
						|
import { ExchangeContractErrs, Token, ZeroEx } from '../src';
 | 
						|
import { TradeSide, TransferType } from '../src/types';
 | 
						|
import { ExchangeTransferSimulator } from '../src/utils/exchange_transfer_simulator';
 | 
						|
 | 
						|
import { chaiSetup } from './utils/chai_setup';
 | 
						|
import { constants } from './utils/constants';
 | 
						|
import { provider, web3Wrapper } from './utils/web3_wrapper';
 | 
						|
 | 
						|
chaiSetup.configure();
 | 
						|
const expect = chai.expect;
 | 
						|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
 | 
						|
 | 
						|
describe('ExchangeTransferSimulator', () => {
 | 
						|
    const config = {
 | 
						|
        networkId: constants.TESTRPC_NETWORK_ID,
 | 
						|
    };
 | 
						|
    const zeroEx = new ZeroEx(provider, config);
 | 
						|
    const transferAmount = new BigNumber(5);
 | 
						|
    let userAddresses: string[];
 | 
						|
    let tokens: Token[];
 | 
						|
    let coinbase: string;
 | 
						|
    let sender: string;
 | 
						|
    let recipient: string;
 | 
						|
    let exampleTokenAddress: string;
 | 
						|
    let exchangeTransferSimulator: ExchangeTransferSimulator;
 | 
						|
    let txHash: string;
 | 
						|
    before(async () => {
 | 
						|
        userAddresses = await zeroEx.getAvailableAddressesAsync();
 | 
						|
        [coinbase, sender, recipient] = userAddresses;
 | 
						|
        tokens = await zeroEx.tokenRegistry.getTokensAsync();
 | 
						|
        exampleTokenAddress = tokens[0].address;
 | 
						|
    });
 | 
						|
    beforeEach(async () => {
 | 
						|
        await blockchainLifecycle.startAsync();
 | 
						|
    });
 | 
						|
    afterEach(async () => {
 | 
						|
        await blockchainLifecycle.revertAsync();
 | 
						|
    });
 | 
						|
    describe('#transferFromAsync', () => {
 | 
						|
        beforeEach(() => {
 | 
						|
            exchangeTransferSimulator = new ExchangeTransferSimulator(zeroEx.token, BlockParamLiteral.Latest);
 | 
						|
        });
 | 
						|
        it("throws if the user doesn't have enough allowance", async () => {
 | 
						|
            return expect(
 | 
						|
                exchangeTransferSimulator.transferFromAsync(
 | 
						|
                    exampleTokenAddress,
 | 
						|
                    sender,
 | 
						|
                    recipient,
 | 
						|
                    transferAmount,
 | 
						|
                    TradeSide.Taker,
 | 
						|
                    TransferType.Trade,
 | 
						|
                ),
 | 
						|
            ).to.be.rejectedWith(ExchangeContractErrs.InsufficientTakerAllowance);
 | 
						|
        });
 | 
						|
        it("throws if the user doesn't have enough balance", async () => {
 | 
						|
            txHash = await zeroEx.token.setProxyAllowanceAsync(exampleTokenAddress, sender, transferAmount);
 | 
						|
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
						|
            return expect(
 | 
						|
                exchangeTransferSimulator.transferFromAsync(
 | 
						|
                    exampleTokenAddress,
 | 
						|
                    sender,
 | 
						|
                    recipient,
 | 
						|
                    transferAmount,
 | 
						|
                    TradeSide.Maker,
 | 
						|
                    TransferType.Trade,
 | 
						|
                ),
 | 
						|
            ).to.be.rejectedWith(ExchangeContractErrs.InsufficientMakerBalance);
 | 
						|
        });
 | 
						|
        it('updates balances and proxyAllowance after transfer', async () => {
 | 
						|
            txHash = await zeroEx.token.transferAsync(exampleTokenAddress, coinbase, sender, transferAmount);
 | 
						|
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
						|
            txHash = await zeroEx.token.setProxyAllowanceAsync(exampleTokenAddress, sender, transferAmount);
 | 
						|
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
						|
            await exchangeTransferSimulator.transferFromAsync(
 | 
						|
                exampleTokenAddress,
 | 
						|
                sender,
 | 
						|
                recipient,
 | 
						|
                transferAmount,
 | 
						|
                TradeSide.Taker,
 | 
						|
                TransferType.Trade,
 | 
						|
            );
 | 
						|
            const store = (exchangeTransferSimulator as any)._store;
 | 
						|
            const senderBalance = await store.getBalanceAsync(exampleTokenAddress, sender);
 | 
						|
            const recipientBalance = await store.getBalanceAsync(exampleTokenAddress, recipient);
 | 
						|
            const senderProxyAllowance = await store.getProxyAllowanceAsync(exampleTokenAddress, sender);
 | 
						|
            expect(senderBalance).to.be.bignumber.equal(0);
 | 
						|
            expect(recipientBalance).to.be.bignumber.equal(transferAmount);
 | 
						|
            expect(senderProxyAllowance).to.be.bignumber.equal(0);
 | 
						|
        });
 | 
						|
        it("doesn't update proxyAllowance after transfer if unlimited", async () => {
 | 
						|
            txHash = await zeroEx.token.transferAsync(exampleTokenAddress, coinbase, sender, transferAmount);
 | 
						|
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
						|
            txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(exampleTokenAddress, sender);
 | 
						|
            await zeroEx.awaitTransactionMinedAsync(txHash);
 | 
						|
            await exchangeTransferSimulator.transferFromAsync(
 | 
						|
                exampleTokenAddress,
 | 
						|
                sender,
 | 
						|
                recipient,
 | 
						|
                transferAmount,
 | 
						|
                TradeSide.Taker,
 | 
						|
                TransferType.Trade,
 | 
						|
            );
 | 
						|
            const store = (exchangeTransferSimulator as any)._store;
 | 
						|
            const senderBalance = await store.getBalanceAsync(exampleTokenAddress, sender);
 | 
						|
            const recipientBalance = await store.getBalanceAsync(exampleTokenAddress, recipient);
 | 
						|
            const senderProxyAllowance = await store.getProxyAllowanceAsync(exampleTokenAddress, sender);
 | 
						|
            expect(senderBalance).to.be.bignumber.equal(0);
 | 
						|
            expect(recipientBalance).to.be.bignumber.equal(transferAmount);
 | 
						|
            expect(senderProxyAllowance).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
 | 
						|
        });
 | 
						|
    });
 | 
						|
});
 |