├── migrations
├── 1_initial_migration.js
└── 2_deploy_contracts.js
├── .gitignore
├── contracts
├── resolver
│ ├── Resolver.sol
│ ├── URLResolver.sol
│ ├── ResolverFactory.sol
│ └── StandardResolver.sol
├── Migrations.sol
├── core
│ ├── Orders.sol
│ └── DINRegistry.sol
├── market
│ ├── Market.sol
│ └── StandardMarket.sol
└── utils
│ └── DINRegistryUtils.sol
├── package.json
├── test
├── resolverfactory.js
├── standardresolver.js
├── dinregistryutils.js
├── dinregistry.js
├── standardmarket.js
└── checkout.js
├── README.md
├── truffle.js
├── LICENSE
└── yarn.lock
/migrations/1_initial_migration.js:
--------------------------------------------------------------------------------
1 | var Migrations = artifacts.require("./Migrations.sol");
2 |
3 | module.exports = function(deployer, network, accounts) {
4 | deployer.deploy(Migrations);
5 | };
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | .vscode/
3 | node_modules/
4 | .DS_Store
5 | *.tgz
6 | my-app*
7 | template/src/__tests__/__snapshots__/
8 | lerna-debug.log
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | /.changelog
13 | .env
--------------------------------------------------------------------------------
/contracts/resolver/Resolver.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.11;
2 |
3 | /** @title Base resolver contract */
4 | contract Resolver {
5 | // https://github.com/ethereum/EIPs/issues/165
6 | function supportsInterface(bytes4 interfaceID) public constant returns (bool);
7 | }
--------------------------------------------------------------------------------
/contracts/resolver/URLResolver.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.11;
2 |
3 | import "./Resolver.sol";
4 |
5 | /** @title Resolver contract that specifies an API endpoint where product information can be retrieved */
6 | contract URLResolver is Resolver {
7 | function productURL(uint256 DIN) public constant returns (string baseURL, uint256 productId);
8 | }
--------------------------------------------------------------------------------
/contracts/resolver/ResolverFactory.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.11;
2 |
3 | import "./StandardResolver.sol";
4 |
5 | /** @title Resolver factory. Creates new resolver contracts */
6 | contract ResolverFactory {
7 | // Logged when a new resolver contract is created.
8 | event NewResolver(
9 | address indexed resolver,
10 | address indexed owner,
11 | string productURL
12 | );
13 |
14 | function createResolver(string productURL) public {
15 | StandardResolver resolver = new StandardResolver(msg.sender, productURL);
16 | NewResolver(resolver, msg.sender, productURL);
17 | }
18 | }
--------------------------------------------------------------------------------
/contracts/Migrations.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.4;
2 |
3 | contract Migrations {
4 | address public owner;
5 | uint public last_completed_migration;
6 |
7 | modifier restricted() {
8 | if (msg.sender == owner) _;
9 | }
10 |
11 | function Migrations() public {
12 | owner = msg.sender;
13 | }
14 |
15 | function setCompleted(uint completed) public restricted {
16 | last_completed_migration = completed;
17 | }
18 |
19 | function upgrade(address new_address) public restricted {
20 | Migrations upgraded = Migrations(new_address);
21 | upgraded.setCompleted(last_completed_migration);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Kiosk",
3 | "version": "0.0.1",
4 | "description": "Kiosk protocol contracts",
5 | "author": "Rich McAteer",
6 | "scripts": {
7 | "test": "rm -rf ./build/contracts && truffle test",
8 | "migrate": "rm -rf ./build/contracts && truffle migrate --reset"
9 | },
10 | "dependencies": {
11 | "babel-polyfill": "^6.26.0",
12 | "bignumber.js": "^4.1.0",
13 | "bluebird": "^3.5.0",
14 | "chai": "^4.1.2",
15 | "dotenv": "^4.0.0",
16 | "ethereumjs-util": "^5.1.2",
17 | "ethereumjs-wallet": "^0.6.0",
18 | "truffle-hdwallet-provider": "0.0.3",
19 | "web3": "^1.0.0-beta.26",
20 | "web3-provider-engine": "^13.3.4",
21 | "zeppelin-solidity": "^1.3.0"
22 | },
23 | "devDependencies": {
24 | "eth-lib": "^0.2.5",
25 | "ethers": "^2.1.3",
26 | "web3-eth-abi": "^1.0.0-beta.27",
27 | "web3-utils": "^1.0.0-beta.26"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/contracts/core/Orders.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.11;
2 |
3 | contract Orders {
4 | // The next order ID.
5 | uint256 public orderIndex = 0;
6 |
7 | // Log new orders
8 | event NewOrder(
9 | uint256 indexed orderID,
10 | address market,
11 | bytes32 nonceHash,
12 | uint256[] DINs,
13 | uint256[] quantities
14 | );
15 |
16 | function createOrder(
17 | bytes32 nonceHash,
18 | uint256[] DINs,
19 | uint256[] quantities
20 | )
21 | public
22 | returns (uint256 orderID)
23 | {
24 | require(DINs.length == quantities.length);
25 |
26 | // Increment the order index.
27 | orderIndex++;
28 |
29 | NewOrder(
30 | orderIndex,
31 | msg.sender,
32 | nonceHash,
33 | DINs,
34 | quantities
35 | );
36 |
37 | return orderIndex;
38 | }
39 | }
--------------------------------------------------------------------------------
/test/resolverfactory.js:
--------------------------------------------------------------------------------
1 | const ResolverFactory = artifacts.require("ResolverFactory.sol");
2 | const StandardResolver = artifacts.require("StandardResolver.sol");
3 | const chai = require("chai"),
4 | expect = chai.expect;
5 |
6 | contract("ResolverFactory", accounts => {
7 | let factory;
8 | const alice = accounts[0];
9 | const DIN = 1000000001;
10 | const baseURL = "https://api.examplestore.com/products/";
11 | const productURL = "https://api.examplestore.com/products/1000000001";
12 |
13 | before(async() => {
14 | factory = await ResolverFactory.deployed();
15 | });
16 |
17 | it("should create a resolver", async () => {
18 | const result = await factory.createResolver(baseURL);
19 | expect(result.logs[0].event).to.equal("NewResolver");
20 |
21 | const resolverAddr = result.logs[0].args.resolver;
22 | const resolver = StandardResolver.at(resolverAddr);
23 |
24 | const tuple = await resolver.productURL(DIN);
25 | const base = tuple[0];
26 | const product = tuple[1].toNumber();
27 | const url = base + product;
28 | expect(url).to.equal(productURL);
29 | });
30 | });
--------------------------------------------------------------------------------
/test/standardresolver.js:
--------------------------------------------------------------------------------
1 | const StandardResolver = artifacts.require("StandardResolver.sol");
2 | const DINRegistry = artifacts.require("DINRegistry.sol");
3 | const chai = require("chai"),
4 | expect = chai.expect;
5 |
6 | contract("StandardResolver", accounts => {
7 | let resolver;
8 | let registry;
9 | const alice = accounts[0]; // DIN owner and merchant
10 | const DIN = 1000000001;
11 | const baseURL = "https://api.examplestore.com/products/";
12 | const productURL = "https://api.examplestore.com/products/1000000001";
13 |
14 | before(async () => {
15 | resolver = await StandardResolver.deployed();
16 | registry = await DINRegistry.deployed();
17 | });
18 |
19 | it("should have the correct owner", async () => {
20 | const owner = await resolver.owner();
21 | expect(owner).to.equal(alice);
22 | });
23 |
24 | it("should have the correct product URL", async () => {
25 | const tuple = await resolver.productURL(DIN);
26 | const base = tuple[0];
27 | const product = tuple[1].toNumber();
28 | const url = base + product;
29 | expect(url).to.equal(productURL);
30 | });
31 |
32 | });
--------------------------------------------------------------------------------
/contracts/market/Market.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | import "../core/DINRegistry.sol";
4 | import "../core/Orders.sol";
5 |
6 | /** @title A market generates orders from DINs. */
7 | contract Market {
8 | DINRegistry public registry;
9 | Orders public orders;
10 |
11 | // Log Solidity errors
12 | event LogError(string error);
13 |
14 | /**
15 | * @dev Verify that an order signature is valid.
16 | * @param signer address of signer.
17 | * @param hash Signed Keccak-256 hash.
18 | * @param v ECDSA signature parameter v.
19 | * @param r ECDSA signature parameters r.
20 | * @param s ECDSA signature parameters s.
21 | * @return valid Validity of the order signature.
22 | */
23 | // Attribution: 0x - https://github.com/0xProject/contracts/blob/master/contracts/Exchange.sol#L447
24 | function isValidSignature(
25 | address signer,
26 | bytes32 hash,
27 | uint8 v,
28 | bytes32 r,
29 | bytes32 s
30 | )
31 | public
32 | pure
33 | returns (bool valid)
34 | {
35 | return signer == ecrecover(
36 | keccak256("\x19Ethereum Signed Message:\n32", hash),
37 | v,
38 | r,
39 | s
40 | );
41 | }
42 |
43 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Kiosk
2 |
3 | Kiosk is a decentralized e-commerce platform built on Ethereum.
4 |
5 | **For Merchants:**
6 | * Register a globally unique product identifier (DIN) for each of your products
7 | * Manage product information and pricing off-chain using your existing e-commerce backend
8 | * Sell products directly to buyers with no middlemen and no transaction fees
9 | * Create your own loyalty token to incentivize repeat purchases
10 |
11 | **For Buyers:**
12 | * Purchase products online with Ether and ERC20 loyalty tokens
13 | * Earn loyalty tokens from merchants
14 |
15 | **For Affiliates:**
16 | * Earn Market Tokens from merchants for successful referrals
17 |
18 | **For Developers:**
19 | * Earn Market Tokens for contributions to the core protocol
20 | * Build your own e-commerce client
21 |
22 | ## Testing
23 |
24 | Requirements:
25 | * Install [Node.js](https://nodejs.org/en/)
26 | * Install [Truffle](http://truffleframework.com/)
27 |
28 | Download the project and install its dependencies.
29 | ```
30 | git clone https://github.com/kioskprotocol/contracts.git
31 | npm install
32 | ```
33 |
34 | In a separate terminal tab, create an in-memory blockchain with Truffle.
35 | ```
36 | truffle develop
37 | ```
38 |
39 | Then, in the root directory of the project, run the tests with Truffle.
40 | ```
41 | truffle test
42 | ```
43 |
--------------------------------------------------------------------------------
/contracts/resolver/StandardResolver.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.11;
2 |
3 | import "./URLResolver.sol";
4 |
5 | /** @title A resolver contract that can be used for a single merchant with many products */
6 | contract StandardResolver is URLResolver {
7 | bytes4 constant INTERFACE_META_ID = 0x01ffc9a7; // bytes4(keccak256("supportsInterface(bytes4)"))
8 | bytes4 constant PRODUCT_URL_INTERFACE_ID = 0xaf655719; // bytes4(keccak256("productURL(uint256)"))
9 |
10 | string url;
11 | address public owner;
12 |
13 | modifier only_owner {
14 | require(owner == msg.sender);
15 | _;
16 | }
17 |
18 | function StandardResolver(address _owner, string _productURL) public {
19 | owner = _owner;
20 | url = _productURL;
21 | }
22 |
23 | function supportsInterface(bytes4 interfaceID) public constant returns (bool) {
24 | return interfaceID == INTERFACE_META_ID ||
25 | interfaceID == PRODUCT_URL_INTERFACE_ID;
26 | }
27 |
28 | function productURL(uint256 DIN) public constant returns (string baseURL, uint256 productId) {
29 | baseURL = url;
30 | productId = DIN;
31 | }
32 |
33 | function setProductURL(string _productURL) public only_owner {
34 | url = _productURL;
35 | }
36 |
37 |
38 | function setOwner(address _owner) public only_owner {
39 | owner = _owner;
40 | }
41 |
42 | }
--------------------------------------------------------------------------------
/migrations/2_deploy_contracts.js:
--------------------------------------------------------------------------------
1 | const DINRegistry = artifacts.require("DINRegistry.sol");
2 | const DINRegistryUtils = artifacts.require("DINRegistryUtils.sol");
3 | const StandardResolver = artifacts.require("StandardResolver.sol");
4 | const ResolverFactory = artifacts.require("ResolverFactory.sol");
5 | const Orders = artifacts.require("Orders.sol");
6 | const StandardMarket = artifacts.require("StandardMarket.sol");
7 | const genesis = 1000000000; // The first DIN.
8 | const initialSupply = 50000000 * Math.pow(10, 18); // 50 million tokens.
9 | const productURL = "https://api.examplestore.com/products/";
10 |
11 | module.exports = async (deployer, network, accounts) => {
12 | const merchant = accounts[0];
13 |
14 | // Deploy DINRegistry
15 | deployer.deploy(DINRegistry, genesis).then(async () => {
16 | // Deploy DINRegistryUtils
17 | await deployer.deploy(DINRegistryUtils, DINRegistry.address);
18 | // Deploy ResolverFactory
19 | await deployer.deploy(ResolverFactory);
20 | // Deploy a StandardResolver
21 | await deployer.deploy(
22 | StandardResolver,
23 | merchant,
24 | productURL,
25 | );
26 | // Deploy Orders
27 | await deployer.deploy(Orders);
28 | // Deploy Checkout
29 | await deployer.deploy(
30 | StandardMarket,
31 | DINRegistry.address,
32 | Orders.address
33 | );
34 | // Register 10 DINs and set their resolvers
35 | // await DINRegistry.at(DINRegistry.address).registerDINsWithResolver(merchant, StandardResolver.address, 10);
36 | });
37 | };
--------------------------------------------------------------------------------
/contracts/utils/DINRegistryUtils.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.11;
2 |
3 | import "../core/DINRegistry.sol";
4 |
5 | /** @title Convenience methods for DINRegistry */
6 | contract DINRegistryUtils {
7 |
8 | DINRegistry registry;
9 |
10 | // Constructor
11 | function DINRegistryUtils(DINRegistry _registry) public {
12 | registry = _registry;
13 | }
14 |
15 | /**
16 | * @dev Self-register multiple new DINs.
17 | * @param amount The amount of DINs to register.
18 | */
19 | function selfRegisterDINs(uint256 amount) public {
20 | registerDINs(msg.sender, amount);
21 | }
22 |
23 | /**
24 | * @dev Self-register multiple new DINs and set the resolver.
25 | * @param resolver The address of the resolver.
26 | * @param amount The amount of DINs to register.
27 | */
28 | function selfRegisterDINsWithResolver(address resolver, uint256 amount) public {
29 | registerDINsWithResolver(msg.sender, resolver, amount);
30 | }
31 |
32 | /**
33 | * @dev Register multiple new DINs.
34 | * @param owner The account that will own the DINs.
35 | * @param amount The amount of DINs to register.
36 | */
37 | function registerDINs(address owner, uint256 amount) public {
38 | for (uint i = 0; i < amount; i++) {
39 | registry.registerDIN(owner);
40 | }
41 | }
42 |
43 | /**
44 | * @dev Register multiple new DINs and set the resolver.
45 | * @param owner The account that will own the DINs.
46 | * @param resolver The address of the resolver.
47 | * @param amount The amount of DINs to register.
48 | */
49 | function registerDINsWithResolver(address owner, address resolver, uint256 amount) public {
50 | for (uint i = 0; i < amount; i++) {
51 | registry.registerDINWithResolver(owner, resolver);
52 | }
53 | }
54 |
55 | }
--------------------------------------------------------------------------------
/truffle.js:
--------------------------------------------------------------------------------
1 | var Wallet = require("ethereumjs-wallet");
2 | var ProviderEngine = require("web3-provider-engine");
3 | var FiltersSubprovider = require("web3-provider-engine/subproviders/filters.js");
4 | var WalletSubprovider = require("web3-provider-engine/subproviders/wallet.js");
5 | const FetchSubprovider = require("web3-provider-engine/subproviders/fetch.js");
6 | require("dotenv").config();
7 |
8 | var PRIVATE_KEY = process.env.PRIVATE_KEY;
9 | var INFURA_TOKEN = process.env.INFURA_ACCESS_TOKEN;
10 |
11 | function InfuraProvider(infuraURL) {
12 | var privateKeyBuffer = new Buffer(PRIVATE_KEY, "hex");
13 | this.wallet = new Wallet(privateKeyBuffer);
14 | this.address = "0x" + this.wallet.getAddress().toString("hex");
15 | this.engine = new ProviderEngine();
16 | this.engine.addProvider(new WalletSubprovider(this.wallet, {}));
17 | this.engine.addProvider(new FiltersSubprovider());
18 | this.engine.addProvider(new FetchSubprovider({ rpcUrl: infuraURL }));
19 | this.engine.start(); // Required by the provider engine.
20 | }
21 |
22 | InfuraProvider.prototype.sendAsync = function() {
23 | this.engine.sendAsync.apply(this.engine, arguments);
24 | };
25 |
26 | InfuraProvider.prototype.send = function() {
27 | return this.engine.send.apply(this.engine, arguments);
28 | };
29 |
30 | InfuraProvider.prototype.getAddress = function() {
31 | return this.address;
32 | };
33 |
34 | module.exports = {
35 | networks: {
36 | development: {
37 | host: "localhost",
38 | port: 9545, // Ganache
39 | network_id: "*" // Match any network id
40 | },
41 | ropsten: {
42 | provider: function() {
43 | return new InfuraProvider(
44 | "https://ropsten.infura.io/" + INFURA_TOKEN
45 | );
46 | },
47 | network_id: 3
48 | },
49 | rinkeby: {
50 | provider: function() {
51 | return new InfuraProvider(
52 | "https://rinkeby.infura.io/" + INFURA_TOKEN
53 | );
54 | },
55 | network_id: 4
56 | },
57 | kovan: {
58 | provider: function() {
59 | return new InfuraProvider(
60 | "https://kovan.infura.io/" + INFURA_TOKEN
61 | );
62 | },
63 | network_id: 42,
64 | gas: 4000000
65 | }
66 | }
67 | };
--------------------------------------------------------------------------------
/test/dinregistryutils.js:
--------------------------------------------------------------------------------
1 | const DINRegistryUtils = artifacts.require("DINRegistryUtils.sol");
2 | const DINRegistry = artifacts.require("DINRegistry.sol");
3 | const StandardResolver = artifacts.require("StandardResolver.sol");
4 | const chai = require("chai"),
5 | expect = chai.expect
6 | const ABI = require("web3-eth-abi");
7 |
8 | contract("DINRegistryUtils", accounts => {
9 | let utils;
10 | let registry;
11 | let resolver;
12 |
13 | let NO_ADDRESS = "0x0000000000000000000000000000000000000000"
14 |
15 | const alice = accounts[0];
16 | const bob = accounts[1];
17 |
18 | before(async () => {
19 | utils = await DINRegistryUtils.deployed();
20 | registry = await DINRegistry.deployed();
21 | resolver = await StandardResolver.deployed();
22 | });
23 |
24 | const testOwner = async (minDIN, maxDIN, expectedOwner) => {
25 | const minOwner = await registry.owner(minDIN);
26 | const maxOwner = await registry.owner(maxDIN);
27 | const noOwner = await registry.owner(maxDIN + 1);
28 | expect(minOwner).to.equal(expectedOwner);
29 | expect(maxOwner).to.equal(expectedOwner);
30 | expect(noOwner).to.equal(NO_ADDRESS);
31 | }
32 |
33 | const testResolver = async (minDIN, maxDIN, expectedResolver) => {
34 | const minResolver = await registry.resolver(minDIN);
35 | const maxResolver = await registry.resolver(maxDIN);
36 | const noResolver = await registry.resolver(maxDIN + 1);
37 | expect(minResolver).to.equal(expectedResolver);
38 | expect(maxResolver).to.equal(expectedResolver);
39 | expect(noResolver).to.equal(NO_ADDRESS);
40 | }
41 |
42 | it("should self-register multiple DINs", async () => {
43 | const amount = 10;
44 | const result = await utils.selfRegisterDINs(amount);
45 | const logs = result.receipt.logs;
46 | const topics = logs[0].topics;
47 |
48 | expect(topics[0]).to.equal(web3.sha3("NewRegistration(uint256,address)"));
49 | expect(logs.length).to.equal(amount);
50 |
51 | const minDIN = parseInt(ABI.decodeParameter("uint256", topics[1]), 10);
52 | const maxDIN = minDIN + amount - 1;
53 |
54 | await testOwner(minDIN, maxDIN, alice);
55 | });
56 |
57 | it("should self-register multiple DINs with a resolver", async () => {
58 | const amount = 10;
59 | const result = await utils.selfRegisterDINsWithResolver(resolver.address, amount);
60 | const logs = result.receipt.logs;
61 | const topics = logs[0].topics;
62 |
63 | const minDIN = parseInt(ABI.decodeParameter("uint256", topics[1]), 10);
64 | const maxDIN = minDIN + amount - 1;
65 |
66 | await testOwner(minDIN, maxDIN, alice);
67 | await testResolver(minDIN, maxDIN, resolver.address);
68 | });
69 |
70 | it("should register multiple DINs", async () => {
71 | const amount = 10;
72 | const result = await utils.registerDINs(bob, amount);
73 | const logs = result.receipt.logs;
74 | const topics = logs[0].topics;
75 |
76 | expect(topics[0]).to.equal(web3.sha3("NewRegistration(uint256,address)"));
77 | expect(logs.length).to.equal(amount);
78 |
79 | const minDIN = parseInt(ABI.decodeParameter("uint256", topics[1]), 10);
80 | const maxDIN = minDIN + amount - 1;
81 |
82 | await testOwner(minDIN, maxDIN, bob);
83 | });
84 |
85 | it("should register multiple DINs with a resolver", async () => {
86 | const amount = 10;
87 | const result = await utils.registerDINsWithResolver(bob, resolver.address, amount);
88 | const logs = result.receipt.logs;
89 | const topics = logs[0].topics;
90 |
91 | const minDIN = parseInt(ABI.decodeParameter("uint256", topics[1]), 10);
92 | const maxDIN = minDIN + amount - 1;
93 |
94 | await testOwner(minDIN, maxDIN, bob);
95 | await testResolver(minDIN, maxDIN, resolver.address);
96 | });
97 |
98 | });
--------------------------------------------------------------------------------
/test/dinregistry.js:
--------------------------------------------------------------------------------
1 | const DINRegistry = artifacts.require("DINRegistry.sol");
2 | const StandardResolver = artifacts.require("StandardResolver.sol");
3 | const chai = require("chai"),
4 | expect = chai.expect
5 |
6 | contract("DINRegistry", accounts => {
7 | let registry;
8 | let resolver;
9 | const DIN = 1000000001;
10 | const alice = accounts[0];
11 | const bob = accounts[1];
12 |
13 | before(async () => {
14 | registry = await DINRegistry.deployed();
15 | resolver = await StandardResolver.deployed();
16 | });
17 |
18 | it("should have the correct genesis DIN", async () => {
19 | const genesis = await registry.genesis();
20 | expect(genesis.toNumber()).to.equal(1000000000);
21 | });
22 |
23 | it("should self-register a new DIN", async () => {
24 | const result = await registry.selfRegisterDIN({ from: alice });
25 | expect(result.logs[0].event).to.equal("NewRegistration");
26 | });
27 |
28 | it("should register a new DIN", async () => {
29 | const result = await registry.registerDIN(bob, { from: alice });
30 | expect(result.logs[0].event).to.equal("NewRegistration");
31 | });
32 |
33 | it("should self-register a new DIN with a resolver", async () => {
34 | const result = await registry.selfRegisterDINWithResolver(
35 | resolver.address,
36 | { from: alice }
37 | );
38 | expect(result.logs[0].event).to.equal("NewRegistration");
39 | expect(result.logs[1].event).to.equal("NewResolver");
40 | });
41 |
42 | it("should register a new DIN with a resolver", async () => {
43 | const result = await registry.registerDINWithResolver(
44 | bob,
45 | resolver.address,
46 | { from: alice }
47 | );
48 | expect(result.logs[0].event).to.equal("NewRegistration");
49 | expect(result.logs[1].event).to.equal("NewResolver");
50 | });
51 |
52 | it("should have the correct owner of a DIN", async () => {
53 | const owner = await registry.owner(DIN);
54 | expect(owner).to.equal(alice);
55 | });
56 |
57 | it("should only let the owner of a DIN set the resolver", async () => {
58 | try {
59 | const result = await registry.setResolver(
60 | DIN,
61 | "0x0000000000000000000000000000000000000000",
62 | { from: bob }
63 | );
64 | expect(result).to.be.null;
65 | } catch (error) {
66 | expect(error.message).to.include("VM Exception");
67 | }
68 |
69 | const result = await registry.setResolver(DIN, resolver.address);
70 | expect(result.logs[0].event).to.equal("NewResolver");
71 | });
72 |
73 | it("should have the correct resolver of a DIN", async () => {
74 | const resolverAddr = await registry.resolver(DIN);
75 | expect(resolverAddr).to.equal(resolver.address);
76 | });
77 |
78 | it("should only let the owner transfer ownership of a DIN", async () => {
79 | try {
80 | const result = await registry.setOwner(DIN, bob, { from: bob });
81 | expect(result).to.be.null;
82 | } catch (error) {
83 | expect(error.message).to.include("VM Exception");
84 | }
85 |
86 | const result = await registry.setOwner(DIN, bob, { from: alice });
87 | expect(result.logs[0].event).to.equal("NewOwner");
88 | const owner = await registry.owner(DIN);
89 | expect(owner).to.equal(bob);
90 | });
91 |
92 | it("should have an updated time for a DIN", async () => {
93 | const updated = await registry.updated(DIN);
94 | expect(updated.toNumber()).to.be.above(0);
95 | });
96 |
97 | it("should change the updated time when a record changes", async () => {
98 | const updated = await registry.updated(DIN);
99 | const owner = await registry.owner(DIN);
100 |
101 | const time = 10000
102 |
103 | // Simulate time passing
104 | web3.currentProvider.send({
105 | jsonrpc: "2.0",
106 | method: "evm_increaseTime",
107 | params: [time],
108 | id: 0
109 | });
110 |
111 | // Alice previously transferred ownership to Bob. Transfer it back here.
112 | await registry.setOwner(DIN, alice, { from: bob });
113 | const newUpdated = await registry.updated(DIN);
114 | expect(newUpdated.toNumber()).to.equal(updated.toNumber() + time);
115 | });
116 |
117 | });
--------------------------------------------------------------------------------
/contracts/core/DINRegistry.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | /** @title Decentralized Identification Number (DIN) registry. */
4 | contract DINRegistry {
5 |
6 | struct Record {
7 | address owner;
8 | address resolver; // Address of the resolver contract, which can be used to find product information.
9 | uint256 updated; // Last updated time (Unix timestamp).
10 | }
11 |
12 | // DIN => Record
13 | mapping (uint256 => Record) records;
14 |
15 | // The first DIN registered.
16 | uint256 public genesis;
17 |
18 | // The current DIN.
19 | uint256 public index;
20 |
21 | modifier only_owner(uint256 DIN) {
22 | require(records[DIN].owner == msg.sender);
23 | _;
24 | }
25 |
26 | // Log transfers of ownership.
27 | event NewOwner(uint256 indexed DIN, address indexed owner);
28 |
29 | // Log when new resolvers are set.
30 | event NewResolver(uint256 indexed DIN, address indexed resolver);
31 |
32 | // Log new registrations.
33 | event NewRegistration(uint256 indexed DIN, address indexed owner);
34 |
35 | /** @dev Constructor.
36 | * @param _genesis The first DIN registered.
37 | */
38 | function DINRegistry(uint256 _genesis) public {
39 | genesis = _genesis;
40 | index = _genesis;
41 |
42 | // Register the genesis DIN to the account that deploys this contract.
43 | records[_genesis].owner = msg.sender;
44 | records[_genesis].updated = block.timestamp;
45 | NewRegistration(_genesis, msg.sender);
46 | }
47 |
48 | /**
49 | * @dev Get the owner of a specific DIN.
50 | */
51 | function owner(uint256 _DIN) public view returns (address) {
52 | return records[_DIN].owner;
53 | }
54 |
55 | /**
56 | * @dev Transfer ownership of a DIN.
57 | * @param _DIN The DIN to transfer.
58 | * @param _owner Address of the new owner.
59 | */
60 | function setOwner(uint256 _DIN, address _owner) public only_owner(_DIN) {
61 | records[_DIN].owner = _owner;
62 | records[_DIN].updated = block.timestamp;
63 | NewOwner(_DIN, _owner);
64 | }
65 |
66 | /**
67 | * @dev Get the address of the resolver contract for a specific DIN.
68 | */
69 | function resolver(uint256 _DIN) public view returns (address) {
70 | return records[_DIN].resolver;
71 | }
72 |
73 | /**
74 | * @dev Set the resolver of a DIN.
75 | * @param _DIN The DIN to update.
76 | * @param _resolver Address of the resolver.
77 | */
78 | function setResolver(uint256 _DIN, address _resolver) public only_owner(_DIN) {
79 | records[_DIN].resolver = _resolver;
80 | records[_DIN].updated = block.timestamp;
81 | NewResolver(_DIN, _resolver);
82 | }
83 |
84 | /**
85 | * @dev Get the last time a DIN was updated with a new owner or resolver.
86 | * @param _DIN The DIN to query.
87 | * @return _timestamp Last updated time (Unix timestamp).
88 | */
89 | function updated(uint256 _DIN) public view returns (uint256 _timestamp) {
90 | return records[_DIN].updated;
91 | }
92 |
93 | /**
94 | * @dev Self-register a new DIN.
95 | * @return _DIN The DIN that is registered.
96 | */
97 | function selfRegisterDIN() public returns (uint256 _DIN) {
98 | return registerDIN(msg.sender);
99 | }
100 |
101 | /**
102 | * @dev Self-register a new DIN and set the resolver.
103 | * @param _resolver Address of the resolver.
104 | * @return _DIN The DIN that is registered.
105 | */
106 | function selfRegisterDINWithResolver(address _resolver) public returns (uint256 _DIN) {
107 | return registerDINWithResolver(msg.sender, _resolver);
108 | }
109 |
110 | /**
111 | * @dev Register a new DIN for a specific address.
112 | * @param _owner Account that will own the DIN.
113 | * @return _DIN The DIN that is registered.
114 | */
115 | function registerDIN(address _owner) public returns (uint256 _DIN) {
116 | index++;
117 | records[index].owner = _owner;
118 | records[index].updated = block.timestamp;
119 | NewRegistration(index, _owner);
120 | return index;
121 | }
122 |
123 | /**
124 | * @dev Register a new DIN and set the resolver.
125 | * @param _owner Account that will own the DIN.
126 | * @param _resolver Address of the resolver.
127 | * @return _DIN The DIN that is registered.
128 | */
129 | function registerDINWithResolver(address _owner, address _resolver) public returns (uint256 _DIN) {
130 | index++;
131 | records[index].owner = _owner;
132 | records[index].resolver = _resolver;
133 | records[index].updated = block.timestamp;
134 | NewRegistration(index, _owner);
135 | NewResolver(index, _resolver);
136 | return index;
137 | }
138 |
139 | }
--------------------------------------------------------------------------------
/contracts/market/StandardMarket.sol:
--------------------------------------------------------------------------------
1 | pragma solidity ^0.4.17;
2 |
3 | import "../core/DINRegistry.sol";
4 | import "../core/Orders.sol";
5 | import "./Market.sol";
6 |
7 | /** @title Buy products with Ether. */
8 | contract StandardMarket is Market {
9 | struct Order {
10 | uint256 DIN;
11 | uint256 quantity;
12 | uint256 totalPrice;
13 | uint256 priceValidUntil;
14 | address merchant;
15 | address owner;
16 | }
17 |
18 | /** @dev Constructor.
19 | * @param _registry The DIN Registry contract address.
20 | * @param _orders The Orders contract address.
21 | */
22 | function StandardMarket(DINRegistry _registry, Orders _orders) public {
23 | registry = _registry;
24 | orders = _orders;
25 | }
26 |
27 | /** @dev Buy a product.
28 | * param orderValues:
29 | [0] DIN The Decentralized Identification Number (DIN) of the product to buy.
30 | [1] quantity The quantity to buy.
31 | [2] totalPrice Total price of the purchase, in wei.
32 | [3] priceValidUntil Expiration time (Unix timestamp).
33 | * param orderAddresses:
34 | [0] merchant The merchant address.
35 | * @param nonceHash The hash of a nonce generated by a client. The nonce can be used as a proof of purchase.
36 | * @param v ECDSA signature parameter v.
37 | * @param r ECDSA signature parameter r.
38 | * @param s ECDSA signature parameter s.
39 | * @return orderID A unique ID for the order.
40 | */
41 | function buyProduct(
42 | uint256[4] orderValues,
43 | address[1] orderAddresses,
44 | bytes32 nonceHash,
45 | uint8 v,
46 | bytes32 r,
47 | bytes32 s
48 | )
49 | payable
50 | public
51 | returns (uint256 orderID)
52 | {
53 | if (buy(orderValues, orderAddresses, v, r, s) == true) {
54 | // http://solidity.readthedocs.io/en/develop/types.html#array-literals-inline-arrays
55 | uint256[] memory DINs = new uint256[](1);
56 | uint256[] memory quantities = new uint256[](1);
57 | DINs[0] = orderValues[0];
58 | quantities[0] = orderValues[1];
59 |
60 | // Create a new order and return the order ID
61 | return orders.createOrder(nonceHash, DINs, quantities);
62 | } else {
63 | // Return Ether to buyer.
64 | msg.sender.transfer(msg.value);
65 | return 0;
66 | }
67 | }
68 |
69 | /** @dev Buy multiple products.
70 | * @param orderValues Array of individual order values
71 | * @param orderAddresses Array of merchant addresses.
72 | * @param nonceHash The hash of a nonce generated by a client. The nonce can be used as a proof of purchase.
73 | * @param v Array of ECDSA signature parameter v.
74 | * @param r Array of ECDSA signature parameter r.
75 | * @param s Array of ECDSA signature parameter s.
76 | * @return orderID A unique ID for the order.
77 | */
78 | function buyProducts(
79 | uint256[4][] orderValues,
80 | address[1][] orderAddresses,
81 | bytes32 nonceHash,
82 | uint8[] v,
83 | bytes32[] r,
84 | bytes32[] s
85 | )
86 | payable
87 | public
88 | returns (uint256 orderID)
89 | {
90 | uint256[] memory DINs = new uint256[](orderValues.length);
91 | uint256[] memory quantities = new uint256[](orderValues.length);
92 |
93 | for (uint i = 0; i < orderValues.length; i++) {
94 | // Throw if any of the buy transactions fail.
95 | assert(buy(
96 | orderValues[i],
97 | orderAddresses[i],
98 | v[i],
99 | r[i],
100 | s[i]
101 | ));
102 | DINs[i] = orderValues[i][0];
103 | quantities[i] = orderValues[i][1];
104 | }
105 |
106 | // Create a new order and return the order ID
107 | return orders.createOrder(nonceHash, DINs, quantities);
108 | }
109 |
110 | // Private helper method to buy a product.
111 | function buy(
112 | uint256[4] orderValues,
113 | address[1] orderAddresses,
114 | uint8 v,
115 | bytes32 r,
116 | bytes32 s
117 | )
118 | private
119 | returns (bool)
120 | {
121 | address merchant = orderAddresses[0];
122 |
123 | Order memory order = Order({
124 | DIN: orderValues[0],
125 | quantity: orderValues[1],
126 | totalPrice: orderValues[2],
127 | priceValidUntil: orderValues[3],
128 | merchant: merchant,
129 | owner: registry.owner(orderValues[0]) // Get the DIN owner address from the DIN registry.
130 | });
131 |
132 | if (isValidOrder(order, v, r, s) == false) {
133 | return false;
134 | }
135 |
136 | // Transfer Ether to the merchant.
137 | merchant.transfer(orderValues[2]);
138 | return true;
139 | }
140 |
141 | /**
142 | * @dev Verify that an order is valid.
143 | * @return valid Validity of the order.
144 | */
145 | function isValidOrder(
146 | Order order,
147 | uint8 v,
148 | bytes32 r,
149 | bytes32 s
150 | )
151 | internal
152 | returns (bool)
153 | {
154 | if (block.timestamp > order.priceValidUntil) {
155 | LogError("Offer expired");
156 | return false;
157 | }
158 |
159 | if (order.merchant == address(0x0)) {
160 | LogError("Invalid merchant");
161 | return false;
162 | }
163 |
164 | if (order.totalPrice > msg.value) {
165 | LogError("Value too low");
166 | return false;
167 | }
168 |
169 | uint256 unitPrice = order.totalPrice / order.quantity;
170 |
171 | // Calculate the hash of the parameters provided by the buyer.
172 | bytes32 hash = keccak256(
173 | this,
174 | order.DIN,
175 | unitPrice,
176 | order.priceValidUntil,
177 | order.merchant
178 | );
179 |
180 | // Verify that the DIN owner has signed the provided inputs.
181 | if (isValidSignature(order.owner, hash, v, r, s) == false) {
182 | LogError("Invalid signature");
183 | return false;
184 | }
185 |
186 | return true;
187 | }
188 |
189 | }
--------------------------------------------------------------------------------
/test/standardmarket.js:
--------------------------------------------------------------------------------
1 | const StandardMarket = artifacts.require("StandardMarket.sol");
2 | const DINRegistry = artifacts.require("DINRegistry.sol");
3 | const DINRegistryUtils = artifacts.require("DINRegistryUtils.sol");
4 | const Orders = artifacts.require("Orders.sol");
5 | const chai = require("chai"),
6 | expect = chai.expect,
7 | should = chai.should();
8 | const Account = require("eth-lib/lib/account");
9 | const Utils = require("web3-utils");
10 | const ABI = require("web3-eth-abi");
11 |
12 | contract("StandardMarket", accounts => {
13 | let market;
14 | let registry;
15 | let orders;
16 |
17 | const MERCHANT = accounts[0];
18 | const BUYER = accounts[1];
19 |
20 | const NO_ADDRESS = "0x0000000000000000000000000000000000000000";
21 |
22 | // The merchant needs to sign off-chain inputs (price, priceValidUntil, etc.)
23 | const MERCHANT_PRIVATE_KEY =
24 | "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3";
25 |
26 | let DIN1;
27 | let DIN2;
28 |
29 | const UNIT_PRICE = web3.toWei(1, "ether");
30 | const LOW_UNIT_PRICE = web3.toWei(0.03, "ether");
31 |
32 | const EXPIRED_DATE = 1483228800; // 1/1/2017
33 | const FUTURE_DATE = 1577836800; // 1/1/2020
34 |
35 | const NONCE = "123";
36 | const NONCE_HASH = web3.sha3(NONCE);
37 |
38 | // Errors
39 | const ERROR_OFFER_EXPIRED = "Offer expired";
40 | const ERROR_INVALID_MERCHANT = "Invalid merchant";
41 | const ERROR_VALUE_TOO_LOW = "Value too low";
42 | const ERROR_INVALID_SIGNATURE = "Invalid signature";
43 |
44 | before(async () => {
45 | market = await StandardMarket.deployed();
46 | registry = await DINRegistry.deployed();
47 | orders = await Orders.deployed();
48 |
49 | const registryUtils = await DINRegistryUtils.deployed();
50 |
51 | // Register 2 new DINs to the merchant
52 | const result = await registryUtils.selfRegisterDINs(2);
53 | const logs = result.receipt.logs;
54 |
55 | DIN1 = parseInt(ABI.decodeParameter("uint256", logs[0].topics[1]), 10);
56 | DIN2 = parseInt(ABI.decodeParameter("uint256", logs[1].topics[1]), 10);
57 | });
58 |
59 | const sign = (product, privateKey) => {
60 | const hash = solidityHash(product);
61 | const prefix = "\x19Ethereum Signed Message:\n32";
62 | const messageHash = Utils.soliditySha3(prefix, hash);
63 | const signature = Account.sign(messageHash, privateKey);
64 | const vrs = Account.decodeSignature(signature);
65 | const v = vrs[0];
66 | return {
67 | v: Utils.toDecimal(v),
68 | r: vrs[1],
69 | s: vrs[2]
70 | };
71 | };
72 |
73 | const solidityHash = product => {
74 | return Utils.soliditySha3(
75 | { type: "address", value: product.market },
76 | { type: "uint256", value: product.DIN },
77 | { type: "uint256", value: product.unitPrice },
78 | { type: "uint256", value: product.priceValidUntil },
79 | { type: "address", value: product.merchant }
80 | );
81 | };
82 |
83 | const orderValues = (product, quantity) => {
84 | return [
85 | product.DIN,
86 | quantity,
87 | quantity * product.unitPrice,
88 | product.priceValidUntil
89 | ];
90 | };
91 |
92 | const orderAddresses = product => {
93 | return [product.merchant];
94 | };
95 |
96 | const buyProduct = async (product, quantity) => {
97 | const qty = quantity ? quantity : 1;
98 | const values = orderValues(product, qty);
99 | const addresses = orderAddresses(product);
100 | const signature = sign(product, MERCHANT_PRIVATE_KEY);
101 | const result = await market.buyProduct(
102 | values,
103 | addresses,
104 | NONCE_HASH,
105 | signature.v,
106 | signature.r,
107 | signature.s,
108 | {
109 | from: BUYER,
110 | value: product.unitPrice * qty
111 | }
112 | );
113 | return result;
114 | };
115 |
116 | const buyProducts = async (products, quantities) => {
117 | let valuesArray = [];
118 | let addressesArray = [];
119 | let vArray = [];
120 | let rArray = [];
121 | let sArray = [];
122 | let totalPrice = 0;
123 | for (let i = 0; i < products.length; i++) {
124 | const values = orderValues(products[i], quantities[i]);
125 | valuesArray.push(values);
126 | const addresses = orderAddresses(products[i]);
127 | addressesArray.push(addresses);
128 | const signature = sign(products[i], MERCHANT_PRIVATE_KEY);
129 | vArray.push(signature.v);
130 | rArray.push(signature.r);
131 | sArray.push(signature.s);
132 | totalPrice += products[i].unitPrice * quantities[i];
133 | }
134 | const result = await market.buyProducts(
135 | valuesArray,
136 | addressesArray,
137 | NONCE_HASH,
138 | vArray,
139 | rArray,
140 | sArray,
141 | {
142 | from: BUYER,
143 | value: totalPrice
144 | }
145 | );
146 | return result;
147 | };
148 |
149 | const decodeOrderResult = result => {
150 | // Exclude the indexed parameter "orderID"
151 | return ABI.decodeParameters(
152 | [
153 | { type: "address", name: "market" },
154 | { type: "bytes32", name: "nonceHash" },
155 | { type: "uint256[]", name: "DINs" },
156 | { type: "uint256[]", name: "quantities" }
157 | ],
158 | result.receipt.logs[0].data
159 | );
160 | };
161 |
162 | it("should have the correct registry address", async () => {
163 | const registryAddr = await market.registry();
164 | expect(registryAddr).to.equal(registry.address);
165 | });
166 |
167 | it("should have the correct orders address", async () => {
168 | const ordersAddr = await market.orders();
169 | expect(ordersAddr).to.equal(orders.address);
170 | });
171 |
172 | it("should validate a signature", async () => {
173 | const product = {
174 | market: market.address,
175 | DIN: DIN1,
176 | unitPrice: UNIT_PRICE,
177 | priceValidUntil: FUTURE_DATE,
178 | merchant: MERCHANT
179 | };
180 | const hash = solidityHash(product);
181 | const signature = sign(product, MERCHANT_PRIVATE_KEY);
182 | const valid = await market.isValidSignature(
183 | MERCHANT,
184 | hash,
185 | signature.v,
186 | signature.r,
187 | signature.s
188 | );
189 | expect(valid).to.equal(true);
190 | });
191 |
192 | it("should log an error if priceValidUntil has expired", async () => {
193 | const product = {
194 | market: market.address,
195 | DIN: DIN1,
196 | unitPrice: UNIT_PRICE,
197 | priceValidUntil: EXPIRED_DATE,
198 | merchant: MERCHANT
199 | };
200 | const result = await buyProduct(product);
201 | expect(result.logs[0].args.error).to.equal(ERROR_OFFER_EXPIRED);
202 | });
203 |
204 | it("should log an error if the merchant is null", async () => {
205 | const product = {
206 | market: market.address,
207 | DIN: DIN1,
208 | unitPrice: UNIT_PRICE,
209 | priceValidUntil: FUTURE_DATE,
210 | merchant: NO_ADDRESS
211 | };
212 | const result = await buyProduct(product);
213 | expect(result.logs[0].args.error).to.equal(ERROR_INVALID_MERCHANT);
214 | });
215 |
216 | it("should log an error if the value is too low", async () => {
217 | const product = {
218 | market: market.address,
219 | DIN: DIN1,
220 | unitPrice: UNIT_PRICE,
221 | priceValidUntil: FUTURE_DATE,
222 | merchant: MERCHANT
223 | };
224 | const values = orderValues(product, 1);
225 | const addresses = orderAddresses(product);
226 | const signature = sign(product, MERCHANT_PRIVATE_KEY);
227 | const result = await market.buyProduct(
228 | values,
229 | addresses,
230 | NONCE_HASH,
231 | signature.v,
232 | signature.r,
233 | signature.s,
234 | {
235 | from: BUYER,
236 | value: 0
237 | }
238 | );
239 | expect(result.logs[0].args.error).to.equal(ERROR_VALUE_TOO_LOW);
240 | });
241 |
242 | it("should buy a product", async () => {
243 | const product = {
244 | market: market.address,
245 | DIN: DIN1,
246 | unitPrice: UNIT_PRICE,
247 | priceValidUntil: FUTURE_DATE,
248 | merchant: MERCHANT
249 | };
250 | const result = await buyProduct(product);
251 | expect(result.receipt.logs[0].topics[0]).to.equal(
252 | web3.sha3("NewOrder(uint256,address,bytes32,uint256[],uint256[])")
253 | );
254 | });
255 |
256 | it("should buy a given quantity of a product", async () => {
257 | const quantity = 5;
258 | const product = {
259 | market: market.address,
260 | DIN: DIN1,
261 | unitPrice: UNIT_PRICE,
262 | priceValidUntil: FUTURE_DATE,
263 | merchant: MERCHANT
264 | };
265 | const result = await buyProduct(product, 5);
266 | expect(result.receipt.logs[0].topics[0]).to.equal(
267 | web3.sha3("NewOrder(uint256,address,bytes32,uint256[],uint256[])")
268 | );
269 | const order = decodeOrderResult(result);
270 | expect(parseInt(order.DINs[0], 10)).to.equal(DIN1);
271 | expect(parseInt(order.quantities[0], 10)).to.equal(quantity);
272 | });
273 |
274 | it("should buy multiple products in a single order", async () => {
275 | const product1 = {
276 | market: market.address,
277 | DIN: DIN1,
278 | unitPrice: UNIT_PRICE,
279 | priceValidUntil: FUTURE_DATE,
280 | merchant: MERCHANT
281 | };
282 | const product2 = {
283 | market: market.address,
284 | DIN: DIN2,
285 | unitPrice: LOW_UNIT_PRICE,
286 | priceValidUntil: FUTURE_DATE,
287 | merchant: MERCHANT
288 | };
289 | const result = await buyProducts([product1, product2], [1, 3]);
290 | const order = decodeOrderResult(result);
291 | expect(parseInt(order.DINs[0], 10)).to.equal(DIN1);
292 | expect(parseInt(order.DINs[1], 10)).to.equal(DIN2);
293 | expect(parseInt(order.quantities[0], 10)).to.equal(1);
294 | expect(parseInt(order.quantities[1], 10)).to.equal(3);
295 | });
296 | });
--------------------------------------------------------------------------------
/test/checkout.js:
--------------------------------------------------------------------------------
1 | // const Checkout = artifacts.require("Checkout.sol");
2 | // const DINRegistry = artifacts.require("DINRegistry.sol");
3 | // const DINRegistrar = artifacts.require("DINRegistrar.sol");
4 | // const Orders = artifacts.require("Orders.sol");
5 | // const Rewards = artifacts.require("Rewards.sol");
6 | // const MarketToken = artifacts.require("MarketToken.sol");
7 | // const LoyaltyToken = artifacts.require("LoyaltyToken");
8 | // const LoyaltyTokenRegistry = artifacts.require("LoyaltyTokenRegistry.sol");
9 | // const StandardResolver = artifacts.require("StandardResolver.sol");
10 | // const Promise = require("bluebird");
11 | // const chai = require("chai"),
12 | // expect = chai.expect,
13 | // should = chai.should();
14 | // const utils = require("web3-utils");
15 |
16 | // contract("Checkout", accounts => {
17 | // const IS_DEBUG = false; // Set to true for additional logging
18 |
19 | // // Contracts
20 | // let checkout;
21 | // let registry;
22 | // let registrar;
23 | // let orders;
24 | // let rewards;
25 | // let resolver;
26 | // let loyaltyToken;
27 | // let loyaltyTokenRegistry;
28 |
29 | // // Accounts
30 | // const MERCHANT = accounts[0];
31 | // const BUYER = accounts[1];
32 | // const AFFILIATE = accounts[2];
33 |
34 | // // Errors
35 | // const ERROR_OFFER_EXPIRED = "Offer expired";
36 | // const ERROR_INVALID_PRICE = "Invalid price";
37 | // const ERROR_INVALID_RESOLVER = "Invalid resolver";
38 | // const ERROR_INVALID_MERCHANT = "Invalid merchant";
39 | // const ERROR_INVALID_SIGNATURE = "Invalid signature";
40 | // const ERROR_INVALID_AFFILIATE = "Invalid affiliate";
41 |
42 | // // Tokens
43 | // const NO_LOYALTY_TOKEN = "0x0000000000000000000000000000000000000000";
44 | // let LOYALTY_TOKEN;
45 |
46 | // // Addresses
47 | // const NO_AFFILIATE = "0x0000000000000000000000000000000000000000";
48 | // const NO_MERCHANT = "0x0000000000000000000000000000000000000000";
49 |
50 | // // DINs
51 | // const DIN = 1000000011;
52 |
53 | // // Price valid until
54 | // const FUTURE_DATE = 1577836800; // 1/1/2020
55 | // const EXPIRED_DATE = 1483228800; // 1/1/2017
56 |
57 | // // Price
58 | // const PRICE = 5 * Math.pow(10, 17); // 0.5 ETH
59 | // const PRICE_TOO_HIGH = 500 * Math.pow(10, 18); // 5,000 ETH
60 |
61 | // // Affiliate Reward
62 | // const AFFILIATE_REWARD = 1 * Math.pow(10, 18); // 1 MARK
63 | // const NO_AFFILIATE_REWARD = 0;
64 |
65 | // // Loyalty Reward
66 | // const NO_LOYALTY_REWARD = 0;
67 | // const LOYALTY_REWARD = 1 * Math.pow(10, 16); // 0.01 LOYALTY (Loyalty token) = 2% Loyalty on 0.5 ETH price
68 |
69 | // // Quantity
70 | // const QUANTITY_ONE = 1;
71 | // const QUANTITY_MANY = 17;
72 |
73 | // // Constants
74 | // // NOTE: Setting a positive gas price will cause a couple of the tests to be off by a very small margin of error.
75 | // const GAS_PRICE = web3.toWei(0, "gwei");
76 | // const NONCE_HASH = utils.sha3("TEST");
77 |
78 | // // Valid order parameters
79 | // const ORDER_VALUES = [
80 | // DIN,
81 | // QUANTITY_ONE,
82 | // PRICE,
83 | // FUTURE_DATE,
84 | // NO_AFFILIATE_REWARD,
85 | // NO_LOYALTY_REWARD
86 | // ];
87 | // const ORDER_ADDRESSES = [MERCHANT, NO_AFFILIATE, NO_LOYALTY_TOKEN];
88 |
89 | // const getLoyaltyTokenAddress = async () => {
90 | // const event = loyaltyTokenRegistry.NewToken(
91 | // {},
92 | // { fromBlock: 0, toBlock: "latest" }
93 | // );
94 | // const eventAsync = Promise.promisifyAll(event);
95 | // const results = await eventAsync.getAsync();
96 | // return results[0]["args"]["token"];
97 | // };
98 |
99 | // const getHash = values => {
100 | // if (IS_DEBUG === true) {
101 | // console.log("VALUES: " + values);
102 | // }
103 | // // http://web3js.readthedocs.io/en/1.0/web3-utils.html#soliditysha3
104 | // const hash = utils.soliditySha3(...values);
105 | // return hash;
106 | // };
107 |
108 | // const getSignature = (values, account = MERCHANT) => {
109 | // const hash = getHash(values);
110 | // if (IS_DEBUG === true) {
111 | // console.log("HASH: " + hash);
112 | // }
113 |
114 | // const signedMessage = web3.eth.sign(account, hash);
115 |
116 | // // https://ethereum.stackexchange.com/questions/1777/workflow-on-signing-a-string-with-private-key-followed-by-signature-verificatio/1794#1794
117 | // const v = "0x" + signedMessage.slice(130, 132);
118 | // const r = signedMessage.slice(0, 66);
119 | // const s = "0x" + signedMessage.slice(66, 130);
120 |
121 | // const signature = {
122 | // v: web3.toDecimal(v) + 27,
123 | // r: r,
124 | // s: s
125 | // };
126 |
127 | // if (IS_DEBUG === true) {
128 | // console.log("SIGNATURE: " + signature);
129 | // }
130 |
131 | // return signature;
132 | // };
133 |
134 | // const getBuyResult = async (
135 | // values,
136 | // addresses,
137 | // owner = MERCHANT,
138 | // buyer = BUYER
139 | // ) => {
140 | // const hashValues = [
141 | // values[0], // DIN
142 | // values[2], // price
143 | // values[3], // priceValidUntil
144 | // addresses[0], // merchant
145 | // values[4], // affiliateReward
146 | // values[5], // loyaltyReward
147 | // addresses[2] // loyaltyToken
148 | // ];
149 | // const signature = getSignature(hashValues, owner);
150 |
151 | // const result = await checkout.buy(
152 | // values,
153 | // addresses,
154 | // NONCE_HASH,
155 | // signature.v,
156 | // signature.r,
157 | // signature.s,
158 | // {
159 | // from: buyer,
160 | // value: values[2],
161 | // gasPrice: GAS_PRICE
162 | // }
163 | // );
164 |
165 | // return result;
166 | // };
167 |
168 | // before(async () => {
169 | // checkout = await Checkout.deployed();
170 | // registry = await DINRegistry.deployed();
171 | // registrar = await DINRegistrar.deployed();
172 | // orders = await Orders.deployed();
173 | // rewards = await Rewards.deployed();
174 | // marketToken = await MarketToken.deployed();
175 | // loyaltyTokenRegistry = await LoyaltyTokenRegistry.deployed();
176 | // resolver = await StandardResolver.deployed();
177 |
178 | // LOYALTY_TOKEN = await getLoyaltyTokenAddress();
179 |
180 | // loyaltyToken = LoyaltyToken.at(LOYALTY_TOKEN);
181 |
182 | // // Register 3 DINs.
183 | // await registrar.registerDINWithResolver(MERCHANT, resolver.address);
184 | // });
185 |
186 | // it("should have the correct registry address", async () => {
187 | // const checkoutRegistry = await checkout.registry();
188 | // expect(checkoutRegistry).to.equal(registry.address);
189 | // });
190 |
191 | // it("should have the correct orders address", async () => {
192 | // const checkoutOrders = await checkout.orders();
193 | // expect(checkoutOrders).to.equal(orders.address);
194 | // });
195 |
196 | // it("should have the correct rewards address", async () => {
197 | // const checkoutRewards = await checkout.rewards();
198 | // expect(checkoutRewards).to.equal(rewards.address);
199 | // });
200 |
201 | // it("should log an error if priceValidUntil has expired", async () => {
202 | // const values = [
203 | // DIN,
204 | // QUANTITY_ONE,
205 | // PRICE,
206 | // EXPIRED_DATE,
207 | // NO_AFFILIATE_REWARD,
208 | // NO_LOYALTY_REWARD
209 | // ];
210 | // const addresses = ORDER_ADDRESSES;
211 |
212 | // const result = await getBuyResult(values, addresses);
213 | // expect(result.logs[0].args.error).to.equal(ERROR_OFFER_EXPIRED);
214 | // });
215 |
216 | // it("should log an error if the merchant is invalid", async () => {
217 | // const values = [
218 | // DIN,
219 | // QUANTITY_ONE,
220 | // PRICE,
221 | // FUTURE_DATE,
222 | // NO_AFFILIATE_REWARD,
223 | // NO_LOYALTY_REWARD
224 | // ];
225 | // const addresses = [NO_MERCHANT, NO_AFFILIATE, NO_LOYALTY_TOKEN];
226 |
227 | // const result = await getBuyResult(values, addresses);
228 | // expect(result.logs[0].args.error).to.equal(ERROR_INVALID_MERCHANT);
229 | // });
230 |
231 | // it("should log an error if the affiliate is the buyer", async () => {
232 | // const values = [
233 | // DIN,
234 | // QUANTITY_ONE,
235 | // PRICE,
236 | // FUTURE_DATE,
237 | // AFFILIATE_REWARD,
238 | // NO_LOYALTY_REWARD
239 | // ];
240 | // const addresses = [MERCHANT, BUYER, NO_LOYALTY_TOKEN];
241 |
242 | // const result = await getBuyResult(values, addresses);
243 | // expect(result.logs[0].args.error).to.equal(ERROR_INVALID_AFFILIATE);
244 | // });
245 |
246 | // it("should log an error if input values are not correct", async () => {
247 | // const values = [
248 | // DIN,
249 | // QUANTITY_ONE,
250 | // PRICE,
251 | // FUTURE_DATE,
252 | // NO_AFFILIATE_REWARD,
253 | // NO_LOYALTY_REWARD
254 | // ];
255 | // const addresses = ORDER_ADDRESSES;
256 | // const signature = getSignature(values, MERCHANT);
257 |
258 | // // Set the price low to try to get the item for less
259 | // const fakeValues = [
260 | // DIN,
261 | // QUANTITY_ONE,
262 | // 1,
263 | // FUTURE_DATE,
264 | // NO_AFFILIATE_REWARD,
265 | // NO_LOYALTY_REWARD
266 | // ];
267 |
268 | // const result = await checkout.buy(
269 | // fakeValues,
270 | // addresses,
271 | // NONCE_HASH,
272 | // signature.v,
273 | // signature.r,
274 | // signature.s
275 | // );
276 | // expect(result.logs[0].args.error).to.equal(ERROR_INVALID_SIGNATURE);
277 | // });
278 |
279 | // it("should log an error if the signature is invalid", async () => {
280 | // const values = [
281 | // DIN,
282 | // QUANTITY_ONE,
283 | // PRICE,
284 | // FUTURE_DATE,
285 | // NO_AFFILIATE_REWARD,
286 | // NO_LOYALTY_REWARD
287 | // ];
288 | // const addresses = ORDER_ADDRESSES;
289 |
290 | // const result = await checkout.buy(
291 | // values,
292 | // addresses,
293 | // NONCE_HASH,
294 | // 27,
295 | // "0x0000000000000000000000000000000000000000",
296 | // "0x0000000000000000000000000000000000000000"
297 | // );
298 | // expect(result.logs[0].args.error).to.equal(ERROR_INVALID_SIGNATURE);
299 | // });
300 |
301 | // it("should validate a signature", async () => {
302 | // const hashValues = [
303 | // DIN,
304 | // PRICE,
305 | // FUTURE_DATE,
306 | // NO_AFFILIATE_REWARD,
307 | // NO_LOYALTY_REWARD,
308 | // NO_LOYALTY_TOKEN
309 | // ];
310 | // const signature = getSignature(hashValues);
311 | // const hash = getHash(hashValues);
312 |
313 | // const result = await checkout.isValidSignature(
314 | // MERCHANT,
315 | // hash,
316 | // signature.v,
317 | // signature.r,
318 | // signature.s
319 | // );
320 | // expect(result).to.equal(true);
321 |
322 | // const fakeValues = [
323 | // DIN,
324 | // QUANTITY_ONE,
325 | // 1,
326 | // FUTURE_DATE,
327 | // NO_AFFILIATE_REWARD,
328 | // NO_LOYALTY_REWARD
329 | // ];
330 | // const fakeHash = getHash(fakeValues);
331 | // const fakeResult = await checkout.isValidSignature(
332 | // MERCHANT,
333 | // fakeHash,
334 | // signature.v,
335 | // signature.r,
336 | // signature.s
337 | // );
338 | // expect(fakeResult).to.equal(false);
339 | // });
340 |
341 | // it("should process a valid purchase", async () => {
342 | // const values = ORDER_VALUES;
343 | // const addresses = ORDER_ADDRESSES;
344 |
345 | // const beginIndex = await orders.orderIndex();
346 | // const beginBalanceBuyer = await web3.eth.getBalance(BUYER);
347 | // const beginBalanceMerchant = await web3.eth.getBalance(MERCHANT);
348 |
349 | // const result = await getBuyResult(values, addresses);
350 | // const gasUsed = result.receipt.gasUsed;
351 |
352 | // const endIndex = await orders.orderIndex();
353 | // expect(endIndex.toNumber()).to.equal(beginIndex.toNumber() + 1);
354 |
355 | // const endBalanceBuyer = await web3.eth.getBalance(BUYER);
356 | // const endBalanceMerchant = await web3.eth.getBalance(MERCHANT);
357 |
358 | // const expectedBuyer =
359 | // beginBalanceBuyer.toNumber() - PRICE - gasUsed * GAS_PRICE;
360 | // const expectedMerchant = beginBalanceMerchant.toNumber() + PRICE;
361 |
362 | // expect(endBalanceBuyer.toNumber()).to.equal(expectedBuyer);
363 | // expect(endBalanceMerchant.toNumber()).to.equal(expectedMerchant);
364 | // });
365 |
366 | // it("should reward a valid affiliate", async () => {
367 | // // MERCHANT will offer 1 MARK to any affiliate that sells his product for 5 ETH.
368 | // // AFFILIATE gets BUYER to purchase the product with her affiliate link.
369 | // const values = [
370 | // DIN,
371 | // QUANTITY_ONE,
372 | // PRICE,
373 | // FUTURE_DATE,
374 | // AFFILIATE_REWARD,
375 | // NO_LOYALTY_REWARD
376 | // ];
377 | // const addresses = [MERCHANT, AFFILIATE, NO_LOYALTY_TOKEN];
378 |
379 | // // Ether beginning balances
380 | // const beginBalanceBuyerETH = await web3.eth.getBalance(BUYER);
381 | // const beginBalanceMerchantETH = await web3.eth.getBalance(MERCHANT);
382 |
383 | // // Market Token beginning balances
384 | // const beginBalanceMerchantMARK = await marketToken.balanceOf(MERCHANT);
385 | // const beginBalanceAffiliateMARK = await marketToken.balanceOf(
386 | // AFFILIATE
387 | // );
388 |
389 | // const result = await getBuyResult(values, addresses);
390 | // const gasUsed = result.receipt.gasUsed;
391 |
392 | // // Ether ending balances
393 | // const endBalanceBuyerETH = await web3.eth.getBalance(BUYER);
394 | // const endBalanceMerchantETH = await web3.eth.getBalance(MERCHANT);
395 |
396 | // // Market Token ending balances
397 | // const endBalanceMerchantMARK = await marketToken.balanceOf(MERCHANT);
398 | // const endBalanceAffiliateMARK = await marketToken.balanceOf(AFFILIATE);
399 |
400 | // // Expected values
401 | // const expectedEndBalanceBuyerETH =
402 | // beginBalanceBuyerETH.toNumber() - PRICE - gasUsed * GAS_PRICE;
403 | // const expectedEndBalanceMerchantETH =
404 | // beginBalanceMerchantETH.toNumber() + PRICE;
405 | // const expectedEndBalanceMerchantMARK =
406 | // beginBalanceMerchantMARK.toNumber() - AFFILIATE_REWARD;
407 | // const expectedEndBalanceAffiliateMARK =
408 | // beginBalanceAffiliateMARK.toNumber() + AFFILIATE_REWARD;
409 |
410 | // expect(endBalanceBuyerETH.toNumber()).to.equal(
411 | // expectedEndBalanceBuyerETH
412 | // );
413 | // expect(endBalanceMerchantETH.toNumber()).to.equal(
414 | // expectedEndBalanceMerchantETH
415 | // );
416 | // expect(endBalanceMerchantMARK.toNumber()).to.equal(
417 | // expectedEndBalanceMerchantMARK
418 | // );
419 | // expect(endBalanceAffiliateMARK.toNumber()).to.equal(
420 | // expectedEndBalanceAffiliateMARK
421 | // );
422 | // });
423 |
424 | // it("should reward loyalty tokens", async () => {
425 | // const values = [
426 | // DIN,
427 | // QUANTITY_ONE,
428 | // PRICE,
429 | // FUTURE_DATE,
430 | // NO_AFFILIATE_REWARD,
431 | // LOYALTY_REWARD
432 | // ];
433 | // const addresses = [MERCHANT, NO_AFFILIATE, LOYALTY_TOKEN];
434 |
435 | // // Ether beginning balances
436 | // const beginBalanceBuyerETH = await web3.eth.getBalance(BUYER);
437 | // const beginBalanceMerchantETH = await web3.eth.getBalance(MERCHANT);
438 |
439 | // // Loyalty token beginning balances
440 | // const beginBalanceBuyerLOYALTY = await loyaltyToken.balanceOf(BUYER);
441 | // const beginBalanceMerchantLOYALTY = await loyaltyToken.balanceOf(MERCHANT);
442 |
443 | // const result = await getBuyResult(values, addresses);
444 | // const gasUsed = result.receipt.gasUsed;
445 |
446 | // // Ether ending balances
447 | // const endBalanceBuyerETH = await web3.eth.getBalance(BUYER);
448 | // const endBalanceMerchantETH = await web3.eth.getBalance(MERCHANT);
449 |
450 | // // Loyalty token ending balances
451 | // const endBalanceBuyerLOYALTY = await loyaltyToken.balanceOf(BUYER);
452 | // const endBalanceMerchantLOYALTY = await loyaltyToken.balanceOf(MERCHANT);
453 |
454 | // // Expected values
455 | // const expectedEndBalanceBuyerETH =
456 | // beginBalanceBuyerETH.toNumber() - PRICE - gasUsed * GAS_PRICE;
457 | // const expectedEndBalanceMerchantETH =
458 | // beginBalanceMerchantETH.toNumber() + PRICE;
459 | // const expectedEndBalanceBuyerLOYALTY =
460 | // beginBalanceBuyerLOYALTY.toNumber() + LOYALTY_REWARD;
461 | // const expectedEndBalanceMerchantLOYALTY =
462 | // beginBalanceMerchantLOYALTY.toNumber() - LOYALTY_REWARD;
463 |
464 | // expect(endBalanceBuyerETH.toNumber()).to.equal(
465 | // expectedEndBalanceBuyerETH
466 | // );
467 | // expect(endBalanceMerchantETH.toNumber()).to.equal(
468 | // expectedEndBalanceMerchantETH
469 | // );
470 | // expect(endBalanceBuyerLOYALTY.toNumber()).to.equal(
471 | // expectedEndBalanceBuyerLOYALTY
472 | // );
473 | // });
474 |
475 | // // it("should let a buyer use loyalty tokens in a purchase", async () => {
476 | // // //
477 | // // });
478 |
479 | // it("should throw if the buyer does not have enough tokens", async () => {
480 | // const values = [
481 | // DIN,
482 | // QUANTITY_ONE,
483 | // PRICE_TOO_HIGH,
484 | // FUTURE_DATE,
485 | // NO_AFFILIATE_REWARD,
486 | // NO_LOYALTY_REWARD
487 | // ];
488 | // const addresses = [MERCHANT, NO_AFFILIATE, NO_LOYALTY_TOKEN];
489 |
490 | // try {
491 | // await getBuyResult(values, addresses);
492 | // } catch (error) {
493 | // assert.include(
494 | // error.message,
495 | // "sender doesn't have enough funds to send tx",
496 | // "Buying a product without enough tokens should throw an error."
497 | // );
498 | // }
499 | // });
500 | // });
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | accepts@~1.3.4:
6 | version "1.3.4"
7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
8 | dependencies:
9 | mime-types "~2.1.16"
10 | negotiator "0.6.1"
11 |
12 | ajv@^5.1.0:
13 | version "5.3.0"
14 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
15 | dependencies:
16 | co "^4.6.0"
17 | fast-deep-equal "^1.0.0"
18 | fast-json-stable-stringify "^2.0.0"
19 | json-schema-traverse "^0.3.0"
20 |
21 | ansi-regex@^2.0.0:
22 | version "2.1.1"
23 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
24 |
25 | ansi-styles@^2.2.1:
26 | version "2.2.1"
27 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
28 |
29 | aproba@^1.0.3:
30 | version "1.2.0"
31 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
32 |
33 | are-we-there-yet@~1.1.2:
34 | version "1.1.4"
35 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
36 | dependencies:
37 | delegates "^1.0.0"
38 | readable-stream "^2.0.6"
39 |
40 | array-flatten@1.1.1:
41 | version "1.1.1"
42 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
43 |
44 | asn1@~0.2.3:
45 | version "0.2.3"
46 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
47 |
48 | assert-plus@1.0.0, assert-plus@^1.0.0:
49 | version "1.0.0"
50 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
51 |
52 | assertion-error@^1.0.1:
53 | version "1.0.2"
54 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c"
55 |
56 | async-limiter@~1.0.0:
57 | version "1.0.0"
58 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
59 |
60 | asynckit@^0.4.0:
61 | version "0.4.0"
62 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
63 |
64 | aws-sign2@~0.7.0:
65 | version "0.7.0"
66 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
67 |
68 | aws4@^1.6.0:
69 | version "1.6.0"
70 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
71 |
72 | babel-code-frame@^6.26.0:
73 | version "6.26.0"
74 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
75 | dependencies:
76 | chalk "^1.1.3"
77 | esutils "^2.0.2"
78 | js-tokens "^3.0.2"
79 |
80 | babel-core@^6.0.14, babel-core@^6.26.0:
81 | version "6.26.0"
82 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
83 | dependencies:
84 | babel-code-frame "^6.26.0"
85 | babel-generator "^6.26.0"
86 | babel-helpers "^6.24.1"
87 | babel-messages "^6.23.0"
88 | babel-register "^6.26.0"
89 | babel-runtime "^6.26.0"
90 | babel-template "^6.26.0"
91 | babel-traverse "^6.26.0"
92 | babel-types "^6.26.0"
93 | babylon "^6.18.0"
94 | convert-source-map "^1.5.0"
95 | debug "^2.6.8"
96 | json5 "^0.5.1"
97 | lodash "^4.17.4"
98 | minimatch "^3.0.4"
99 | path-is-absolute "^1.0.1"
100 | private "^0.1.7"
101 | slash "^1.0.0"
102 | source-map "^0.5.6"
103 |
104 | babel-generator@^6.26.0:
105 | version "6.26.0"
106 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
107 | dependencies:
108 | babel-messages "^6.23.0"
109 | babel-runtime "^6.26.0"
110 | babel-types "^6.26.0"
111 | detect-indent "^4.0.0"
112 | jsesc "^1.3.0"
113 | lodash "^4.17.4"
114 | source-map "^0.5.6"
115 | trim-right "^1.0.1"
116 |
117 | babel-helper-call-delegate@^6.24.1:
118 | version "6.24.1"
119 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
120 | dependencies:
121 | babel-helper-hoist-variables "^6.24.1"
122 | babel-runtime "^6.22.0"
123 | babel-traverse "^6.24.1"
124 | babel-types "^6.24.1"
125 |
126 | babel-helper-define-map@^6.24.1:
127 | version "6.26.0"
128 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
129 | dependencies:
130 | babel-helper-function-name "^6.24.1"
131 | babel-runtime "^6.26.0"
132 | babel-types "^6.26.0"
133 | lodash "^4.17.4"
134 |
135 | babel-helper-function-name@^6.24.1:
136 | version "6.24.1"
137 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
138 | dependencies:
139 | babel-helper-get-function-arity "^6.24.1"
140 | babel-runtime "^6.22.0"
141 | babel-template "^6.24.1"
142 | babel-traverse "^6.24.1"
143 | babel-types "^6.24.1"
144 |
145 | babel-helper-get-function-arity@^6.24.1:
146 | version "6.24.1"
147 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
148 | dependencies:
149 | babel-runtime "^6.22.0"
150 | babel-types "^6.24.1"
151 |
152 | babel-helper-hoist-variables@^6.24.1:
153 | version "6.24.1"
154 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
155 | dependencies:
156 | babel-runtime "^6.22.0"
157 | babel-types "^6.24.1"
158 |
159 | babel-helper-optimise-call-expression@^6.24.1:
160 | version "6.24.1"
161 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
162 | dependencies:
163 | babel-runtime "^6.22.0"
164 | babel-types "^6.24.1"
165 |
166 | babel-helper-regex@^6.24.1:
167 | version "6.26.0"
168 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
169 | dependencies:
170 | babel-runtime "^6.26.0"
171 | babel-types "^6.26.0"
172 | lodash "^4.17.4"
173 |
174 | babel-helper-replace-supers@^6.24.1:
175 | version "6.24.1"
176 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
177 | dependencies:
178 | babel-helper-optimise-call-expression "^6.24.1"
179 | babel-messages "^6.23.0"
180 | babel-runtime "^6.22.0"
181 | babel-template "^6.24.1"
182 | babel-traverse "^6.24.1"
183 | babel-types "^6.24.1"
184 |
185 | babel-helpers@^6.24.1:
186 | version "6.24.1"
187 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
188 | dependencies:
189 | babel-runtime "^6.22.0"
190 | babel-template "^6.24.1"
191 |
192 | babel-messages@^6.23.0:
193 | version "6.23.0"
194 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
195 | dependencies:
196 | babel-runtime "^6.22.0"
197 |
198 | babel-plugin-check-es2015-constants@^6.22.0:
199 | version "6.22.0"
200 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
201 | dependencies:
202 | babel-runtime "^6.22.0"
203 |
204 | babel-plugin-transform-es2015-arrow-functions@^6.22.0:
205 | version "6.22.0"
206 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
207 | dependencies:
208 | babel-runtime "^6.22.0"
209 |
210 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
211 | version "6.22.0"
212 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
213 | dependencies:
214 | babel-runtime "^6.22.0"
215 |
216 | babel-plugin-transform-es2015-block-scoping@^6.24.1:
217 | version "6.26.0"
218 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
219 | dependencies:
220 | babel-runtime "^6.26.0"
221 | babel-template "^6.26.0"
222 | babel-traverse "^6.26.0"
223 | babel-types "^6.26.0"
224 | lodash "^4.17.4"
225 |
226 | babel-plugin-transform-es2015-classes@^6.24.1:
227 | version "6.24.1"
228 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
229 | dependencies:
230 | babel-helper-define-map "^6.24.1"
231 | babel-helper-function-name "^6.24.1"
232 | babel-helper-optimise-call-expression "^6.24.1"
233 | babel-helper-replace-supers "^6.24.1"
234 | babel-messages "^6.23.0"
235 | babel-runtime "^6.22.0"
236 | babel-template "^6.24.1"
237 | babel-traverse "^6.24.1"
238 | babel-types "^6.24.1"
239 |
240 | babel-plugin-transform-es2015-computed-properties@^6.24.1:
241 | version "6.24.1"
242 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
243 | dependencies:
244 | babel-runtime "^6.22.0"
245 | babel-template "^6.24.1"
246 |
247 | babel-plugin-transform-es2015-destructuring@^6.22.0:
248 | version "6.23.0"
249 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
250 | dependencies:
251 | babel-runtime "^6.22.0"
252 |
253 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
254 | version "6.24.1"
255 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
256 | dependencies:
257 | babel-runtime "^6.22.0"
258 | babel-types "^6.24.1"
259 |
260 | babel-plugin-transform-es2015-for-of@^6.22.0:
261 | version "6.23.0"
262 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
263 | dependencies:
264 | babel-runtime "^6.22.0"
265 |
266 | babel-plugin-transform-es2015-function-name@^6.24.1:
267 | version "6.24.1"
268 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
269 | dependencies:
270 | babel-helper-function-name "^6.24.1"
271 | babel-runtime "^6.22.0"
272 | babel-types "^6.24.1"
273 |
274 | babel-plugin-transform-es2015-literals@^6.22.0:
275 | version "6.22.0"
276 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
277 | dependencies:
278 | babel-runtime "^6.22.0"
279 |
280 | babel-plugin-transform-es2015-modules-amd@^6.24.1:
281 | version "6.24.1"
282 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
283 | dependencies:
284 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
285 | babel-runtime "^6.22.0"
286 | babel-template "^6.24.1"
287 |
288 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
289 | version "6.26.0"
290 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
291 | dependencies:
292 | babel-plugin-transform-strict-mode "^6.24.1"
293 | babel-runtime "^6.26.0"
294 | babel-template "^6.26.0"
295 | babel-types "^6.26.0"
296 |
297 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
298 | version "6.24.1"
299 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
300 | dependencies:
301 | babel-helper-hoist-variables "^6.24.1"
302 | babel-runtime "^6.22.0"
303 | babel-template "^6.24.1"
304 |
305 | babel-plugin-transform-es2015-modules-umd@^6.24.1:
306 | version "6.24.1"
307 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
308 | dependencies:
309 | babel-plugin-transform-es2015-modules-amd "^6.24.1"
310 | babel-runtime "^6.22.0"
311 | babel-template "^6.24.1"
312 |
313 | babel-plugin-transform-es2015-object-super@^6.24.1:
314 | version "6.24.1"
315 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
316 | dependencies:
317 | babel-helper-replace-supers "^6.24.1"
318 | babel-runtime "^6.22.0"
319 |
320 | babel-plugin-transform-es2015-parameters@^6.24.1:
321 | version "6.24.1"
322 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
323 | dependencies:
324 | babel-helper-call-delegate "^6.24.1"
325 | babel-helper-get-function-arity "^6.24.1"
326 | babel-runtime "^6.22.0"
327 | babel-template "^6.24.1"
328 | babel-traverse "^6.24.1"
329 | babel-types "^6.24.1"
330 |
331 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
332 | version "6.24.1"
333 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
334 | dependencies:
335 | babel-runtime "^6.22.0"
336 | babel-types "^6.24.1"
337 |
338 | babel-plugin-transform-es2015-spread@^6.22.0:
339 | version "6.22.0"
340 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
341 | dependencies:
342 | babel-runtime "^6.22.0"
343 |
344 | babel-plugin-transform-es2015-sticky-regex@^6.24.1:
345 | version "6.24.1"
346 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
347 | dependencies:
348 | babel-helper-regex "^6.24.1"
349 | babel-runtime "^6.22.0"
350 | babel-types "^6.24.1"
351 |
352 | babel-plugin-transform-es2015-template-literals@^6.22.0:
353 | version "6.22.0"
354 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
355 | dependencies:
356 | babel-runtime "^6.22.0"
357 |
358 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
359 | version "6.23.0"
360 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
361 | dependencies:
362 | babel-runtime "^6.22.0"
363 |
364 | babel-plugin-transform-es2015-unicode-regex@^6.24.1:
365 | version "6.24.1"
366 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
367 | dependencies:
368 | babel-helper-regex "^6.24.1"
369 | babel-runtime "^6.22.0"
370 | regexpu-core "^2.0.0"
371 |
372 | babel-plugin-transform-regenerator@^6.24.1:
373 | version "6.26.0"
374 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
375 | dependencies:
376 | regenerator-transform "^0.10.0"
377 |
378 | babel-plugin-transform-strict-mode@^6.24.1:
379 | version "6.24.1"
380 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
381 | dependencies:
382 | babel-runtime "^6.22.0"
383 | babel-types "^6.24.1"
384 |
385 | babel-polyfill@^6.26.0:
386 | version "6.26.0"
387 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
388 | dependencies:
389 | babel-runtime "^6.26.0"
390 | core-js "^2.5.0"
391 | regenerator-runtime "^0.10.5"
392 |
393 | babel-preset-es2015@^6.24.0:
394 | version "6.24.1"
395 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
396 | dependencies:
397 | babel-plugin-check-es2015-constants "^6.22.0"
398 | babel-plugin-transform-es2015-arrow-functions "^6.22.0"
399 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
400 | babel-plugin-transform-es2015-block-scoping "^6.24.1"
401 | babel-plugin-transform-es2015-classes "^6.24.1"
402 | babel-plugin-transform-es2015-computed-properties "^6.24.1"
403 | babel-plugin-transform-es2015-destructuring "^6.22.0"
404 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
405 | babel-plugin-transform-es2015-for-of "^6.22.0"
406 | babel-plugin-transform-es2015-function-name "^6.24.1"
407 | babel-plugin-transform-es2015-literals "^6.22.0"
408 | babel-plugin-transform-es2015-modules-amd "^6.24.1"
409 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
410 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
411 | babel-plugin-transform-es2015-modules-umd "^6.24.1"
412 | babel-plugin-transform-es2015-object-super "^6.24.1"
413 | babel-plugin-transform-es2015-parameters "^6.24.1"
414 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
415 | babel-plugin-transform-es2015-spread "^6.22.0"
416 | babel-plugin-transform-es2015-sticky-regex "^6.24.1"
417 | babel-plugin-transform-es2015-template-literals "^6.22.0"
418 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
419 | babel-plugin-transform-es2015-unicode-regex "^6.24.1"
420 | babel-plugin-transform-regenerator "^6.24.1"
421 |
422 | babel-register@^6.26.0:
423 | version "6.26.0"
424 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
425 | dependencies:
426 | babel-core "^6.26.0"
427 | babel-runtime "^6.26.0"
428 | core-js "^2.5.0"
429 | home-or-tmp "^2.0.0"
430 | lodash "^4.17.4"
431 | mkdirp "^0.5.1"
432 | source-map-support "^0.4.15"
433 |
434 | babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
435 | version "6.26.0"
436 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
437 | dependencies:
438 | core-js "^2.4.0"
439 | regenerator-runtime "^0.11.0"
440 |
441 | babel-template@^6.24.1, babel-template@^6.26.0:
442 | version "6.26.0"
443 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
444 | dependencies:
445 | babel-runtime "^6.26.0"
446 | babel-traverse "^6.26.0"
447 | babel-types "^6.26.0"
448 | babylon "^6.18.0"
449 | lodash "^4.17.4"
450 |
451 | babel-traverse@^6.24.1, babel-traverse@^6.26.0:
452 | version "6.26.0"
453 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
454 | dependencies:
455 | babel-code-frame "^6.26.0"
456 | babel-messages "^6.23.0"
457 | babel-runtime "^6.26.0"
458 | babel-types "^6.26.0"
459 | babylon "^6.18.0"
460 | debug "^2.6.8"
461 | globals "^9.18.0"
462 | invariant "^2.2.2"
463 | lodash "^4.17.4"
464 |
465 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
466 | version "6.26.0"
467 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
468 | dependencies:
469 | babel-runtime "^6.26.0"
470 | esutils "^2.0.2"
471 | lodash "^4.17.4"
472 | to-fast-properties "^1.0.3"
473 |
474 | babelify@^7.3.0:
475 | version "7.3.0"
476 | resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
477 | dependencies:
478 | babel-core "^6.0.14"
479 | object-assign "^4.0.0"
480 |
481 | babylon@^6.18.0:
482 | version "6.18.0"
483 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
484 |
485 | balanced-match@^1.0.0:
486 | version "1.0.0"
487 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
488 |
489 | bcrypt-pbkdf@^1.0.0:
490 | version "1.0.1"
491 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
492 | dependencies:
493 | tweetnacl "^0.14.3"
494 |
495 | bignumber.js@^4.1.0:
496 | version "4.1.0"
497 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
498 |
499 | bindings@^1.2.1:
500 | version "1.3.0"
501 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
502 |
503 | bip66@^1.1.3:
504 | version "1.1.5"
505 | resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22"
506 | dependencies:
507 | safe-buffer "^5.0.1"
508 |
509 | bl@^1.0.0:
510 | version "1.2.1"
511 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
512 | dependencies:
513 | readable-stream "^2.0.5"
514 |
515 | bluebird@^3.5.0:
516 | version "3.5.1"
517 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
518 |
519 | bn.js@4.11.6:
520 | version "4.11.6"
521 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
522 |
523 | bn.js@^4.11.3, bn.js@^4.11.6, bn.js@^4.4.0, bn.js@^4.8.0:
524 | version "4.11.8"
525 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
526 |
527 | body-parser@1.18.2, body-parser@^1.16.0:
528 | version "1.18.2"
529 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
530 | dependencies:
531 | bytes "3.0.0"
532 | content-type "~1.0.4"
533 | debug "2.6.9"
534 | depd "~1.1.1"
535 | http-errors "~1.6.2"
536 | iconv-lite "0.4.19"
537 | on-finished "~2.3.0"
538 | qs "6.5.1"
539 | raw-body "2.3.2"
540 | type-is "~1.6.15"
541 |
542 | boom@4.x.x:
543 | version "4.3.1"
544 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
545 | dependencies:
546 | hoek "4.x.x"
547 |
548 | boom@5.x.x:
549 | version "5.2.0"
550 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
551 | dependencies:
552 | hoek "4.x.x"
553 |
554 | brace-expansion@^1.1.7:
555 | version "1.1.8"
556 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
557 | dependencies:
558 | balanced-match "^1.0.0"
559 | concat-map "0.0.1"
560 |
561 | brorand@^1.0.1:
562 | version "1.1.0"
563 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
564 |
565 | browserify-aes@^1.0.6:
566 | version "1.1.1"
567 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
568 | dependencies:
569 | buffer-xor "^1.0.3"
570 | cipher-base "^1.0.0"
571 | create-hash "^1.1.0"
572 | evp_bytestokey "^1.0.3"
573 | inherits "^2.0.1"
574 | safe-buffer "^5.0.1"
575 |
576 | browserify-sha3@^0.0.1:
577 | version "0.0.1"
578 | resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.1.tgz#3ff34a3006ef15c0fb3567e541b91a2340123d11"
579 | dependencies:
580 | js-sha3 "^0.3.1"
581 |
582 | buffer-to-arraybuffer@0.0.2:
583 | version "0.0.2"
584 | resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.2.tgz#d0d80564dc31866a1976515487b3ab620db7c849"
585 | dependencies:
586 | tape "^3.0.3"
587 |
588 | buffer-xor@^1.0.3:
589 | version "1.0.3"
590 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
591 |
592 | bytes@3.0.0:
593 | version "3.0.0"
594 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
595 |
596 | caseless@~0.12.0:
597 | version "0.12.0"
598 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
599 |
600 | chai@^4.1.2:
601 | version "4.1.2"
602 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c"
603 | dependencies:
604 | assertion-error "^1.0.1"
605 | check-error "^1.0.1"
606 | deep-eql "^3.0.0"
607 | get-func-name "^2.0.0"
608 | pathval "^1.0.0"
609 | type-detect "^4.0.0"
610 |
611 | chalk@^1.1.3:
612 | version "1.1.3"
613 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
614 | dependencies:
615 | ansi-styles "^2.2.1"
616 | escape-string-regexp "^1.0.2"
617 | has-ansi "^2.0.0"
618 | strip-ansi "^3.0.0"
619 | supports-color "^2.0.0"
620 |
621 | check-error@^1.0.1:
622 | version "1.0.2"
623 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
624 |
625 | chownr@^1.0.1:
626 | version "1.0.1"
627 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
628 |
629 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
630 | version "1.0.4"
631 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
632 | dependencies:
633 | inherits "^2.0.1"
634 | safe-buffer "^5.0.1"
635 |
636 | co@^4.6.0:
637 | version "4.6.0"
638 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
639 |
640 | code-point-at@^1.0.0:
641 | version "1.1.0"
642 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
643 |
644 | combined-stream@^1.0.5, combined-stream@~1.0.5:
645 | version "1.0.5"
646 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
647 | dependencies:
648 | delayed-stream "~1.0.0"
649 |
650 | concat-map@0.0.1:
651 | version "0.0.1"
652 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
653 |
654 | console-control-strings@^1.0.0, console-control-strings@~1.1.0:
655 | version "1.1.0"
656 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
657 |
658 | content-disposition@0.5.2:
659 | version "0.5.2"
660 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
661 |
662 | content-type@~1.0.4:
663 | version "1.0.4"
664 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
665 |
666 | convert-source-map@^1.5.0:
667 | version "1.5.0"
668 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
669 |
670 | cookie-signature@1.0.6:
671 | version "1.0.6"
672 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
673 |
674 | cookie@0.3.1:
675 | version "0.3.1"
676 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
677 |
678 | core-js@^2.4.0, core-js@^2.5.0:
679 | version "2.5.1"
680 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
681 |
682 | core-util-is@1.0.2, core-util-is@~1.0.0:
683 | version "1.0.2"
684 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
685 |
686 | cors@^2.8.1:
687 | version "2.8.4"
688 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686"
689 | dependencies:
690 | object-assign "^4"
691 | vary "^1"
692 |
693 | create-hash@^1.1.0, create-hash@^1.1.2:
694 | version "1.1.3"
695 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
696 | dependencies:
697 | cipher-base "^1.0.1"
698 | inherits "^2.0.1"
699 | ripemd160 "^2.0.0"
700 | sha.js "^2.4.0"
701 |
702 | create-hmac@^1.1.4:
703 | version "1.1.6"
704 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
705 | dependencies:
706 | cipher-base "^1.0.3"
707 | create-hash "^1.1.0"
708 | inherits "^2.0.1"
709 | ripemd160 "^2.0.0"
710 | safe-buffer "^5.0.1"
711 | sha.js "^2.4.8"
712 |
713 | cryptiles@3.x.x:
714 | version "3.1.2"
715 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
716 | dependencies:
717 | boom "5.x.x"
718 |
719 | dashdash@^1.12.0:
720 | version "1.14.1"
721 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
722 | dependencies:
723 | assert-plus "^1.0.0"
724 |
725 | debug@2.6.9, debug@^2.6.8:
726 | version "2.6.9"
727 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
728 | dependencies:
729 | ms "2.0.0"
730 |
731 | deep-eql@^3.0.0:
732 | version "3.0.1"
733 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
734 | dependencies:
735 | type-detect "^4.0.0"
736 |
737 | deep-equal@~0.2.0:
738 | version "0.2.2"
739 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d"
740 |
741 | deep-extend@~0.4.0:
742 | version "0.4.2"
743 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
744 |
745 | defined@~0.0.0:
746 | version "0.0.0"
747 | resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e"
748 |
749 | delayed-stream@~1.0.0:
750 | version "1.0.0"
751 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
752 |
753 | delegates@^1.0.0:
754 | version "1.0.0"
755 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
756 |
757 | depd@1.1.1, depd@~1.1.1:
758 | version "1.1.1"
759 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
760 |
761 | destroy@~1.0.4:
762 | version "1.0.4"
763 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
764 |
765 | detect-indent@^4.0.0:
766 | version "4.0.0"
767 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
768 | dependencies:
769 | repeating "^2.0.0"
770 |
771 | dom-walk@^0.1.0:
772 | version "0.1.1"
773 | resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
774 |
775 | drbg.js@^1.0.1:
776 | version "1.0.1"
777 | resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
778 | dependencies:
779 | browserify-aes "^1.0.6"
780 | create-hash "^1.1.2"
781 | create-hmac "^1.1.4"
782 |
783 | ecc-jsbn@~0.1.1:
784 | version "0.1.1"
785 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
786 | dependencies:
787 | jsbn "~0.1.0"
788 |
789 | ee-first@1.1.1:
790 | version "1.1.1"
791 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
792 |
793 | elliptic@^6.2.3, elliptic@^6.4.0:
794 | version "6.4.0"
795 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
796 | dependencies:
797 | bn.js "^4.4.0"
798 | brorand "^1.0.1"
799 | hash.js "^1.0.0"
800 | hmac-drbg "^1.0.0"
801 | inherits "^2.0.1"
802 | minimalistic-assert "^1.0.0"
803 | minimalistic-crypto-utils "^1.0.0"
804 |
805 | encodeurl@~1.0.1:
806 | version "1.0.1"
807 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
808 |
809 | end-of-stream@^1.0.0, end-of-stream@^1.1.0:
810 | version "1.4.0"
811 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
812 | dependencies:
813 | once "^1.4.0"
814 |
815 | escape-html@~1.0.3:
816 | version "1.0.3"
817 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
818 |
819 | escape-string-regexp@^1.0.2:
820 | version "1.0.5"
821 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
822 |
823 | esutils@^2.0.2:
824 | version "2.0.2"
825 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
826 |
827 | etag@~1.8.1:
828 | version "1.8.1"
829 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
830 |
831 | eth-lib@^0.1.27:
832 | version "0.1.27"
833 | resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.27.tgz#f0b0fd144f865d2d6bf8257a40004f2e75ca1dd6"
834 | dependencies:
835 | bn.js "^4.11.6"
836 | elliptic "^6.4.0"
837 | keccakjs "^0.2.1"
838 | nano-json-stream-parser "^0.1.2"
839 | servify "^0.1.12"
840 | ws "^3.0.0"
841 | xhr-request-promise "^0.1.2"
842 |
843 | ethereumjs-util@^5.1.2:
844 | version "5.1.2"
845 | resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.1.2.tgz#25ba0215cbb4c2f0b108a6f96af2a2e62e45921f"
846 | dependencies:
847 | babel-preset-es2015 "^6.24.0"
848 | babelify "^7.3.0"
849 | bn.js "^4.8.0"
850 | create-hash "^1.1.2"
851 | ethjs-util "^0.1.3"
852 | keccak "^1.0.2"
853 | rlp "^2.0.0"
854 | secp256k1 "^3.0.1"
855 |
856 | ethjs-unit@0.1.6:
857 | version "0.1.6"
858 | resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
859 | dependencies:
860 | bn.js "4.11.6"
861 | number-to-bn "1.7.0"
862 |
863 | ethjs-util@^0.1.3:
864 | version "0.1.4"
865 | resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.4.tgz#1c8b6879257444ef4d3f3fbbac2ded12cd997d93"
866 | dependencies:
867 | is-hex-prefixed "1.0.0"
868 | strip-hex-prefix "1.0.0"
869 |
870 | evp_bytestokey@^1.0.3:
871 | version "1.0.3"
872 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
873 | dependencies:
874 | md5.js "^1.3.4"
875 | safe-buffer "^5.1.1"
876 |
877 | expand-template@^1.0.2:
878 | version "1.1.0"
879 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc"
880 |
881 | express@^4.14.0:
882 | version "4.16.2"
883 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
884 | dependencies:
885 | accepts "~1.3.4"
886 | array-flatten "1.1.1"
887 | body-parser "1.18.2"
888 | content-disposition "0.5.2"
889 | content-type "~1.0.4"
890 | cookie "0.3.1"
891 | cookie-signature "1.0.6"
892 | debug "2.6.9"
893 | depd "~1.1.1"
894 | encodeurl "~1.0.1"
895 | escape-html "~1.0.3"
896 | etag "~1.8.1"
897 | finalhandler "1.1.0"
898 | fresh "0.5.2"
899 | merge-descriptors "1.0.1"
900 | methods "~1.1.2"
901 | on-finished "~2.3.0"
902 | parseurl "~1.3.2"
903 | path-to-regexp "0.1.7"
904 | proxy-addr "~2.0.2"
905 | qs "6.5.1"
906 | range-parser "~1.2.0"
907 | safe-buffer "5.1.1"
908 | send "0.16.1"
909 | serve-static "1.13.1"
910 | setprototypeof "1.1.0"
911 | statuses "~1.3.1"
912 | type-is "~1.6.15"
913 | utils-merge "1.0.1"
914 | vary "~1.1.2"
915 |
916 | extend@~3.0.1:
917 | version "3.0.1"
918 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
919 |
920 | extsprintf@1.3.0, extsprintf@^1.2.0:
921 | version "1.3.0"
922 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
923 |
924 | fast-deep-equal@^1.0.0:
925 | version "1.0.0"
926 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
927 |
928 | fast-json-stable-stringify@^2.0.0:
929 | version "2.0.0"
930 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
931 |
932 | finalhandler@1.1.0:
933 | version "1.1.0"
934 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
935 | dependencies:
936 | debug "2.6.9"
937 | encodeurl "~1.0.1"
938 | escape-html "~1.0.3"
939 | on-finished "~2.3.0"
940 | parseurl "~1.3.2"
941 | statuses "~1.3.1"
942 | unpipe "~1.0.0"
943 |
944 | for-each@^0.3.2:
945 | version "0.3.2"
946 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4"
947 | dependencies:
948 | is-function "~1.0.0"
949 |
950 | forever-agent@~0.6.1:
951 | version "0.6.1"
952 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
953 |
954 | form-data@~2.3.1:
955 | version "2.3.1"
956 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
957 | dependencies:
958 | asynckit "^0.4.0"
959 | combined-stream "^1.0.5"
960 | mime-types "^2.1.12"
961 |
962 | forwarded@~0.1.2:
963 | version "0.1.2"
964 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
965 |
966 | fresh@0.5.2:
967 | version "0.5.2"
968 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
969 |
970 | gauge@~2.7.3:
971 | version "2.7.4"
972 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
973 | dependencies:
974 | aproba "^1.0.3"
975 | console-control-strings "^1.0.0"
976 | has-unicode "^2.0.0"
977 | object-assign "^4.1.0"
978 | signal-exit "^3.0.0"
979 | string-width "^1.0.1"
980 | strip-ansi "^3.0.1"
981 | wide-align "^1.1.0"
982 |
983 | get-func-name@^2.0.0:
984 | version "2.0.0"
985 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
986 |
987 | getpass@^0.1.1:
988 | version "0.1.7"
989 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
990 | dependencies:
991 | assert-plus "^1.0.0"
992 |
993 | github-from-package@0.0.0:
994 | version "0.0.0"
995 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
996 |
997 | glob@~3.2.9:
998 | version "3.2.11"
999 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
1000 | dependencies:
1001 | inherits "2"
1002 | minimatch "0.3"
1003 |
1004 | global@~4.3.0:
1005 | version "4.3.2"
1006 | resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
1007 | dependencies:
1008 | min-document "^2.19.0"
1009 | process "~0.5.1"
1010 |
1011 | globals@^9.18.0:
1012 | version "9.18.0"
1013 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
1014 |
1015 | har-schema@^2.0.0:
1016 | version "2.0.0"
1017 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
1018 |
1019 | har-validator@~5.0.3:
1020 | version "5.0.3"
1021 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
1022 | dependencies:
1023 | ajv "^5.1.0"
1024 | har-schema "^2.0.0"
1025 |
1026 | has-ansi@^2.0.0:
1027 | version "2.0.0"
1028 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1029 | dependencies:
1030 | ansi-regex "^2.0.0"
1031 |
1032 | has-unicode@^2.0.0:
1033 | version "2.0.1"
1034 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1035 |
1036 | hash-base@^2.0.0:
1037 | version "2.0.2"
1038 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
1039 | dependencies:
1040 | inherits "^2.0.1"
1041 |
1042 | hash-base@^3.0.0:
1043 | version "3.0.4"
1044 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
1045 | dependencies:
1046 | inherits "^2.0.1"
1047 | safe-buffer "^5.0.1"
1048 |
1049 | hash.js@^1.0.0, hash.js@^1.0.3:
1050 | version "1.1.3"
1051 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
1052 | dependencies:
1053 | inherits "^2.0.3"
1054 | minimalistic-assert "^1.0.0"
1055 |
1056 | hawk@~6.0.2:
1057 | version "6.0.2"
1058 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
1059 | dependencies:
1060 | boom "4.x.x"
1061 | cryptiles "3.x.x"
1062 | hoek "4.x.x"
1063 | sntp "2.x.x"
1064 |
1065 | hmac-drbg@^1.0.0:
1066 | version "1.0.1"
1067 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
1068 | dependencies:
1069 | hash.js "^1.0.3"
1070 | minimalistic-assert "^1.0.0"
1071 | minimalistic-crypto-utils "^1.0.1"
1072 |
1073 | hoek@4.x.x:
1074 | version "4.2.0"
1075 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
1076 |
1077 | home-or-tmp@^2.0.0:
1078 | version "2.0.0"
1079 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
1080 | dependencies:
1081 | os-homedir "^1.0.0"
1082 | os-tmpdir "^1.0.1"
1083 |
1084 | http-errors@1.6.2, http-errors@~1.6.2:
1085 | version "1.6.2"
1086 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
1087 | dependencies:
1088 | depd "1.1.1"
1089 | inherits "2.0.3"
1090 | setprototypeof "1.0.3"
1091 | statuses ">= 1.3.1 < 2"
1092 |
1093 | http-signature@~1.2.0:
1094 | version "1.2.0"
1095 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
1096 | dependencies:
1097 | assert-plus "^1.0.0"
1098 | jsprim "^1.2.2"
1099 | sshpk "^1.7.0"
1100 |
1101 | iconv-lite@0.4.19:
1102 | version "0.4.19"
1103 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
1104 |
1105 | inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
1106 | version "2.0.3"
1107 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1108 |
1109 | ini@~1.3.0:
1110 | version "1.3.4"
1111 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
1112 |
1113 | invariant@^2.2.2:
1114 | version "2.2.2"
1115 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
1116 | dependencies:
1117 | loose-envify "^1.0.0"
1118 |
1119 | ipaddr.js@1.5.2:
1120 | version "1.5.2"
1121 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
1122 |
1123 | is-finite@^1.0.0:
1124 | version "1.0.2"
1125 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
1126 | dependencies:
1127 | number-is-nan "^1.0.0"
1128 |
1129 | is-fullwidth-code-point@^1.0.0:
1130 | version "1.0.0"
1131 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1132 | dependencies:
1133 | number-is-nan "^1.0.0"
1134 |
1135 | is-function@^1.0.1, is-function@~1.0.0:
1136 | version "1.0.1"
1137 | resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
1138 |
1139 | is-hex-prefixed@1.0.0:
1140 | version "1.0.0"
1141 | resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
1142 |
1143 | is-typedarray@~1.0.0:
1144 | version "1.0.0"
1145 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1146 |
1147 | isarray@~1.0.0:
1148 | version "1.0.0"
1149 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1150 |
1151 | isstream@~0.1.2:
1152 | version "0.1.2"
1153 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
1154 |
1155 | js-sha3@^0.3.1:
1156 | version "0.3.1"
1157 | resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.3.1.tgz#86122802142f0828502a0d1dee1d95e253bb0243"
1158 |
1159 | js-tokens@^3.0.0, js-tokens@^3.0.2:
1160 | version "3.0.2"
1161 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
1162 |
1163 | jsbn@~0.1.0:
1164 | version "0.1.1"
1165 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
1166 |
1167 | jsesc@^1.3.0:
1168 | version "1.3.0"
1169 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
1170 |
1171 | jsesc@~0.5.0:
1172 | version "0.5.0"
1173 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
1174 |
1175 | json-schema-traverse@^0.3.0:
1176 | version "0.3.1"
1177 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
1178 |
1179 | json-schema@0.2.3:
1180 | version "0.2.3"
1181 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
1182 |
1183 | json-stringify-safe@~5.0.1:
1184 | version "5.0.1"
1185 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
1186 |
1187 | json5@^0.5.1:
1188 | version "0.5.1"
1189 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
1190 |
1191 | jsprim@^1.2.2:
1192 | version "1.4.1"
1193 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
1194 | dependencies:
1195 | assert-plus "1.0.0"
1196 | extsprintf "1.3.0"
1197 | json-schema "0.2.3"
1198 | verror "1.10.0"
1199 |
1200 | keccak@^1.0.2:
1201 | version "1.3.0"
1202 | resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.3.0.tgz#3681bd99ad3d0354ddb29b9040c1b6560cce08ac"
1203 | dependencies:
1204 | bindings "^1.2.1"
1205 | inherits "^2.0.3"
1206 | nan "^2.2.1"
1207 | prebuild-install "^2.0.0"
1208 | safe-buffer "^5.1.0"
1209 |
1210 | keccakjs@^0.2.1:
1211 | version "0.2.1"
1212 | resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.1.tgz#1d633af907ef305bbf9f2fa616d56c44561dfa4d"
1213 | dependencies:
1214 | browserify-sha3 "^0.0.1"
1215 | sha3 "^1.1.0"
1216 |
1217 | lodash@^4.17.4:
1218 | version "4.17.4"
1219 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
1220 |
1221 | loose-envify@^1.0.0:
1222 | version "1.3.1"
1223 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
1224 | dependencies:
1225 | js-tokens "^3.0.0"
1226 |
1227 | lru-cache@2:
1228 | version "2.7.3"
1229 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
1230 |
1231 | md5.js@^1.3.4:
1232 | version "1.3.4"
1233 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
1234 | dependencies:
1235 | hash-base "^3.0.0"
1236 | inherits "^2.0.1"
1237 |
1238 | media-typer@0.3.0:
1239 | version "0.3.0"
1240 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
1241 |
1242 | merge-descriptors@1.0.1:
1243 | version "1.0.1"
1244 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
1245 |
1246 | methods@~1.1.2:
1247 | version "1.1.2"
1248 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
1249 |
1250 | mime-db@~1.30.0:
1251 | version "1.30.0"
1252 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
1253 |
1254 | mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17:
1255 | version "2.1.17"
1256 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
1257 | dependencies:
1258 | mime-db "~1.30.0"
1259 |
1260 | mime@1.4.1:
1261 | version "1.4.1"
1262 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
1263 |
1264 | min-document@^2.19.0:
1265 | version "2.19.0"
1266 | resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
1267 | dependencies:
1268 | dom-walk "^0.1.0"
1269 |
1270 | minimalistic-assert@^1.0.0:
1271 | version "1.0.0"
1272 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
1273 |
1274 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
1275 | version "1.0.1"
1276 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
1277 |
1278 | minimatch@0.3:
1279 | version "0.3.0"
1280 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
1281 | dependencies:
1282 | lru-cache "2"
1283 | sigmund "~1.0.0"
1284 |
1285 | minimatch@^3.0.4:
1286 | version "3.0.4"
1287 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
1288 | dependencies:
1289 | brace-expansion "^1.1.7"
1290 |
1291 | minimist@0.0.8:
1292 | version "0.0.8"
1293 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
1294 |
1295 | minimist@^1.2.0:
1296 | version "1.2.0"
1297 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1298 |
1299 | mkdirp@^0.5.1:
1300 | version "0.5.1"
1301 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
1302 | dependencies:
1303 | minimist "0.0.8"
1304 |
1305 | ms@2.0.0:
1306 | version "2.0.0"
1307 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
1308 |
1309 | nan@^2.0.5, nan@^2.2.1:
1310 | version "2.7.0"
1311 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
1312 |
1313 | nano-json-stream-parser@^0.1.2:
1314 | version "0.1.2"
1315 | resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
1316 |
1317 | negotiator@0.6.1:
1318 | version "0.6.1"
1319 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
1320 |
1321 | node-abi@^2.1.1:
1322 | version "2.1.2"
1323 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.2.tgz#4da6caceb6685fcd31e7dd1994ef6bb7d0a9c0b2"
1324 | dependencies:
1325 | semver "^5.4.1"
1326 |
1327 | noop-logger@^0.1.1:
1328 | version "0.1.1"
1329 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
1330 |
1331 | npmlog@^4.0.1:
1332 | version "4.1.2"
1333 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
1334 | dependencies:
1335 | are-we-there-yet "~1.1.2"
1336 | console-control-strings "~1.1.0"
1337 | gauge "~2.7.3"
1338 | set-blocking "~2.0.0"
1339 |
1340 | number-is-nan@^1.0.0:
1341 | version "1.0.1"
1342 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
1343 |
1344 | number-to-bn@1.7.0:
1345 | version "1.7.0"
1346 | resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
1347 | dependencies:
1348 | bn.js "4.11.6"
1349 | strip-hex-prefix "1.0.0"
1350 |
1351 | oauth-sign@~0.8.2:
1352 | version "0.8.2"
1353 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
1354 |
1355 | object-assign@^3.0.0:
1356 | version "3.0.0"
1357 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
1358 |
1359 | object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0:
1360 | version "4.1.1"
1361 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1362 |
1363 | object-inspect@~0.4.0:
1364 | version "0.4.0"
1365 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec"
1366 |
1367 | on-finished@~2.3.0:
1368 | version "2.3.0"
1369 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
1370 | dependencies:
1371 | ee-first "1.1.1"
1372 |
1373 | once@^1.3.1, once@^1.4.0:
1374 | version "1.4.0"
1375 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1376 | dependencies:
1377 | wrappy "1"
1378 |
1379 | os-homedir@^1.0.0, os-homedir@^1.0.1:
1380 | version "1.0.2"
1381 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
1382 |
1383 | os-tmpdir@^1.0.1:
1384 | version "1.0.2"
1385 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
1386 |
1387 | parse-headers@^2.0.0:
1388 | version "2.0.1"
1389 | resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536"
1390 | dependencies:
1391 | for-each "^0.3.2"
1392 | trim "0.0.1"
1393 |
1394 | parseurl@~1.3.2:
1395 | version "1.3.2"
1396 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
1397 |
1398 | path-is-absolute@^1.0.1:
1399 | version "1.0.1"
1400 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1401 |
1402 | path-to-regexp@0.1.7:
1403 | version "0.1.7"
1404 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
1405 |
1406 | pathval@^1.0.0:
1407 | version "1.1.0"
1408 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
1409 |
1410 | performance-now@^2.1.0:
1411 | version "2.1.0"
1412 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
1413 |
1414 | prebuild-install@^2.0.0:
1415 | version "2.3.0"
1416 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.3.0.tgz#19481247df728b854ab57b187ce234211311b485"
1417 | dependencies:
1418 | expand-template "^1.0.2"
1419 | github-from-package "0.0.0"
1420 | minimist "^1.2.0"
1421 | mkdirp "^0.5.1"
1422 | node-abi "^2.1.1"
1423 | noop-logger "^0.1.1"
1424 | npmlog "^4.0.1"
1425 | os-homedir "^1.0.1"
1426 | pump "^1.0.1"
1427 | rc "^1.1.6"
1428 | simple-get "^1.4.2"
1429 | tar-fs "^1.13.0"
1430 | tunnel-agent "^0.6.0"
1431 | xtend "4.0.1"
1432 |
1433 | private@^0.1.6, private@^0.1.7:
1434 | version "0.1.8"
1435 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
1436 |
1437 | process-nextick-args@~1.0.6:
1438 | version "1.0.7"
1439 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
1440 |
1441 | process@~0.5.1:
1442 | version "0.5.2"
1443 | resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
1444 |
1445 | proxy-addr@~2.0.2:
1446 | version "2.0.2"
1447 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
1448 | dependencies:
1449 | forwarded "~0.1.2"
1450 | ipaddr.js "1.5.2"
1451 |
1452 | pump@^1.0.0, pump@^1.0.1:
1453 | version "1.0.2"
1454 | resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51"
1455 | dependencies:
1456 | end-of-stream "^1.1.0"
1457 | once "^1.3.1"
1458 |
1459 | punycode@^1.4.1:
1460 | version "1.4.1"
1461 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
1462 |
1463 | qs@6.5.1, qs@~6.5.1:
1464 | version "6.5.1"
1465 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
1466 |
1467 | query-string@^2.4.0:
1468 | version "2.4.2"
1469 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-2.4.2.tgz#7db0666420804baa92ae9f268962855a76143dfb"
1470 | dependencies:
1471 | strict-uri-encode "^1.0.0"
1472 |
1473 | randomhex@0.1.5:
1474 | version "0.1.5"
1475 | resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585"
1476 |
1477 | range-parser@~1.2.0:
1478 | version "1.2.0"
1479 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
1480 |
1481 | raw-body@2.3.2:
1482 | version "2.3.2"
1483 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
1484 | dependencies:
1485 | bytes "3.0.0"
1486 | http-errors "1.6.2"
1487 | iconv-lite "0.4.19"
1488 | unpipe "1.0.0"
1489 |
1490 | rc@^1.1.6:
1491 | version "1.2.2"
1492 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
1493 | dependencies:
1494 | deep-extend "~0.4.0"
1495 | ini "~1.3.0"
1496 | minimist "^1.2.0"
1497 | strip-json-comments "~2.0.1"
1498 |
1499 | readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6:
1500 | version "2.3.3"
1501 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
1502 | dependencies:
1503 | core-util-is "~1.0.0"
1504 | inherits "~2.0.3"
1505 | isarray "~1.0.0"
1506 | process-nextick-args "~1.0.6"
1507 | safe-buffer "~5.1.1"
1508 | string_decoder "~1.0.3"
1509 | util-deprecate "~1.0.1"
1510 |
1511 | regenerate@^1.2.1:
1512 | version "1.3.3"
1513 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
1514 |
1515 | regenerator-runtime@^0.10.5:
1516 | version "0.10.5"
1517 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
1518 |
1519 | regenerator-runtime@^0.11.0:
1520 | version "0.11.0"
1521 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1"
1522 |
1523 | regenerator-transform@^0.10.0:
1524 | version "0.10.1"
1525 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
1526 | dependencies:
1527 | babel-runtime "^6.18.0"
1528 | babel-types "^6.19.0"
1529 | private "^0.1.6"
1530 |
1531 | regexpu-core@^2.0.0:
1532 | version "2.0.0"
1533 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
1534 | dependencies:
1535 | regenerate "^1.2.1"
1536 | regjsgen "^0.2.0"
1537 | regjsparser "^0.1.4"
1538 |
1539 | regjsgen@^0.2.0:
1540 | version "0.2.0"
1541 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
1542 |
1543 | regjsparser@^0.1.4:
1544 | version "0.1.5"
1545 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
1546 | dependencies:
1547 | jsesc "~0.5.0"
1548 |
1549 | repeating@^2.0.0:
1550 | version "2.0.1"
1551 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
1552 | dependencies:
1553 | is-finite "^1.0.0"
1554 |
1555 | request@^2.79.0:
1556 | version "2.83.0"
1557 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
1558 | dependencies:
1559 | aws-sign2 "~0.7.0"
1560 | aws4 "^1.6.0"
1561 | caseless "~0.12.0"
1562 | combined-stream "~1.0.5"
1563 | extend "~3.0.1"
1564 | forever-agent "~0.6.1"
1565 | form-data "~2.3.1"
1566 | har-validator "~5.0.3"
1567 | hawk "~6.0.2"
1568 | http-signature "~1.2.0"
1569 | is-typedarray "~1.0.0"
1570 | isstream "~0.1.2"
1571 | json-stringify-safe "~5.0.1"
1572 | mime-types "~2.1.17"
1573 | oauth-sign "~0.8.2"
1574 | performance-now "^2.1.0"
1575 | qs "~6.5.1"
1576 | safe-buffer "^5.1.1"
1577 | stringstream "~0.0.5"
1578 | tough-cookie "~2.3.3"
1579 | tunnel-agent "^0.6.0"
1580 | uuid "^3.1.0"
1581 |
1582 | resumer@~0.0.0:
1583 | version "0.0.0"
1584 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
1585 | dependencies:
1586 | through "~2.3.4"
1587 |
1588 | ripemd160@^2.0.0:
1589 | version "2.0.1"
1590 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
1591 | dependencies:
1592 | hash-base "^2.0.0"
1593 | inherits "^2.0.1"
1594 |
1595 | rlp@^2.0.0:
1596 | version "2.0.0"
1597 | resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0"
1598 |
1599 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
1600 | version "5.1.1"
1601 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
1602 |
1603 | secp256k1@^3.0.1:
1604 | version "3.3.1"
1605 | resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.3.1.tgz#d1d325519db714789c11ec0450d4b9a3aa01eb1a"
1606 | dependencies:
1607 | bindings "^1.2.1"
1608 | bip66 "^1.1.3"
1609 | bn.js "^4.11.3"
1610 | create-hash "^1.1.2"
1611 | drbg.js "^1.0.1"
1612 | elliptic "^6.2.3"
1613 | nan "^2.2.1"
1614 | prebuild-install "^2.0.0"
1615 | safe-buffer "^5.1.0"
1616 |
1617 | semver@^5.4.1:
1618 | version "5.4.1"
1619 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
1620 |
1621 | send@0.16.1:
1622 | version "0.16.1"
1623 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
1624 | dependencies:
1625 | debug "2.6.9"
1626 | depd "~1.1.1"
1627 | destroy "~1.0.4"
1628 | encodeurl "~1.0.1"
1629 | escape-html "~1.0.3"
1630 | etag "~1.8.1"
1631 | fresh "0.5.2"
1632 | http-errors "~1.6.2"
1633 | mime "1.4.1"
1634 | ms "2.0.0"
1635 | on-finished "~2.3.0"
1636 | range-parser "~1.2.0"
1637 | statuses "~1.3.1"
1638 |
1639 | serve-static@1.13.1:
1640 | version "1.13.1"
1641 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
1642 | dependencies:
1643 | encodeurl "~1.0.1"
1644 | escape-html "~1.0.3"
1645 | parseurl "~1.3.2"
1646 | send "0.16.1"
1647 |
1648 | servify@^0.1.12:
1649 | version "0.1.12"
1650 | resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95"
1651 | dependencies:
1652 | body-parser "^1.16.0"
1653 | cors "^2.8.1"
1654 | express "^4.14.0"
1655 | request "^2.79.0"
1656 | xhr "^2.3.3"
1657 |
1658 | set-blocking@~2.0.0:
1659 | version "2.0.0"
1660 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1661 |
1662 | setprototypeof@1.0.3:
1663 | version "1.0.3"
1664 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
1665 |
1666 | setprototypeof@1.1.0:
1667 | version "1.1.0"
1668 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
1669 |
1670 | sha.js@^2.4.0, sha.js@^2.4.8:
1671 | version "2.4.9"
1672 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d"
1673 | dependencies:
1674 | inherits "^2.0.1"
1675 | safe-buffer "^5.0.1"
1676 |
1677 | sha3@^1.1.0:
1678 | version "1.2.0"
1679 | resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.0.tgz#6989f1b70a498705876a373e2c62ace96aa9399a"
1680 | dependencies:
1681 | nan "^2.0.5"
1682 |
1683 | sigmund@~1.0.0:
1684 | version "1.0.1"
1685 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
1686 |
1687 | signal-exit@^3.0.0:
1688 | version "3.0.2"
1689 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
1690 |
1691 | simple-get@^1.4.2, simple-get@^1.4.3:
1692 | version "1.4.3"
1693 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb"
1694 | dependencies:
1695 | once "^1.3.1"
1696 | unzip-response "^1.0.0"
1697 | xtend "^4.0.0"
1698 |
1699 | slash@^1.0.0:
1700 | version "1.0.0"
1701 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
1702 |
1703 | sntp@2.x.x:
1704 | version "2.1.0"
1705 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
1706 | dependencies:
1707 | hoek "4.x.x"
1708 |
1709 | source-map-support@^0.4.15:
1710 | version "0.4.18"
1711 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
1712 | dependencies:
1713 | source-map "^0.5.6"
1714 |
1715 | source-map@^0.5.6:
1716 | version "0.5.7"
1717 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
1718 |
1719 | sshpk@^1.7.0:
1720 | version "1.13.1"
1721 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
1722 | dependencies:
1723 | asn1 "~0.2.3"
1724 | assert-plus "^1.0.0"
1725 | dashdash "^1.12.0"
1726 | getpass "^0.1.1"
1727 | optionalDependencies:
1728 | bcrypt-pbkdf "^1.0.0"
1729 | ecc-jsbn "~0.1.1"
1730 | jsbn "~0.1.0"
1731 | tweetnacl "~0.14.0"
1732 |
1733 | "statuses@>= 1.3.1 < 2", statuses@~1.3.1:
1734 | version "1.3.1"
1735 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
1736 |
1737 | strict-uri-encode@^1.0.0:
1738 | version "1.1.0"
1739 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
1740 |
1741 | string-width@^1.0.1, string-width@^1.0.2:
1742 | version "1.0.2"
1743 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
1744 | dependencies:
1745 | code-point-at "^1.0.0"
1746 | is-fullwidth-code-point "^1.0.0"
1747 | strip-ansi "^3.0.0"
1748 |
1749 | string_decoder@~1.0.3:
1750 | version "1.0.3"
1751 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
1752 | dependencies:
1753 | safe-buffer "~5.1.0"
1754 |
1755 | stringstream@~0.0.5:
1756 | version "0.0.5"
1757 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
1758 |
1759 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
1760 | version "3.0.1"
1761 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
1762 | dependencies:
1763 | ansi-regex "^2.0.0"
1764 |
1765 | strip-hex-prefix@1.0.0:
1766 | version "1.0.0"
1767 | resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
1768 | dependencies:
1769 | is-hex-prefixed "1.0.0"
1770 |
1771 | strip-json-comments@~2.0.1:
1772 | version "2.0.1"
1773 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1774 |
1775 | supports-color@^2.0.0:
1776 | version "2.0.0"
1777 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
1778 |
1779 | tape@^3.0.3:
1780 | version "3.6.1"
1781 | resolved "https://registry.yarnpkg.com/tape/-/tape-3.6.1.tgz#4893dd53e280a5f58c0ceb30c2c0ebb3bcd51e1f"
1782 | dependencies:
1783 | deep-equal "~0.2.0"
1784 | defined "~0.0.0"
1785 | glob "~3.2.9"
1786 | inherits "~2.0.1"
1787 | object-inspect "~0.4.0"
1788 | resumer "~0.0.0"
1789 | through "~2.3.4"
1790 |
1791 | tar-fs@^1.13.0:
1792 | version "1.16.0"
1793 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896"
1794 | dependencies:
1795 | chownr "^1.0.1"
1796 | mkdirp "^0.5.1"
1797 | pump "^1.0.0"
1798 | tar-stream "^1.1.2"
1799 |
1800 | tar-stream@^1.1.2:
1801 | version "1.5.4"
1802 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016"
1803 | dependencies:
1804 | bl "^1.0.0"
1805 | end-of-stream "^1.0.0"
1806 | readable-stream "^2.0.0"
1807 | xtend "^4.0.0"
1808 |
1809 | through@~2.3.4:
1810 | version "2.3.8"
1811 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
1812 |
1813 | timed-out@^2.0.0:
1814 | version "2.0.0"
1815 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a"
1816 |
1817 | to-fast-properties@^1.0.3:
1818 | version "1.0.3"
1819 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
1820 |
1821 | tough-cookie@~2.3.3:
1822 | version "2.3.3"
1823 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
1824 | dependencies:
1825 | punycode "^1.4.1"
1826 |
1827 | trim-right@^1.0.1:
1828 | version "1.0.1"
1829 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
1830 |
1831 | trim@0.0.1:
1832 | version "0.0.1"
1833 | resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
1834 |
1835 | tunnel-agent@^0.6.0:
1836 | version "0.6.0"
1837 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
1838 | dependencies:
1839 | safe-buffer "^5.0.1"
1840 |
1841 | tweetnacl@^0.14.3, tweetnacl@~0.14.0:
1842 | version "0.14.5"
1843 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
1844 |
1845 | type-detect@^4.0.0:
1846 | version "4.0.3"
1847 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea"
1848 |
1849 | type-is@~1.6.15:
1850 | version "1.6.15"
1851 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
1852 | dependencies:
1853 | media-typer "0.3.0"
1854 | mime-types "~2.1.15"
1855 |
1856 | ultron@~1.1.0:
1857 | version "1.1.0"
1858 | resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864"
1859 |
1860 | underscore@1.8.3:
1861 | version "1.8.3"
1862 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
1863 |
1864 | unpipe@1.0.0, unpipe@~1.0.0:
1865 | version "1.0.0"
1866 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1867 |
1868 | unzip-response@^1.0.0:
1869 | version "1.0.2"
1870 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe"
1871 |
1872 | url-set-query@^1.0.0:
1873 | version "1.0.0"
1874 | resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
1875 |
1876 | utf8@2.1.1:
1877 | version "2.1.1"
1878 | resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768"
1879 |
1880 | util-deprecate@~1.0.1:
1881 | version "1.0.2"
1882 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1883 |
1884 | utils-merge@1.0.1:
1885 | version "1.0.1"
1886 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1887 |
1888 | uuid@^3.1.0:
1889 | version "3.1.0"
1890 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
1891 |
1892 | vary@^1, vary@~1.1.2:
1893 | version "1.1.2"
1894 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1895 |
1896 | verror@1.10.0:
1897 | version "1.10.0"
1898 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
1899 | dependencies:
1900 | assert-plus "^1.0.0"
1901 | core-util-is "1.0.2"
1902 | extsprintf "^1.2.0"
1903 |
1904 | web3-utils@^1.0.0-beta.22:
1905 | version "1.0.0-beta.24"
1906 | resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.24.tgz#03a94127cf9cbfc66467608ef4b8055efe8921ea"
1907 | dependencies:
1908 | bn.js "4.11.6"
1909 | eth-lib "^0.1.27"
1910 | ethjs-unit "0.1.6"
1911 | number-to-bn "1.7.0"
1912 | randomhex "0.1.5"
1913 | underscore "1.8.3"
1914 | utf8 "2.1.1"
1915 |
1916 | wide-align@^1.1.0:
1917 | version "1.1.2"
1918 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
1919 | dependencies:
1920 | string-width "^1.0.2"
1921 |
1922 | wrappy@1:
1923 | version "1.0.2"
1924 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1925 |
1926 | ws@^3.0.0:
1927 | version "3.3.0"
1928 | resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.0.tgz#f8b948a1378af7efa702f5513da08dd516897c31"
1929 | dependencies:
1930 | async-limiter "~1.0.0"
1931 | safe-buffer "~5.1.0"
1932 | ultron "~1.1.0"
1933 |
1934 | xhr-request-promise@^0.1.2:
1935 | version "0.1.2"
1936 | resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz#343c44d1ee7726b8648069682d0f840c83b4261d"
1937 | dependencies:
1938 | xhr-request "^1.0.1"
1939 |
1940 | xhr-request@^1.0.1:
1941 | version "1.0.1"
1942 | resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.0.1.tgz#83f08a4b20beec67a8c1c728e8102f4c9eecbdda"
1943 | dependencies:
1944 | buffer-to-arraybuffer "0.0.2"
1945 | object-assign "^3.0.0"
1946 | query-string "^2.4.0"
1947 | simple-get "^1.4.3"
1948 | timed-out "^2.0.0"
1949 | url-set-query "^1.0.0"
1950 | xhr "^2.0.4"
1951 |
1952 | xhr@^2.0.4, xhr@^2.3.3:
1953 | version "2.4.0"
1954 | resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993"
1955 | dependencies:
1956 | global "~4.3.0"
1957 | is-function "^1.0.1"
1958 | parse-headers "^2.0.0"
1959 | xtend "^4.0.0"
1960 |
1961 | xtend@4.0.1, xtend@^4.0.0:
1962 | version "4.0.1"
1963 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
1964 |
1965 | zeppelin-solidity@^1.3.0:
1966 | version "1.3.0"
1967 | resolved "https://registry.yarnpkg.com/zeppelin-solidity/-/zeppelin-solidity-1.3.0.tgz#066ab35d7e07510da391d1dbaaf319e0d06fcfc6"
1968 |
--------------------------------------------------------------------------------