1319 lines
71 KiB
JavaScript
1319 lines
71 KiB
JavaScript
"use strict";
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
function step(op) {
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|
while (_) try {
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
switch (op[0]) {
|
|
case 0: case 1: t = op; break;
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
default:
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
if (t[2]) _.ops.pop();
|
|
_.trys.pop(); continue;
|
|
}
|
|
op = body.call(thisArg, _);
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
}
|
|
};
|
|
var __read = (this && this.__read) || function (o, n) {
|
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
if (!m) return o;
|
|
var i = m.call(o), r, ar = [], e;
|
|
try {
|
|
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
}
|
|
catch (error) { e = { error: error }; }
|
|
finally {
|
|
try {
|
|
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
}
|
|
finally { if (e) throw e.error; }
|
|
}
|
|
return ar;
|
|
};
|
|
var __spread = (this && this.__spread) || function () {
|
|
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
return ar;
|
|
};
|
|
var __values = (this && this.__values) || function (o) {
|
|
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
|
|
if (m) return m.call(o);
|
|
return {
|
|
next: function () {
|
|
if (o && i >= o.length) o = void 0;
|
|
return { value: o && o[i++], done: !o };
|
|
}
|
|
};
|
|
};
|
|
var _this = this;
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var contracts_test_utils_1 = require("@0x/contracts-test-utils");
|
|
var utils_1 = require("@0x/utils");
|
|
var _ = require("lodash");
|
|
var artifacts_1 = require("./artifacts");
|
|
var wrappers_1 = require("./wrappers");
|
|
contracts_test_utils_1.blockchainTests('erc20-bridge-sampler', function (env) {
|
|
var testContract;
|
|
var RATE_DENOMINATOR = contracts_test_utils_1.constants.ONE_ETHER;
|
|
var MIN_RATE = new utils_1.BigNumber('0.01');
|
|
var MAX_RATE = new utils_1.BigNumber('100');
|
|
var MIN_DECIMALS = 4;
|
|
var MAX_DECIMALS = 20;
|
|
var WETH_ADDRESS = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
|
|
var KYBER_SALT = '0x0ff3ca9d46195c39f9a12afb74207b4970349fb3cfb1e459bbf170298d326bc7';
|
|
var ETH2DAI_SALT = '0xb713b61bb9bb2958a0f5d1534b21e94fc68c4c0c034b0902ed844f2f6cd1b4f7';
|
|
var UNISWAP_BASE_SALT = '0x1d6a6a0506b0b4a554b907a4c29d9f4674e461989d9c1921feb17b26716385ab';
|
|
var ERC20_PROXY_ID = '0xf47261b0';
|
|
var INVALID_TOKEN_PAIR_ERROR = 'ERC20BridgeSampler/INVALID_TOKEN_PAIR';
|
|
var MAKER_TOKEN = contracts_test_utils_1.randomAddress();
|
|
var TAKER_TOKEN = contracts_test_utils_1.randomAddress();
|
|
before(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, wrappers_1.TestERC20BridgeSamplerContract.deployFrom0xArtifactAsync(artifacts_1.artifacts.TestERC20BridgeSampler, env.provider, env.txDefaults, {})];
|
|
case 1:
|
|
testContract = _a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
function getPackedHash() {
|
|
var args = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
args[_i] = arguments[_i];
|
|
}
|
|
return utils_1.hexUtils.hash(utils_1.hexUtils.concat.apply(utils_1.hexUtils, __spread(args.map(function (a) { return utils_1.hexUtils.toHex(a); }))));
|
|
}
|
|
function getUniswapExchangeSalt(tokenAddress) {
|
|
return getPackedHash(UNISWAP_BASE_SALT, tokenAddress);
|
|
}
|
|
function getDeterministicRate(salt, sellToken, buyToken) {
|
|
var hash = getPackedHash(salt, sellToken, buyToken);
|
|
var _minRate = RATE_DENOMINATOR.times(MIN_RATE);
|
|
var _maxRate = RATE_DENOMINATOR.times(MAX_RATE);
|
|
return new utils_1.BigNumber(hash)
|
|
.mod(_maxRate.minus(_minRate))
|
|
.plus(_minRate)
|
|
.div(RATE_DENOMINATOR);
|
|
}
|
|
function getDeterministicTokenDecimals(token) {
|
|
if (token === WETH_ADDRESS) {
|
|
return 18;
|
|
}
|
|
// HACK(dorothy-zbornak): Linter will complain about the addition not being
|
|
// between two numbers, even though they are.
|
|
// tslint:disable-next-line restrict-plus-operands
|
|
return new utils_1.BigNumber(getPackedHash(token)).mod(MAX_DECIMALS - MIN_DECIMALS).toNumber() + MIN_DECIMALS;
|
|
}
|
|
function getDeterministicSellQuote(salt, sellToken, buyToken, sellAmount) {
|
|
var sellBase = new utils_1.BigNumber(10).pow(getDeterministicTokenDecimals(sellToken));
|
|
var buyBase = new utils_1.BigNumber(10).pow(getDeterministicTokenDecimals(buyToken));
|
|
var rate = getDeterministicRate(salt, sellToken, buyToken);
|
|
return sellAmount
|
|
.times(rate)
|
|
.times(buyBase)
|
|
.dividedToIntegerBy(sellBase);
|
|
}
|
|
function getDeterministicBuyQuote(salt, sellToken, buyToken, buyAmount) {
|
|
var sellBase = new utils_1.BigNumber(10).pow(getDeterministicTokenDecimals(sellToken));
|
|
var buyBase = new utils_1.BigNumber(10).pow(getDeterministicTokenDecimals(buyToken));
|
|
var rate = getDeterministicRate(salt, sellToken, buyToken);
|
|
return buyAmount
|
|
.times(sellBase)
|
|
.dividedToIntegerBy(rate)
|
|
.dividedToIntegerBy(buyBase);
|
|
}
|
|
function areAddressesEqual(a, b) {
|
|
return a.toLowerCase() === b.toLowerCase();
|
|
}
|
|
function getDeterministicUniswapSellQuote(sellToken, buyToken, sellAmount) {
|
|
if (areAddressesEqual(buyToken, WETH_ADDRESS)) {
|
|
return getDeterministicSellQuote(getUniswapExchangeSalt(sellToken), sellToken, WETH_ADDRESS, sellAmount);
|
|
}
|
|
if (areAddressesEqual(sellToken, WETH_ADDRESS)) {
|
|
return getDeterministicSellQuote(getUniswapExchangeSalt(buyToken), buyToken, WETH_ADDRESS, sellAmount);
|
|
}
|
|
var ethBought = getDeterministicSellQuote(getUniswapExchangeSalt(sellToken), sellToken, WETH_ADDRESS, sellAmount);
|
|
return getDeterministicSellQuote(getUniswapExchangeSalt(buyToken), buyToken, WETH_ADDRESS, ethBought);
|
|
}
|
|
function getDeterministicUniswapBuyQuote(sellToken, buyToken, buyAmount) {
|
|
if (areAddressesEqual(buyToken, WETH_ADDRESS)) {
|
|
return getDeterministicBuyQuote(getUniswapExchangeSalt(sellToken), WETH_ADDRESS, sellToken, buyAmount);
|
|
}
|
|
if (areAddressesEqual(sellToken, WETH_ADDRESS)) {
|
|
return getDeterministicBuyQuote(getUniswapExchangeSalt(buyToken), WETH_ADDRESS, buyToken, buyAmount);
|
|
}
|
|
var ethSold = getDeterministicBuyQuote(getUniswapExchangeSalt(buyToken), WETH_ADDRESS, buyToken, buyAmount);
|
|
return getDeterministicBuyQuote(getUniswapExchangeSalt(sellToken), WETH_ADDRESS, sellToken, ethSold);
|
|
}
|
|
function getDeterministicSellQuotes(sellToken, buyToken, sources, sampleAmounts) {
|
|
var e_1, _a, e_2, _b;
|
|
var quotes = [];
|
|
try {
|
|
for (var sources_1 = __values(sources), sources_1_1 = sources_1.next(); !sources_1_1.done; sources_1_1 = sources_1.next()) {
|
|
var source = sources_1_1.value;
|
|
var sampleOutputs = [];
|
|
try {
|
|
for (var sampleAmounts_1 = __values(sampleAmounts), sampleAmounts_1_1 = sampleAmounts_1.next(); !sampleAmounts_1_1.done; sampleAmounts_1_1 = sampleAmounts_1.next()) {
|
|
var amount = sampleAmounts_1_1.value;
|
|
if (source === 'Kyber' || source === 'Eth2Dai') {
|
|
sampleOutputs.push(getDeterministicSellQuote(source === 'Kyber' ? KYBER_SALT : ETH2DAI_SALT, sellToken, buyToken, amount));
|
|
}
|
|
else if (source === 'Uniswap') {
|
|
sampleOutputs.push(getDeterministicUniswapSellQuote(sellToken, buyToken, amount));
|
|
}
|
|
}
|
|
}
|
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
finally {
|
|
try {
|
|
if (sampleAmounts_1_1 && !sampleAmounts_1_1.done && (_b = sampleAmounts_1.return)) _b.call(sampleAmounts_1);
|
|
}
|
|
finally { if (e_2) throw e_2.error; }
|
|
}
|
|
quotes.push(sampleOutputs);
|
|
}
|
|
}
|
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
finally {
|
|
try {
|
|
if (sources_1_1 && !sources_1_1.done && (_a = sources_1.return)) _a.call(sources_1);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
}
|
|
return quotes;
|
|
}
|
|
function getDeterministicBuyQuotes(sellToken, buyToken, sources, sampleAmounts) {
|
|
var e_3, _a, e_4, _b;
|
|
var quotes = [];
|
|
try {
|
|
for (var sources_2 = __values(sources), sources_2_1 = sources_2.next(); !sources_2_1.done; sources_2_1 = sources_2.next()) {
|
|
var source = sources_2_1.value;
|
|
var sampleOutputs = [];
|
|
try {
|
|
for (var sampleAmounts_2 = __values(sampleAmounts), sampleAmounts_2_1 = sampleAmounts_2.next(); !sampleAmounts_2_1.done; sampleAmounts_2_1 = sampleAmounts_2.next()) {
|
|
var amount = sampleAmounts_2_1.value;
|
|
if (source === 'Eth2Dai') {
|
|
sampleOutputs.push(getDeterministicBuyQuote(ETH2DAI_SALT, sellToken, buyToken, amount));
|
|
}
|
|
else if (source === 'Uniswap') {
|
|
sampleOutputs.push(getDeterministicUniswapBuyQuote(sellToken, buyToken, amount));
|
|
}
|
|
}
|
|
}
|
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
finally {
|
|
try {
|
|
if (sampleAmounts_2_1 && !sampleAmounts_2_1.done && (_b = sampleAmounts_2.return)) _b.call(sampleAmounts_2);
|
|
}
|
|
finally { if (e_4) throw e_4.error; }
|
|
}
|
|
quotes.push(sampleOutputs);
|
|
}
|
|
}
|
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
finally {
|
|
try {
|
|
if (sources_2_1 && !sources_2_1.done && (_a = sources_2.return)) _a.call(sources_2);
|
|
}
|
|
finally { if (e_3) throw e_3.error; }
|
|
}
|
|
return quotes;
|
|
}
|
|
function getDeterministicFillableTakerAssetAmount(order) {
|
|
var hash = getPackedHash(utils_1.hexUtils.leftPad(order.salt));
|
|
var orderStatus = new utils_1.BigNumber(hash).mod(100).toNumber() > 90 ? 5 : 3;
|
|
var isValidSignature = !!new utils_1.BigNumber(hash).mod(2).toNumber();
|
|
if (orderStatus !== 3 || !isValidSignature) {
|
|
return contracts_test_utils_1.constants.ZERO_AMOUNT;
|
|
}
|
|
return order.takerAssetAmount.minus(new utils_1.BigNumber(hash).mod(order.takerAssetAmount));
|
|
}
|
|
function getDeterministicFillableMakerAssetAmount(order) {
|
|
var takerAmount = getDeterministicFillableTakerAssetAmount(order);
|
|
return order.makerAssetAmount
|
|
.times(takerAmount)
|
|
.div(order.takerAssetAmount)
|
|
.integerValue(utils_1.BigNumber.ROUND_UP);
|
|
}
|
|
function getERC20AssetData(tokenAddress) {
|
|
return utils_1.hexUtils.concat(ERC20_PROXY_ID, utils_1.hexUtils.leftPad(tokenAddress));
|
|
}
|
|
function getSampleAmounts(tokenAddress, count) {
|
|
var tokenDecimals = getDeterministicTokenDecimals(tokenAddress);
|
|
var _upperLimit = contracts_test_utils_1.getRandomPortion(contracts_test_utils_1.getRandomInteger(1, 1000).times(Math.pow(10, tokenDecimals)));
|
|
var _count = count || _.random(1, 16);
|
|
var d = _upperLimit.div(_count);
|
|
return _.times(_count, function (i) { return d.times((i + 1) / _count).integerValue(); });
|
|
}
|
|
function createOrder(makerToken, takerToken) {
|
|
return {
|
|
chainId: 1337,
|
|
exchangeAddress: contracts_test_utils_1.randomAddress(),
|
|
makerAddress: contracts_test_utils_1.randomAddress(),
|
|
takerAddress: contracts_test_utils_1.randomAddress(),
|
|
senderAddress: contracts_test_utils_1.randomAddress(),
|
|
feeRecipientAddress: contracts_test_utils_1.randomAddress(),
|
|
makerAssetAmount: contracts_test_utils_1.getRandomInteger(1, 1e18),
|
|
takerAssetAmount: contracts_test_utils_1.getRandomInteger(1, 1e18),
|
|
makerFee: contracts_test_utils_1.getRandomInteger(1, 1e18),
|
|
takerFee: contracts_test_utils_1.getRandomInteger(1, 1e18),
|
|
makerAssetData: getERC20AssetData(makerToken),
|
|
takerAssetData: getERC20AssetData(takerToken),
|
|
makerFeeAssetData: getERC20AssetData(contracts_test_utils_1.randomAddress()),
|
|
takerFeeAssetData: getERC20AssetData(contracts_test_utils_1.randomAddress()),
|
|
salt: new utils_1.BigNumber(utils_1.hexUtils.random()),
|
|
expirationTimeSeconds: contracts_test_utils_1.getRandomInteger(0, Math.pow(2, 32)),
|
|
};
|
|
}
|
|
function createOrders(makerToken, takerToken, count) {
|
|
return _.times(count || _.random(1, 16), function () { return createOrder(makerToken, takerToken); });
|
|
}
|
|
function enableFailTriggerAsync() {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.enableFailTrigger().awaitTransactionSuccessAsync({ value: 1 })];
|
|
case 1:
|
|
_a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
});
|
|
}
|
|
describe('getOrderFillableTakerAssetAmounts()', function () {
|
|
it('returns the expected amount for each order', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, expected, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN);
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
expected = orders.map(getDeterministicFillableTakerAssetAmount);
|
|
return [4 /*yield*/, testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq(expected);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns empty for no orders', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.getOrderFillableTakerAssetAmounts([], []).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero for an order with zero maker asset amount', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1);
|
|
orders[0].makerAssetAmount = contracts_test_utils_1.constants.ZERO_AMOUNT;
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
return [4 /*yield*/, testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([contracts_test_utils_1.constants.ZERO_AMOUNT]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero for an order with zero taker asset amount', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1);
|
|
orders[0].takerAssetAmount = contracts_test_utils_1.constants.ZERO_AMOUNT;
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
return [4 /*yield*/, testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([contracts_test_utils_1.constants.ZERO_AMOUNT]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero for an order with an empty signature', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1);
|
|
signatures = _.times(orders.length, function () { return contracts_test_utils_1.constants.NULL_BYTES; });
|
|
return [4 /*yield*/, testContract.getOrderFillableTakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([contracts_test_utils_1.constants.ZERO_AMOUNT]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
describe('getOrderFillableMakerAssetAmounts()', function () {
|
|
it('returns the expected amount for each order', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, expected, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN);
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
expected = orders.map(getDeterministicFillableMakerAssetAmount);
|
|
return [4 /*yield*/, testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq(expected);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns empty for no orders', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.getOrderFillableMakerAssetAmounts([], []).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero for an order with zero maker asset amount', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1);
|
|
orders[0].makerAssetAmount = contracts_test_utils_1.constants.ZERO_AMOUNT;
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
return [4 /*yield*/, testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([contracts_test_utils_1.constants.ZERO_AMOUNT]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero for an order with zero taker asset amount', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1);
|
|
orders[0].takerAssetAmount = contracts_test_utils_1.constants.ZERO_AMOUNT;
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
return [4 /*yield*/, testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([contracts_test_utils_1.constants.ZERO_AMOUNT]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero for an order with an empty signature', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, 1);
|
|
signatures = _.times(orders.length, function () { return contracts_test_utils_1.constants.NULL_BYTES; });
|
|
return [4 /*yield*/, testContract.getOrderFillableMakerAssetAmounts(orders, signatures).callAsync()];
|
|
case 1:
|
|
actual = _a.sent();
|
|
contracts_test_utils_1.expect(actual).to.deep.eq([contracts_test_utils_1.constants.ZERO_AMOUNT]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
contracts_test_utils_1.blockchainTests.resets('sampleSellsFromKyberNetwork()', function () {
|
|
before(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.createTokenExchanges([MAKER_TOKEN, TAKER_TOKEN]).awaitTransactionSuccessAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('throws if tokens are the same', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var tx;
|
|
return __generator(this, function (_a) {
|
|
tx = testContract.sampleSellsFromKyberNetwork(MAKER_TOKEN, MAKER_TOKEN, []).callAsync();
|
|
return [2 /*return*/, contracts_test_utils_1.expect(tx).to.revertWith(INVALID_TOKEN_PAIR_ERROR)];
|
|
});
|
|
}); });
|
|
it('can return no quotes', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.sampleSellsFromKyberNetwork(TAKER_TOKEN, MAKER_TOKEN, []).callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token - token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(TAKER_TOKEN, MAKER_TOKEN, ['Kyber'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromKyberNetwork(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromKyberNetwork(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> ETH', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(TAKER_TOKEN, WETH_ADDRESS, ['Kyber'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromKyberNetwork(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> ETH fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromKyberNetwork(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote ETH -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(WETH_ADDRESS, TAKER_TOKEN, ['Kyber'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromKyberNetwork(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if ETH -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromKyberNetwork(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
contracts_test_utils_1.blockchainTests.resets('sampleSellsFromEth2Dai()', function () {
|
|
before(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.createTokenExchanges([MAKER_TOKEN, TAKER_TOKEN]).awaitTransactionSuccessAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('throws if tokens are the same', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var tx;
|
|
return __generator(this, function (_a) {
|
|
tx = testContract.sampleSellsFromEth2Dai(MAKER_TOKEN, MAKER_TOKEN, []).callAsync();
|
|
return [2 /*return*/, contracts_test_utils_1.expect(tx).to.revertWith(INVALID_TOKEN_PAIR_ERROR)];
|
|
});
|
|
}); });
|
|
it('can return no quotes', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.sampleSellsFromEth2Dai(TAKER_TOKEN, MAKER_TOKEN, []).callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(TAKER_TOKEN, MAKER_TOKEN, ['Eth2Dai'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromEth2Dai(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromEth2Dai(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> ETH', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(TAKER_TOKEN, WETH_ADDRESS, ['Eth2Dai'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromEth2Dai(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> ETH fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromEth2Dai(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote ETH -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(WETH_ADDRESS, TAKER_TOKEN, ['Eth2Dai'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromEth2Dai(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if ETH -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromEth2Dai(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
contracts_test_utils_1.blockchainTests.resets('sampleBuysFromEth2Dai()', function () {
|
|
before(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.createTokenExchanges([MAKER_TOKEN, TAKER_TOKEN]).awaitTransactionSuccessAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('throws if tokens are the same', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var tx;
|
|
return __generator(this, function (_a) {
|
|
tx = testContract.sampleBuysFromEth2Dai(MAKER_TOKEN, MAKER_TOKEN, []).callAsync();
|
|
return [2 /*return*/, contracts_test_utils_1.expect(tx).to.revertWith(INVALID_TOKEN_PAIR_ERROR)];
|
|
});
|
|
}); });
|
|
it('can return no quotes', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.sampleBuysFromEth2Dai(TAKER_TOKEN, MAKER_TOKEN, []).callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
_a = __read(getDeterministicBuyQuotes(TAKER_TOKEN, MAKER_TOKEN, ['Eth2Dai'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromEth2Dai(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromEth2Dai(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> ETH', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
_a = __read(getDeterministicBuyQuotes(TAKER_TOKEN, WETH_ADDRESS, ['Eth2Dai'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromEth2Dai(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> ETH fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromEth2Dai(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote ETH -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
_a = __read(getDeterministicBuyQuotes(WETH_ADDRESS, TAKER_TOKEN, ['Eth2Dai'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromEth2Dai(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if ETH -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromEth2Dai(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
contracts_test_utils_1.blockchainTests.resets('sampleSellsFromUniswap()', function () {
|
|
before(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.createTokenExchanges([MAKER_TOKEN, TAKER_TOKEN]).awaitTransactionSuccessAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('throws if tokens are the same', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var tx;
|
|
return __generator(this, function (_a) {
|
|
tx = testContract.sampleSellsFromUniswap(MAKER_TOKEN, MAKER_TOKEN, []).callAsync();
|
|
return [2 /*return*/, contracts_test_utils_1.expect(tx).to.revertWith(INVALID_TOKEN_PAIR_ERROR)];
|
|
});
|
|
}); });
|
|
it('can return no quotes', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.sampleSellsFromUniswap(TAKER_TOKEN, MAKER_TOKEN, []).callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(TAKER_TOKEN, MAKER_TOKEN, ['Uniswap'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> ETH', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(TAKER_TOKEN, WETH_ADDRESS, ['Uniswap'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> ETH fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote ETH -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
_a = __read(getDeterministicSellQuotes(WETH_ADDRESS, TAKER_TOKEN, ['Uniswap'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if ETH -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if no exchange exists for the maker token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var nonExistantToken, sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
nonExistantToken = contracts_test_utils_1.randomAddress();
|
|
sampleAmounts = getSampleAmounts(TAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(TAKER_TOKEN, nonExistantToken, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if no exchange exists for the taker token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var nonExistantToken, sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
nonExistantToken = contracts_test_utils_1.randomAddress();
|
|
sampleAmounts = getSampleAmounts(nonExistantToken);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, testContract
|
|
.sampleSellsFromUniswap(nonExistantToken, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
contracts_test_utils_1.blockchainTests.resets('sampleBuysFromUniswap()', function () {
|
|
before(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.createTokenExchanges([MAKER_TOKEN, TAKER_TOKEN]).awaitTransactionSuccessAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('throws if tokens are the same', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var tx;
|
|
return __generator(this, function (_a) {
|
|
tx = testContract.sampleBuysFromUniswap(MAKER_TOKEN, MAKER_TOKEN, []).callAsync();
|
|
return [2 /*return*/, contracts_test_utils_1.expect(tx).to.revertWith(INVALID_TOKEN_PAIR_ERROR)];
|
|
});
|
|
}); });
|
|
it('can return no quotes', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, testContract.sampleBuysFromUniswap(TAKER_TOKEN, MAKER_TOKEN, []).callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq([]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
_a = __read(getDeterministicBuyQuotes(TAKER_TOKEN, MAKER_TOKEN, ['Uniswap'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(TAKER_TOKEN, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote token -> ETH', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
_a = __read(getDeterministicBuyQuotes(TAKER_TOKEN, WETH_ADDRESS, ['Uniswap'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if token -> ETH fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(TAKER_TOKEN, WETH_ADDRESS, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can quote ETH -> token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, _a, expectedQuotes, quotes;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
_a = __read(getDeterministicBuyQuotes(WETH_ADDRESS, TAKER_TOKEN, ['Uniswap'], sampleAmounts), 1), expectedQuotes = _a[0];
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _b.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if ETH -> token fails', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, enableFailTriggerAsync()];
|
|
case 1:
|
|
_a.sent();
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(WETH_ADDRESS, TAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 2:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if no exchange exists for the maker token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var nonExistantToken, sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
nonExistantToken = contracts_test_utils_1.randomAddress();
|
|
sampleAmounts = getSampleAmounts(nonExistantToken);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(TAKER_TOKEN, nonExistantToken, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('returns zero if no exchange exists for the taker token', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var nonExistantToken, sampleAmounts, expectedQuotes, quotes;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
nonExistantToken = contracts_test_utils_1.randomAddress();
|
|
sampleAmounts = getSampleAmounts(MAKER_TOKEN);
|
|
expectedQuotes = _.times(sampleAmounts.length, function () { return contracts_test_utils_1.constants.ZERO_AMOUNT; });
|
|
return [4 /*yield*/, testContract
|
|
.sampleBuysFromUniswap(nonExistantToken, MAKER_TOKEN, sampleAmounts)
|
|
.callAsync()];
|
|
case 1:
|
|
quotes = _a.sent();
|
|
contracts_test_utils_1.expect(quotes).to.deep.eq(expectedQuotes);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
describe('batchCall()', function () {
|
|
it('can call one function', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var orders, signatures, expected, calls, r, actual;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN);
|
|
signatures = _.times(orders.length, function (i) { return utils_1.hexUtils.random(); });
|
|
expected = orders.map(getDeterministicFillableTakerAssetAmount);
|
|
calls = [
|
|
testContract.getOrderFillableTakerAssetAmounts(orders, signatures).getABIEncodedTransactionData(),
|
|
];
|
|
return [4 /*yield*/, testContract.batchCall(calls).callAsync()];
|
|
case 1:
|
|
r = _a.sent();
|
|
contracts_test_utils_1.expect(r).to.be.length(1);
|
|
actual = testContract.getABIDecodedReturnData('getOrderFillableTakerAssetAmounts', r[0]);
|
|
contracts_test_utils_1.expect(actual).to.deep.eq(expected);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can call two functions', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var numOrders, orders, signatures, expecteds, calls, r;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
numOrders = _.random(1, 10);
|
|
orders = _.times(2, function () { return createOrders(MAKER_TOKEN, TAKER_TOKEN, numOrders); });
|
|
signatures = _.times(numOrders, function (i) { return utils_1.hexUtils.random(); });
|
|
expecteds = [
|
|
orders[0].map(getDeterministicFillableTakerAssetAmount),
|
|
orders[1].map(getDeterministicFillableMakerAssetAmount),
|
|
];
|
|
calls = [
|
|
testContract.getOrderFillableTakerAssetAmounts(orders[0], signatures).getABIEncodedTransactionData(),
|
|
testContract.getOrderFillableMakerAssetAmounts(orders[1], signatures).getABIEncodedTransactionData(),
|
|
];
|
|
return [4 /*yield*/, testContract.batchCall(calls).callAsync()];
|
|
case 1:
|
|
r = _a.sent();
|
|
contracts_test_utils_1.expect(r).to.be.length(2);
|
|
contracts_test_utils_1.expect(testContract.getABIDecodedReturnData('getOrderFillableTakerAssetAmounts', r[0])).to.deep.eq(expecteds[0]);
|
|
contracts_test_utils_1.expect(testContract.getABIDecodedReturnData('getOrderFillableMakerAssetAmounts', r[1])).to.deep.eq(expecteds[1]);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
it('can make recursive calls', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
var numOrders, orders, signatures, expected, r;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
numOrders = _.random(1, 10);
|
|
orders = createOrders(MAKER_TOKEN, TAKER_TOKEN, numOrders);
|
|
signatures = _.times(numOrders, function (i) { return utils_1.hexUtils.random(); });
|
|
expected = orders.map(getDeterministicFillableTakerAssetAmount);
|
|
return [4 /*yield*/, testContract
|
|
.batchCall([
|
|
testContract
|
|
.batchCall([
|
|
testContract
|
|
.getOrderFillableTakerAssetAmounts(orders, signatures)
|
|
.getABIEncodedTransactionData(),
|
|
])
|
|
.getABIEncodedTransactionData(),
|
|
])
|
|
.callAsync()];
|
|
case 1:
|
|
r = _a.sent();
|
|
contracts_test_utils_1.expect(r).to.be.length(1);
|
|
r = testContract.getABIDecodedReturnData('batchCall', r[0]);
|
|
contracts_test_utils_1.expect(r).to.be.length(1);
|
|
contracts_test_utils_1.expect(testContract.getABIDecodedReturnData('getOrderFillableTakerAssetAmounts', r[0])).to.deep.eq(expected);
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
}); });
|
|
});
|
|
});
|
|
//# sourceMappingURL=erc20-bridge-sampler.js.map
|