[testnet-faucets] update to v2

This commit is contained in:
Jacob Evans 2018-09-05 15:13:21 +01:00
parent 174b360593
commit db6ddc0c4b
No known key found for this signature in database
GPG Key ID: 2036DA2ADDFB0842
6 changed files with 133 additions and 142 deletions

View File

@ -17,7 +17,7 @@
"author": "Fabio Berger",
"license": "Apache-2.0",
"dependencies": {
"0x.js": "0.38.5",
"0x.js": "1.0.1",
"@0xproject/subproviders": "^2.0.2",
"@0xproject/typescript-typings": "^2.0.0",
"@0xproject/utils": "^1.0.8",

View File

@ -1,13 +1,14 @@
import { ZeroEx } from '0x.js';
import { ERC20TokenWrapper } from '0x.js';
import { BigNumber, logUtils } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import { configs } from './configs';
import { TOKENS_BY_NETWORK } from './tokens';
const DISPENSE_AMOUNT_ETHER = 0.1;
const DISPENSE_AMOUNT_TOKEN = 0.1;
const DISPENSE_MAX_AMOUNT_TOKEN = 2;
const DISPENSE_AMOUNT_TOKEN = 1;
const DISPENSE_MAX_AMOUNT_TOKEN = 100;
const DISPENSE_MAX_AMOUNT_ETHER = 2;
type AsyncTask = () => Promise<void>;
@ -32,17 +33,22 @@ export const dispenseAssetTasks = {
logUtils.log(`Sent ${DISPENSE_AMOUNT_ETHER} ETH to ${recipientAddress} tx: ${txHash}`);
};
},
dispenseTokenTask(recipientAddress: string, tokenSymbol: string, zeroEx: ZeroEx): AsyncTask {
dispenseTokenTask(
recipientAddress: string,
tokenSymbol: string,
networkId: number,
erc20TokenWrapper: ERC20TokenWrapper,
): AsyncTask {
return async () => {
logUtils.log(`Processing ${tokenSymbol} ${recipientAddress}`);
const amountToDispense = new BigNumber(DISPENSE_AMOUNT_TOKEN);
const token = await zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(tokenSymbol);
const token = TOKENS_BY_NETWORK[networkId][tokenSymbol];
if (_.isUndefined(token)) {
throw new Error(`Unsupported asset type: ${tokenSymbol}`);
}
const baseUnitAmount = ZeroEx.toBaseUnitAmount(amountToDispense, token.decimals);
const userBalanceBaseUnits = await zeroEx.token.getBalanceAsync(token.address, recipientAddress);
const maxAmountBaseUnits = ZeroEx.toBaseUnitAmount(
const baseUnitAmount = Web3Wrapper.toBaseUnitAmount(amountToDispense, token.decimals);
const userBalanceBaseUnits = await erc20TokenWrapper.getBalanceAsync(token.address, recipientAddress);
const maxAmountBaseUnits = Web3Wrapper.toBaseUnitAmount(
new BigNumber(DISPENSE_MAX_AMOUNT_TOKEN),
token.decimals,
);
@ -52,13 +58,13 @@ export const dispenseAssetTasks = {
);
return;
}
const txHash = await zeroEx.token.transferAsync(
const txHash = await erc20TokenWrapper.transferAsync(
token.address,
configs.DISPENSER_ADDRESS,
recipientAddress,
baseUnitAmount,
);
logUtils.log(`Sent ${amountToDispense} ZRX to ${recipientAddress} tx: ${txHash}`);
logUtils.log(`Sent ${amountToDispense} ${tokenSymbol} to ${recipientAddress} tx: ${txHash}`);
};
},
};

View File

@ -1,27 +1,35 @@
import { Order, ZeroEx } from '0x.js';
import { BigNumber, logUtils } from '@0xproject/utils';
import {
assetDataUtils,
BigNumber,
ContractWrappers,
generatePseudoRandomSalt,
Order,
orderHashUtils,
Provider,
RPCSubprovider,
signatureUtils,
SignedOrder,
SignerType,
Web3ProviderEngine,
} from '0x.js';
import { NonceTrackerSubprovider, PrivateKeyWalletSubprovider } from '@0xproject/subproviders';
import { logUtils } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import { Provider } from 'ethereum-types';
import * as express from 'express';
import * as _ from 'lodash';
import {
NonceTrackerSubprovider,
PrivateKeyWalletSubprovider,
RPCSubprovider,
Web3ProviderEngine,
} from '@0xproject/subproviders';
import { configs } from './configs';
import { constants } from './constants';
import { DispatchQueue } from './dispatch_queue';
import { dispenseAssetTasks } from './dispense_asset_tasks';
import { rpcUrls } from './rpc_urls';
import { TOKENS_BY_NETWORK } from './tokens';
interface NetworkConfig {
dispatchQueue: DispatchQueue;
web3Wrapper: Web3Wrapper;
zeroEx: ZeroEx;
contractWrappers: ContractWrappers;
networkId: number;
}
interface ItemByNetworkId<T> {
@ -35,6 +43,9 @@ enum RequestedAssetType {
}
const FIVE_DAYS_IN_MS = 4.32e8; // TODO: make this configurable
const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
const ZERO = new BigNumber(0);
const ASSET_AMOUNT = new BigNumber(0.1);
export class Handler {
private readonly _networkConfigByNetworkId: ItemByNetworkId<NetworkConfig> = {};
@ -50,18 +61,18 @@ export class Handler {
return engine;
}
constructor() {
_.forIn(rpcUrls, (rpcUrl: string, networkId: string) => {
_.forIn(rpcUrls, (rpcUrl: string, networkIdString: string) => {
const providerObj = Handler._createProviderEngine(rpcUrl);
const web3Wrapper = new Web3Wrapper(providerObj);
const zeroExConfig = {
networkId: +networkId,
};
const zeroEx = new ZeroEx(providerObj, zeroExConfig);
// tslint:disable-next-line:custom-no-magic-numbers
const networkId = parseInt(networkIdString, 10);
const contractWrappers = new ContractWrappers(providerObj, { networkId });
const dispatchQueue = new DispatchQueue();
this._networkConfigByNetworkId[networkId] = {
dispatchQueue,
web3Wrapper,
zeroEx,
contractWrappers,
networkId,
};
});
}
@ -107,7 +118,8 @@ export class Handler {
dispenserTask = dispenseAssetTasks.dispenseTokenTask(
recipient,
requestedAssetType,
networkConfig.zeroEx,
networkConfig.networkId,
networkConfig.contractWrappers.erc20Token,
);
break;
default:
@ -131,39 +143,47 @@ export class Handler {
res.status(constants.BAD_REQUEST_STATUS).send('UNSUPPORTED_NETWORK_ID');
return;
}
const zeroEx = networkConfig.zeroEx;
res.setHeader('Content-Type', 'application/json');
const makerToken = await zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(requestedAssetType);
const makerToken = TOKENS_BY_NETWORK[networkConfig.networkId][requestedAssetType];
if (_.isUndefined(makerToken)) {
throw new Error(`Unsupported asset type: ${requestedAssetType}`);
}
const takerTokenSymbol =
requestedAssetType === RequestedAssetType.WETH ? RequestedAssetType.ZRX : RequestedAssetType.WETH;
const takerToken = await zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(takerTokenSymbol);
const takerToken = TOKENS_BY_NETWORK[networkConfig.networkId][takerTokenSymbol];
if (_.isUndefined(takerToken)) {
throw new Error(`Unsupported asset type: ${requestedAssetType}`);
}
const makerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(0.1), makerToken.decimals);
const takerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(0.1), takerToken.decimals);
const makerAssetAmount = Web3Wrapper.toBaseUnitAmount(ASSET_AMOUNT, makerToken.decimals);
const takerAssetAmount = Web3Wrapper.toBaseUnitAmount(ASSET_AMOUNT, takerToken.decimals);
const makerAssetData = assetDataUtils.encodeERC20AssetData(makerToken.address);
const takerAssetData = assetDataUtils.encodeERC20AssetData(takerToken.address);
const order: Order = {
maker: configs.DISPENSER_ADDRESS,
taker: req.params.recipient,
makerFee: new BigNumber(0),
takerFee: new BigNumber(0),
makerTokenAmount,
takerTokenAmount,
makerTokenAddress: makerToken.address,
takerTokenAddress: takerToken.address,
salt: ZeroEx.generatePseudoRandomSalt(),
exchangeContractAddress: zeroEx.exchange.getContractAddress(),
feeRecipient: ZeroEx.NULL_ADDRESS,
expirationUnixTimestampSec: new BigNumber(Date.now() + FIVE_DAYS_IN_MS),
makerAddress: configs.DISPENSER_ADDRESS,
takerAddress: req.params.recipient as string,
makerFee: ZERO,
takerFee: ZERO,
makerAssetAmount,
takerAssetAmount,
makerAssetData,
takerAssetData,
salt: generatePseudoRandomSalt(),
exchangeAddress: networkConfig.contractWrappers.exchange.getContractAddress(),
feeRecipientAddress: NULL_ADDRESS,
senderAddress: NULL_ADDRESS,
// tslint:disable-next-line:custom-no-magic-numbers
expirationTimeSeconds: new BigNumber(Date.now() + FIVE_DAYS_IN_MS).div(1000),
};
const orderHash = ZeroEx.getOrderHashHex(order);
const signature = await zeroEx.signOrderHashAsync(orderHash, configs.DISPENSER_ADDRESS, false);
const signedOrder = {
const orderHash = orderHashUtils.getOrderHashHex(order);
const signature = await signatureUtils.ecSignOrderHashAsync(
networkConfig.web3Wrapper.getProvider(),
orderHash,
configs.DISPENSER_ADDRESS,
SignerType.Default,
);
const signedOrder: SignedOrder = {
...order,
ecSignature: signature,
signature,
};
const payload = JSON.stringify(signedOrder);
logUtils.log(`Dispensed signed order: ${payload}`);

View File

@ -2,7 +2,6 @@ import { configs } from './configs';
const productionRpcUrls = {
'3': `https://ropsten.infura.io/${configs.INFURA_API_KEY}`,
'4': `https://rinkeby.infura.io/${configs.INFURA_API_KEY}`,
'42': `https://kovan.infura.io/${configs.INFURA_API_KEY}`,
};

View File

@ -0,0 +1,41 @@
export const tokens = {
ZRX: {
name: '0x Protocol Token',
decimals: 18,
symbol: 'ZRX',
},
WETH: {
name: 'Wrapped ETH',
decimals: 18,
symbol: 'WETH',
},
};
export const ETHER_TOKEN = {
name: 'Ether',
decimals: 18,
symbol: 'ETH',
};
export const TOKENS_BY_NETWORK: {
[networkId: number]: { [tokenSymbol: string]: { address: string; decimals: number; symbol: string; name: string } };
} = {
3: {
ZRX: {
...tokens.ZRX,
address: '0xff67881f8d12f372d91baae9752eb3631ff0ed00',
},
WETH: {
...tokens.WETH,
address: '0xc778417e063141139fce010982780140aa0cd5ab',
},
},
42: {
ZRX: {
...tokens.ZRX,
address: '0x2002d3812f58e35f0ea1ffbf80a75a38c32175fa',
},
WETH: {
...tokens.WETH,
address: '0xd0a1e359811322d97991e03f863a0c30c2cf029c',
},
},
};

107
yarn.lock
View File

@ -2,23 +2,6 @@
# yarn lockfile v1
"0x.js@0.38.5":
version "0.38.5"
resolved "https://registry.yarnpkg.com/0x.js/-/0x.js-0.38.5.tgz#da4724e81e648279ea288cbac4b1a950a7cd7707"
dependencies:
"@0xproject/assert" "^0.2.13"
"@0xproject/base-contract" "^0.3.5"
"@0xproject/contract-wrappers" "^0.1.0"
"@0xproject/order-utils" "^0.0.8"
"@0xproject/order-watcher" "^0.0.7"
"@0xproject/sol-compiler" "^0.5.3"
"@0xproject/types" "^0.8.2"
"@0xproject/typescript-typings" "^0.4.2"
"@0xproject/utils" "^0.7.2"
"@0xproject/web3-wrapper" "^0.7.2"
ethers "3.0.22"
lodash "4.17.10"
"0x.js@^0.38.6":
version "0.38.6"
resolved "https://registry.yarnpkg.com/0x.js/-/0x.js-0.38.6.tgz#f6cb2b6ef9aea2ff7696c923095e0b794c1d84fc"
@ -510,16 +493,6 @@
npmlog "^4.1.2"
write-file-atomic "^2.3.0"
"@0xproject/assert@^0.2.13":
version "0.2.13"
resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.13.tgz#8eb0e16cd6d802eae1b0ab86d344360ea0038331"
dependencies:
"@0xproject/json-schemas" "^0.8.2"
"@0xproject/typescript-typings" "^0.4.2"
"@0xproject/utils" "^0.7.2"
lodash "4.17.10"
valid-url "1.0.9"
"@0xproject/assert@^0.2.14":
version "0.2.14"
resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.14.tgz#7d5a373fedc8eb482716b730f4dddf3ef33bfa29"
@ -530,7 +503,7 @@
lodash "4.17.10"
valid-url "1.0.9"
"@0xproject/base-contract@^0.3.5", "@0xproject/base-contract@^0.3.6":
"@0xproject/base-contract@^0.3.6":
version "0.3.6"
resolved "https://registry.yarnpkg.com/@0xproject/base-contract/-/base-contract-0.3.6.tgz#c6d742ce2904bdd9e77524d99ba2438d3aae8a40"
dependencies:
@ -555,7 +528,7 @@
sinon "^4.0.0"
websocket "^1.0.25"
"@0xproject/contract-wrappers@^0.1.0", "@0xproject/contract-wrappers@^0.1.1":
"@0xproject/contract-wrappers@^0.1.1":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@0xproject/contract-wrappers/-/contract-wrappers-0.1.1.tgz#8108d7ec051f202ef0cfa77c91c4ef994bf89881"
dependencies:
@ -576,19 +549,6 @@
lodash "4.17.10"
uuid "3.2.1"
"@0xproject/fill-scenarios@^0.0.5":
version "0.0.5"
resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.5.tgz#a62a240ae40423b9b73ecc0b1fc2abb58b76621c"
dependencies:
"@0xproject/base-contract" "^0.3.5"
"@0xproject/order-utils" "^0.0.8"
"@0xproject/types" "^0.8.2"
"@0xproject/typescript-typings" "^0.4.2"
"@0xproject/utils" "^0.7.2"
"@0xproject/web3-wrapper" "^0.7.2"
ethers "3.0.22"
lodash "4.17.10"
"@0xproject/fill-scenarios@^0.0.6":
version "0.0.6"
resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.6.tgz#969a2c49122650af5a1bf7fe7c6d286a0e6f2de2"
@ -602,15 +562,6 @@
ethers "3.0.22"
lodash "4.17.10"
"@0xproject/json-schemas@^0.8.2":
version "0.8.2"
resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.2.tgz#9d3f446e546ce0c959cf7beb45d41ac60476a78c"
dependencies:
"@0xproject/typescript-typings" "^0.4.2"
"@types/node" "9.6.0"
jsonschema "1.2.2"
lodash.values "4.3.0"
"@0xproject/json-schemas@^0.8.3":
version "0.8.3"
resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.3.tgz#455e6219a6bd05e990392165192a983a9ab89f26"
@ -620,22 +571,6 @@
jsonschema "1.2.2"
lodash.values "4.3.0"
"@0xproject/order-utils@^0.0.8":
version "0.0.8"
resolved "https://registry.yarnpkg.com/@0xproject/order-utils/-/order-utils-0.0.8.tgz#72077749a22cae5f0c748a6af90d1d77f5ebf8c9"
dependencies:
"@0xproject/assert" "^0.2.13"
"@0xproject/json-schemas" "^0.8.2"
"@0xproject/types" "^0.8.2"
"@0xproject/typescript-typings" "^0.4.2"
"@0xproject/utils" "^0.7.2"
"@0xproject/web3-wrapper" "^0.7.2"
"@types/node" "9.6.0"
bn.js "4.11.7"
ethereumjs-abi "0.6.5"
ethereumjs-util "5.1.5"
lodash "4.17.10"
"@0xproject/order-utils@^0.0.9":
version "0.0.9"
resolved "https://registry.yarnpkg.com/@0xproject/order-utils/-/order-utils-0.0.9.tgz#75225dfbd87335d18810abf995d8e077b9a84868"
@ -652,26 +587,6 @@
ethereumjs-util "5.1.5"
lodash "4.17.10"
"@0xproject/order-watcher@^0.0.7":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@0xproject/order-watcher/-/order-watcher-0.0.7.tgz#fbe019aa33447781096b5d562e7a3a4ec91a1da2"
dependencies:
"@0xproject/assert" "^0.2.13"
"@0xproject/base-contract" "^0.3.5"
"@0xproject/contract-wrappers" "^0.1.0"
"@0xproject/fill-scenarios" "^0.0.5"
"@0xproject/json-schemas" "^0.8.2"
"@0xproject/order-utils" "^0.0.8"
"@0xproject/types" "^0.8.2"
"@0xproject/typescript-typings" "^0.4.2"
"@0xproject/utils" "^0.7.2"
"@0xproject/web3-wrapper" "^0.7.2"
bintrees "1.0.2"
ethereum-types "^0.0.2"
ethereumjs-blockstream "5.0.0"
ethers "3.0.22"
lodash "4.17.10"
"@0xproject/order-watcher@^0.0.8":
version "0.0.8"
resolved "https://registry.yarnpkg.com/@0xproject/order-watcher/-/order-watcher-0.0.8.tgz#cfba4c39ca8c5d39e076276479383d0aae022c6d"
@ -692,7 +607,7 @@
ethers "3.0.22"
lodash "4.17.10"
"@0xproject/sol-compiler@^0.5.3", "@0xproject/sol-compiler@^0.5.4":
"@0xproject/sol-compiler@^0.5.4":
version "0.5.4"
resolved "https://registry.yarnpkg.com/@0xproject/sol-compiler/-/sol-compiler-0.5.4.tgz#3e0b04b0c02c5ec046ebb962b5ed20978c6b4cdd"
dependencies:
@ -743,7 +658,7 @@
"@0xproject/types" "^0.5.0"
bignumber.js "~4.1.0"
"@0xproject/typescript-typings@^0.4.2", "@0xproject/typescript-typings@^0.4.3":
"@0xproject/typescript-typings@^0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@0xproject/typescript-typings/-/typescript-typings-0.4.3.tgz#f99f939a43f2764ad7182fcd78a71212a1d76d96"
dependencies:
@ -751,7 +666,17 @@
bignumber.js "~4.1.0"
ethereum-types "^0.0.2"
"@0xproject/utils@^0.7.2", "@0xproject/utils@^0.7.3":
"@0xproject/typescript-typings@^1.0.3":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@0xproject/typescript-typings/-/typescript-typings-1.0.5.tgz#a808443419f26a7b90d63d1afd3efbfb48644184"
dependencies:
"@types/bn.js" "^4.11.0"
"@types/react" "*"
bignumber.js "~4.1.0"
ethereum-types "^1.0.5"
popper.js "1.14.3"
"@0xproject/utils@^0.7.3":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@0xproject/utils/-/utils-0.7.3.tgz#ffa7c6da9bf0dd3e13694f185dcfc48a8981ff05"
dependencies:
@ -765,7 +690,7 @@
lodash "4.17.10"
web3 "0.20.6"
"@0xproject/web3-wrapper@^0.7.2", "@0xproject/web3-wrapper@^0.7.3":
"@0xproject/web3-wrapper@^0.7.3":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@0xproject/web3-wrapper/-/web3-wrapper-0.7.3.tgz#9bd50b034b92fd505b6766b6e225f014b6d08b08"
dependencies: