├── 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 | --------------------------------------------------------------------------------