* Curve ERC20Bridge * ERC20BridgeSampler Curve (#2483) * ERC20Sampler Curve * Use Bridge Sources for each Curve * Support multiple versions of the Curve contract * CHANGELOG and redeployed Curve (mainnet) * Fix Market ops utils test * Added Curve DAI USDC USDT TUSD * Bump sampler gas limit default * Decode the Curve in tests * Disable Curve in Buy tests * blockchainTests.fork.resets Curve and Sampler
112 lines
5.6 KiB
TypeScript
112 lines
5.6 KiB
TypeScript
import { artifacts as assetProxyArtifacts } from '@0x/contracts-asset-proxy';
|
|
import { CurveBridgeContract } from '@0x/contracts-asset-proxy/lib/src/wrappers';
|
|
import { ERC20TokenContract } from '@0x/contracts-erc20';
|
|
import { blockchainTests, constants, describe, toBaseUnitAmount } from '@0x/contracts-test-utils';
|
|
import { AbiEncoder } from '@0x/utils';
|
|
|
|
blockchainTests.fork.resets('Mainnet curve bridge tests', env => {
|
|
let testContract: CurveBridgeContract;
|
|
const receiver = '0x986ccf5234d9cfbb25246f1a5bfa51f4ccfcb308';
|
|
const usdcWallet = '0xF977814e90dA44bFA03b6295A0616a897441aceC';
|
|
const usdcAddress = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
const daiWallet = '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b';
|
|
const daiAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
|
|
const curveAddressUsdcDai = '0x2e60CF74d81ac34eB21eEff58Db4D385920ef419';
|
|
const curveAddressUsdcDaiUsdt = '0x52EA46506B9CC5Ef470C5bf89f17Dc28bB35D85C';
|
|
const daiTokenIdx = 0;
|
|
const usdcTokenIdx = 1;
|
|
const bridgeDataEncoder = AbiEncoder.create([
|
|
{ name: 'curveAddress', type: 'address' },
|
|
{ name: 'fromTokenIdx', type: 'int128' },
|
|
{ name: 'toTokenIdx', type: 'int128' },
|
|
{ name: 'version', type: 'int128' },
|
|
]);
|
|
before(async () => {
|
|
testContract = await CurveBridgeContract.deployFrom0xArtifactAsync(
|
|
assetProxyArtifacts.CurveBridge,
|
|
env.provider,
|
|
{ ...env.txDefaults, from: daiWallet },
|
|
{},
|
|
);
|
|
});
|
|
|
|
describe('bridgeTransferFrom()', () => {
|
|
describe('Version 0', () => {
|
|
const version = 0;
|
|
it('succeeds exchanges DAI for USDC', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([curveAddressUsdcDai, daiTokenIdx, usdcTokenIdx, version]);
|
|
// Fund the Bridge
|
|
const dai = new ERC20TokenContract(daiAddress, env.provider, { ...env.txDefaults, from: daiWallet });
|
|
await dai
|
|
.transfer(testContract.address, toBaseUnitAmount(1))
|
|
.awaitTransactionSuccessAsync({ from: daiWallet }, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(
|
|
usdcAddress,
|
|
constants.NULL_ADDRESS,
|
|
receiver,
|
|
constants.ZERO_AMOUNT,
|
|
bridgeData,
|
|
)
|
|
.awaitTransactionSuccessAsync({ from: daiWallet, gasPrice: 1 }, { shouldValidate: false });
|
|
});
|
|
it('succeeds exchanges USDC for DAI', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([curveAddressUsdcDai, usdcTokenIdx, daiTokenIdx, version]);
|
|
// Fund the Bridge
|
|
const usdc = new ERC20TokenContract(usdcAddress, env.provider, { ...env.txDefaults, from: usdcWallet });
|
|
await usdc
|
|
.transfer(testContract.address, toBaseUnitAmount(1, 6))
|
|
.awaitTransactionSuccessAsync({ from: usdcWallet }, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(daiAddress, constants.NULL_ADDRESS, receiver, constants.ZERO_AMOUNT, bridgeData)
|
|
.awaitTransactionSuccessAsync({ from: usdcWallet, gasPrice: 1 }, { shouldValidate: false });
|
|
});
|
|
});
|
|
describe('Version 1', () => {
|
|
const version = 1;
|
|
it('succeeds exchanges DAI for USDC', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([
|
|
curveAddressUsdcDaiUsdt,
|
|
daiTokenIdx,
|
|
usdcTokenIdx,
|
|
version,
|
|
]);
|
|
// Fund the Bridge
|
|
const dai = new ERC20TokenContract(daiAddress, env.provider, { ...env.txDefaults, from: daiWallet });
|
|
await dai
|
|
.transfer(testContract.address, toBaseUnitAmount(1))
|
|
.awaitTransactionSuccessAsync({ from: daiWallet }, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(
|
|
usdcAddress,
|
|
constants.NULL_ADDRESS,
|
|
receiver,
|
|
constants.ZERO_AMOUNT,
|
|
bridgeData,
|
|
)
|
|
.awaitTransactionSuccessAsync({ from: daiWallet, gasPrice: 1 }, { shouldValidate: false });
|
|
});
|
|
it('succeeds exchanges USDC for DAI', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([
|
|
curveAddressUsdcDaiUsdt,
|
|
usdcTokenIdx,
|
|
daiTokenIdx,
|
|
version,
|
|
]);
|
|
// Fund the Bridge
|
|
const usdc = new ERC20TokenContract(usdcAddress, env.provider, { ...env.txDefaults, from: usdcWallet });
|
|
await usdc
|
|
.transfer(testContract.address, toBaseUnitAmount(1, 6))
|
|
.awaitTransactionSuccessAsync({ from: usdcWallet }, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(daiAddress, constants.NULL_ADDRESS, receiver, constants.ZERO_AMOUNT, bridgeData)
|
|
.awaitTransactionSuccessAsync({ from: usdcWallet, gasPrice: 1 }, { shouldValidate: false });
|
|
});
|
|
});
|
|
});
|
|
});
|