Use kredits-contracts from truffle-kredits
This commit is contained in:
		
							parent
							
								
									050e8ce79f
								
							
						
					
					
						commit
						e99addf37e
					
				
							
								
								
									
										414
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										414
									
								
								index.js
									
									
									
									
									
								
							@ -6,41 +6,30 @@
 | 
				
			|||||||
//   KREDITS_ROOM: Kredit proposals are posted to this chatroom
 | 
					//   KREDITS_ROOM: Kredit proposals are posted to this chatroom
 | 
				
			||||||
//   KREDITS_WALLET_PATH: Path to a etherum wallet JSON file
 | 
					//   KREDITS_WALLET_PATH: Path to a etherum wallet JSON file
 | 
				
			||||||
//   KREDITS_WALLET_PASSWORD: Wallet password
 | 
					//   KREDITS_WALLET_PASSWORD: Wallet password
 | 
				
			||||||
//   KREDITS_CONTRACT_ADDRESS: Address of Kredits contract
 | 
					//   KREDITS_PROVIDER_URL: Ethereum JSON-RPC URL (default 'http://localhost:7545')
 | 
				
			||||||
//   KREDITS_PROVIDER_URL: Ethereum JSON-RPC URL (default 'http://localhost:8545')
 | 
					 | 
				
			||||||
//   IPFS_API_HOST: Host/domain (default 'localhost')
 | 
					//   IPFS_API_HOST: Host/domain (default 'localhost')
 | 
				
			||||||
//   IPFS_API_PORT: Port number (default '5001')
 | 
					//   IPFS_API_PORT: Port number (default '5001')
 | 
				
			||||||
//   IPFS_API_PROTOCOL: Protocol, e.g. 'http' or 'https' (default 'http')
 | 
					//   IPFS_API_PROTOCOL: Protocol, e.g. 'http' or 'https' (default 'http')
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const fs = require('fs');
 | 
					const fs = require('fs');
 | 
				
			||||||
const util = require('util');
 | 
					const util = require('util');
 | 
				
			||||||
const fetch = require('node-fetch');
 | 
					const fetch = require('node-fetch');
 | 
				
			||||||
 | 
					 | 
				
			||||||
const ethers = require('ethers');
 | 
					const ethers = require('ethers');
 | 
				
			||||||
 | 
					const kredits = require('kredits-contracts');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const kredits = require('./kredits');
 | 
					const walletPath  = process.env.KREDITS_WALLET_PATH || './wallet.json';
 | 
				
			||||||
 | 
					const walletJson  = fs.readFileSync(walletPath);
 | 
				
			||||||
 | 
					const providerUrl = process.env.KREDITS_PROVIDER_URL || 'http://localhost:7545';
 | 
				
			||||||
 | 
					const networkId = parseInt(process.env.KREDITS_NETWORK_ID || 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(async function() {
 | 
					const ipfsConfig = {
 | 
				
			||||||
  "use strict";
 | 
					  host: process.env.IPFS_API_HOST || 'localhost',
 | 
				
			||||||
 | 
					  port: process.env.IPFS_API_PORT || '5001',
 | 
				
			||||||
 | 
					  protocol: process.env.IPFS_API_PROTOCOL || 'http'
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					module.exports = async function(robot) {
 | 
				
			||||||
  // Instantiate ethereum client and wallet
 | 
					 | 
				
			||||||
  //
 | 
					 | 
				
			||||||
  let walletPath  = process.env.KREDITS_WALLET_PATH || './wallet.json';
 | 
					 | 
				
			||||||
  let walletJson  = fs.readFileSync(walletPath);
 | 
					 | 
				
			||||||
  let providerUrl = process.env.KREDITS_PROVIDER_URL || 'http://localhost:8545';
 | 
					 | 
				
			||||||
  let networkId = parseInt(process.env.KREDITS_NETWORK_ID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  let ipfsConfig = {};
 | 
					 | 
				
			||||||
  if (process.env.IPFS_API_HOST) {
 | 
					 | 
				
			||||||
    ipfsConfig = {
 | 
					 | 
				
			||||||
      host: process.env.IPFS_API_HOST,
 | 
					 | 
				
			||||||
      port: process.env.IPFS_API_PORT,
 | 
					 | 
				
			||||||
      protocol: process.env.IPFS_API_PROTOCOL
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const wallet = await ethers.Wallet.fromEncryptedWallet(walletJson, process.env.KREDITS_WALLET_PASSWORD);
 | 
					  const wallet = await ethers.Wallet.fromEncryptedWallet(walletJson, process.env.KREDITS_WALLET_PASSWORD);
 | 
				
			||||||
  const ethProvider = new ethers.providers.JsonRpcProvider(providerUrl, {chainId: networkId});
 | 
					  const ethProvider = new ethers.providers.JsonRpcProvider(providerUrl, {chainId: networkId});
 | 
				
			||||||
@ -51,215 +40,212 @@ const kredits = require('./kredits');
 | 
				
			|||||||
  const Contributor = kredits.Contributor;
 | 
					  const Contributor = kredits.Contributor;
 | 
				
			||||||
  const Operator = kredits.Operator;
 | 
					  const Operator = kredits.Operator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  module.exports = function(robot) {
 | 
					  function messageRoom(message) {
 | 
				
			||||||
 | 
					    robot.messageRoom(process.env.KREDITS_ROOM, message);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function messageRoom(message) {
 | 
					  robot.logger.info('[hubot-kredits] Wallet address: ' + wallet.address);
 | 
				
			||||||
      robot.messageRoom(process.env.KREDITS_ROOM, message);
 | 
					
 | 
				
			||||||
 | 
					  ethProvider.getBalance(wallet.address).then(balance => {
 | 
				
			||||||
 | 
					    robot.logger.info('[hubot-kredits] Wallet balance: ' + balance.toString());
 | 
				
			||||||
 | 
					    if (balance.toNumber() <= 0) {
 | 
				
			||||||
 | 
					      messageRoom(`Yo gang, I\'m broke! Please drop me some ETH to ${hubotWalletAddress}. kthxbai.`);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    robot.logger.info('[hubot-kredits] Wallet address: ' + wallet.address);
 | 
					  robot.respond(/got ETH\?/i, res => {
 | 
				
			||||||
 | 
					    ethProvider.getBalance(wallet.address).then((balance) => {
 | 
				
			||||||
    ethProvider.getBalance(wallet.address).then(balance => {
 | 
					      res.send(`my wallet contains ${ethers.utils.formatEther(balance)} ETH`);
 | 
				
			||||||
      robot.logger.info('[hubot-kredits] Wallet balance: ' + balance.toString());
 | 
					 | 
				
			||||||
      if (balance.toNumber() <= 0) {
 | 
					 | 
				
			||||||
        messageRoom(`Yo gang, I\'m broke! Please drop me some ETH to ${hubotWalletAddress}. kthxbai.`);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    robot.respond(/got ETH\?/i, res => {
 | 
					  robot.respond(/propose (\d*)\s?\S*\s?to (\S+)(?:\sfor (.*))?$"/i, res => {
 | 
				
			||||||
      ethProvider.getBalance(wallet.address).then((balance) => {
 | 
					    let amount = res.match[1];
 | 
				
			||||||
        res.send(`my wallet contains ${ethers.utils.formatEther(balance)} ETH`);
 | 
					    let githubUser = res.match[2];
 | 
				
			||||||
      });
 | 
					    let description = res.match[3];
 | 
				
			||||||
 | 
					    let url = null;
 | 
				
			||||||
 | 
					    createProposal(githubUser, amount, description, url).then((result) => {
 | 
				
			||||||
 | 
					      messageRoom('Proposal created');
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    robot.respond(/propose (\d*)\s?\S*\s?to (\S+)(?:\sfor (.*))?$"/i, res => {
 | 
					  robot.respond(/list open proposals/i, res => {
 | 
				
			||||||
      let amount = res.match[1];
 | 
					    Operator.all().then((proposals) => {
 | 
				
			||||||
      let githubUser = res.match[2];
 | 
					      proposals.forEach((proposal) => {
 | 
				
			||||||
      let description = res.match[3];
 | 
					        if (!proposal.executed) {
 | 
				
			||||||
      let url = null;
 | 
					          Contributor.getById(proposal.contributorId).then((contributor) => {
 | 
				
			||||||
      createProposal(githubUser, amount, description, url).then((result) => {
 | 
					            messageRoom(`* ${proposal.amount} kredits to ${contributor.name} for ${proposal.description}`);
 | 
				
			||||||
        messageRoom('Proposal created');
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    robot.respond(/list open proposals/i, res => {
 | 
					 | 
				
			||||||
      Operator.all().then((proposals) => {
 | 
					 | 
				
			||||||
        proposals.forEach((proposal) => {
 | 
					 | 
				
			||||||
          if (!proposal.executed) {
 | 
					 | 
				
			||||||
            Contributor.getById(proposal.contributorId).then((contributor) => {
 | 
					 | 
				
			||||||
              messageRoom(`* ${proposal.amount} kredits to ${contributor.name} for ${proposal.description}`);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function getContributorByGithubUser(username) {
 | 
					 | 
				
			||||||
      return Contributor.all().then(contributors => {
 | 
					 | 
				
			||||||
        let contrib = contributors.find(c => {
 | 
					 | 
				
			||||||
          return c.github_username === username;
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        if (!contrib) {
 | 
					 | 
				
			||||||
          throw new Errro(`No contributor found for ${username}`);A
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          return contrib;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function createProposal(githubUser, amount, description, url, details) {
 | 
					 | 
				
			||||||
      return getContributorByGithubUser(githubUser).then((contributor) => {
 | 
					 | 
				
			||||||
        robot.logger.debug(`[kredits] Creating proposal to issue ${amount}₭S to ${githubUser} for ${url}...`);
 | 
					 | 
				
			||||||
        let contributionAttr = {
 | 
					 | 
				
			||||||
          contributorIpfsHash: contributor.ipfsHash,
 | 
					 | 
				
			||||||
          url,
 | 
					 | 
				
			||||||
          description,
 | 
					 | 
				
			||||||
          details,
 | 
					 | 
				
			||||||
          kind: 'dev'
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        return Operator.add(contributionAttr).then((result) => {
 | 
					 | 
				
			||||||
            robot.logger.debug('[kredits] proposal created:', util.inspect(result));
 | 
					 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
        }).catch(() => {
 | 
					 | 
				
			||||||
          messageRoom(`I wanted to propose giving kredits to ${githubUser} for ${url}, but I can't find their contact data. Please add them as a contributor: https://kredits.kosmos.org`);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function amountFromIssueLabels(issue) {
 | 
					 | 
				
			||||||
      let kreditsLabel = issue.labels.map(l => l.name)
 | 
					 | 
				
			||||||
                              .filter(n => n.match(/^kredits/))[0];
 | 
					 | 
				
			||||||
      // No label, no kredits
 | 
					 | 
				
			||||||
      if (typeof kreditsLabel === 'undefined') { return 0; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // TODO move to config maybe?
 | 
					 | 
				
			||||||
      let amount;
 | 
					 | 
				
			||||||
      switch(kreditsLabel) {
 | 
					 | 
				
			||||||
        case 'kredits-1':
 | 
					 | 
				
			||||||
          amount = 50;
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        case 'kredits-2':
 | 
					 | 
				
			||||||
          amount = 150;
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        case 'kredits-3':
 | 
					 | 
				
			||||||
          amount = 500;
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      return amount;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function handleGitHubIssueClosed(data) {
 | 
					 | 
				
			||||||
      return new Promise((resolve/*, reject*/) => {
 | 
					 | 
				
			||||||
        // fs.writeFileSync('tmp/github-issue.json', JSON.stringify(data, null, 4));
 | 
					 | 
				
			||||||
        let recipients;
 | 
					 | 
				
			||||||
        let issue        = data.issue;
 | 
					 | 
				
			||||||
        let assignees    = issue.assignees.map(a => a.login);
 | 
					 | 
				
			||||||
        let web_url      = issue.html_url;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let amount = amountFromIssueLabels(issue);
 | 
					 | 
				
			||||||
        if (amount === 0) { resolve(); return; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (assignees.length > 0) {
 | 
					 | 
				
			||||||
          recipients = assignees;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          recipients = [issue.user.login];
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        let repoName = issue.repository_url.match(/.*\/(.+\/.+)$/)[1];
 | 
					 | 
				
			||||||
        let description = `${repoName}: ${issue.title}`;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        recipients.forEach(recipient => {
 | 
					 | 
				
			||||||
          createProposal(recipient, amount, description, web_url, issue)
 | 
					 | 
				
			||||||
            .catch(err => robot.logger.error(err));
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        resolve();
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function handleGitHubPullRequestClosed(data) {
 | 
					  function getContributorByGithubUser(username) {
 | 
				
			||||||
      return new Promise((resolve, reject) => {
 | 
					    return Contributor.all().then(contributors => {
 | 
				
			||||||
        // fs.writeFileSync('tmp/github-pr.json', JSON.stringify(data, null, 4));
 | 
					      let contrib = contributors.find(c => {
 | 
				
			||||||
        let recipients;
 | 
					        return c.github_username === username;
 | 
				
			||||||
        let pull_request = data.pull_request;
 | 
					 | 
				
			||||||
        let assignees    = pull_request.assignees.map(a => a.login);
 | 
					 | 
				
			||||||
        let web_url      = pull_request._links.html.href;
 | 
					 | 
				
			||||||
        let pr_issue_url = pull_request.issue_url;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (assignees.length > 0) {
 | 
					 | 
				
			||||||
          recipients = assignees;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          recipients = [pull_request.user.login];
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        fetch(pr_issue_url)
 | 
					 | 
				
			||||||
          .then(response => {
 | 
					 | 
				
			||||||
            if (response.status >= 400) {
 | 
					 | 
				
			||||||
              reject('Bad response from fetching PR issue');
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return response.json();
 | 
					 | 
				
			||||||
          })
 | 
					 | 
				
			||||||
          .then(issue => {
 | 
					 | 
				
			||||||
            // fs.writeFileSync('tmp/github-pr-issue.json', JSON.stringify(data, null, 4));
 | 
					 | 
				
			||||||
            let amount = amountFromIssueLabels(issue);
 | 
					 | 
				
			||||||
            if (amount === 0) { resolve(); return; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            let repoName = pull_request.base.repo.full_name;
 | 
					 | 
				
			||||||
            let description = `${repoName}: ${pull_request.title}`;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            let proposalPromisses = [];
 | 
					 | 
				
			||||||
            recipients.forEach(recipient => {
 | 
					 | 
				
			||||||
              proposalPromisses.push(
 | 
					 | 
				
			||||||
                createProposal(recipient, amount, description, web_url, pull_request)
 | 
					 | 
				
			||||||
                  .catch(err => robot.logger.error(err))
 | 
					 | 
				
			||||||
              );
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            return Promise.all(proposalPromisses);
 | 
					 | 
				
			||||||
          });
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					      if (!contrib) {
 | 
				
			||||||
 | 
					        throw new Errro(`No contributor found for ${username}`);A
 | 
				
			||||||
 | 
					 | 
				
			||||||
    robot.router.post('/incoming/kredits/github/'+process.env.KREDITS_WEBHOOK_TOKEN, (req, res) => {
 | 
					 | 
				
			||||||
      let evt = req.header('X-GitHub-Event');
 | 
					 | 
				
			||||||
      let data = req.body;
 | 
					 | 
				
			||||||
      // For some reason data is contained in a payload property on one
 | 
					 | 
				
			||||||
      // machine, but directly in the root of the object on others
 | 
					 | 
				
			||||||
      if (data.payload) { data = JSON.parse(data.payload); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      robot.logger.info(`Received GitHub hook. Event: ${evt}, action: ${data.action}`);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (evt === 'pull_request' && data.action === 'closed') {
 | 
					 | 
				
			||||||
        handleGitHubPullRequestClosed(data).then(() => res.send(200));
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else if (evt === 'issues' && data.action === 'closed') {
 | 
					 | 
				
			||||||
        handleGitHubIssueClosed(data).then(() => res.send(200));
 | 
					 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        res.send(200);
 | 
					        return contrib;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function watchContractEvents() {
 | 
					  function createProposal(githubUser, amount, description, url, details) {
 | 
				
			||||||
      ethProvider.getBlockNumber().then((blockNumber) => {
 | 
					    return getContributorByGithubUser(githubUser).then((contributor) => {
 | 
				
			||||||
        // current block is the last mined one, thus we check from the next
 | 
					      robot.logger.debug(`[kredits] Creating proposal to issue ${amount}₭S to ${githubUser} for ${url}...`);
 | 
				
			||||||
        // mined one onwards to prevent getting previous events
 | 
					      let contributionAttr = {
 | 
				
			||||||
        let nextBlock = blockNumber + 1;
 | 
					        contributorIpfsHash: contributor.ipfsHash,
 | 
				
			||||||
        robot.logger.debug(`[kredits] watching events from block ${nextBlock} onward`);
 | 
					        url,
 | 
				
			||||||
        ethProvider.resetEventsBlock(nextBlock);
 | 
					        description,
 | 
				
			||||||
 | 
					        details,
 | 
				
			||||||
        Operator.on('ProposalCreated', handleProposalCreated);
 | 
					        kind: 'dev'
 | 
				
			||||||
      });
 | 
					      };
 | 
				
			||||||
    }
 | 
					      return Operator.add(contributionAttr).then((result) => {
 | 
				
			||||||
 | 
					          robot.logger.debug('[kredits] proposal created:', util.inspect(result));
 | 
				
			||||||
    function handleProposalCreated(proposalId, creatorAccount, contributorId, amount) {
 | 
					 | 
				
			||||||
      Contributor.getById(contributorId).then((contributor) => {
 | 
					 | 
				
			||||||
        Operator.getBy(proposalId).then((proposal) => {
 | 
					 | 
				
			||||||
          messageRoom(`Let's give ${contributor.name} some kredits for ${proposal.url} (${proposal.description}): https://kredits.kosmos.org`);
 | 
					 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					      }).catch(() => {
 | 
				
			||||||
 | 
					        messageRoom(`I wanted to propose giving kredits to ${githubUser} for ${url}, but I can't find their contact data. Please add them as a contributor: https://kredits.kosmos.org`);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function amountFromIssueLabels(issue) {
 | 
				
			||||||
 | 
					    let kreditsLabel = issue.labels.map(l => l.name)
 | 
				
			||||||
 | 
					                            .filter(n => n.match(/^kredits/))[0];
 | 
				
			||||||
 | 
					    // No label, no kredits
 | 
				
			||||||
 | 
					    if (typeof kreditsLabel === 'undefined') { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO move to config maybe?
 | 
				
			||||||
 | 
					    let amount;
 | 
				
			||||||
 | 
					    switch(kreditsLabel) {
 | 
				
			||||||
 | 
					      case 'kredits-1':
 | 
				
			||||||
 | 
					        amount = 50;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'kredits-2':
 | 
				
			||||||
 | 
					        amount = 150;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'kredits-3':
 | 
				
			||||||
 | 
					        amount = 500;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    watchContractEvents();
 | 
					    return amount;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  };
 | 
					  function handleGitHubIssueClosed(data) {
 | 
				
			||||||
}());
 | 
					    return new Promise((resolve/*, reject*/) => {
 | 
				
			||||||
 | 
					      // fs.writeFileSync('tmp/github-issue.json', JSON.stringify(data, null, 4));
 | 
				
			||||||
 | 
					      let recipients;
 | 
				
			||||||
 | 
					      let issue        = data.issue;
 | 
				
			||||||
 | 
					      let assignees    = issue.assignees.map(a => a.login);
 | 
				
			||||||
 | 
					      let web_url      = issue.html_url;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let amount = amountFromIssueLabels(issue);
 | 
				
			||||||
 | 
					      if (amount === 0) { resolve(); return; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (assignees.length > 0) {
 | 
				
			||||||
 | 
					        recipients = assignees;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        recipients = [issue.user.login];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let repoName = issue.repository_url.match(/.*\/(.+\/.+)$/)[1];
 | 
				
			||||||
 | 
					      let description = `${repoName}: ${issue.title}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      recipients.forEach(recipient => {
 | 
				
			||||||
 | 
					        createProposal(recipient, amount, description, web_url, issue)
 | 
				
			||||||
 | 
					          .catch(err => robot.logger.error(err));
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      resolve();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function handleGitHubPullRequestClosed(data) {
 | 
				
			||||||
 | 
					    return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					      // fs.writeFileSync('tmp/github-pr.json', JSON.stringify(data, null, 4));
 | 
				
			||||||
 | 
					      let recipients;
 | 
				
			||||||
 | 
					      let pull_request = data.pull_request;
 | 
				
			||||||
 | 
					      let assignees    = pull_request.assignees.map(a => a.login);
 | 
				
			||||||
 | 
					      let web_url      = pull_request._links.html.href;
 | 
				
			||||||
 | 
					      let pr_issue_url = pull_request.issue_url;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (assignees.length > 0) {
 | 
				
			||||||
 | 
					        recipients = assignees;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        recipients = [pull_request.user.login];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      fetch(pr_issue_url)
 | 
				
			||||||
 | 
					        .then(response => {
 | 
				
			||||||
 | 
					          if (response.status >= 400) {
 | 
				
			||||||
 | 
					            reject('Bad response from fetching PR issue');
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return response.json();
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .then(issue => {
 | 
				
			||||||
 | 
					          // fs.writeFileSync('tmp/github-pr-issue.json', JSON.stringify(data, null, 4));
 | 
				
			||||||
 | 
					          let amount = amountFromIssueLabels(issue);
 | 
				
			||||||
 | 
					          if (amount === 0) { resolve(); return; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          let repoName = pull_request.base.repo.full_name;
 | 
				
			||||||
 | 
					          let description = `${repoName}: ${pull_request.title}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          let proposalPromisses = [];
 | 
				
			||||||
 | 
					          recipients.forEach(recipient => {
 | 
				
			||||||
 | 
					            proposalPromisses.push(
 | 
				
			||||||
 | 
					              createProposal(recipient, amount, description, web_url, pull_request)
 | 
				
			||||||
 | 
					                .catch(err => robot.logger.error(err))
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          return Promise.all(proposalPromisses);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  robot.router.post('/incoming/kredits/github/'+process.env.KREDITS_WEBHOOK_TOKEN, (req, res) => {
 | 
				
			||||||
 | 
					    let evt = req.header('X-GitHub-Event');
 | 
				
			||||||
 | 
					    let data = req.body;
 | 
				
			||||||
 | 
					    // For some reason data is contained in a payload property on one
 | 
				
			||||||
 | 
					    // machine, but directly in the root of the object on others
 | 
				
			||||||
 | 
					    if (data.payload) { data = JSON.parse(data.payload); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    robot.logger.info(`Received GitHub hook. Event: ${evt}, action: ${data.action}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (evt === 'pull_request' && data.action === 'closed') {
 | 
				
			||||||
 | 
					      handleGitHubPullRequestClosed(data).then(() => res.send(200));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (evt === 'issues' && data.action === 'closed') {
 | 
				
			||||||
 | 
					      handleGitHubIssueClosed(data).then(() => res.send(200));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      res.send(200);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function watchContractEvents() {
 | 
				
			||||||
 | 
					    ethProvider.getBlockNumber().then((blockNumber) => {
 | 
				
			||||||
 | 
					      // current block is the last mined one, thus we check from the next
 | 
				
			||||||
 | 
					      // mined one onwards to prevent getting previous events
 | 
				
			||||||
 | 
					      let nextBlock = blockNumber + 1;
 | 
				
			||||||
 | 
					      robot.logger.debug(`[kredits] watching events from block ${nextBlock} onward`);
 | 
				
			||||||
 | 
					      ethProvider.resetEventsBlock(nextBlock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      Operator.on('ProposalCreated', handleProposalCreated);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  function handleProposalCreated(proposalId, creatorAccount, contributorId, amount) {
 | 
				
			||||||
 | 
					    Contributor.getById(contributorId).then((contributor) => {
 | 
				
			||||||
 | 
					      Operator.getBy(proposalId).then((proposal) => {
 | 
				
			||||||
 | 
					        messageRoom(`Let's give ${contributor.name} some kredits for ${proposal.url} (${proposal.description}): https://kredits.kosmos.org`);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  watchContractEvents();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										786
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										786
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,786 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "hubot-kredits",
 | 
				
			||||||
 | 
					  "version": "1.7.0",
 | 
				
			||||||
 | 
					  "lockfileVersion": 1,
 | 
				
			||||||
 | 
					  "requires": true,
 | 
				
			||||||
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "aes-js": {
 | 
				
			||||||
 | 
					      "version": "3.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "2.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "ansi-styles": {
 | 
				
			||||||
 | 
					      "version": "2.2.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-code-frame": {
 | 
				
			||||||
 | 
					      "version": "6.22.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "chalk": "1.1.3",
 | 
				
			||||||
 | 
					        "esutils": "2.0.2",
 | 
				
			||||||
 | 
					        "js-tokens": "3.0.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "esutils": {
 | 
				
			||||||
 | 
					          "version": "2.0.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-core": {
 | 
				
			||||||
 | 
					      "version": "6.25.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-code-frame": "6.22.0",
 | 
				
			||||||
 | 
					        "babel-generator": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-helpers": "6.24.1",
 | 
				
			||||||
 | 
					        "babel-messages": "6.23.0",
 | 
				
			||||||
 | 
					        "babel-register": "6.24.1",
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-template": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-traverse": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-types": "6.25.0",
 | 
				
			||||||
 | 
					        "babylon": "6.17.4",
 | 
				
			||||||
 | 
					        "convert-source-map": "1.5.0",
 | 
				
			||||||
 | 
					        "debug": "2.6.8",
 | 
				
			||||||
 | 
					        "json5": "0.5.1",
 | 
				
			||||||
 | 
					        "lodash": "4.17.4",
 | 
				
			||||||
 | 
					        "minimatch": "3.0.4",
 | 
				
			||||||
 | 
					        "path-is-absolute": "1.0.1",
 | 
				
			||||||
 | 
					        "private": "0.1.7",
 | 
				
			||||||
 | 
					        "slash": "1.0.0",
 | 
				
			||||||
 | 
					        "source-map": "0.5.6"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "source-map": {
 | 
				
			||||||
 | 
					          "version": "0.5.6",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-generator": {
 | 
				
			||||||
 | 
					      "version": "6.25.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-messages": "6.23.0",
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-types": "6.25.0",
 | 
				
			||||||
 | 
					        "detect-indent": "4.0.0",
 | 
				
			||||||
 | 
					        "jsesc": "1.3.0",
 | 
				
			||||||
 | 
					        "lodash": "4.17.4",
 | 
				
			||||||
 | 
					        "source-map": "0.5.6",
 | 
				
			||||||
 | 
					        "trim-right": "1.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "source-map": {
 | 
				
			||||||
 | 
					          "version": "0.5.6",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-helpers": {
 | 
				
			||||||
 | 
					      "version": "6.24.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-template": "6.25.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-messages": {
 | 
				
			||||||
 | 
					      "version": "6.23.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-plugin-static-fs": {
 | 
				
			||||||
 | 
					      "version": "1.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-plugin-static-fs/-/babel-plugin-static-fs-1.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-gSrtwGKX6QvquO0C8qaazcyiPAU=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-template": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-types": "6.25.0",
 | 
				
			||||||
 | 
					        "events": "1.1.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-register": {
 | 
				
			||||||
 | 
					      "version": "6.24.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-core": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "core-js": "2.5.0",
 | 
				
			||||||
 | 
					        "home-or-tmp": "2.0.0",
 | 
				
			||||||
 | 
					        "lodash": "4.17.4",
 | 
				
			||||||
 | 
					        "mkdirp": "0.5.1",
 | 
				
			||||||
 | 
					        "source-map-support": "0.4.15"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-runtime": {
 | 
				
			||||||
 | 
					      "version": "6.25.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "core-js": "2.5.0",
 | 
				
			||||||
 | 
					        "regenerator-runtime": "0.10.5"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-template": {
 | 
				
			||||||
 | 
					      "version": "6.25.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-traverse": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-types": "6.25.0",
 | 
				
			||||||
 | 
					        "babylon": "6.17.4",
 | 
				
			||||||
 | 
					        "lodash": "4.17.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-traverse": {
 | 
				
			||||||
 | 
					      "version": "6.25.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-code-frame": "6.22.0",
 | 
				
			||||||
 | 
					        "babel-messages": "6.23.0",
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-types": "6.25.0",
 | 
				
			||||||
 | 
					        "babylon": "6.17.4",
 | 
				
			||||||
 | 
					        "debug": "2.6.8",
 | 
				
			||||||
 | 
					        "globals": "9.18.0",
 | 
				
			||||||
 | 
					        "invariant": "2.2.2",
 | 
				
			||||||
 | 
					        "lodash": "4.17.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babel-types": {
 | 
				
			||||||
 | 
					      "version": "6.25.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-runtime": "6.25.0",
 | 
				
			||||||
 | 
					        "esutils": "2.0.2",
 | 
				
			||||||
 | 
					        "lodash": "4.17.4",
 | 
				
			||||||
 | 
					        "to-fast-properties": "1.0.3"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "esutils": {
 | 
				
			||||||
 | 
					          "version": "2.0.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "babylon": {
 | 
				
			||||||
 | 
					      "version": "6.17.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "balanced-match": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "bn.js": {
 | 
				
			||||||
 | 
					      "version": "4.11.8",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "brace-expansion": {
 | 
				
			||||||
 | 
					      "version": "1.1.8",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "balanced-match": "1.0.0",
 | 
				
			||||||
 | 
					        "concat-map": "0.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "brfs-babel": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/brfs-babel/-/brfs-babel-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Zy32AGfQKSEMSTKNeLOXnVe1Cxg=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "babel-core": "6.25.0",
 | 
				
			||||||
 | 
					        "babel-plugin-static-fs": "1.1.0",
 | 
				
			||||||
 | 
					        "through2": "2.0.3"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "brorand": {
 | 
				
			||||||
 | 
					      "version": "1.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "chalk": {
 | 
				
			||||||
 | 
					      "version": "1.1.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "ansi-styles": "2.2.1",
 | 
				
			||||||
 | 
					        "escape-string-regexp": "1.0.5",
 | 
				
			||||||
 | 
					        "has-ansi": "2.0.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "3.0.1",
 | 
				
			||||||
 | 
					        "supports-color": "2.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "colors": {
 | 
				
			||||||
 | 
					      "version": "1.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "concat-map": {
 | 
				
			||||||
 | 
					      "version": "0.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "convert-source-map": {
 | 
				
			||||||
 | 
					      "version": "1.5.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "core-js": {
 | 
				
			||||||
 | 
					      "version": "2.5.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "core-util-is": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "cycle": {
 | 
				
			||||||
 | 
					      "version": "1.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "debug": {
 | 
				
			||||||
 | 
					      "version": "2.6.8",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "ms": "2.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "deep-equal": {
 | 
				
			||||||
 | 
					      "version": "0.2.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "detect-indent": {
 | 
				
			||||||
 | 
					      "version": "4.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "repeating": "2.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "elliptic": {
 | 
				
			||||||
 | 
					      "version": "6.3.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "bn.js": "4.11.8",
 | 
				
			||||||
 | 
					        "brorand": "1.1.0",
 | 
				
			||||||
 | 
					        "hash.js": "1.1.3",
 | 
				
			||||||
 | 
					        "inherits": "2.0.3"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "escape-string-regexp": {
 | 
				
			||||||
 | 
					      "version": "1.0.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "ethers": {
 | 
				
			||||||
 | 
					      "version": "3.0.15",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ethers/-/ethers-3.0.15.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-d/tiMUavaeaY2GFqjpgfPzT46cEc0cilP3hnlTXR3LR/HR5Qrhv4PfdgW3gxBlR5aBTtUeM/lo8z8ph3JdtFhQ==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "aes-js": "3.0.0",
 | 
				
			||||||
 | 
					        "bn.js": "4.11.8",
 | 
				
			||||||
 | 
					        "elliptic": "6.3.3",
 | 
				
			||||||
 | 
					        "hash.js": "1.1.3",
 | 
				
			||||||
 | 
					        "inherits": "2.0.1",
 | 
				
			||||||
 | 
					        "js-sha3": "0.5.7",
 | 
				
			||||||
 | 
					        "scrypt-js": "2.0.3",
 | 
				
			||||||
 | 
					        "setimmediate": "1.0.4",
 | 
				
			||||||
 | 
					        "uuid": "2.0.1",
 | 
				
			||||||
 | 
					        "xmlhttprequest": "1.8.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "inherits": {
 | 
				
			||||||
 | 
					          "version": "2.0.1",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "events": {
 | 
				
			||||||
 | 
					      "version": "1.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "eyes": {
 | 
				
			||||||
 | 
					      "version": "0.1.8",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "fs.realpath": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "glob": {
 | 
				
			||||||
 | 
					      "version": "7.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "fs.realpath": "1.0.0",
 | 
				
			||||||
 | 
					        "inflight": "1.0.6",
 | 
				
			||||||
 | 
					        "inherits": "2.0.3",
 | 
				
			||||||
 | 
					        "minimatch": "3.0.4",
 | 
				
			||||||
 | 
					        "once": "1.4.0",
 | 
				
			||||||
 | 
					        "path-is-absolute": "1.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "globals": {
 | 
				
			||||||
 | 
					      "version": "9.18.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "has-ansi": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "ansi-regex": "2.1.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "hash.js": {
 | 
				
			||||||
 | 
					      "version": "1.1.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "inherits": "2.0.3",
 | 
				
			||||||
 | 
					        "minimalistic-assert": "1.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "home-or-tmp": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "os-homedir": "1.0.2",
 | 
				
			||||||
 | 
					        "os-tmpdir": "1.0.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "i": {
 | 
				
			||||||
 | 
					      "version": "0.3.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-HSuFQVjsgWkRPGy39raAHpniEdU="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "inflight": {
 | 
				
			||||||
 | 
					      "version": "1.0.6",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "once": "1.4.0",
 | 
				
			||||||
 | 
					        "wrappy": "1.0.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "inherits": {
 | 
				
			||||||
 | 
					      "version": "2.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "invariant": {
 | 
				
			||||||
 | 
					      "version": "2.2.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "loose-envify": "1.3.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "is-finite": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "number-is-nan": "1.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "isarray": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "isstream": {
 | 
				
			||||||
 | 
					      "version": "0.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "js-sha3": {
 | 
				
			||||||
 | 
					      "version": "0.5.7",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "js-tokens": {
 | 
				
			||||||
 | 
					      "version": "3.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "jsesc": {
 | 
				
			||||||
 | 
					      "version": "1.3.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "json5": {
 | 
				
			||||||
 | 
					      "version": "0.5.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "kosmos-schemas": {
 | 
				
			||||||
 | 
					      "version": "1.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/kosmos-schemas/-/kosmos-schemas-1.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-BTva6wQysoBudXA588l090+Bo54=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "brfs-babel": "1.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "lodash": {
 | 
				
			||||||
 | 
					      "version": "4.17.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "loose-envify": {
 | 
				
			||||||
 | 
					      "version": "1.3.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "js-tokens": "3.0.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "minimalistic-assert": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "minimatch": {
 | 
				
			||||||
 | 
					      "version": "3.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "brace-expansion": "1.1.8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "mkdirp": {
 | 
				
			||||||
 | 
					      "version": "0.5.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "minimist": "0.0.8"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "minimist": {
 | 
				
			||||||
 | 
					          "version": "0.0.8",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "ms": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "mute-stream": {
 | 
				
			||||||
 | 
					      "version": "0.0.7",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "ncp": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node-fetch": {
 | 
				
			||||||
 | 
					      "version": "2.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "number-is-nan": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "once": {
 | 
				
			||||||
 | 
					      "version": "1.4.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "wrappy": "1.0.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "os-homedir": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "os-tmpdir": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "path-is-absolute": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "pkginfo": {
 | 
				
			||||||
 | 
					      "version": "0.4.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-NJ27f/04CB/K3AhT32h/DHdEzWU="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "private": {
 | 
				
			||||||
 | 
					      "version": "0.1.7",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "process-nextick-args": {
 | 
				
			||||||
 | 
					      "version": "1.0.7",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "prompt": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "colors": "1.1.2",
 | 
				
			||||||
 | 
					        "pkginfo": "0.4.0",
 | 
				
			||||||
 | 
					        "read": "1.0.7",
 | 
				
			||||||
 | 
					        "revalidator": "0.1.8",
 | 
				
			||||||
 | 
					        "utile": "0.3.0",
 | 
				
			||||||
 | 
					        "winston": "2.1.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "read": {
 | 
				
			||||||
 | 
					      "version": "1.0.7",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "mute-stream": "0.0.7"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "readable-stream": {
 | 
				
			||||||
 | 
					      "version": "2.3.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "core-util-is": "1.0.2",
 | 
				
			||||||
 | 
					        "inherits": "2.0.3",
 | 
				
			||||||
 | 
					        "isarray": "1.0.0",
 | 
				
			||||||
 | 
					        "process-nextick-args": "1.0.7",
 | 
				
			||||||
 | 
					        "safe-buffer": "5.1.1",
 | 
				
			||||||
 | 
					        "string_decoder": "1.0.3",
 | 
				
			||||||
 | 
					        "util-deprecate": "1.0.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "regenerator-runtime": {
 | 
				
			||||||
 | 
					      "version": "0.10.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "repeating": {
 | 
				
			||||||
 | 
					      "version": "2.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "is-finite": "1.0.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "revalidator": {
 | 
				
			||||||
 | 
					      "version": "0.1.8",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "rimraf": {
 | 
				
			||||||
 | 
					      "version": "2.6.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "glob": "7.1.2"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "safe-buffer": {
 | 
				
			||||||
 | 
					      "version": "5.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "scrypt-js": {
 | 
				
			||||||
 | 
					      "version": "2.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "setimmediate": {
 | 
				
			||||||
 | 
					      "version": "1.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "slash": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "source-map-support": {
 | 
				
			||||||
 | 
					      "version": "0.4.15",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "source-map": "0.5.6"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "source-map": {
 | 
				
			||||||
 | 
					          "version": "0.5.6",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "stack-trace": {
 | 
				
			||||||
 | 
					      "version": "0.0.10",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "string_decoder": {
 | 
				
			||||||
 | 
					      "version": "1.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "safe-buffer": "5.1.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "strip-ansi": {
 | 
				
			||||||
 | 
					      "version": "3.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "ansi-regex": "2.1.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "supports-color": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "through2": {
 | 
				
			||||||
 | 
					      "version": "2.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "readable-stream": "2.3.3",
 | 
				
			||||||
 | 
					        "xtend": "4.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "to-fast-properties": {
 | 
				
			||||||
 | 
					      "version": "1.0.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "trim-right": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "util-deprecate": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "utile": {
 | 
				
			||||||
 | 
					      "version": "0.3.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "async": "0.9.2",
 | 
				
			||||||
 | 
					        "deep-equal": "0.2.2",
 | 
				
			||||||
 | 
					        "i": "0.3.5",
 | 
				
			||||||
 | 
					        "mkdirp": "0.5.1",
 | 
				
			||||||
 | 
					        "ncp": "1.0.1",
 | 
				
			||||||
 | 
					        "rimraf": "2.6.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "async": {
 | 
				
			||||||
 | 
					          "version": "0.9.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "uuid": {
 | 
				
			||||||
 | 
					      "version": "2.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "winston": {
 | 
				
			||||||
 | 
					      "version": "2.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "async": "1.0.0",
 | 
				
			||||||
 | 
					        "colors": "1.0.3",
 | 
				
			||||||
 | 
					        "cycle": "1.0.3",
 | 
				
			||||||
 | 
					        "eyes": "0.1.8",
 | 
				
			||||||
 | 
					        "isstream": "0.1.2",
 | 
				
			||||||
 | 
					        "pkginfo": "0.3.1",
 | 
				
			||||||
 | 
					        "stack-trace": "0.0.10"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "async": {
 | 
				
			||||||
 | 
					          "version": "1.0.0",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "colors": {
 | 
				
			||||||
 | 
					          "version": "1.0.3",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "pkginfo": {
 | 
				
			||||||
 | 
					          "version": "0.3.1",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "wrappy": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "xmlhttprequest": {
 | 
				
			||||||
 | 
					      "version": "1.8.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "xtend": {
 | 
				
			||||||
 | 
					      "version": "4.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -10,10 +10,11 @@
 | 
				
			|||||||
    "kredits-wallet-create": "scripts/create-wallet.js"
 | 
					    "kredits-wallet-create": "scripts/create-wallet.js"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "ethers": "^3.0.15",
 | 
				
			||||||
    "kosmos-schemas": "^1.1.2",
 | 
					    "kosmos-schemas": "^1.1.2",
 | 
				
			||||||
    "kredits-contracts": "2.0.0",
 | 
					 | 
				
			||||||
    "node-fetch": "^2.1.1",
 | 
					    "node-fetch": "^2.1.1",
 | 
				
			||||||
    "prompt": "^1.0.0"
 | 
					    "prompt": "^1.0.0",
 | 
				
			||||||
 | 
					    "truffle-kredits": "github:67P/truffle-kredits#library"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "repository": {
 | 
					  "repository": {
 | 
				
			||||||
    "type": "git",
 | 
					    "type": "git",
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user