* Split up BridgeAdapter by chain * Fix BridgeProtocols enum * Add isSupportedSource to bridge adapter contracts * Add bridge adapter tests * Fix FQT test
299 lines
12 KiB
TypeScript
299 lines
12 KiB
TypeScript
import { ChainId } from '@0x/contract-addresses';
|
|
import { blockchainTests, constants, describe, expect } from '@0x/contracts-test-utils';
|
|
import {
|
|
artifacts as zeroExArtifacts,
|
|
AvalancheBridgeAdapterContract,
|
|
BSCBridgeAdapterContract,
|
|
CeloBridgeAdapterContract,
|
|
EthereumBridgeAdapterContract,
|
|
FantomBridgeAdapterContract,
|
|
OptimismBridgeAdapterContract,
|
|
PolygonBridgeAdapterContract,
|
|
} from '@0x/contracts-zero-ex';
|
|
|
|
import { BUY_SOURCE_FILTER_BY_CHAIN_ID, ERC20BridgeSource, SELL_SOURCE_FILTER_BY_CHAIN_ID } from '../../src';
|
|
import { getErc20BridgeSourceToBridgeSource } from '../../src/utils/market_operation_utils/orders';
|
|
|
|
blockchainTests('Bridge adapter source compatibility tests', env => {
|
|
describe('Avalanche', () => {
|
|
let adapter: AvalancheBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await AvalancheBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.AvalancheBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Avalanche].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Avalanche].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
describe('BSC', () => {
|
|
let adapter: BSCBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await BSCBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.BSCBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.BSC].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.BSC].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
describe('Celo', () => {
|
|
let adapter: CeloBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await CeloBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.CeloBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Celo].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Celo].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
describe('Ethereum', () => {
|
|
let adapter: EthereumBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await EthereumBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.EthereumBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Mainnet].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
describe('Fantom', () => {
|
|
let adapter: FantomBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await FantomBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.FantomBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Fantom].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Fantom].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
describe('Optimism', () => {
|
|
let adapter: OptimismBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await OptimismBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.OptimismBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Optimism].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Optimism].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
describe('Polygon', () => {
|
|
let adapter: PolygonBridgeAdapterContract;
|
|
before(async () => {
|
|
adapter = await PolygonBridgeAdapterContract.deployFrom0xArtifactAsync(
|
|
zeroExArtifacts.PolygonBridgeAdapter,
|
|
env.provider,
|
|
env.txDefaults,
|
|
zeroExArtifacts,
|
|
constants.NULL_ADDRESS,
|
|
);
|
|
});
|
|
it('sell sources', async () => {
|
|
const sellSources = SELL_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Polygon].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
sellSources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
it('buy sources', async () => {
|
|
const buySources = BUY_SOURCE_FILTER_BY_CHAIN_ID[ChainId.Polygon].exclude([
|
|
ERC20BridgeSource.Native,
|
|
ERC20BridgeSource.MultiHop,
|
|
]).sources;
|
|
return Promise.all(
|
|
buySources.map(async source => {
|
|
const isSupported = await adapter
|
|
.isSupportedSource(getErc20BridgeSourceToBridgeSource(source))
|
|
.callAsync();
|
|
expect(isSupported, `${source} is not supported`).to.be.true();
|
|
}),
|
|
);
|
|
});
|
|
});
|
|
});
|