diff --git a/admin/.env.example b/admin/.env.example
new file mode 100644
index 00000000..493592e5
--- /dev/null
+++ b/admin/.env.example
@@ -0,0 +1,8 @@
+# admin listen port
+PORT=3500
+
+# backend url
+BACKEND_URL=http://localhost:5000
+
+# Disable SSL in production
+# DISABLE_SSL=true
diff --git a/admin/.envexample b/admin/.envexample
deleted file mode 100644
index e7ec6ab7..00000000
--- a/admin/.envexample
+++ /dev/null
@@ -1,4 +0,0 @@
-# admin listen port
-PORT=3500
-# backend url
-BACKEND_URL=http://localhost:5000
\ No newline at end of file
diff --git a/admin/package.json b/admin/package.json
index 91d20910..8bded901 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -68,6 +68,7 @@
"dotenv": "^6.0.0",
"ethereum-blockies-base64": "1.0.2",
"ethereumjs-util": "5.2.0",
+ "express-sslify": "1.2.0",
"file-loader": "^2.0.0",
"font-awesome": "^4.7.0",
"fork-ts-checker-webpack-plugin": "^0.4.2",
diff --git a/admin/server.js b/admin/server.js
index fc674371..9649db51 100644
--- a/admin/server.js
+++ b/admin/server.js
@@ -1,10 +1,17 @@
const express = require('express');
const path = require('path');
+const enforce = require('express-sslify');
require('dotenv').config();
+const isDev = process.env.NODE_ENV === 'development';
const PORT = process.env.PORT || 3500;
const app = express();
+if (!isDev && !process.env.DISABLE_SSL) {
+ console.log('PRODUCTION mode, enforcing HTTPS redirect');
+ app.use(enforce.HTTPS({ trustProtoHeader: true }));
+}
+
app.use(express.static(__dirname + '/build'));
app.get('*', function(request, response) {
diff --git a/admin/yarn.lock b/admin/yarn.lock
index d391a490..8a9334fc 100644
--- a/admin/yarn.lock
+++ b/admin/yarn.lock
@@ -3225,6 +3225,11 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
dependencies:
homedir-polyfill "^1.0.1"
+express-sslify@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/express-sslify/-/express-sslify-1.2.0.tgz#30e84bceed1557eb187672bbe1430a0a2a100d9c"
+ integrity sha1-MOhLzu0VV+sYdnK74UMKCioQDZw=
+
express@^4.16.2:
version "4.16.4"
resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
diff --git a/backend/.env.example b/backend/.env.example
index 736aa204..d4c83bff 100644
--- a/backend/.env.example
+++ b/backend/.env.example
@@ -32,5 +32,8 @@ BLOCKCHAIN_API_SECRET="ef0b48e41f78d3ae85b1379b386f1bca"
# EXPLORER_URL="https://chain.so/tx/ZEC/"
EXPLORER_URL="https://chain.so/tx/ZECTEST/"
-# Amount for staking a proposal in ZEC
+# Amount for staking a proposal in ZEC, keep in sync with frontend .env
PROPOSAL_STAKING_AMOUNT=0.025
+
+# Maximum amount for a proposal target, keep in sync with frontend .env
+PROPOSAL_TARGET_MAX=10000
diff --git a/backend/grant/admin/views.py b/backend/grant/admin/views.py
index 92ea2f68..07119ba1 100644
--- a/backend/grant/admin/views.py
+++ b/backend/grant/admin/views.py
@@ -472,7 +472,7 @@ def get_rfps():
"category": fields.Str(required=True, validate=validate.OneOf(choices=Category.list())),
"bounty": fields.Str(required=False, missing=0),
"matching": fields.Bool(required=False, missing=False),
- "dateCloses": fields.Int(required=True)
+ "dateCloses": fields.Int(required=False, missing=None)
})
@admin.admin_auth_required
def create_rfp(date_closes, **kwargs):
diff --git a/backend/grant/app.py b/backend/grant/app.py
index b6f2c9a1..c58e87a1 100644
--- a/backend/grant/app.py
+++ b/backend/grant/app.py
@@ -158,6 +158,7 @@ def register_commands(app):
app.cli.add_command(commands.lint)
app.cli.add_command(commands.clean)
app.cli.add_command(commands.urls)
+ app.cli.add_command(commands.reset_db_chain_data)
app.cli.add_command(proposal.commands.create_proposal)
app.cli.add_command(proposal.commands.create_proposals)
app.cli.add_command(user.commands.set_admin)
diff --git a/backend/grant/commands.py b/backend/grant/commands.py
index b652e099..508c7621 100644
--- a/backend/grant/commands.py
+++ b/backend/grant/commands.py
@@ -8,6 +8,7 @@ import click
from flask import current_app
from flask.cli import with_appcontext
from werkzeug.exceptions import MethodNotAllowed, NotFound
+from sqlalchemy import text
HERE = os.path.abspath(os.path.dirname(__file__))
PROJECT_ROOT = os.path.join(HERE, os.pardir)
@@ -137,3 +138,46 @@ def urls(url, order):
for row in rows:
click.echo(str_template.format(*row[:column_length]))
+
+
+@click.command()
+@with_appcontext
+def reset_db_chain_data():
+ """Removes chain-state dependent entities from the database. Cannot be undone!"""
+ from grant.extensions import db
+ from grant.proposal.models import Proposal
+ from grant.user.models import UserSettings
+ from grant.task.models import Task
+
+ # Delete all proposals. Should cascade to contributions, comments etc.
+ p_count = 0
+ for proposal in Proposal.query.all():
+ db.session.delete(proposal)
+ p_count = p_count + 1
+
+ # Delete all outstanding tasks
+ t_count = Task.query.delete()
+
+ # Delete refund address from settings
+ s_count = 0
+ for settings in UserSettings.query.all():
+ if settings.refund_address:
+ settings.refund_address = None
+ db.session.add(settings)
+ s_count = s_count + 1
+
+ # Commit state
+ db.session.commit()
+
+ # Attempt to reset contribution ID sequence, psql specific. Don't fail out
+ # if this messes up though, just warn them.
+ try:
+ db.engine.execute(text('ALTER SEQUENCE proposal_contribution_id_seq RESTART WITH 1'))
+ except e:
+ print(e)
+ print('Failed to reset contribution id sequence, see above error. Continuing anyway.')
+
+ print('Successfully wiped chain-dependent db state!')
+ print(f'* Deleted {p_count} proposals and their linked entities')
+ print(f'* Deleted {t_count} tasks')
+ print(f'* Removed refund address from {s_count} user settings')
diff --git a/backend/grant/comment/models.py b/backend/grant/comment/models.py
index c8a9d284..6b57c3c5 100644
--- a/backend/grant/comment/models.py
+++ b/backend/grant/comment/models.py
@@ -30,7 +30,7 @@ class Comment(db.Model):
self.proposal_id = proposal_id
self.user_id = user_id
self.parent_comment_id = parent_comment_id
- self.content = content
+ self.content = content[:1000]
self.date_created = datetime.datetime.now()
@staticmethod
diff --git a/backend/grant/milestone/models.py b/backend/grant/milestone/models.py
index cab8d261..5f33bbf2 100644
--- a/backend/grant/milestone/models.py
+++ b/backend/grant/milestone/models.py
@@ -53,11 +53,11 @@ class Milestone(db.Model):
proposal_id=int,
):
self.id = gen_random_id(Milestone)
- self.title = title
- self.content = content
+ self.title = title[:255]
+ self.content = content[:255]
self.stage = stage
self.date_estimated = date_estimated
- self.payout_percent = payout_percent
+ self.payout_percent = payout_percent[:255]
self.immediate_payout = immediate_payout
self.proposal_id = proposal_id
self.date_created = datetime.datetime.now()
@@ -70,21 +70,16 @@ class Milestone(db.Model):
[db.session.delete(x) for x in proposal.milestones]
for i, milestone_data in enumerate(milestones_data):
m = Milestone(
- title=milestone_data["title"],
- content=milestone_data["content"],
+ title=milestone_data["title"][:255],
+ content=milestone_data["content"][:255],
date_estimated=datetime.datetime.fromtimestamp(milestone_data["date_estimated"]),
- payout_percent=str(milestone_data["payout_percent"]),
+ payout_percent=str(milestone_data["payout_percent"])[:255],
immediate_payout=milestone_data["immediate_payout"],
proposal_id=proposal.id,
index=i
)
db.session.add(m)
- @staticmethod
- def validate(milestone):
- if len(milestone.title) > 60:
- raise ValidationException("Milestone title must be no more than 60 chars")
-
def request_payout(self, user_id: int):
if self.stage not in [MilestoneStage.IDLE, MilestoneStage.REJECTED]:
raise MilestoneException(f'Cannot request payout for milestone at {self.stage} stage')
diff --git a/backend/grant/proposal/models.py b/backend/grant/proposal/models.py
index 1224ed5a..84f610fa 100644
--- a/backend/grant/proposal/models.py
+++ b/backend/grant/proposal/models.py
@@ -11,7 +11,7 @@ from flask import current_app
from grant.comment.models import Comment
from grant.email.send import send_email
from grant.extensions import ma, db
-from grant.settings import PROPOSAL_STAKING_AMOUNT
+from grant.settings import PROPOSAL_STAKING_AMOUNT, PROPOSAL_TARGET_MAX
from grant.task.jobs import ContributionExpired
from grant.utils.enums import (
ProposalStatus,
@@ -45,7 +45,7 @@ class ProposalTeamInvite(db.Model):
def __init__(self, proposal_id: int, address: str, accepted: bool = None):
self.proposal_id = proposal_id
- self.address = address
+ self.address = address[:255]
self.accepted = accepted
self.date_created = datetime.datetime.now()
@@ -70,7 +70,7 @@ class ProposalUpdate(db.Model):
def __init__(self, proposal_id: int, title: str, content: str):
self.id = gen_random_id(ProposalUpdate)
self.proposal_id = proposal_id
- self.title = title
+ self.title = title[:255]
self.content = content
self.date_created = datetime.datetime.now()
@@ -275,12 +275,11 @@ class Proposal(db.Model):
@staticmethod
def simple_validate(proposal):
- title = proposal.get('title')
+ # Validate fields to be database save-able.
+ # Stricter validation is done in validate_publishable.
stage = proposal.get('stage')
category = proposal.get('category')
- if title and len(title) > 60:
- raise ValidationException("Proposal title cannot be longer than 60 characters")
if stage and not ProposalStage.includes(stage):
raise ValidationException("Proposal stage {} is not a valid stage".format(stage))
if category and not Category.includes(category):
@@ -294,37 +293,59 @@ class Proposal(db.Model):
raise ValidationException("Only the first milestone can have an immediate payout")
if len(milestone.title) > 60:
- raise ValidationException("Milestone title must be no more than 60 chars")
+ raise ValidationException("Milestone title cannot be longer than 60 chars")
if len(milestone.content) > 200:
- raise ValidationException("Milestone content must be no more than 200 chars")
+ raise ValidationException("Milestone content cannot be longer than 200 chars")
- payout_total += float(milestone.payout_percent)
+ try:
+ p = float(milestone.payout_percent)
+ if not p.is_integer():
+ raise ValidationException("Milestone payout percents must be whole numbers, no decimals")
+ if p <= 0 or p > 100:
+ raise ValidationException("Milestone payout percent must be greater than zero")
+ except ValueError:
+ raise ValidationException("Milestone payout percent must be a number")
+
+ payout_total += p
try:
present = datetime.datetime.today().replace(day=1)
if present > milestone.date_estimated:
- raise ValidationException("Milestone date_estimated must be in the future ")
+ raise ValidationException("Milestone date estimate must be in the future ")
except Exception as e:
current_app.logger.warn(
f"Unexpected validation error - client prohibits {e}"
)
- raise ValidationException("date_estimated does not convert to a datetime")
+ raise ValidationException("Date estimate is not a valid datetime")
if payout_total != 100.0:
- raise ValidationException("payoutPercent across milestones must sum to exactly 100")
+ raise ValidationException("Payout percentages of milestones must add up to exactly 100%")
def validate_publishable(self):
self.validate_publishable_milestones()
# Require certain fields
-
required_fields = ['title', 'content', 'brief', 'category', 'target', 'payout_address']
for field in required_fields:
if not hasattr(self, field):
raise ValidationException("Proposal must have a {}".format(field))
+ # Stricter limits on certain fields
+ if len(self.title) > 60:
+ raise ValidationException("Proposal title cannot be longer than 60 characters")
+ if len(self.brief) > 140:
+ raise ValidationException("Brief cannot be longer than 140 characters")
+ if len(self.content) > 250000:
+ raise ValidationException("Content cannot be longer than 250,000 characters")
+ if Decimal(self.target) > PROPOSAL_TARGET_MAX:
+ raise ValidationException("Target cannot be more than {} ZEC".format(PROPOSAL_TARGET_MAX))
+ if Decimal(self.target) < 0.0001:
+ raise ValidationException("Target cannot be less than 0.0001")
+ if self.deadline_duration > 7776000:
+ raise ValidationException("Deadline duration cannot be more than 90 days")
+
# Check with node that the address is kosher
try:
res = blockchain_get('/validate/address', {'address': self.payout_address})
@@ -380,12 +401,12 @@ class Proposal(db.Model):
payout_address: str = '',
deadline_duration: int = 5184000 # 60 days
):
- self.title = title
- self.brief = brief
+ self.title = title[:255]
+ self.brief = brief[:255]
self.category = category
- self.content = content
- self.target = target if target != '' else None
- self.payout_address = payout_address
+ self.content = content[:300000]
+ self.target = target[:255] if target != '' else '0'
+ self.payout_address = payout_address[:255]
self.deadline_duration = deadline_duration
Proposal.simple_validate(vars(self))
diff --git a/backend/grant/proposal/views.py b/backend/grant/proposal/views.py
index 3893a98c..ebda9083 100644
--- a/backend/grant/proposal/views.py
+++ b/backend/grant/proposal/views.py
@@ -4,6 +4,7 @@ from flask import Blueprint, g, request, current_app
from marshmallow import fields, validate
from sqlalchemy import or_
from sentry_sdk import capture_message
+from webargs import validate
from grant.extensions import limiter
from grant.comment.models import Comment, comment_schema, comments_schema
@@ -98,7 +99,7 @@ def report_proposal_comment(proposal_id, comment_id):
@limiter.limit("30/hour;2/minute")
@requires_email_verified_auth
@body({
- "comment": fields.Str(required=True),
+ "comment": fields.Str(required=True, validate=validate.Length(max=1000)),
"parentCommentId": fields.Int(required=False, missing=None),
})
def post_proposal_comments(proposal_id, comment, parent_comment_id):
@@ -122,9 +123,6 @@ def post_proposal_comments(proposal_id, comment, parent_comment_id):
if g.current_user.silenced:
return {"message": "Your account has been silenced, commenting is disabled."}, 403
- if len(comment) > 1000:
- return {"message": "Please make sure your comment is less than 1000 characters long"}, 400
-
# Make the comment
comment = Comment(
proposal_id=proposal_id,
@@ -218,6 +216,7 @@ def get_proposal_drafts():
@blueprint.route("/", methods=["PUT"])
@requires_team_member_auth
@body({
+ # Length checks are to prevent database errors, not actual user limits imposed
"title": fields.Str(required=True),
"brief": fields.Str(required=True),
"category": fields.Str(required=True, validate=validate.OneOf(choices=Category.list() + [''])),
@@ -226,7 +225,7 @@ def get_proposal_drafts():
"payoutAddress": fields.Str(required=True),
"deadlineDuration": fields.Int(required=True),
"milestones": fields.List(fields.Dict(), required=True),
- "rfpOptIn": fields.Bool(required=False, missing=None)
+ "rfpOptIn": fields.Bool(required=False, missing=None),
})
def update_proposal(milestones, proposal_id, rfp_opt_in, **kwargs):
# Update the base proposal fields
@@ -348,8 +347,8 @@ def get_proposal_update(proposal_id, update_id):
@limiter.limit("5/day;1/minute")
@requires_team_member_auth
@body({
- "title": fields.Str(required=True, validate=lambda p: 3 <= len(p) <= 30),
- "content": fields.Str(required=True, validate=lambda p: 5 <= len(p) <= 10000),
+ "title": fields.Str(required=True, validate=validate.Length(min=3, max=60)),
+ "content": fields.Str(required=True, validate=validate.Length(min=5, max=10000)),
})
def post_proposal_update(proposal_id, title, content):
update = ProposalUpdate(
@@ -376,9 +375,13 @@ def post_proposal_update(proposal_id, title, content):
@limiter.limit("30/day;10/minute")
@requires_team_member_auth
@body({
- "address": fields.Str(required=True),
+ "address": fields.Str(required=True, validate=validate.Length(max=255)),
})
def post_proposal_team_invite(proposal_id, address):
+ for u in g.current_proposal.team:
+ if address == u.email_address:
+ return {"message": f"Cannot invite members already on the team"}, 400
+
existing_invite = ProposalTeamInvite.query.filter_by(
proposal_id=proposal_id,
address=address
@@ -643,7 +646,7 @@ def accept_milestone_payout_request(proposal_id, milestone_id):
@blueprint.route("//milestone//reject", methods=["PUT"])
@requires_arbiter_auth
@body({
- "reason": fields.Str(required=True, validate=lambda p: 2 <= len(p) <= 200),
+ "reason": fields.Str(required=True, validate=validate.Length(min=2, max=200)),
})
def reject_milestone_payout_request(proposal_id, milestone_id, reason):
if not g.current_proposal.is_funded:
diff --git a/backend/grant/rfp/models.py b/backend/grant/rfp/models.py
index 9c29743b..2a13b4ae 100644
--- a/backend/grant/rfp/models.py
+++ b/backend/grant/rfp/models.py
@@ -64,8 +64,8 @@ class RFP(db.Model):
assert Category.includes(category)
self.id = gen_random_id(RFP)
self.date_created = datetime.now()
- self.title = title
- self.brief = brief
+ self.title = title[:255]
+ self.brief = brief[:255]
self.content = content
self.category = category
self.bounty = bounty
diff --git a/backend/grant/settings.py b/backend/grant/settings.py
index 7aa6780a..d82b013a 100644
--- a/backend/grant/settings.py
+++ b/backend/grant/settings.py
@@ -61,6 +61,7 @@ BLOCKCHAIN_API_SECRET = env.str("BLOCKCHAIN_API_SECRET")
EXPLORER_URL = env.str("EXPLORER_URL", default="https://chain.so/tx/ZECTEST/")
PROPOSAL_STAKING_AMOUNT = Decimal(env.str("PROPOSAL_STAKING_AMOUNT"))
+PROPOSAL_TARGET_MAX = Decimal(env.str("PROPOSAL_TARGET_MAX"))
UI = {
'NAME': 'ZF Grants',
diff --git a/backend/grant/user/models.py b/backend/grant/user/models.py
index f16952c3..80c00961 100644
--- a/backend/grant/user/models.py
+++ b/backend/grant/user/models.py
@@ -46,8 +46,8 @@ class SocialMedia(db.Model):
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
def __init__(self, service: str, username: str, user_id):
- self.service = service.upper()
- self.username = username.lower()
+ self.service = service.upper()[:255]
+ self.username = username.lower()[:255]
self.user_id = user_id
@@ -145,8 +145,8 @@ class User(db.Model, UserMixin):
):
self.id = gen_random_id(User)
self.email_address = email_address
- self.display_name = display_name
- self.title = title
+ self.display_name = display_name[:255]
+ self.title = title[:255]
self.password = password
@staticmethod
diff --git a/backend/grant/user/views.py b/backend/grant/user/views.py
index 654b15c2..cc024781 100644
--- a/backend/grant/user/views.py
+++ b/backend/grant/user/views.py
@@ -3,6 +3,7 @@ from animal_case import keys_to_snake_case
from flask import Blueprint, g, current_app
from marshmallow import fields
from validate_email import validate_email
+from webargs import validate
import grant.utils.auth as auth
from grant.comment.models import Comment, user_comments_schema
@@ -95,8 +96,8 @@ def get_user(user_id, with_proposals, with_comments, with_funded, with_pending,
@body({
"emailAddress": fields.Str(required=True, validate=lambda e: validate_email(e)),
"password": fields.Str(required=True),
- "displayName": fields.Str(required=True, validate=lambda p: 2 <= len(p) <= 200),
- "title": fields.Str(required=True, validate=lambda p: 2 <= len(p) <= 200),
+ "displayName": fields.Str(required=True, validate=validate.Length(min=2, max=50)),
+ "title": fields.Str(required=True, validate=validate.Length(min=2, max=50)),
})
def create_user(
email_address,
diff --git a/backend/tests/proposal/test_comment_api.py b/backend/tests/proposal/test_comment_api.py
index 3b3ae791..9dbdeef1 100644
--- a/backend/tests/proposal/test_comment_api.py
+++ b/backend/tests/proposal/test_comment_api.py
@@ -128,7 +128,6 @@ class TestProposalCommentAPI(BaseUserConfig):
)
self.assertStatus(comment_res, 400)
- self.assertIn('less than', comment_res.json['message'])
def test_create_new_proposal_comment_fails_with_silenced_user(self):
self.login_default_user()
diff --git a/blockchain/.env.example b/blockchain/.env.example
index 45443f6a..b8187afe 100644
--- a/blockchain/.env.example
+++ b/blockchain/.env.example
@@ -14,13 +14,26 @@ MINIMUM_BLOCK_CONFIRMATIONS="6"
API_SECRET_HASH=""
API_SECRET_KEY=""
+############################ ADDRESS DERIVATION ############################
+# You should only set one OR the other. The former will generate addresses #
+# using Bip32 address derivation. The latter uses BitGo's API. If you set #
+# both, BitGo takes precedence. API key should ONLY HAVE VIEW ACCESS! #
+############################################################################
+
+# BITGO_WALLET_ID=""
+# BITGO_ACCESS_TOKEN=""
+
+### OR ###
+
+# BIP32_XPUB=""
+
+############################################################################
+
+
# Addresses, run `yarn genaddress` to get sprout information
SPROUT_ADDRESS=""
SPROUT_VIEWKEY=""
-# extended public seed
-BIP32_XPUB=""
-
# Block heights to fall back on for starting our scan
MAINNET_START_BLOCK="464000"
TESTNET_START_BLOCK="390000"
@@ -30,3 +43,6 @@ SENTRY_DSN=""
# Logging level
LOG_LEVEL="debug"
+
+# Fixie proxy URL for BitGo requests (optional)
+# FIXIE_URL=""
diff --git a/blockchain/package.json b/blockchain/package.json
index d3c086fa..e9c40b0b 100755
--- a/blockchain/package.json
+++ b/blockchain/package.json
@@ -35,6 +35,7 @@
"@types/dotenv": "^6.1.0",
"@types/ws": "^6.0.1",
"axios": "0.18.0",
+ "bitgo": "4.48.1",
"body-parser": "1.18.3",
"cors": "2.8.5",
"dotenv": "^6.1.0",
diff --git a/blockchain/src/bin/genaddress.ts b/blockchain/src/bin/genaddress.ts
index 8a8b7f9c..ee6302a8 100644
--- a/blockchain/src/bin/genaddress.ts
+++ b/blockchain/src/bin/genaddress.ts
@@ -1,4 +1,5 @@
import node from '../node';
+import { extractErrMessage } from '../util';
async function printAddressAndKey() {
try {
@@ -9,11 +10,7 @@ async function printAddressAndKey() {
console.log(`SPROUT_ADDRESS="${address}"`);
console.log(`SPROUT_VIEWKEY="${viewkey}"\n`);
} catch(err) {
- if (err.response && err.response.data) {
- console.error(err.response.data);
- } else {
- console.error(err);
- }
+ console.error(extractErrMessage(err));
process.exit(1);
}
}
diff --git a/blockchain/src/bitgo.ts b/blockchain/src/bitgo.ts
new file mode 100644
index 00000000..a7c06f21
--- /dev/null
+++ b/blockchain/src/bitgo.ts
@@ -0,0 +1,57 @@
+import { BitGo, Wallet } from 'bitgo';
+import bitcore from "zcash-bitcore-lib";
+import env from './env';
+import log from './log';
+import { getNetwork } from './node';
+
+let bitgoWallet: Wallet;
+
+export async function initBitGo() {
+ if (!env.BITGO_ACCESS_TOKEN || !env.BITGO_WALLET_ID) {
+ log.info('BITGO environment variables not set, nooping initBitGo');
+ return;
+ }
+
+ // Assert that we're on mainnet
+ const network = getNetwork();
+ if (network !== bitcore.Networks.mainnet) {
+ throw new Error(`BitGo cannot be used on anything but mainnet, connected node is ${network}`);
+ }
+
+ const proxy = env.FIXIE_URL || undefined;
+ const bitgo = new BitGo({
+ env: 'prod', // Non-prod ZEC is not supported
+ accessToken: env.BITGO_ACCESS_TOKEN,
+ proxy,
+ });
+ bitgoWallet = await bitgo.coin('zec').wallets().get({ id: env.BITGO_WALLET_ID });
+ log.info(`Initialized BitGo wallet "${bitgoWallet.label()}"`);
+ if (proxy) {
+ log.info(`Proxying BitGo requests through ${proxy}`);
+ }
+}
+
+export async function getContributionAddress(id: number) {
+ if (!bitgoWallet) {
+ throw new Error('Must run initBitGo before getContributionAddress');
+ }
+
+ // Attempt to fetch first
+ const label = `Contribution #${id}`;
+ const res = await bitgoWallet.addresses({ labelContains: label });
+ if (res.addresses.length) {
+ if (res.addresses.length > 1) {
+ log.warn(`Contribution ${id} has ${res.addresses.length} associated with it. Using the first one (${res.addresses[0].address})`);
+ }
+ return res.addresses[0].address;
+ }
+
+ // Create a new one otherwise
+ const createRes = await bitgoWallet.createAddress({ label });
+ log.info(`Generate new address for contribution ${id}`);
+ return createRes.address;
+}
+
+function generateLabel(id: number) {
+ return `Contribution #${id}`;
+}
\ No newline at end of file
diff --git a/blockchain/src/env.ts b/blockchain/src/env.ts
index 3d776a2d..fa9fa522 100644
--- a/blockchain/src/env.ts
+++ b/blockchain/src/env.ts
@@ -18,31 +18,55 @@ const DEFAULTS = {
ZCASH_NODE_PASSWORD: "",
MINIMUM_BLOCK_CONFIRMATIONS: "6",
+ BITGO_WALLET_ID: "",
+ BITGO_ACCESS_TOKEN: "",
+
+ BIP32_XPUB: "",
+
SPROUT_ADDRESS: "",
SPROUT_VIEWKEY: "",
- BIP32_XPUB: "",
MAINNET_START_BLOCK: "464000",
TESTNET_START_BLOCK: "390000",
SENTRY_DSN: "",
+ FIXIE_URL: "",
};
+const OPTIONAL: { [key: string]: undefined | boolean } = {
+ BITGO_WALLET_ID: true,
+ BITGO_ACCESS_TOKEN: true,
+ BIP32_XPUB: true,
+ FIXIE_URL: true,
+ // NOTE: Remove these from optional when sapling is ready
+ SPROUT_ADDRESS: true,
+ SPROUT_VIEWKEY: true,
+}
+
type CustomEnvironment = typeof DEFAULTS;
// ignore when testing
if (process.env.NODE_ENV !== "test") {
+ // Set environment variables, throw on missing required ones
Object.entries(DEFAULTS).forEach(([k, v]) => {
if (!process.env[k]) {
const defVal = (DEFAULTS as any)[k];
if (defVal) {
console.info(`Using default environment variable ${k}="${defVal}"`);
process.env[k] = defVal;
- } else {
+ } else if (!OPTIONAL[k]) {
throw new Error(`Missing required environment variable ${k}`);
}
}
});
+
+ // Ensure we have either xpub or bitgo, and warn if we have both
+ if (!process.env.BIP32_XPUB && (!process.env.BITGO_WALLET_ID || !process.env.BITGO_ACCESS_TOKEN)) {
+ throw new Error('Either BIP32_XPUB or BITGO_* environment variables required, missing both');
+ }
+ if (process.env.BIP32_XPUB && process.env.BITGO_WALLET_ID) {
+ console.info('BIP32_XPUB and BITGO environment variables set, BIP32_XPUB will be ignored');
+ }
}
export default (process.env as any) as CustomEnvironment;
diff --git a/blockchain/src/index.ts b/blockchain/src/index.ts
index bc4c9506..aad5fa12 100755
--- a/blockchain/src/index.ts
+++ b/blockchain/src/index.ts
@@ -2,6 +2,8 @@ import * as Sentry from "@sentry/node";
import * as Webhooks from "./webhooks";
import * as RestServer from "./server";
import { initNode } from "./node";
+import { initBitGo } from "./bitgo";
+import { extractErrMessage } from "./util";
import env from "./env";
import log from "./log";
@@ -15,6 +17,7 @@ async function start() {
log.info("============== Starting services ==============");
await initNode();
+ await initBitGo();
await RestServer.start();
Webhooks.start();
log.info("===============================================");
@@ -28,4 +31,8 @@ process.on("SIGINT", () => {
process.exit();
});
-start();
+start().catch(err => {
+ Sentry.captureException(err);
+ log.error(`Unexpected error while starting blockchain watcher: ${extractErrMessage(err)}`);
+ process.exit(1);
+});
diff --git a/blockchain/src/node.ts b/blockchain/src/node.ts
index c7638ffb..17c09e21 100644
--- a/blockchain/src/node.ts
+++ b/blockchain/src/node.ts
@@ -3,6 +3,7 @@ import bitcore from "zcash-bitcore-lib";
import { captureException } from "@sentry/node";
import env from "./env";
import log from "./log";
+import { extractErrMessage } from "./util";
export interface BlockChainInfo {
chain: string;
@@ -16,9 +17,9 @@ export interface BlockChainInfo {
export interface ScriptPubKey {
asm: string;
hex: string;
- reqSigs: number;
type: string;
- addresses: string[];
+ reqSigs?: number;
+ addresses?: string[];
}
export interface VIn {
@@ -49,6 +50,27 @@ export interface Transaction {
vjoinsplit: any[];
}
+export interface RawTransaction {
+ txid: string;
+ hex: string;
+ overwintered: boolean;
+ version: number;
+ versiongroupid: number;
+ locktime: number;
+ expiryheight: string;
+ vin: VIn[];
+ vout: VOut[];
+ valueBalance: string;
+ blockhash: string;
+ blocktime: number;
+ confirmations: number;
+ time: number;
+ // unclear what these are
+ vjoinsplit: any[];
+ vShieldedSpend: any[];
+ vShieldedOutput: any[];
+}
+
export interface Block {
hash: string;
confirmations: number;
@@ -119,6 +141,10 @@ interface ZCashNode {
(numberOrHash: string | number, verbosity: 0): Promise;
};
gettransaction: (txid: string) => Promise;
+ getrawtransaction: {
+ (numberOrHash: string | number, verbosity: 1): Promise;
+ (numberOrHash: string | number, verbosity?: 0): Promise;
+ };
validateaddress: (address: string) => Promise;
z_getbalance: (address: string, minConf?: number) => Promise;
z_getnewaddress: (type?: "sprout" | "sapling") => Promise;
@@ -166,31 +192,29 @@ export async function initNode() {
}
} catch (err) {
captureException(err);
- log.error(err.response ? err.response.data : err);
- log.error(
- "Failed to connect to zcash node with the following credentials:\r\n",
- rpcOptions
- );
+ log.error(extractErrMessage(err));
+ log.error(`Failed to connect to zcash node with the following credentials: ${JSON.stringify(rpcOptions, null, 2)}`);
process.exit(1);
}
// Check if sprout address is readable
- try {
- if (!env.SPROUT_ADDRESS) {
- console.error("Missing SPROUT_ADDRESS environment variable, exiting");
- process.exit(1);
- }
- await node.z_getbalance(env.SPROUT_ADDRESS as string);
- } catch (err) {
- if (!env.SPROUT_VIEWKEY) {
- log.error(
- "Unable to view SPROUT_ADDRESS and missing SPROUT_VIEWKEY environment variable, exiting"
- );
- process.exit(1);
- }
- await node.z_importviewingkey(env.SPROUT_VIEWKEY as string);
- await node.z_getbalance(env.SPROUT_ADDRESS as string);
- }
+ // NOTE: Replace with sapling when ready
+ // try {
+ // if (!env.SPROUT_ADDRESS) {
+ // console.error("Missing SPROUT_ADDRESS environment variable, exiting");
+ // process.exit(1);
+ // }
+ // await node.z_getbalance(env.SPROUT_ADDRESS as string);
+ // } catch (err) {
+ // if (!env.SPROUT_VIEWKEY) {
+ // log.error(
+ // "Unable to view SPROUT_ADDRESS and missing SPROUT_VIEWKEY environment variable, exiting"
+ // );
+ // process.exit(1);
+ // }
+ // await node.z_importviewingkey(env.SPROUT_VIEWKEY as string);
+ // await node.z_getbalance(env.SPROUT_ADDRESS as string);
+ // }
}
export function getNetwork() {
@@ -204,29 +228,27 @@ export function getNetwork() {
export async function getBootstrapBlockHeight(txid: string | undefined) {
if (txid) {
try {
- const tx = await node.gettransaction(txid);
+ const tx = await node.getrawtransaction(txid, 1);
const block = await node.getblock(tx.blockhash);
const height =
block.height - parseInt(env.MINIMUM_BLOCK_CONFIRMATIONS, 10);
return height.toString();
} catch (err) {
- console.warn(
- `Attempted to get block height for tx ${txid} but failed with the following error:\n`,
- err
- );
- console.warn("Falling back to hard-coded starter blocks");
+ log.warn(`Attempted to get block height for tx ${txid} but failed with the following error: ${extractErrMessage(err)}`);
}
}
// If we can't find the latest tx block, fall back to when the grant
- // system first launched, and scan from there.
+ // system first launched, and scan from there. Regtest or unknown networks
+ // start from the bottom.
const net = getNetwork();
+ let height = "0";
if (net === bitcore.Networks.mainnet) {
- return env.MAINNET_START_BLOCK;
+ height = env.MAINNET_START_BLOCK;
} else if (net === bitcore.Networks.testnet && !net.regtestEnabled) {
- return env.TESTNET_START_BLOCK;
+ height = env.TESTNET_START_BLOCK;
}
- // Regtest or otherwise unknown networks should start at the bottom
- return "0";
+ log.info(`Falling back to hard-coded starter block height ${height}`);
+ return height;
}
diff --git a/blockchain/src/server/index.ts b/blockchain/src/server/index.ts
index 83960f10..4aadc12c 100644
--- a/blockchain/src/server/index.ts
+++ b/blockchain/src/server/index.ts
@@ -14,7 +14,7 @@ import {
} from '../store';
import env from '../env';
import node, { getBootstrapBlockHeight } from '../node';
-import { makeContributionMemo } from '../util';
+import { makeContributionMemo, extractErrMessage } from '../util';
import log from '../log';
// Configure server
@@ -29,8 +29,16 @@ app.use(authMiddleware);
// Routes
app.post('/bootstrap', async (req, res) => {
const { pendingContributions, latestTxId } = req.body;
- const info = await node.getblockchaininfo();
- const startHeight = await getBootstrapBlockHeight(latestTxId);
+
+ let info;
+ let startHeight;
+ try {
+ info = await node.getblockchaininfo();
+ startHeight = await getBootstrapBlockHeight(latestTxId);
+ } catch(err) {
+ log.error(`Unknown node error during bootstrap: ${extractErrMessage(err)}`);
+ return res.status(500).json({ error: 'Unknown zcash node error' });
+ }
console.info('Bootstrapping watcher!');
console.info(' * Start height:', startHeight);
@@ -39,11 +47,18 @@ app.post('/bootstrap', async (req, res) => {
console.info('Generating addresses to watch for each contribution...');
// Running generate address on each will add each contribution to redux state
- pendingContributions.forEach((c: any) => {
- store.dispatch(generateAddresses(c.id));
- });
- console.info(`Done! Generated ${pendingContributions.length} addresses.`);
- store.dispatch(setStartingBlockHeight(startHeight));
+ try {
+ const dispatchers = pendingContributions.map(async (c: any) => {
+ const action = await generateAddresses(c.id);
+ store.dispatch(action);
+ });
+ await Promise.all(dispatchers);
+ console.info(`Done! Generated ${pendingContributions.length} addresses.`);
+ store.dispatch(setStartingBlockHeight(startHeight));
+ } catch(err) {
+ log.error(`Unknown error during bootstrap address generation: ${extractErrMessage(err)}`);
+ return res.status(500).json({ error: 'Failed to generate addresses for contributions' });
+ }
// Send back some basic info about where the chain is at
res.json({
@@ -54,20 +69,29 @@ app.post('/bootstrap', async (req, res) => {
});
});
-app.get('/contribution/addresses', (req, res) => {
+app.get('/contribution/addresses', async (req, res) => {
const { contributionId } = req.query;
let addresses = getAddressesByContributionId(store.getState(), contributionId)
if (!addresses) {
- const action = generateAddresses(req.query.contributionId);
- addresses = action.payload.addresses;
- store.dispatch(action);
+ try {
+ const action = await generateAddresses(contributionId);
+ addresses = action.payload.addresses;
+ store.dispatch(action);
+ } catch(err) {
+ log.error(`Unknown error during address generation for contribution ${contributionId}: ${extractErrMessage(err)}`);
+ }
+ }
+
+ if (addresses) {
+ res.json({
+ data: {
+ ...addresses,
+ memo: makeContributionMemo(contributionId),
+ },
+ });
+ } else {
+ res.status(500).json({ error: 'Failed to generate addresses' });
}
- res.json({
- data: {
- ...addresses,
- memo: makeContributionMemo(contributionId),
- },
- });
});
@@ -96,7 +120,7 @@ app.post('/contribution/disclosure', async (req, res) => {
return res.status(400).json({ error: err.response.data.error.message });
}
else {
- log.error('Unknown node error:', err.response ? err.response.data : err);
+ log.error(`Unknown node error during disclosure: ${extractErrMessage(err)}`);
return res.status(500).json({ error: 'Unknown zcash node error' });
}
}
diff --git a/blockchain/src/server/middleware/errorHandler.ts b/blockchain/src/server/middleware/errorHandler.ts
index 706b8679..d3be2f37 100644
--- a/blockchain/src/server/middleware/errorHandler.ts
+++ b/blockchain/src/server/middleware/errorHandler.ts
@@ -1,6 +1,7 @@
import { captureException } from "@sentry/node";
import { Request, Response, NextFunction } from 'express';
import log from "../../log";
+import { extractErrMessage } from "../../util";
export default function errorHandler(err: Error, req: Request, res: Response, next: NextFunction) {
// Non-error responses, or something else handled & responded
@@ -9,7 +10,7 @@ export default function errorHandler(err: Error, req: Request, res: Response, ne
}
captureException(err);
- log.error(`Uncaught ${err.name} exception at ${req.method} ${req.path}: ${err.message}`);
+ log.error(`Uncaught ${err.name} exception at ${req.method} ${req.path}: ${extractErrMessage(err)}`);
log.debug(`Query: ${JSON.stringify(req.query, null, 2)}`);
log.debug(`Body: ${JSON.stringify(req.body, null, 2)}`);
log.debug(`Full stacktrace:\n${err.stack}`);
diff --git a/blockchain/src/store/actions.ts b/blockchain/src/store/actions.ts
index a3a44c7f..c6236594 100644
--- a/blockchain/src/store/actions.ts
+++ b/blockchain/src/store/actions.ts
@@ -1,6 +1,7 @@
import type, { AddressCollection } from './types';
import { deriveTransparentAddress } from '../util';
import { getNetwork } from '../node';
+import { getContributionAddress } from '../bitgo';
import env from '../env';
export function setStartingBlockHeight(height: string | number) {
@@ -10,10 +11,16 @@ export function setStartingBlockHeight(height: string | number) {
}
}
-export function generateAddresses(contributionId: number) {
- // 2^31 is the maximum number of BIP32 addresses
+export async function generateAddresses(contributionId: number) {
+ let transparent;
+ if (env.BITGO_WALLET_ID) {
+ transparent = await getContributionAddress(contributionId);
+ } else {
+ transparent = deriveTransparentAddress(contributionId, getNetwork());
+ }
+
const addresses: AddressCollection = {
- transparent: deriveTransparentAddress(contributionId, getNetwork()),
+ transparent,
sprout: env.SPROUT_ADDRESS,
};
return {
@@ -45,8 +52,9 @@ export function confirmPaymentDisclosure(contributionId: number, disclosure: str
};
}
+type UnwrapPromise = T extends Promise ? U : T;
export type ActionTypes =
| ReturnType
- | ReturnType
+ | UnwrapPromise>
| ReturnType
| ReturnType;
diff --git a/blockchain/src/util.ts b/blockchain/src/util.ts
index f15e1d7f..ba4fbf38 100755
--- a/blockchain/src/util.ts
+++ b/blockchain/src/util.ts
@@ -73,3 +73,15 @@ export function sleep(ms: number) {
setTimeout(resolve, ms);
});
}
+
+// They come in all shapes and sizes, and nested data can get truncated as
+// [object Object], so try to extract the best parts available.
+export function extractErrMessage(err: any) {
+ if (err.response && err.response.data) {
+ if (err.response.data.error && err.response.data.error.message) {
+ return err.response.data.error.message;
+ }
+ return JSON.stringify(err.response.data, null, 2);
+ }
+ return err.message || err.toString();
+}
\ No newline at end of file
diff --git a/blockchain/src/webhooks/index.ts b/blockchain/src/webhooks/index.ts
index 525e100d..ab4c19a1 100755
--- a/blockchain/src/webhooks/index.ts
+++ b/blockchain/src/webhooks/index.ts
@@ -5,13 +5,13 @@ import { Notifier } from "./notifiers/notifier";
import node from "../node";
import env from "../env";
import { store } from "../store";
-import { sleep } from "../util";
+import { sleep, extractErrMessage } from "../util";
import log from "../log";
let blockScanTimeout: any = null;
let notifiers = [] as Notifier[];
let consecutiveBlockFailures = 0;
-const MAXIMUM_BLOCK_FAILURES = 5;
+const MAXIMUM_BLOCK_FAILURES = 10;
const MIN_BLOCK_CONF = parseInt(env.MINIMUM_BLOCK_CONFIRMATIONS, 10);
export async function start() {
@@ -38,7 +38,7 @@ function initScan() {
store.subscribe(() => {
const { startingBlockHeight } = store.getState();
if (startingBlockHeight !== null && prevHeight !== startingBlockHeight) {
- console.info(`Starting block scan at block ${startingBlockHeight}`);
+ log.info(`Starting block scan at block ${startingBlockHeight}`);
clearTimeout(blockScanTimeout);
scanBlock(startingBlockHeight);
prevHeight = startingBlockHeight;
@@ -47,25 +47,25 @@ function initScan() {
}
async function scanBlock(height: number) {
- const highestBlock = await node.getblockcount();
-
- // Try again in 5 seconds if the next block isn't ready
- if (height > highestBlock - MIN_BLOCK_CONF) {
- blockScanTimeout = setTimeout(() => {
- scanBlock(height);
- }, 5000);
- return;
- }
-
- // Process the block
try {
+ // Fetch the current block height, try again in 5 seconds if the next
+ // block doesn't meet our confirmation requirement
+ const highestBlock = await node.getblockcount();
+ if (height > highestBlock - MIN_BLOCK_CONF) {
+ blockScanTimeout = setTimeout(() => {
+ scanBlock(height);
+ }, 5000);
+ return;
+ }
+
+ // Process the block, then try the next one
const block = await node.getblock(String(height), 2); // 2 == full blocks
log.info(`Processing block #${block.height}...`);
notifiers.forEach(n => n.onNewBlock && n.onNewBlock(block));
consecutiveBlockFailures = 0;
+ scanBlock(height + 1);
} catch(err) {
- log.warn(err.response ? err.response.data : err);
- log.warn(`Failed to fetch block ${height}, see above error`);
+ log.warn(`Failed to fetch block ${height}: ${extractErrMessage(err)}`);
consecutiveBlockFailures++;
// If we fail a certain number of times, it's reasonable to
// assume that the blockchain is down, and we should just quit.
@@ -75,13 +75,12 @@ async function scanBlock(height: number) {
process.exit(1);
}
else {
- log.warn('Attempting to fetch again shortly...');
- await sleep(5000);
+ log.warn('Attempting to fetch again in 60 seconds...');
+ await sleep(60000);
}
+ // Try same block again
+ scanBlock(height);
}
-
- // Try next block
- scanBlock(height + 1);
}
function initNotifiers() {
@@ -94,8 +93,7 @@ async function requestBootstrap() {
log.debug('Requesting bootstrap from backend...');
await send('/blockchain/bootstrap', 'GET');
} catch(err) {
- log.error(err.response ? err.response.data : err);
- log.error('Request for bootstrap failed, see above for details');
+ log.error(`Request for bootstrap failed: ${extractErrMessage(err)}`);
}
}
@@ -126,7 +124,6 @@ const send: Send = (route, method, payload) => {
return;
}
captureException(err);
- const errMsg = err.response ? `Response: ${JSON.stringify(err.response.data, null, 2)}` : err.message;
- log.error(`Webhook server request to ${method} ${route} failed: ${errMsg}`);
+ log.error(`Webhook server request to ${method} ${route} failed: ${extractErrMessage(err)}`);
});
};
diff --git a/blockchain/src/webhooks/notifiers/contribution/index.ts b/blockchain/src/webhooks/notifiers/contribution/index.ts
index 2cb707a2..b84ccace 100644
--- a/blockchain/src/webhooks/notifiers/contribution/index.ts
+++ b/blockchain/src/webhooks/notifiers/contribution/index.ts
@@ -10,7 +10,7 @@ import {
} from "../../../store";
import env from "../../../env";
import log from "../../../log";
-import { getContributionIdFromMemo, decodeHexMemo, toBaseUnit } from "../../../util";
+import { getContributionIdFromMemo, decodeHexMemo, toBaseUnit, extractErrMessage } from "../../../util";
interface ContributionConfirmationPayload {
to: string;
@@ -26,8 +26,9 @@ export default class ContributionNotifier implements Notifier {
onNewBlock = (block: BlockWithTransactions) => {
this.checkBlockForTransparentPayments(block);
- this.checkForMemoPayments();
- this.checkDisclosuresForPayment(block);
+ // NOTE: Re-enable when sapling is ready
+ // this.checkForMemoPayments();
+ // this.checkDisclosuresForPayment(block);
};
registerSend = (sm: Send) => (this.send = sm);
@@ -41,6 +42,11 @@ export default class ContributionNotifier implements Notifier {
block.tx.forEach(tx => {
tx.vout.forEach(vout => {
+ // Some vouts are not transactions with addresses, ignore those
+ if (!vout.scriptPubKey.addresses) {
+ return;
+ }
+
// Addresses is an array because of multisigs, but we'll never
// generate one, so all of our addresses will only have addresses[0]
const to = vout.scriptPubKey.addresses[0];
@@ -91,7 +97,7 @@ export default class ContributionNotifier implements Notifier {
captureException(err);
log.error(
'Failed to check sprout address for memo payments:\n',
- err.response ? err.response.data : err,
+ extractErrMessage(err),
);
}
};
@@ -131,9 +137,9 @@ export default class ContributionNotifier implements Notifier {
store.dispatch(confirmPaymentDisclosure(contributionId, disclosure));
} catch(err) {
captureException(err);
- log.error(
+ log.warn(
'Encountered an error while checking disclosure:\n',
- err.response ? err.response.data : err,
+ extractErrMessage(err),
);
}
};
diff --git a/blockchain/tsconfig.json b/blockchain/tsconfig.json
index 370ec7b5..5fdcec26 100755
--- a/blockchain/tsconfig.json
+++ b/blockchain/tsconfig.json
@@ -50,7 +50,8 @@
// https://www.npmjs.com/package/ts-node#help-my-types-are-missing
"paths": {
"stdrpc": ["types/stdrpc"],
- "zcash-bitcore-lib": ["types/zcash-bitcore-lib"]
+ "zcash-bitcore-lib": ["types/zcash-bitcore-lib"],
+ "bitgo": ["types/bitgo"]
},
/* Source Map Options */
diff --git a/blockchain/types/bitgo.d.ts b/blockchain/types/bitgo.d.ts
new file mode 100644
index 00000000..0b7ce5c3
--- /dev/null
+++ b/blockchain/types/bitgo.d.ts
@@ -0,0 +1,71 @@
+// Adapted from documentation here: https://www.bitgo.com/api/v2/?javascript
+// Far from exhaustive, only functions used are properly typed.
+
+declare module 'bitgo' {
+ // Wallet
+ interface CreateAddressOptions {
+ label: string;
+ }
+
+ interface GetAddressesOptions {
+ labelContains?: string;
+ limit?: number;
+ mine?: boolean;
+ prevId?: string;
+ chains?: number[];
+ sort?: 1 | -1;
+ }
+
+ interface AddressInfo {
+ id: string;
+ address: string;
+ chain: number;
+ index: number;
+ coin: string;
+ lastNonce: number;
+ wallet: string;
+ label: string;
+ addressType: string;
+ }
+
+ interface GetAddressResponse {
+ coin: string;
+ totalAddressCount: number;
+ pendingAddressCount: number;
+ addresses: AddressInfo[];
+ nextBatchPrevId: string;
+ }
+
+ export class Wallet {
+ id(): string;
+ label(): string;
+ createAddress(options?: CreateAddressOptions): Promise;
+ addresses(options?: GetAddressesOptions): Promise;
+ }
+
+ // Wallets
+ interface GetWalletOptions {
+ id: string;
+ }
+
+ export class Wallets {
+ get(options: GetWalletOptions): Promise;
+ }
+
+ // BaseCoin
+ export class BaseCoin {
+ wallets(): Wallets;
+ }
+
+ // BitGo
+ interface BitGoOptions {
+ env: 'test' | 'prod';
+ accessToken: string;
+ proxy?: string;
+ }
+
+ export class BitGo {
+ constructor(options: BitGoOptions);
+ coin(coin: string): BaseCoin;
+ }
+}
diff --git a/blockchain/yarn.lock b/blockchain/yarn.lock
index ce57fd57..c09b612e 100755
--- a/blockchain/yarn.lock
+++ b/blockchain/yarn.lock
@@ -114,6 +114,11 @@
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+"@types/lodash@^4.14.85":
+ version "4.14.123"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.123.tgz#39be5d211478c8dd3bdae98ee75bb7efe4abfe4d"
+ integrity sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==
+
"@types/mime@*":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
@@ -126,6 +131,11 @@
version "10.12.11"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.11.tgz#715c476c99a5f6898a1ae61caf9825e43c03912e"
+"@types/node@^8.0.7":
+ version "8.10.44"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.44.tgz#b00cf3595c6a3d75740af9768739a8125053a5a9"
+ integrity sha512-HY3SK7egERHGUfY8p6ztXIEQWcIPHouYhCGcLAPQin7gE2G/fALFz+epnMwcxKUS6aKqTVoAFdi+t1llQd3xcw==
+
"@types/range-parser@*":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
@@ -141,6 +151,13 @@
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d"
+"@types/ws@^3.2.0":
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-3.2.1.tgz#b0c1579e58e686f83ce0a97bb9463d29705827fb"
+ integrity sha512-t5n0/iHoavnX1MqeYmKJgWc1W6yX4BXsNxQg7M5862RWrfN9S5k8yaWbDMGJSTCzbH7+q5QS8chjymd+ND9gMw==
+ dependencies:
+ "@types/node" "*"
+
"@types/ws@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28"
@@ -159,7 +176,7 @@ accepts@~1.3.5:
mime-types "~2.1.18"
negotiator "0.6.1"
-agent-base@^4.1.0:
+agent-base@4, agent-base@^4.1.0, agent-base@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
dependencies:
@@ -203,6 +220,13 @@ are-we-there-yet@~1.1.2:
delegates "^1.0.0"
readable-stream "^2.0.6"
+argparse@1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -227,10 +251,22 @@ arrify@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+assert@0.4.9:
+ version "0.4.9"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-0.4.9.tgz#45faff1a58f718508118873dead940c8b51db939"
+ integrity sha1-Rfr/Glj3GFCBGIc96tlAyLUduTk=
+ dependencies:
+ util ">= 0.4.9"
+
assign-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ast-types@0.x.x:
+ version "0.12.2"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.2.tgz#341656049ee328ac03fc805c156b49ebab1e4462"
+ integrity sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==
+
async-each@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -245,11 +281,16 @@ async@^2.6.0:
dependencies:
lodash "^4.17.10"
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
atob@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
-axios@0.18.0:
+axios@0.18.0, axios@^0.18.0:
version "0.18.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
dependencies:
@@ -263,10 +304,42 @@ axios@^0.16.2:
follow-redirects "^1.2.3"
is-buffer "^1.1.5"
+babel-runtime@^5.8.20:
+ version "5.8.38"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19"
+ integrity sha1-HAsC62MxL18If/IEUIJ7QlydTBk=
+ dependencies:
+ core-js "^1.0.0"
+
+babel-runtime@^6.6.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+base-x@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac"
+ integrity sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w=
+
+base-x@^3.0.2:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.5.tgz#d3ada59afed05b921ab581ec3112e6444ba0795a"
+ integrity sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base32.js@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.1.0.tgz#b582dec693c2f11e893cf064ee6ac5b6131a2202"
+ integrity sha1-tYLexpPC8R6JPPBk7mrFthMaIgI=
+
base@^0.11.1:
version "0.11.2"
resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
@@ -279,16 +352,183 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
-basic-auth@^2.0.0:
+basic-auth@^2.0.0, basic-auth@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
dependencies:
safe-buffer "5.1.2"
+bech32@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/bech32/-/bech32-0.0.3.tgz#736747c4a6531c5d8937d0400498de30e93b2f9c"
+ integrity sha512-O+K1w8P/aAOLcYwwQ4sbiPYZ51ZIW95lnS4/6nE8Aib/z+OOddQIIPdu2qi94qGDp4HhYy/wJotttXKkak1lXg==
+
+big.js@3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
+ integrity sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=
+
+bigi@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.0.tgz#90ac1aeac0a531216463bdb58f42c1e05c8407ac"
+ integrity sha1-kKwa6sClMSFkY721j0LB4FyEB6w=
+
+bigi@^1.1.0, bigi@^1.4.0, bigi@^1.4.2, bigi@~1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825"
+ integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=
+
+bignumber.js@8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.1.tgz#5d419191370fb558c64e3e5f70d68e5947138832"
+ integrity sha512-zAySveTJXkgLYCBi0b14xzfnOs+f3G6x36I8w2a1+PFQpWk/dp0mI0F+ZZK2bu+3ELewDcSyP+Cfq++NcHX7sg==
+
+bignumber.js@^4.0.0, bignumber.js@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
+ integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==
+
binary-extensions@^1.0.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
+bindings@^1.2.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bip66@^1.1.0, bip66@^1.1.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22"
+ integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+bitcoin-ops@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz#e45de620398e22fd4ca6023de43974ff42240278"
+ integrity sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==
+
+bitcoin-ops@~1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.3.0.tgz#6b126b585537bc679b02ed499f14450cffc37e13"
+ integrity sha1-axJrWFU3vGebAu1JnxRFDP/DfhM=
+
+bitcoinjs-lib@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-3.0.3.tgz#3470eed5d6778b5404b770effbd0fcbb2bd89655"
+ integrity sha1-NHDu1dZ3i1QEt3Dv+9D8uyvYllU=
+ dependencies:
+ bigi "^1.4.0"
+ bip66 "^1.1.0"
+ bitcoin-ops "^1.3.0"
+ bs58check "^2.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.3"
+ ecurve "^1.0.0"
+ merkle-lib "^2.0.10"
+ pushdata-bitcoin "^1.0.1"
+ randombytes "^2.0.1"
+ typeforce "^1.8.7"
+ varuint-bitcoin "^1.0.4"
+ wif "^2.0.1"
+
+bitcoinjs-message@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/bitcoinjs-message/-/bitcoinjs-message-2.0.0.tgz#e285d223607dabf2b33a6ee486a223b59d1b1548"
+ integrity sha512-H5pJC7/eSqVjREiEOZ4jifX+7zXYP3Y28GIOIqg9hrgE7Vj8Eva9+HnVqnxwA1rJPOwZKuw0vo6k0UxgVc6q1A==
+ dependencies:
+ bs58check "^2.0.2"
+ buffer-equals "^1.0.3"
+ create-hash "^1.1.2"
+ secp256k1 "^3.0.1"
+ varuint-bitcoin "^1.0.1"
+
+bitgo-utxo-lib@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/bitgo-utxo-lib/-/bitgo-utxo-lib-1.3.0.tgz#585f365c3eb61d53c7bc0e6a87573dae9d867c27"
+ integrity sha512-jry6Y97g2jr1XlY1Ou5WkWUg1rQbyioLYp9AgyK4OwZ7t2ETRyTB1rcJV9kYOlTnTjC6k+Sef+IKcZLM/u9zjA==
+ dependencies:
+ bech32 "0.0.3"
+ bigi "^1.4.0"
+ bip66 "^1.1.0"
+ bitcoin-ops "^1.3.0"
+ blake2b "https://github.com/BitGo/blake2b#6268e6dd678661e0acc4359e9171b97eb1ebf8ac"
+ bs58check "^2.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.3"
+ debug "~3.1.0"
+ ecurve "^1.0.0"
+ merkle-lib "^2.0.10"
+ pushdata-bitcoin "^1.0.1"
+ randombytes "^2.0.1"
+ safe-buffer "^5.0.1"
+ typeforce "^1.11.3"
+ varuint-bitcoin "^1.0.4"
+ wif "^2.0.1"
+ optionalDependencies:
+ secp256k1 "^3.5.2"
+
+bitgo@4.48.1:
+ version "4.48.1"
+ resolved "https://registry.yarnpkg.com/bitgo/-/bitgo-4.48.1.tgz#8b3965516441ef99fbf327e8a05109a450a7bcea"
+ integrity sha512-+LF9J5zFuIUv48J2n4o/oyEd16Z3RPyXReIIZELaB88CGnqeIspHOwmnRM2+gn5Q7NPP+xZYOLn5stqOGmUJ6w==
+ dependencies:
+ argparse "1.0.10"
+ assert "0.4.9"
+ big.js "3.1.3"
+ bigi "1.4.0"
+ bignumber.js "8.0.1"
+ bitcoinjs-message "2.0.0"
+ bitgo-utxo-lib "1.3.0"
+ bluebird "3.5.3"
+ body-parser "1.18.3"
+ bs58 "2.0.1"
+ bs58check "1.0.4"
+ cashaddress "1.1.0"
+ create-hmac "1.1.7"
+ debug "3.1.0"
+ ecurve "1.0.6"
+ eol "0.5.0"
+ express "4.16.4"
+ http-proxy "1.11.1"
+ lodash "4.17.11"
+ minimist "0.2.0"
+ moment "2.20.1"
+ morgan "1.9.1"
+ prova-lib "0.2.10"
+ ripple-lib "0.22.0"
+ sanitize-html "1.13.0"
+ secrets.js-grempe "1.1.0"
+ stellar-sdk "0.11.0"
+ superagent "3.8.3"
+ superagent-proxy "1.0.3"
+ optionalDependencies:
+ ethereumjs-abi "0.6.5"
+ ethereumjs-tx "1.3.7"
+ ethereumjs-util "4.4.1"
+ secp256k1 "3.6.1"
+
+"blake2b-wasm@https://github.com/BitGo/blake2b-wasm#193cdb71656c1a6c7f89b05d0327bb9b758d071b":
+ version "2.0.0"
+ resolved "https://github.com/BitGo/blake2b-wasm#193cdb71656c1a6c7f89b05d0327bb9b758d071b"
+ dependencies:
+ nanoassert "^1.0.0"
+
+"blake2b@git+https://github.com/BitGo/blake2b.git#6268e6dd678661e0acc4359e9171b97eb1ebf8ac":
+ version "2.1.3"
+ resolved "git+https://github.com/BitGo/blake2b.git#6268e6dd678661e0acc4359e9171b97eb1ebf8ac"
+ dependencies:
+ blake2b-wasm "https://github.com/BitGo/blake2b-wasm#193cdb71656c1a6c7f89b05d0327bb9b758d071b"
+ nanoassert "^1.0.0"
+
+bluebird@3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
+ integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
+
bn.js@=2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.0.4.tgz#220a7cd677f7f1bfa93627ff4193776fe7819480"
@@ -297,6 +537,16 @@ bn.js@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625"
+bn.js@^3.1.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-3.3.0.tgz#1138e577889fdc97bbdab51844f2190dfc0ae3d7"
+ integrity sha1-ETjld4if3Je72rUYRPIZDfwK49c=
+
+bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.3, bn.js@^4.4.0, bn.js@^4.8.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
body-parser@1.18.3:
version "1.18.3"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
@@ -346,7 +596,7 @@ braces@^2.3.0, braces@^2.3.1:
split-string "^3.0.2"
to-regex "^3.0.1"
-brorand@^1.0.1:
+brorand@^1.0.1, brorand@^1.0.5:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -354,18 +604,84 @@ browser-stdout@1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+browserify-aes@^1.0.6:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-sha3@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.4.tgz#086c47b8c82316c9d47022c26185954576dd8e26"
+ integrity sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=
+ dependencies:
+ js-sha3 "^0.6.1"
+ safe-buffer "^5.1.1"
+
+bs58@2.0.1, bs58@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d"
+ integrity sha1-VZCNWPGYKrogCPob7Y+RmYopv40=
+
bs58@=2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.0.tgz#72b713bed223a0ac518bbda0e3ce3f4817f39eb5"
+bs58@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo=
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-1.0.4.tgz#94180ab90821fe250496151f60d0eb3d9f321198"
+ integrity sha1-lBgKuQgh/iUElhUfYNDrPZ8yEZg=
+ dependencies:
+ bs58 "^2.0.1"
+
+bs58check@<3.0.0, bs58check@^2.0.0, bs58check@^2.0.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+bs58check@~2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.0.2.tgz#06f63b01c2fa6173033c90eb87f1fe3d2e13d89a"
+ integrity sha1-BvY7AcL6YXMDPJDrh/H+PS4T2Jo=
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+
buffer-compare@=1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.0.0.tgz#acaa7a966e98eee9fae14b31c39a5f158fb3c4a2"
+buffer-equals@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5"
+ integrity sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=
+
buffer-from@^1.0.0, buffer-from@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@@ -392,6 +708,13 @@ capture-stack-trace@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
+cashaddress@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/cashaddress/-/cashaddress-1.1.0.tgz#1a7d3b4e3b3bbdef77b666fecf322ea79bcc9799"
+ integrity sha1-Gn07Tjs7ve93tmb+zzIup5vMl5k=
+ dependencies:
+ bigi "^1.4.2"
+
chalk@^2.0.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
@@ -427,6 +750,14 @@ ci-info@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -440,6 +771,11 @@ cli-boxes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
@@ -494,11 +830,18 @@ colorspace@1.1.x:
color "3.0.x"
text-hex "1.0.x"
+combined-stream@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
+ integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
+ dependencies:
+ delayed-stream "~1.0.0"
+
commander@2.15.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
-component-emitter@^1.2.1:
+component-emitter@^1.2.0, component-emitter@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
@@ -537,10 +880,25 @@ cookie@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+cookiejar@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
copy-descriptor@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+core-js@^1.0.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+ integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
+
+core-js@^2.4.0, core-js@^2.6.3:
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
+ integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==
+
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -552,12 +910,40 @@ cors@2.8.5:
object-assign "^4"
vary "^1"
+crc@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964"
+ integrity sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=
+
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
dependencies:
capture-stack-trace "^1.0.0"
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@1.1.7, create-hmac@^1.1.3, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@@ -570,24 +956,48 @@ crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+cursor@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/cursor/-/cursor-0.1.5.tgz#ea778c2b09d33c2e564fd92147076750483ebb2c"
+ integrity sha1-6neMKwnTPC5WT9khRwdnUEg+uyw=
+
+data-uri-to-buffer@2:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.0.tgz#0ba23671727349828c32cfafddea411908d13d23"
+ integrity sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw==
+ dependencies:
+ "@types/node" "^8.0.7"
+
debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
-debug@3.1.0, debug@=3.1.0:
+debug@3.1.0, debug@=3.1.0, debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
+debug@4:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
dependencies:
ms "^2.1.1"
+decimal.js@^5.0.8:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-5.0.8.tgz#b48c3fb7d73a2d4d4940e0b38f1cd21db5b367ce"
+ integrity sha1-tIw/t9c6LU1JQOCzjxzSHbWzZ84=
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -596,6 +1006,11 @@ deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
deepmerge@^2.0.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
@@ -619,6 +1034,20 @@ define-property@^2.0.2:
is-descriptor "^1.0.2"
isobject "^3.0.1"
+degenerator@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095"
+ integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=
+ dependencies:
+ ast-types "0.x.x"
+ escodegen "1.x.x"
+ esprima "3.x.x"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -647,6 +1076,34 @@ diff@3.5.0, diff@^3.1.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+dom-serializer@0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+ integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+ dependencies:
+ domelementtype "^1.3.0"
+ entities "^1.1.1"
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
dot-prop@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
@@ -657,10 +1114,35 @@ dotenv@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.1.0.tgz#9853b6ca98292acb7dec67a95018fa40bccff42c"
+drbg.js@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
+ integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=
+ dependencies:
+ browserify-aes "^1.0.6"
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ecurve@1.0.6, ecurve@^1.0.0, ecurve@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797"
+ integrity sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w==
+ dependencies:
+ bigi "^1.1.0"
+ safe-buffer "^5.0.1"
+
+ed25519@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/ed25519/-/ed25519-0.0.4.tgz#e56218ace2fc903d259593aef0b2a9639f475beb"
+ integrity sha1-5WIYrOL8kD0llZOu8LKpY59HW+s=
+ dependencies:
+ bindings "^1.2.1"
+ nan "^2.0.9"
+
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -674,6 +1156,29 @@ elliptic@=3.0.3:
hash.js "^1.0.0"
inherits "^2.0.1"
+elliptic@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-5.2.1.tgz#fa294b6563c6ddbc9ba3dc8594687ae840858f10"
+ integrity sha1-+ilLZWPG3bybo9yFlGh66ECFjxA=
+ dependencies:
+ bn.js "^3.1.1"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ inherits "^2.0.1"
+
+elliptic@^6.2.3:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
+ integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
enabled@1.0.x:
version "1.0.2"
resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93"
@@ -684,14 +1189,29 @@ encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+entities@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
env-variable@0.0.x:
version "0.0.5"
resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88"
+eol@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/eol/-/eol-0.5.0.tgz#7544ee1c9cefcac6041286abac1e7f5e5b36f10c"
+ integrity sha1-dUTuHJzvysYEEoarrB5/Xls28Qw=
+
es6-promise@^4.0.3:
version "4.2.5"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
+es6-promise@^4.2.4:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f"
+ integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==
+
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
@@ -706,10 +1226,126 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+escodegen@1.x.x:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510"
+ integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esprima@3.x.x, esprima@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+ integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
+
+estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+ integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+ integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
+
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ethereum-common@^0.0.18:
+ version "0.0.18"
+ resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
+ integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=
+
+ethereumjs-abi@0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
+ integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=
+ dependencies:
+ bn.js "^4.10.0"
+ ethereumjs-util "^4.3.0"
+
+ethereumjs-tx@1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
+ integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ dependencies:
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
+
+ethereumjs-util@4.4.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.4.1.tgz#6316bfbc8a01c8767a78620928ed79ef424c3f92"
+ integrity sha1-Yxa/vIoByHZ6eGIJKO1570JMP5I=
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ keccakjs "^0.2.0"
+ rlp "^2.0.0"
+ secp256k1 "^3.0.1"
+
+ethereumjs-util@^4.3.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6"
+ integrity sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=
+ dependencies:
+ bn.js "^4.8.0"
+ create-hash "^1.1.2"
+ keccakjs "^0.2.0"
+ rlp "^2.0.0"
+ secp256k1 "^3.0.1"
+
+ethereumjs-util@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642"
+ integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ ethjs-util "^0.1.3"
+ keccak "^1.0.2"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+ secp256k1 "^3.0.1"
+
+ethjs-util@^0.1.3:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-source-polyfill@0.0.12:
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/event-source-polyfill/-/event-source-polyfill-0.0.12.tgz#e539cd67fdef2760a16aa5262fa98134df52e3af"
+ integrity sha1-5TnNZ/3vJ2ChaqUmL6mBNN9S468=
+
+eventemitter3@1.x.x:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+ integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=
+
+eventsource@^1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
+ integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
+ dependencies:
+ original "^1.0.0"
+
+evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
@@ -782,6 +1418,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
+extend@^3.0.0, extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -795,6 +1436,11 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
fast-safe-stringify@^2.0.4:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2"
@@ -803,6 +1449,11 @@ fecha@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd"
+file-uri-to-path@1, file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -840,6 +1491,20 @@ for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+form-data@^2.3.1:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+formidable@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659"
+ integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==
+
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -871,6 +1536,14 @@ fsevents@^1.2.2:
nan "^2.9.2"
node-pre-gyp "^0.10.0"
+ftp@~0.3.10:
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+ integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=
+ dependencies:
+ readable-stream "1.1.x"
+ xregexp "2.0.0"
+
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -888,6 +1561,18 @@ get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+get-uri@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.3.tgz#fa13352269781d75162c6fc813c9e905323fbab5"
+ integrity sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==
+ dependencies:
+ data-uri-to-buffer "2"
+ debug "4"
+ extend "~3.0.2"
+ file-uri-to-path "1"
+ ftp "~0.3.10"
+ readable-stream "3"
+
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -986,7 +1671,15 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
-hash.js@^1.0.0:
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
dependencies:
@@ -997,6 +1690,27 @@ he@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+htmlparser2@^3.9.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
version "1.6.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
@@ -1006,7 +1720,23 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
-https-proxy-agent@2.2.1:
+http-proxy-agent@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
+ integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
+ dependencies:
+ agent-base "4"
+ debug "3.1.0"
+
+http-proxy@1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.11.1.tgz#71df55757e802d58ea810df2244019dda05ae85d"
+ integrity sha1-cd9VdX6ALVjqgQ3yJEAZ3aBa6F0=
+ dependencies:
+ eventemitter3 "1.x.x"
+ requires-port "0.x.x"
+
+https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
@@ -1051,7 +1781,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@@ -1063,6 +1793,11 @@ ini@^1.3.4, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+ip@^1.1.4, ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+ integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
ipaddr.js@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
@@ -1163,6 +1898,11 @@ is-glob@^4.0.0:
dependencies:
is-extglob "^2.1.1"
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha1-fY035q135dEnFIkTxXPggtd39VQ=
+
is-installed-globally@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
@@ -1212,6 +1952,11 @@ is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
isarray@1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -1234,16 +1979,54 @@ isomorphic-ws@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
+js-sha3@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.6.1.tgz#5b89f77a7477679877f58c4a075240934b1f95c0"
+ integrity sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=
+
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+js-xdr@^1.0.5:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/js-xdr/-/js-xdr-1.1.1.tgz#38b1dbba77e4b381b9603e564fe1d374649ce2e1"
+ integrity sha512-csYOkKC78umSY2r3oDUONGH1ZcyTex7VlzpfmjKdzlNoeqFQtOA1rhBE9/e3mFNiO0Do65EVvyWx2jHHtRYPPg==
+ dependencies:
+ core-js "^2.6.3"
+ cursor "^0.1.5"
+ lodash "^4.17.5"
+ long "^2.2.3"
+
json5@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
dependencies:
minimist "^1.2.0"
+jsonschema@1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.2.tgz#83ab9c63d65bf4d596f91d81195e78772f6452bc"
+ integrity sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==
+
+keccak@^1.0.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80"
+ integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==
+ dependencies:
+ bindings "^1.2.1"
+ inherits "^2.0.3"
+ nan "^2.2.1"
+ safe-buffer "^5.1.0"
+
+keccakjs@^0.2.0:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.3.tgz#5e4e969ce39689a3861f445d7752ee3477f9fe72"
+ integrity sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==
+ dependencies:
+ browserify-sha3 "^0.0.4"
+ sha3 "^1.2.2"
+
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -1282,18 +2065,26 @@ latest-version@^3.0.0:
dependencies:
package-json "^4.0.0"
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+lodash@4.17.11, lodash@^4.12.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.4:
+ version "4.17.11"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+
lodash@=3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
-lodash@^4.17.10:
- version "4.17.11"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
-
logform@^1.9.1:
version "1.10.0"
resolved "https://registry.yarnpkg.com/logform/-/logform-1.10.0.tgz#c9d5598714c92b546e23f4e78147c40f1e02012e"
@@ -1304,6 +2095,11 @@ logform@^1.9.1:
ms "^2.1.1"
triple-beam "^1.2.0"
+long@^2.2.3:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f"
+ integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=
+
loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -1314,7 +2110,7 @@ lowercase-keys@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
-lru-cache@^4.0.1:
+lru-cache@^4.0.1, lru-cache@^4.1.2:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
dependencies:
@@ -1350,6 +2146,15 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -1358,7 +2163,12 @@ merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
-methods@~1.1.2:
+merkle-lib@^2.0.10:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/merkle-lib/-/merkle-lib-2.0.10.tgz#82b8dbae75e27a7785388b73f9d7725d0f6f3326"
+ integrity sha1-grjbrnXieneFOItz+ddyXQ9vMyY=
+
+methods@^1.1.1, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -1384,6 +2194,18 @@ mime-db@~1.37.0:
version "1.37.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
+mime-db@~1.38.0:
+ version "1.38.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
+ integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==
+
+mime-types@^2.1.12:
+ version "2.1.22"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd"
+ integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==
+ dependencies:
+ mime-db "~1.38.0"
+
mime-types@~2.1.18:
version "2.1.21"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
@@ -1394,10 +2216,20 @@ mime@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
-minimalistic-assert@^1.0.1:
+mime@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
minimatch@3.0.4, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@@ -1408,6 +2240,11 @@ minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+minimist@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce"
+ integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784=
+
minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
@@ -1454,6 +2291,22 @@ mocha@^5.2.0:
mkdirp "0.5.1"
supports-color "5.4.0"
+moment@2.20.1:
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
+ integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==
+
+morgan@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59"
+ integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==
+ dependencies:
+ basic-auth "~2.0.0"
+ debug "2.6.9"
+ depd "~1.1.2"
+ on-finished "~2.3.0"
+ on-headers "~1.0.1"
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -1462,10 +2315,25 @@ ms@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+nan@2.10.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+ integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==
+
+nan@^2.0.9, nan@^2.2.1:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd"
+ integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==
+
nan@^2.9.2:
version "2.11.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+nanoassert@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-1.1.0.tgz#4f3152e09540fde28c76f44b19bbcd1d5a42478d"
+ integrity sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -1494,6 +2362,11 @@ negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+netmask@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
+ integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=
+
node-pre-gyp@^0.10.0:
version "0.10.3"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
@@ -1603,6 +2476,11 @@ on-finished@~2.3.0:
dependencies:
ee-first "1.1.1"
+on-headers@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -1613,6 +2491,25 @@ one-time@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
+optionator@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+original@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
+ integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
+ dependencies:
+ url-parse "^1.4.3"
+
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
@@ -1632,6 +2529,31 @@ p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+pac-proxy-agent@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz#90d9f6730ab0f4d2607dcdcd4d3d641aa26c3896"
+ integrity sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==
+ dependencies:
+ agent-base "^4.2.0"
+ debug "^3.1.0"
+ get-uri "^2.0.0"
+ http-proxy-agent "^2.1.0"
+ https-proxy-agent "^2.2.1"
+ pac-resolver "^3.0.0"
+ raw-body "^2.2.0"
+ socks-proxy-agent "^3.0.0"
+
+pac-resolver@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26"
+ integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==
+ dependencies:
+ co "^4.6.0"
+ degenerator "^1.0.4"
+ ip "^1.1.5"
+ netmask "^1.0.6"
+ thunkify "^2.1.2"
+
package-json@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
@@ -1677,6 +2599,11 @@ posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
prepend-http@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
@@ -1685,6 +2612,22 @@ process-nextick-args@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+prova-lib@0.2.10:
+ version "0.2.10"
+ resolved "https://registry.yarnpkg.com/prova-lib/-/prova-lib-0.2.10.tgz#324c17227d62c0cbd74b62198f0928560a889a92"
+ integrity sha512-L1K1BiBteuTL4Q/gyMROmPI4BJVG2KsmEkhmQEOKQw5SA3D54UC3iG6u+DSZKW7nvjsTPSbpzDzaCOmSgtTGuA==
+ dependencies:
+ bigi "~1.4.2"
+ bitcoin-ops "~1.3.0"
+ bitcoinjs-lib "~3.0.2"
+ bs58check "~2.0.1"
+ ecurve "~1.0.5"
+ lodash "~4.17.4"
+ typeforce "~1.10.6"
+ varuint-bitcoin "~1.0.4"
+ optionalDependencies:
+ secp256k1 "~3.5.0"
+
proxy-addr@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
@@ -1692,6 +2635,25 @@ proxy-addr@~2.0.4:
forwarded "~0.1.2"
ipaddr.js "1.8.0"
+proxy-agent@2:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.3.1.tgz#3d49d863d46cf5f37ca8394848346ea02373eac6"
+ integrity sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==
+ dependencies:
+ agent-base "^4.2.0"
+ debug "^3.1.0"
+ http-proxy-agent "^2.1.0"
+ https-proxy-agent "^2.2.1"
+ lru-cache "^4.1.2"
+ pac-proxy-agent "^2.0.1"
+ proxy-from-env "^1.0.0"
+ socks-proxy-agent "^3.0.0"
+
+proxy-from-env@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee"
+ integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=
+
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@@ -1700,15 +2662,39 @@ pstree.remy@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.2.tgz#4448bbeb4b2af1fed242afc8dc7416a6f504951a"
+pushdata-bitcoin@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz#15931d3cd967ade52206f523aa7331aef7d43af7"
+ integrity sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=
+ dependencies:
+ bitcoin-ops "^1.3.0"
+
qs@6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+qs@^6.5.1:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2"
+ integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==
+
+querystringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef"
+ integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==
+
+randombytes@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
range-parser@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
-raw-body@2.3.3:
+raw-body@2.3.3, raw-body@^2.2.0:
version "2.3.3"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
dependencies:
@@ -1726,7 +2712,26 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.6:
+readable-stream@1.1.x:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@3, readable-stream@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d"
+ integrity sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.5, readable-stream@^2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
dependencies:
@@ -1753,6 +2758,11 @@ redux@4.0.1:
loose-envify "^1.4.0"
symbol-observable "^1.2.0"
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
@@ -1760,6 +2770,11 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
+regexp-quote@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/regexp-quote/-/regexp-quote-0.0.0.tgz#1e0f4650c862dcbfed54fd42b148e9bb1721fcf2"
+ integrity sha1-Hg9GUMhi3L/tVP1CsUjpuxch/PI=
+
registry-auth-token@^3.0.1:
version "3.3.2"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20"
@@ -1785,6 +2800,16 @@ repeat-string@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+requires-port@0.x.x:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d"
+ integrity sha1-S0QUQR2d98hVmV3YmajHiilRwW0=
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+
resolve-url@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
@@ -1799,7 +2824,92 @@ rimraf@^2.6.1:
dependencies:
glob "^7.0.5"
-safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+ripple-address-codec@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/ripple-address-codec/-/ripple-address-codec-2.0.1.tgz#eddbe3a7960d2e02c5c1c74fb9a9fa0d2dfb6571"
+ integrity sha1-7dvjp5YNLgLFwcdPuan6DS37ZXE=
+ dependencies:
+ hash.js "^1.0.3"
+ x-address-codec "^0.7.0"
+
+ripple-binary-codec@^0.1.0, ripple-binary-codec@^0.1.13:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ripple-binary-codec/-/ripple-binary-codec-0.1.15.tgz#bf69aa4aef097237f682ff517be29959102cd816"
+ integrity sha512-7b8JO8XmwzcNpBO3bBjNeATiW+NO3qPm56rZBaPn2HJ8Ig0bLJ/ZuA/Vg3SKJQSGOwtx2UD9Cm7PHSpbp+qmIg==
+ dependencies:
+ babel-runtime "^6.6.1"
+ bn.js "^4.11.3"
+ create-hash "^1.1.2"
+ decimal.js "^5.0.8"
+ inherits "^2.0.1"
+ lodash "^4.12.0"
+ ripple-address-codec "^2.0.1"
+
+ripple-hashes@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/ripple-hashes/-/ripple-hashes-0.3.1.tgz#f2f46f1ff05e6487500a99839019114cd2482411"
+ integrity sha1-8vRvH/BeZIdQCpmDkBkRTNJIJBE=
+ dependencies:
+ bignumber.js "^4.1.0"
+ create-hash "^1.1.2"
+ ripple-address-codec "^2.0.1"
+ ripple-binary-codec "^0.1.0"
+
+ripple-keypairs@^0.10.1:
+ version "0.10.2"
+ resolved "https://registry.yarnpkg.com/ripple-keypairs/-/ripple-keypairs-0.10.2.tgz#b3a1d1e2fca85a11c5224b2a7e6da506c19720d0"
+ integrity sha512-NvY+jCrhtpy7ox2unZTIfOfSrUWqVTq+tfCTqgDD8XZ957JGwHBlL5osYAypkTWed/JglH5hggxw14NTKEZzGA==
+ dependencies:
+ babel-runtime "^5.8.20"
+ bn.js "^3.1.1"
+ brorand "^1.0.5"
+ elliptic "^5.1.0"
+ hash.js "^1.0.3"
+ ripple-address-codec "^2.0.1"
+
+ripple-lib-transactionparser@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.6.2.tgz#eb117834816cab3398445a74ec3cacec95b6b5fa"
+ integrity sha1-6xF4NIFsqzOYRFp07Dys7JW2tfo=
+ dependencies:
+ bignumber.js "^4.1.0"
+ lodash "^4.17.4"
+
+ripple-lib@0.22.0:
+ version "0.22.0"
+ resolved "https://registry.yarnpkg.com/ripple-lib/-/ripple-lib-0.22.0.tgz#09c230eaa036dc544c7fb60536c25c527a2c45f7"
+ integrity sha1-CcIw6qA23FRMf7YFNsJcUnosRfc=
+ dependencies:
+ "@types/lodash" "^4.14.85"
+ "@types/ws" "^3.2.0"
+ bignumber.js "^4.1.0"
+ https-proxy-agent "2.2.1"
+ jsonschema "1.2.2"
+ lodash "^4.17.4"
+ ripple-address-codec "^2.0.1"
+ ripple-binary-codec "^0.1.13"
+ ripple-hashes "^0.3.1"
+ ripple-keypairs "^0.10.1"
+ ripple-lib-transactionparser "^0.6.2"
+ ws "^3.3.1"
+
+rlp@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.2.tgz#e6677b83cca9105371d930e01d8ffc1263139d05"
+ integrity sha512-Ng2kJEN731Sfv4ZAY2i0ytPMc0BbJKBsVNl0QZY8LxOWSwd+1xpg+fpSRfaMn0heHU447s6Kgy8qfHZR0XTyVw==
+ dependencies:
+ bn.js "^4.11.1"
+ safe-buffer "^5.1.1"
+
+safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -1813,10 +2923,66 @@ safe-regex@^1.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+sanitize-html@1.13.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.13.0.tgz#4ee17cbec516bfe32f2ce6686a569d7e6b4f3631"
+ integrity sha1-TuF8vsUWv+MvLOZoaladfmtPNjE=
+ dependencies:
+ htmlparser2 "^3.9.0"
+ regexp-quote "0.0.0"
+ xtend "^4.0.0"
+
sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+secp256k1@3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.6.1.tgz#f0475d42096218ff00e45a127242abdff9285335"
+ integrity sha512-utLpWv4P4agEw7hakR73wlWX0NBmC5t/vkJ0TAfTyvETAUzo0tm6aFKPYetVYRaVubxMeWm5Ekv9ETwOgcDCqw==
+ dependencies:
+ bindings "^1.2.1"
+ bip66 "^1.1.3"
+ bn.js "^4.11.3"
+ create-hash "^1.1.2"
+ drbg.js "^1.0.1"
+ elliptic "^6.2.3"
+ nan "^2.2.1"
+ safe-buffer "^5.1.0"
+
+secp256k1@^3.0.1, secp256k1@^3.5.2:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.6.2.tgz#da835061c833c74a12f75c73d2ec2e980f00dc1f"
+ integrity sha512-90nYt7yb0LmI4A2jJs1grglkTAXrBwxYAjP9bpeKjvJKOjG2fOeH/YI/lchDMIvjrOasd5QXwvV2jwN168xNng==
+ dependencies:
+ bindings "^1.2.1"
+ bip66 "^1.1.3"
+ bn.js "^4.11.3"
+ create-hash "^1.1.2"
+ drbg.js "^1.0.1"
+ elliptic "^6.2.3"
+ nan "^2.2.1"
+ safe-buffer "^5.1.0"
+
+secp256k1@~3.5.0:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.2.tgz#f95f952057310722184fe9c914e6b71281f2f2ae"
+ integrity sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ==
+ dependencies:
+ bindings "^1.2.1"
+ bip66 "^1.1.3"
+ bn.js "^4.11.3"
+ create-hash "^1.1.2"
+ drbg.js "^1.0.1"
+ elliptic "^6.2.3"
+ nan "^2.2.1"
+ safe-buffer "^5.1.0"
+
+secrets.js-grempe@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/secrets.js-grempe/-/secrets.js-grempe-1.1.0.tgz#bb3b606dd68637ca244681a10fdee6c512049294"
+ integrity sha1-uztgbdaGN8okRoGhD97mxRIEkpQ=
+
semver-diff@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
@@ -1880,6 +3046,21 @@ setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+sha.js@^2.3.6, sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+sha3@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.2.tgz#a66c5098de4c25bc88336ec8b4817d005bca7ba9"
+ integrity sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=
+ dependencies:
+ nan "2.10.0"
+
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -1900,6 +3081,11 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
+smart-buffer@^1.0.13:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
+ integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=
+
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -1927,6 +3113,22 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
+socks-proxy-agent@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659"
+ integrity sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==
+ dependencies:
+ agent-base "^4.1.0"
+ socks "^1.1.10"
+
+socks@^1.1.10:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a"
+ integrity sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=
+ dependencies:
+ ip "^1.1.4"
+ smart-buffer "^1.0.13"
+
source-map-resolve@^0.5.0:
version "0.5.2"
resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
@@ -1952,7 +3154,7 @@ source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-source-map@^0.6.0:
+source-map@^0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -1962,6 +3164,11 @@ split-string@^3.0.1, split-string@^3.0.2:
dependencies:
extend-shallow "^3.0.0"
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
stack-trace@0.0.10, stack-trace@0.0.x:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
@@ -1988,6 +3195,35 @@ stdrpc@1.0.0:
axios "^0.16.2"
koa-basic-auth "^3.0.0"
+stellar-base@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/stellar-base/-/stellar-base-0.9.0.tgz#03a4d71c9bfe49f0c54afd4a8f34517ed49c0924"
+ integrity sha512-4tyztbyNeLW3bGUMepMqdcywfLUmfAI1A/RSiMgNHRC7vK8Jueh5Dn8RmQPhmAlKsgXhDSmbvpCLwEr2i00Emg==
+ dependencies:
+ base32.js "~0.1.0"
+ bignumber.js "^4.0.0"
+ crc "3.5.0"
+ js-xdr "^1.0.5"
+ lodash "^4.17.10"
+ sha.js "^2.3.6"
+ tweetnacl "^1.0.0"
+ optionalDependencies:
+ ed25519 "0.0.4"
+
+stellar-sdk@0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/stellar-sdk/-/stellar-sdk-0.11.0.tgz#d5415b1c535df188dbd3ab173f93bb24d18266d5"
+ integrity sha512-VNiJBea4eqZsuuNoqJu2WfBq0xhfaKex4soowJFQzYbLY0xVUe4qigetMO8dwlJrRevL4c/EDUd4ouKbT1lqAQ==
+ dependencies:
+ axios "^0.18.0"
+ es6-promise "^4.2.4"
+ event-source-polyfill "0.0.12"
+ eventsource "^1.0.5"
+ lodash "^4.17.10"
+ stellar-base "^0.9.0"
+ toml "^2.3.0"
+ urijs "1.19.1"
+
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -2003,6 +3239,18 @@ string-width@^1.0.1:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
+string_decoder@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
+ integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@@ -2029,10 +3277,41 @@ strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha1-DF8VX+8RUTczd96du1iNoFUA428=
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+superagent-proxy@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-1.0.3.tgz#acfa776672f11c24a90ad575e855def8be44f741"
+ integrity sha512-79Ujg1lRL2ICfuHUdX+H2MjIw73kB7bXsIkxLwHURz3j0XUmEEEoJ+u/wq+mKwna21Uejsm2cGR3OESA00TIjA==
+ dependencies:
+ debug "^3.1.0"
+ proxy-agent "2"
+
+superagent@3.8.3:
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128"
+ integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==
+ dependencies:
+ component-emitter "^1.2.0"
+ cookiejar "^2.1.0"
+ debug "^3.1.0"
+ extend "^3.0.0"
+ form-data "^2.3.1"
+ formidable "^1.2.0"
+ methods "^1.1.1"
+ mime "^1.4.1"
+ qs "^6.5.1"
+ readable-stream "^2.3.5"
+
supports-color@5.4.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
@@ -2071,6 +3350,11 @@ text-hex@1.0.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
+thunkify@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d"
+ integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=
+
timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
@@ -2097,6 +3381,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
+toml@^2.3.0:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b"
+ integrity sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==
+
touch@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
@@ -2155,6 +3444,18 @@ tslib@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+tweetnacl@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.1.tgz#2594d42da73cd036bd0d2a54683dd35a6b55ca17"
+ integrity sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
type-is@~1.6.16:
version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
@@ -2162,10 +3463,27 @@ type-is@~1.6.16:
media-typer "0.3.0"
mime-types "~2.1.18"
+typeforce@^1.11.3, typeforce@^1.8.7:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
+ integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==
+
+typeforce@~1.10.6:
+ version "1.10.6"
+ resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.10.6.tgz#71bdca35b4e635b61245371b57c008cedfbec4db"
+ integrity sha1-cb3KNbTmNbYSRTcbV8AIzt++xNs=
+ dependencies:
+ inherits "^2.0.1"
+
typescript@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz#0b7a04b8cf3868188de914d9568bd030f0c56192"
+ultron@~1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+ integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
undefsafe@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76"
@@ -2221,6 +3539,11 @@ update-notifier@^2.3.0:
semver-diff "^2.0.0"
xdg-basedir "^3.0.0"
+urijs@1.19.1:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a"
+ integrity sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==
+
urix@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
@@ -2231,18 +3554,45 @@ url-parse-lax@^1.0.0:
dependencies:
prepend-http "^1.0.1"
+url-parse@^1.4.3:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8"
+ integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==
+ dependencies:
+ querystringify "^2.0.0"
+ requires-port "^1.0.0"
+
use@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
-util-deprecate@~1.0.1:
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+"util@>= 0.4.9":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+ integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+ dependencies:
+ inherits "2.0.3"
+
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+varuint-bitcoin@^1.0.1, varuint-bitcoin@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz#7a343f50537607af6a3059312b9782a170894540"
+ integrity sha512-jCEPG+COU/1Rp84neKTyDJQr478/hAfVp5xxYn09QEH0yBjbmPeMfuuQIrp+BUD83hybtYZKhr5elV3bvdV1bA==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+varuint-bitcoin@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.0.4.tgz#d812c5dae16e32f60544b6adee1d4be1307d0283"
+ integrity sha1-2BLF2uFuMvYFRLat7h1L4TB9AoM=
+
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -2265,6 +3615,13 @@ widest-line@^2.0.0:
dependencies:
string-width "^2.1.1"
+wif@^2.0.1:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704"
+ integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=
+ dependencies:
+ bs58check "<3.0.0"
+
winston-transport@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66"
@@ -2286,6 +3643,11 @@ winston@3.1.0:
triple-beam "^1.3.0"
winston-transport "^4.2.0"
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -2298,16 +3660,42 @@ write-file-atomic@^2.0.0:
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
+ws@^3.3.1:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+ integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+ dependencies:
+ async-limiter "~1.0.0"
+ safe-buffer "~5.1.0"
+ ultron "~1.1.0"
+
ws@^6.1.2:
version "6.1.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
dependencies:
async-limiter "~1.0.0"
+x-address-codec@^0.7.0:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/x-address-codec/-/x-address-codec-0.7.2.tgz#2a2f7bb00278520bd13733a7959a05443d6802e0"
+ integrity sha1-Ki97sAJ4UgvRNzOnlZoFRD1oAuA=
+ dependencies:
+ base-x "^1.0.1"
+
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+xregexp@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+ integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
+
+xtend@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+ integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
+
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
diff --git a/frontend/.env.example b/frontend/.env.example
index 186f9d4f..83333a15 100644
--- a/frontend/.env.example
+++ b/frontend/.env.example
@@ -16,7 +16,7 @@ BACKEND_URL=http://localhost:5000
# EXPLORER_URL="https://chain.so/tx/ZEC/"
EXPLORER_URL="https://chain.so/tx/ZECTEST/"
-# Amount for staking a proposal in ZEC
+# Amount for staking a proposal in ZEC, keep in sync with backend .env
PROPOSAL_STAKING_AMOUNT=0.025
# Normally production runs with SSL, this disables that
@@ -24,3 +24,6 @@ DISABLE_SSL=true
# Uncomment if running on testnet
# TESTNET=true
+
+# Maximum amount for a proposal target, keep in sync with backend .env
+PROPOSAL_TARGET_MAX=10000
diff --git a/frontend/client/components/AuthFlow/SignUp.tsx b/frontend/client/components/AuthFlow/SignUp.tsx
index 7c3de208..a32de653 100644
--- a/frontend/client/components/AuthFlow/SignUp.tsx
+++ b/frontend/client/components/AuthFlow/SignUp.tsx
@@ -36,6 +36,7 @@ class SignUp extends React.Component {
name="name"
placeholder="Non-unique name that others will see you as"
autoComplete="name"
+ maxLength={50}
/>,
)}
@@ -47,6 +48,7 @@ class SignUp extends React.Component {
,
)}
@@ -62,6 +64,7 @@ class SignUp extends React.Component {
name="email"
placeholder="We promise not to spam you or share your email"
autoComplete="username"
+ maxLength={255}
/>,
)}
diff --git a/frontend/client/components/CreateFlow/Basics.tsx b/frontend/client/components/CreateFlow/Basics.tsx
index ab064d83..cc205969 100644
--- a/frontend/client/components/CreateFlow/Basics.tsx
+++ b/frontend/client/components/CreateFlow/Basics.tsx
@@ -68,6 +68,12 @@ class CreateFlowBasics extends React.Component {
const { title, brief, category, target, rfp, rfpOptIn } = this.state;
const errors = getCreateErrors(this.state, true);
+ // Don't show target error at zero since it defaults to that
+ // Error just shows up at the end to prevent submission
+ if (target === '0') {
+ errors.target = undefined;
+ }
+
const rfpOptInRequired =
rfp && (rfp.matching || (rfp.bounty && new BN(rfp.bounty).gtn(0)));
@@ -147,6 +153,7 @@ class CreateFlowBasics extends React.Component {
type="text"
value={title}
onChange={this.handleInputChange}
+ maxLength={200}
/>
@@ -161,6 +168,7 @@ class CreateFlowBasics extends React.Component {
value={brief}
onChange={this.handleInputChange}
rows={3}
+ maxLength={200}
/>
@@ -196,6 +204,7 @@ class CreateFlowBasics extends React.Component {
value={target}
onChange={this.handleInputChange}
addonAfter="ZEC"
+ maxLength={16}
/>
diff --git a/frontend/client/components/CreateFlow/Details.tsx b/frontend/client/components/CreateFlow/Details.tsx
index ebd145bb..070e504b 100644
--- a/frontend/client/components/CreateFlow/Details.tsx
+++ b/frontend/client/components/CreateFlow/Details.tsx
@@ -1,7 +1,8 @@
import React from 'react';
-import { Form } from 'antd';
+import { Form, Alert } from 'antd';
import MarkdownEditor from 'components/MarkdownEditor';
import { ProposalDraft } from 'types';
+import { getCreateErrors } from 'modules/create/utils';
interface State {
content: string;
@@ -22,6 +23,8 @@ export default class CreateFlowTeam extends React.Component {
}
render() {
+ const errors = getCreateErrors(this.state, true);
+
return (
);
}
diff --git a/frontend/client/components/CreateFlow/Milestones.tsx b/frontend/client/components/CreateFlow/Milestones.tsx
index 15b830eb..2766a739 100644
--- a/frontend/client/components/CreateFlow/Milestones.tsx
+++ b/frontend/client/components/CreateFlow/Milestones.tsx
@@ -124,6 +124,7 @@ const MilestoneFields = ({
name="title"
value={milestone.title}
onChange={ev => onChange(index, { ...milestone, title: ev.currentTarget.value })}
+ maxLength={80}
/>
diff --git a/frontend/client/modules/create/utils.ts b/frontend/client/modules/create/utils.ts
index 123f6343..8ef9a107 100644
--- a/frontend/client/modules/create/utils.ts
+++ b/frontend/client/modules/create/utils.ts
@@ -13,8 +13,6 @@ import {
PROPOSAL_DETAIL_INITIAL_STATE,
} from 'modules/proposals/reducers';
-export const TARGET_ZEC_LIMIT = 1000;
-
interface CreateFormErrors {
rfpOptIn?: string;
title?: string;
@@ -57,7 +55,17 @@ export function getCreateErrors(
skipRequired?: boolean,
): CreateFormErrors {
const errors: CreateFormErrors = {};
- const { title, team, milestones, target, payoutAddress, rfp, rfpOptIn, brief } = form;
+ const {
+ title,
+ content,
+ team,
+ milestones,
+ target,
+ payoutAddress,
+ rfp,
+ rfpOptIn,
+ brief,
+ } = form;
// Required fields with no extra validation
if (!skipRequired) {
@@ -90,10 +98,16 @@ export function getCreateErrors(
errors.brief = 'Brief can only be 140 characters maximum';
}
+ // Content limit for our database's sake
+ if (content && content.length > 250000) {
+ errors.content = 'Details can only be 250,000 characters maximum';
+ }
+
// Amount to raise
const targetFloat = target ? parseFloat(target) : 0;
if (target && !Number.isNaN(targetFloat)) {
- const targetErr = getAmountError(targetFloat, TARGET_ZEC_LIMIT);
+ const limit = parseFloat(process.env.PROPOSAL_TARGET_MAX as string);
+ const targetErr = getAmountError(targetFloat, limit, 1);
if (targetErr) {
errors.target = targetErr;
}
@@ -134,6 +148,12 @@ export function getCreateErrors(
return 'Payout percent is required';
} else if (Number.isNaN(parseInt(ms.payoutPercent, 10))) {
return 'Payout percent must be a valid number';
+ } else if (parseInt(ms.payoutPercent, 10) !== parseFloat(ms.payoutPercent)) {
+ return 'Payout percent must be a whole number, no decimals';
+ } else if (parseInt(ms.payoutPercent, 10) <= 0) {
+ return 'Payout percent must be greater than 0%';
+ } else if (parseInt(ms.payoutPercent, 10) > 100) {
+ return 'Payout percent must be less than or equal to 100%';
}
// Last one shows percentage errors
@@ -155,10 +175,10 @@ export function getCreateErrors(
}
export function validateUserProfile(user: User) {
- if (user.displayName.length > 30) {
- return 'Display name can only be 30 characters maximum';
- } else if (user.title.length > 30) {
- return 'Title can only be 30 characters maximum';
+ if (user.displayName.length > 50) {
+ return 'Display name can only be 50 characters maximum';
+ } else if (user.title.length > 50) {
+ return 'Title can only be 50 characters maximum';
}
return '';
diff --git a/frontend/client/static/locales/en/common.json b/frontend/client/static/locales/en/common.json
index ceffcaf0..430d808a 100644
--- a/frontend/client/static/locales/en/common.json
+++ b/frontend/client/static/locales/en/common.json
@@ -16,7 +16,7 @@
"requests": {
"title": "Open Requests from the ZF",
- "description": "The Zcash Foundation will periodically open up requests for proposals that have financial incentives attached to them in the form of fixed bounties, or pledges of contribution matching.\nProposals will be reviewed and chosen based on the ZF’s confidence in the team and their plan.\nTo be eligible for funding from the Zcash Foundation, teams must provide identifying information for legal reasons.",
+ "description": "The Zcash Foundation will periodically open up requests for proposals that have financial incentives attached to them in the form of fixed bounties, or pledges of contribution matching.\nProposals will be reviewed and chosen based on the ZF’s confidence in the team and their plan.\nTo be eligible for funding from the Zcash Foundation, teams must provide identifying information for legal reasons.\nIf none of the RFPs catch your eye, check out the list of promising ideas<\/a>!",
"more": "See all requests",
"emptyTitle": "No open requests at this time",
"emptySubtitle": "But don’t let that stop you! Proposals can be submitted at any time."
diff --git a/frontend/client/styles/antd-overrides.less b/frontend/client/styles/antd-overrides.less
index b57ba7a1..e67a80a3 100644
--- a/frontend/client/styles/antd-overrides.less
+++ b/frontend/client/styles/antd-overrides.less
@@ -16,3 +16,20 @@
div.antd-pro-ellipsis-ellipsis {
word-break: break-word;
}
+
+// List items with long content can push the actions aside
+.ant-list-item {
+ overflow: hidden;
+
+ .ant-list-item-content,
+ .ant-list-item-meta,
+ .ant-list-item-meta-content {
+ min-width: 0;
+ }
+
+ .ant-list-item-meta-title,
+ .ant-list-item-meta-description {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+}
\ No newline at end of file
diff --git a/frontend/client/utils/api.ts b/frontend/client/utils/api.ts
index 0d0f4a89..984d1ffa 100644
--- a/frontend/client/utils/api.ts
+++ b/frontend/client/utils/api.ts
@@ -149,6 +149,10 @@ export function massageSerializedState(state: AppState) {
);
state.proposal.detail.contributionBounty = new BN((state.proposal.detail
.contributionBounty as any) as string);
+ state.proposal.detail.milestones = state.proposal.detail.milestones.map(m => ({
+ ...m,
+ amount: new BN((m.amount as any) as string, 16),
+ }));
if (state.proposal.detail.rfp && state.proposal.detail.rfp.bounty) {
state.proposal.detail.rfp.bounty = new BN(
(state.proposal.detail.rfp.bounty as any) as string,
diff --git a/frontend/client/utils/validators.ts b/frontend/client/utils/validators.ts
index e7cd7957..0fa80bf4 100644
--- a/frontend/client/utils/validators.ts
+++ b/frontend/client/utils/validators.ts
@@ -1,4 +1,4 @@
-export function getAmountError(amount: number, max: number = Infinity) {
+export function getAmountError(amount: number, max: number = Infinity, min?: number) {
if (amount < 0) {
return 'Amount must be a positive number';
} else if (
@@ -8,6 +8,8 @@ export function getAmountError(amount: number, max: number = Infinity) {
return 'Must be in increments of 0.001';
} else if (amount > max) {
return `Cannot exceed maximum (${max} ZEC)`;
+ } else if (min && amount < min) {
+ return `Must be at least ${min} ZEC`;
}
return null;
diff --git a/frontend/config/env.js b/frontend/config/env.js
index 55017af3..535f2c4c 100644
--- a/frontend/config/env.js
+++ b/frontend/config/env.js
@@ -57,6 +57,7 @@ module.exports = () => {
NODE_ENV: process.env.NODE_ENV || 'development',
PORT: process.env.PORT || 3000,
PROPOSAL_STAKING_AMOUNT: process.env.PROPOSAL_STAKING_AMOUNT,
+ PROPOSAL_TARGET_MAX: process.env.PROPOSAL_TARGET_MAX || '10000',
PUBLIC_HOST_URL: process.env.PUBLIC_HOST_URL,
SENTRY_DSN: process.env.SENTRY_DSN || null,
SENTRY_RELEASE: process.env.SENTRY_RELEASE || undefined,
diff --git a/frontend/server/index.tsx b/frontend/server/index.tsx
index 57ae7e04..4ffa1bb1 100644
--- a/frontend/server/index.tsx
+++ b/frontend/server/index.tsx
@@ -29,7 +29,7 @@ const app = express();
// ssl
if (!isDev && !process.env.DISABLE_SSL) {
- log.warn('PRODUCTION mode, enforcing HTTPS redirect');
+ log.info('PRODUCTION mode, enforcing HTTPS redirect');
app.use(enforce.HTTPS({ trustProtoHeader: true }));
}