133 lines
5.7 KiB
TypeScript
133 lines
5.7 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';
|
|
|
|
const USDC_WALLET = '0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3';
|
|
const DAI_WALLET = '0x6cc5f688a315f3dc28a7781717a9a798a59fda7b';
|
|
const WBTC_WALLET = '0x56178a0d5F301bAf6CF3e1Cd53d9863437345Bf9';
|
|
blockchainTests.configure({
|
|
fork: {
|
|
unlockedAccounts: [USDC_WALLET, DAI_WALLET, WBTC_WALLET],
|
|
},
|
|
});
|
|
|
|
blockchainTests.fork('Mainnet curve bridge tests', env => {
|
|
let testContract: CurveBridgeContract;
|
|
const RECEIVER = '0x986ccf5234d9cfbb25246f1a5bfa51f4ccfcb308';
|
|
const bridgeDataEncoder = AbiEncoder.create([
|
|
{ name: 'curveAddress', type: 'address' },
|
|
{ name: 'exchangeFunctionSelector', type: 'bytes4' },
|
|
{ name: 'fromTokenAddress', type: 'address' },
|
|
{ name: 'fromTokenIdx', type: 'int128' },
|
|
{ name: 'toTokenIdx', type: 'int128' },
|
|
]);
|
|
before(async () => {
|
|
testContract = await CurveBridgeContract.deployFrom0xArtifactAsync(
|
|
assetProxyArtifacts.CurveBridge,
|
|
env.provider,
|
|
{ ...env.txDefaults },
|
|
{},
|
|
);
|
|
});
|
|
|
|
describe('bridgeTransferFrom()', () => {
|
|
describe('exchange_underlying()', () => {
|
|
const USDC_ADDRESS = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
const DAI_ADDRESS = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
|
|
const DAI_TOKEN_IDX = 0;
|
|
const USDC_TOKEN_IDX = 1;
|
|
const EXCHANGE_UNDERLYING_SELECTOR = '0xa6417ed6';
|
|
const CURVE_ADDRESS = '0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56';
|
|
it('succeeds exchanges DAI for USDC', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([
|
|
CURVE_ADDRESS,
|
|
EXCHANGE_UNDERLYING_SELECTOR,
|
|
DAI_ADDRESS,
|
|
DAI_TOKEN_IDX,
|
|
USDC_TOKEN_IDX,
|
|
]);
|
|
// Fund the Bridge
|
|
const dai = new ERC20TokenContract(DAI_ADDRESS, env.provider, { ...env.txDefaults, from: DAI_WALLET });
|
|
await dai
|
|
.transfer(testContract.address, toBaseUnitAmount(1))
|
|
.awaitTransactionSuccessAsync({}, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(
|
|
USDC_ADDRESS,
|
|
constants.NULL_ADDRESS,
|
|
RECEIVER,
|
|
constants.ZERO_AMOUNT,
|
|
bridgeData,
|
|
)
|
|
.awaitTransactionSuccessAsync({}, { shouldValidate: false });
|
|
});
|
|
it('succeeds exchanges USDC for DAI', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([
|
|
CURVE_ADDRESS,
|
|
EXCHANGE_UNDERLYING_SELECTOR,
|
|
USDC_ADDRESS,
|
|
USDC_TOKEN_IDX,
|
|
DAI_TOKEN_IDX,
|
|
]);
|
|
// Fund the Bridge
|
|
const usdc = new ERC20TokenContract(USDC_ADDRESS, env.provider, {
|
|
...env.txDefaults,
|
|
from: USDC_WALLET,
|
|
});
|
|
await usdc
|
|
.transfer(testContract.address, toBaseUnitAmount(1, 6))
|
|
.awaitTransactionSuccessAsync({}, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(
|
|
DAI_ADDRESS,
|
|
constants.NULL_ADDRESS,
|
|
RECEIVER,
|
|
constants.ZERO_AMOUNT,
|
|
bridgeData,
|
|
)
|
|
.awaitTransactionSuccessAsync({}, { shouldValidate: false });
|
|
});
|
|
});
|
|
|
|
describe('exchange()', () => {
|
|
const WBTC_ADDRESS = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599';
|
|
const RENBTC_ADDRESS = '0xeb4c2781e4eba804ce9a9803c67d0893436bb27d';
|
|
const RENBTC_TOKEN_IDX = 0;
|
|
const WBTC_TOKEN_IDX = 1;
|
|
const EXCHANGE_SELECTOR = '0x3df02124';
|
|
const CURVE_ADDRESS = '0x7fc77b5c7614e1533320ea6ddc2eb61fa00a9714';
|
|
it('succeeds exchanges WBTC for renBTC', async () => {
|
|
const bridgeData = bridgeDataEncoder.encode([
|
|
CURVE_ADDRESS,
|
|
EXCHANGE_SELECTOR,
|
|
WBTC_ADDRESS,
|
|
WBTC_TOKEN_IDX,
|
|
RENBTC_TOKEN_IDX,
|
|
]);
|
|
// Fund the Bridge
|
|
const wbtc = new ERC20TokenContract(WBTC_ADDRESS, env.provider, {
|
|
...env.txDefaults,
|
|
from: WBTC_WALLET,
|
|
});
|
|
await wbtc
|
|
.transfer(testContract.address, toBaseUnitAmount(1, 8))
|
|
.awaitTransactionSuccessAsync({}, { shouldValidate: false });
|
|
// Exchange via Curve
|
|
await testContract
|
|
.bridgeTransferFrom(
|
|
RENBTC_ADDRESS,
|
|
constants.NULL_ADDRESS,
|
|
RECEIVER,
|
|
constants.ZERO_AMOUNT,
|
|
bridgeData,
|
|
)
|
|
.awaitTransactionSuccessAsync({ gas: 6e6 }, { shouldValidate: false });
|
|
});
|
|
});
|
|
});
|
|
});
|