diff --git a/package-lock.json b/package-lock.json index 5b85147..b02f651 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,6 +72,15 @@ "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==", "dev": true }, + "@babel/runtime": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.2.tgz", + "integrity": "sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, "@babel/template": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", @@ -157,10 +166,19 @@ "resolved": "https://registry.npmjs.org/@gnosis.pm/util-contracts/-/util-contracts-3.0.0-alpha.3.tgz", "integrity": "sha512-9rvTRON3UWDVlSzP0+JmZtKNImMitDrRBfynHCbAlLT5iiy9omk9RbGSY3Zw3XxSvZPLRTI7+mhzv+L+DGjuyA==" }, + "@types/bn.js": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.4.tgz", + "integrity": "sha512-AO8WW+aRcKWKQAYTfKLzwnpL6U+TfPqS+haRrhCy5ff04Da8WZud3ZgVjspQXaEXJDcTlsjUEVvL39wegDek5w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/node": { - "version": "10.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.7.tgz", - "integrity": "sha512-yOxFfkN9xUFLyvWaeYj90mlqTJ41CsQzWKS3gXdOMOyPVacUsymejKxJ4/pMW7exouubuEeZLJawGgcNGYlTeg==", + "version": "10.14.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.4.tgz", + "integrity": "sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg==", "dev": true }, "abi-decoder": { @@ -183,6 +201,13 @@ "utf8": "^2.1.1", "xhr2": "*", "xmlhttprequest": "*" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "dev": true + } } } } @@ -219,15 +244,15 @@ "dev": true }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-escapes": { @@ -257,12 +282,6 @@ "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==", "dev": true }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, "app-module-path": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", @@ -397,9 +416,9 @@ } }, "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "dev": true + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", + "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==" }, "bindings": { "version": "1.5.0", @@ -420,19 +439,10 @@ "safe-buffer": "^5.1.1" } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -529,12 +539,13 @@ } }, "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", + "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", "dev": true, "requires": { - "js-sha3": "^0.3.1" + "js-sha3": "^0.6.1", + "safe-buffer": "^5.1.1" } }, "browserify-sign": { @@ -657,6 +668,12 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -711,12 +728,6 @@ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -811,9 +822,9 @@ "dev": true }, "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { "object-assign": "^4", @@ -936,9 +947,9 @@ "dev": true }, "decimal.js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.0.1.tgz", - "integrity": "sha512-vklWB5C4Cj423xnaOtsUmAv0/7GqlXIgDv2ZKDyR64OV3OSzGHNx2mk4p/1EKnB5s70k73cIOOEcG9YzF0q4Lw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.1.1.tgz", + "integrity": "sha512-vEEgyk1fWVEnv7lPjkNedAIjzxQDue5Iw4FeX4UkNUDSVyD/jZTD0Bw2kAO7k6iyyJRAhM9oxxI0D1ET6k0Mmg==", "dev": true }, "decode-uri-component": { @@ -1060,6 +1071,15 @@ "clone": "^1.0.2" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -1206,6 +1226,31 @@ "once": "^1.4.0" } }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-promise": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", @@ -1460,9 +1505,9 @@ } }, "ethers": { - "version": "4.0.0-beta.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.1.tgz", - "integrity": "sha512-SoYhktEbLxf+fiux5SfCEwdzWENMvgIbMZD90I62s4GZD9nEjgEWy8ZboI3hck193Vs0bDoTohDISx84f2H2tw==", + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.27.tgz", + "integrity": "sha512-+DXZLP/tyFnXWxqr2fXLT67KlGUfLuvDkHSOtSC9TUVG9OIj6yrG5JPeXRMYo15xkOYwnjgdMKrXp5V94rtjJA==", "dev": true, "requires": { "@types/node": "^10.3.2", @@ -1471,7 +1516,7 @@ "elliptic": "6.3.3", "hash.js": "1.1.3", "js-sha3": "0.5.7", - "scrypt-js": "2.0.3", + "scrypt-js": "2.0.4", "setimmediate": "1.0.4", "uuid": "2.0.1", "xmlhttprequest": "1.8.0" @@ -1538,9 +1583,9 @@ } }, "eventemitter3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "evp_bytestokey": { @@ -1688,9 +1733,9 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-diff": { @@ -1817,25 +1862,14 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - } } }, "forwarded": { @@ -1878,28 +1912,13 @@ } } }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "requires": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" - }, - "dependencies": { - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" - } - } + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -1908,17 +1927,11 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "functional-red-black-tree": { "version": "1.0.1", @@ -2038,15 +2051,24 @@ "dev": true }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2059,6 +2081,12 @@ "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", @@ -2079,9 +2107,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2117,12 +2145,6 @@ "statuses": ">= 1.4.0 < 2" } }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "dev": true - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2161,9 +2183,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { @@ -2233,6 +2255,12 @@ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -2299,6 +2327,15 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -2317,6 +2354,15 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2358,9 +2404,9 @@ } }, "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", + "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=", "dev": true }, "js-tokens": { @@ -2398,9 +2444,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -2449,13 +2495,13 @@ } }, "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", + "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", "dev": true, "requires": { - "browserify-sha3": "^0.0.1", - "sha3": "^1.1.0" + "browserify-sha3": "^0.0.4", + "sha3": "^1.2.2" } }, "klaw": { @@ -2605,18 +2651,18 @@ "dev": true }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "~1.38.0" } }, "mimic-fn": { @@ -2667,6 +2713,33 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -2758,15 +2831,9 @@ } }, "mock-fs": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz", - "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA==", - "dev": true - }, - "mout": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz", + "integrity": "sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw==", "dev": true }, "ms": { @@ -2781,17 +2848,6 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -2889,14 +2945,11 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "oboe": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", - "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true }, "on-finished": { "version": "2.3.0", @@ -3027,16 +3080,17 @@ "dev": true }, "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-code-context": { @@ -3047,13 +3101,13 @@ "optional": true }, "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", + "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", "dev": true, "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" + "for-each": "^0.3.3", + "string.prototype.trim": "^1.1.2" } }, "parseurl": { @@ -3237,9 +3291,9 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, "public-encrypt": { @@ -3279,10 +3333,16 @@ "strict-uri-encode": "^1.0.0" } }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -3337,6 +3397,12 @@ "util-deprecate": "~1.0.1" } }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "dev": true + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -3399,6 +3465,12 @@ "resolve-from": "^1.0.0" } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", @@ -3474,9 +3546,9 @@ } }, "scrypt-js": { - "version": "2.0.3", - "resolved": "http://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", "dev": true }, "scrypt.js": { @@ -3737,9 +3809,9 @@ "dev": true }, "sshpk": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", - "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -3781,6 +3853,17 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3839,34 +3922,43 @@ } }, "swarm-js": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", - "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", + "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", "dev": true, "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", "decompress": "^4.0.0", "eth-lib": "^0.1.26", - "fs-extra": "^2.1.2", - "fs-promise": "^2.0.0", + "fs-extra": "^4.0.2", "got": "^7.1.0", "mime-types": "^2.1.16", "mkdirp-promise": "^5.0.1", "mock-fs": "^4.1.0", "setimmediate": "^1.0.5", - "tar.gz": "^1.0.5", + "tar": "^4.0.2", "xhr-request-promise": "^0.1.2" }, "dependencies": { "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" } } } @@ -3910,14 +4002,26 @@ } }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } } }, "tar-stream": { @@ -3935,51 +4039,12 @@ "xtend": "^4.0.0" } }, - "tar.gz": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", - "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "dev": true, - "requires": { - "bluebird": "^2.9.34", - "commander": "^2.8.1", - "fstream": "^1.0.8", - "mout": "^0.11.0", - "tar": "^2.1.1" - }, - "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -4023,12 +4088,6 @@ "punycode": "^1.4.1" } }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -4132,40 +4191,15 @@ "dev": true }, "unbzip2-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz", - "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", "dev": true, "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true - }, - "buffer": { - "version": "3.6.0", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - } + "buffer": "^5.2.1", + "through": "^2.3.8" } }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -4195,6 +4229,16 @@ } } }, + "url-parse": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -4276,321 +4320,310 @@ } }, "web3": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.36.tgz", - "integrity": "sha512-fZDunw1V0AQS27r5pUN3eOVP7u8YAvyo6vOapdgVRolAu5LgaweP7jncYyLINqIX9ZgWdS5A090bt+ymgaYHsw==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.50.tgz", + "integrity": "sha512-N4YqT1jl2tZYNWiLk5gA5BMchHJaG76d65z899DT9UTR4iI6mfqe1QIE+1YLII1x+uE8ohFzBq/aaZ8praLeoA==", "dev": true, "requires": { - "web3-bzz": "1.0.0-beta.36", - "web3-core": "1.0.0-beta.36", - "web3-eth": "1.0.0-beta.36", - "web3-eth-personal": "1.0.0-beta.36", - "web3-net": "1.0.0-beta.36", - "web3-shh": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "@types/node": "^10.12.18", + "web3-bzz": "1.0.0-beta.50", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-eth": "1.0.0-beta.50", + "web3-eth-personal": "1.0.0-beta.50", + "web3-net": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-shh": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, "web3-bzz": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.36.tgz", - "integrity": "sha512-clDRS/ziboJ5ytnrfxq80YSu9HQsT0vggnT3BkoXadrauyEE/9JNLxRu016jjUxqdkfdv4MgIPDdOS3Bv2ghiw==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.50.tgz", + "integrity": "sha512-0jD4/g+apH7t87cA9gXoZpvvVW7OqQtbu+X+olFKPrS9pKbkwfaKPdRwc1BNbjqvrRYN0K7koT9xV+Lzvyah6w==", "dev": true, "requires": { - "got": "7.1.0", - "swarm-js": "0.1.37", - "underscore": "1.8.3" + "@babel/runtime": "^7.3.1", + "@types/node": "^10.12.18", + "lodash": "^4.17.11", + "swarm-js": "^0.1.39" } }, "web3-core": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.36.tgz", - "integrity": "sha512-C2QW9CMMRZdYAiKiLkMrKRSp+gekSqTDgZTNvlxAdN1hXn4d9UmcmWSJXOmIHqr5N2ISbRod+bW+qChODxVE3Q==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.50.tgz", + "integrity": "sha512-edOHdSnkRREi0vUXXNUsrbkTvXftCDroiF2tEvbPVyiBv0U6/VDYClFdHuZKdrrTRUcn/rUbvBqw8qCt3xgcuQ==", "dev": true, "requires": { - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-core-requestmanager": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "@types/node": "^10.12.18", + "lodash": "^4.17.11", + "web3-utils": "1.0.0-beta.50" } }, "web3-core-helpers": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.36.tgz", - "integrity": "sha512-gu74l0htiGWuxLQuMnZqKToFvkSM+UFPE7qUuy1ZosH/h2Jd+VBWg6k4CyNYVYfP0hL5x3CN8SBmB+HMowo55A==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.50.tgz", + "integrity": "sha512-B1LMrlC9c5HEJYmBWUhsxHdJ78w5YGop/ptF1cFL8cHLwTCQqCFFKLgYUg+dax/554TP1xgJ2w/ArLpnPJ8dBg==", "dev": true, "requires": { - "underscore": "1.8.3", - "web3-eth-iban": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "lodash": "^4.17.11", + "web3-eth-iban": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, "web3-core-method": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.36.tgz", - "integrity": "sha512-dJsP3KkGaqBBSdxfzvLsYPOmVaSs1lR/3oKob/gtUYG7UyTnwquwliAc7OXj+gqRA2E/FHZcM83cWdl31ltdSA==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-promievent": "1.0.0-beta.36", - "web3-core-subscriptions": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" - } - }, - "web3-core-promievent": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.36.tgz", - "integrity": "sha512-RGIL6TjcOeJTullFLMurChPTsg94cPF6LI763y/sPYtXTDol1vVa+J5aGLp/4WW8v+s+1bSQO6zYq2ZtkbmtEQ==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "1.1.1" - } - }, - "web3-core-requestmanager": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.36.tgz", - "integrity": "sha512-/CHuaMbiMDu1v8ANGYI7yFCnh1GaCWx5pKnUPJf+QTk2xAAw+Bvd97yZJIWPOK5AOPUIzxgwx9Ob/5ln6mTmYA==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.50.tgz", + "integrity": "sha512-0+L37KDT90DD1fcTye/ZWMyGOLiw0ZxX2vaC8qDSFvAV3scTEuZyEQuR+tCM2aGyUVihy8LdmZwioRwnTXgLwg==", "dev": true, "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.36", - "web3-providers-http": "1.0.0-beta.36", - "web3-providers-ipc": "1.0.0-beta.36", - "web3-providers-ws": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "eventemitter3": "3.1.0", + "lodash": "^4.17.11" } }, "web3-core-subscriptions": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.36.tgz", - "integrity": "sha512-/evyLQ8CMEYXC5aUCodDpmEnmGVYQxaIjiEIfA/85f9ifHkfzP1aOwCAjcsLsJWnwrWDagxSpjCYrDtnNabdEw==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.50.tgz", + "integrity": "sha512-q2Jmuy/BCwcKCFjR6kc03hPbdC6sR0n3IhPVg98Sk7ewgRLur/v3lLDz0fQpY4xE6U0XOqrjxwzlqISkOcP5Kw==", "dev": true, "requires": { - "eventemitter3": "1.1.1", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "eventemitter3": "^3.1.0", + "lodash": "^4.17.11" } }, "web3-eth": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.36.tgz", - "integrity": "sha512-uEa0UnbnNHUB4N2O1U+LsvxzSPJ/w3azy5115IseaUdDaiz6IFFgFfFP3ssauayQNCf7v2F44GXLfPhrNeb/Sw==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.36", - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-core-subscriptions": "1.0.0-beta.36", - "web3-eth-abi": "1.0.0-beta.36", - "web3-eth-accounts": "1.0.0-beta.36", - "web3-eth-contract": "1.0.0-beta.36", - "web3-eth-ens": "1.0.0-beta.36", - "web3-eth-iban": "1.0.0-beta.36", - "web3-eth-personal": "1.0.0-beta.36", - "web3-net": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.50.tgz", + "integrity": "sha512-ojsddEclIdu+C3hfRrLVJK0rcxt2O+Yj7c3b4YEzZQ9+Kd/HaSZfeSpUgKojgmFhUUiCCRTEc2holWtQ+Lx4gQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "eth-lib": "0.2.8", + "rxjs": "^6.4.0", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-core-subscriptions": "1.0.0-beta.50", + "web3-eth-abi": "1.0.0-beta.50", + "web3-eth-accounts": "1.0.0-beta.50", + "web3-eth-contract": "1.0.0-beta.50", + "web3-eth-ens": "1.0.0-beta.50", + "web3-eth-iban": "1.0.0-beta.50", + "web3-eth-personal": "1.0.0-beta.50", + "web3-net": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "web3-eth-abi": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.36.tgz", - "integrity": "sha512-fBfW+7hvA0rxEMV45fO7JU+0R32ayT7aRwG9Cl6NW2/QvhFeME2qVbMIWw0q5MryPZGIN8A6366hKNuWvVidDg==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.50.tgz", + "integrity": "sha512-Nwm1HL3xBbrs43j/9V3gH1CJWWR7jyTDSE7PIkjYVjwgygAjlHPMHzuzGffoFMp2tSQ2DywCGmXAY5I5+vznZw==", "dev": true, "requires": { - "ethers": "4.0.0-beta.1", - "underscore": "1.8.3", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "ethers": "^4.0.27", + "lodash": "^4.17.11", + "web3-utils": "1.0.0-beta.50" } }, "web3-eth-accounts": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.36.tgz", - "integrity": "sha512-MmgIlBEZ0ILLWV4+wfMrbeVVMU/VmQnCpgSDcw7wHKOKu47bKncJ6rVqVsUbC6d9F613Rios+Yj2Ua6SCHtmrg==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.50.tgz", + "integrity": "sha512-cUuYxKhymob87zCUYgw7ieZY6aVStMhClocblI3FKNdI1I8dczhdhZ97qMj5iavOganN7/OxLzeji7ksAoNAhg==", "dev": true, "requires": { - "any-promise": "1.3.0", + "@babel/runtime": "^7.3.1", "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", + "eth-lib": "0.2.8", + "lodash": "^4.17.11", "scrypt.js": "0.2.0", - "underscore": "1.8.3", - "uuid": "2.0.1", - "web3-core": "1.0.0-beta.36", - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "uuid": "3.3.2", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" }, "dependencies": { "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", "xhr-request-promise": "^0.1.2" } - }, - "uuid": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true } } }, "web3-eth-contract": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.36.tgz", - "integrity": "sha512-cywqcIrUsCW4fyqsHdOb24OCC8AnBol8kNiptI+IHRylyCjTNgr53bUbjrXWjmEnear90rO0QhAVjLB1a4iEbQ==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.50.tgz", + "integrity": "sha512-X8R1+qIeD4Dbz1RmQa5m3K1suVFigNgd7EFMp6vVC3ULDjt4R6T0cRmFw/x51v3MQoT7s6Yd1KiEWIAt9IYG6w==", "dev": true, "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.36", - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-core-promievent": "1.0.0-beta.36", - "web3-core-subscriptions": "1.0.0-beta.36", - "web3-eth-abi": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "lodash": "^4.17.11", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-core-subscriptions": "1.0.0-beta.50", + "web3-eth-abi": "1.0.0-beta.50", + "web3-eth-accounts": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, "web3-eth-ens": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.36.tgz", - "integrity": "sha512-8ZdD7XoJfSX3jNlZHSLe4G837xQ0v5a8cHCcDcd1IoqoY855X9SrIQ0Xdqia9p4mR1YcH1vgmkXY9/3hsvxS7g==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.50.tgz", + "integrity": "sha512-UnhYcNuSNRBOBcbD5y8cTyRh5ENn65/GfZkxCDXAKBY6sD4GzMZNkD7kq+37/34cnZEzzQPPGd9jLZNLXOklyg==", "dev": true, "requires": { + "@babel/runtime": "^7.3.1", "eth-ens-namehash": "2.0.8", - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.36", - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-promievent": "1.0.0-beta.36", - "web3-eth-abi": "1.0.0-beta.36", - "web3-eth-contract": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "lodash": "^4.17.11", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-eth-abi": "1.0.0-beta.50", + "web3-eth-contract": "1.0.0-beta.50", + "web3-net": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, "web3-eth-iban": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.36.tgz", - "integrity": "sha512-b5AEDjjhOLR4q47Hbzf65zYE+7U7JgCgrUb13RU4HMIGoMb1q4DXaJw1UH8VVHCZulevl2QBjpCyrntecMqqCQ==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.50.tgz", + "integrity": "sha512-rW5fpUUW3WaToPxBXNnqTfj5dh2BJ+9uognYAfThh2WWR1+EwWZethsKS/PyU6Jn9uA5p/kQoUIP0JKaeBm80Q==", "dev": true, "requires": { - "bn.js": "4.11.6", - "web3-utils": "1.0.0-beta.36" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } + "@babel/runtime": "^7.3.1", + "bn.js": "4.11.8", + "web3-utils": "1.0.0-beta.50" } }, "web3-eth-personal": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.36.tgz", - "integrity": "sha512-+oxvhojeWh4C/XtnlYURWRR3F5Cg7bQQNjtN1ZGnouKAZyBLoYDVVJ6OaPiveNtfC9RKnzLikn9/Uqc0xz410A==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.50.tgz", + "integrity": "sha512-52dS24YfJxx/Uy21RKj2m5rjag1kktdy5rY/R9vDwWZRrJkxfDf058CvtRF+QsD7A6QVxkHCZ9YwEWnLCLW9Cw==", "dev": true, "requires": { - "web3-core": "1.0.0-beta.36", - "web3-core-helpers": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-net": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-net": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, "web3-net": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.36.tgz", - "integrity": "sha512-BriXK0Pjr6Hc/VDq1Vn8vyOum4JB//wpCjgeGziFD6jC7Of8YaWC7AJYXje89OckzfcqX1aJyJlBwDpasNkAzQ==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.50.tgz", + "integrity": "sha512-T9aBrWYzCeqZTTJlljonTm8x1tEjHT1uBqcdvEYZoyCS1Xxc+zCNBqP4SBfdcfwCeGohhI7bRx9qX1JjYH3cRA==", "dev": true, "requires": { - "web3-core": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-utils": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "lodash": "^4.17.11", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, - "web3-providers-http": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.36.tgz", - "integrity": "sha512-KLSqMS59nRdpet9B0B64MKgtM3n9wAHTcAHJ03hv79avQNTjHxtjZm0ttcjcFUPpWDgTCtcYCa7tqaYo9Pbeog==", + "web3-providers": { + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-providers/-/web3-providers-1.0.0-beta.50.tgz", + "integrity": "sha512-p2xtr6N72pdXvND5dLdK1G9T/9qCQiKC2EYDPmimnqvoHWixmM3tlBl042swkHspHHVL60vXPKxB4UDaQE2hWQ==", "dev": true, "requires": { - "web3-core-helpers": "1.0.0-beta.36", + "@babel/runtime": "^7.3.1", + "@types/node": "^10.12.18", + "eventemitter3": "3.1.0", + "lodash": "^4.17.11", + "url-parse": "1.4.4", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", "xhr2-cookies": "1.1.0" } }, - "web3-providers-ipc": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.36.tgz", - "integrity": "sha512-iEUrmdd2CzoWgp+75/ydom/1IaoLw95qkAzsgwjjZp1waDncHP/cvVGX74+fbUx4hRaPdchyzxCQfNpgLDmNjQ==", - "dev": true, - "requires": { - "oboe": "2.1.3", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.36" - } - }, - "web3-providers-ws": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.36.tgz", - "integrity": "sha512-wAnENuZx75T5ZSrT2De2LOaUuPf2yRjq1VfcbD7+Zd79F3DZZLBJcPyCNVQ1U0fAXt0wfgCKl7sVw5pffqR9Bw==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.36", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" - }, - "dependencies": { - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "dev": true, - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - } - } - } - }, "web3-shh": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.36.tgz", - "integrity": "sha512-bREGHS/WprYFSvGUhyIk8RSpT2Z5SvJOKGBrsUW2nDIMWO6z0Op8E7fzC6GXY2HZfZliAqq6LirbXLgcLRWuPw==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.50.tgz", + "integrity": "sha512-a46Gz/YQdF3HJ4XK7rZh6bJiP3IEq+BDAvdxD1jW54yKM2k3RGarOY8hanC1crxKE7E9Q1UUkrp1Vjrj8XSQuQ==", "dev": true, "requires": { - "web3-core": "1.0.0-beta.36", - "web3-core-method": "1.0.0-beta.36", - "web3-core-subscriptions": "1.0.0-beta.36", - "web3-net": "1.0.0-beta.36" + "@babel/runtime": "^7.3.1", + "web3-core": "1.0.0-beta.50", + "web3-core-helpers": "1.0.0-beta.50", + "web3-core-method": "1.0.0-beta.50", + "web3-core-subscriptions": "1.0.0-beta.50", + "web3-net": "1.0.0-beta.50", + "web3-providers": "1.0.0-beta.50", + "web3-utils": "1.0.0-beta.50" } }, "web3-utils": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.36.tgz", - "integrity": "sha512-7ri74lG5fS2Th0fhYvTtiEHMB1Pmf2p7dQx1COQ3OHNI/CHNEMjzoNMEbBU6FAENrywfoFur40K4m0AOmEUq5A==", + "version": "1.0.0-beta.50", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.50.tgz", + "integrity": "sha512-xGhM/YkepK2x0iMYUl/sws58LzTbodjMGlhZxrCZLZxJ0DoaDyk3UdmZ6aCSCwVTFg4hlVj3doaIhWnwGfhhpQ==", "dev": true, "requires": { - "bn.js": "4.11.6", - "eth-lib": "0.1.27", - "ethjs-unit": "0.1.6", + "@babel/runtime": "^7.3.1", + "@types/bn.js": "^4.11.4", + "@types/node": "^10.12.18", + "bn.js": "4.11.8", + "eth-lib": "0.2.8", + "ethjs-unit": "^0.1.6", + "lodash": "^4.17.11", "number-to-bn": "1.7.0", "randomhex": "0.1.5", - "underscore": "1.8.3", "utf8": "2.1.1" }, "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } }, "utf8": { "version": "2.1.1", @@ -4600,6 +4633,17 @@ } } }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", + "dev": true, + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 038c25e..97c3309 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "license": "LGPL-3.0", "dependencies": { "@gnosis.pm/util-contracts": "^3.0.0-alpha", + "bignumber.js": "^8.1.1", "canonical-weth": "^1.4.0", "openzeppelin-solidity": "^2.2.0" }, @@ -37,7 +38,7 @@ "@gnosis.pm/truffle-nice-tools": "^1.1.3", "babel-eslint": "^10.0.1", "cross-env": "^5.2.0", - "decimal.js": "^10.0.0", + "decimal.js": "^10.1.1", "eslint": "^5.7.0", "eslint-plugin-babel": "^5.2.1", "fs-extra": "^7.0.0", diff --git a/test/javascript/digix_tempo.js b/test/javascript/digix_tempo.js new file mode 100644 index 0000000..8403bc1 --- /dev/null +++ b/test/javascript/digix_tempo.js @@ -0,0 +1,53 @@ +//This is a modified copy of: https://github.com/DigixGlobal/tempo/blob/master/lib/index.js +// It is not compatible with Web3 v1.0 (https://github.com/DigixGlobal/tempo/issues/5) +// A pull request has been created https://github.com/DigixGlobal/tempo/pull/4 +// In the mean time, a local modified copy is used. + +'use strict'; + +module.exports = function (web3) { + function sendRpc(method, params) { + return new Promise(function (resolve) { + web3.currentProvider.send({ + jsonrpc: '2.0', + method: method, + params: params || [], + id: new Date().getTime() + }, function (err, res) { + resolve(res); + }); + }); + } + function waitUntilBlock(seconds, targetBlock) { + return new Promise(function (resolve) { + var asyncIterator = function asyncIterator() { + return web3.eth.getBlock('latest', function (e, _ref) { + var number = _ref.number; + + if (number >= targetBlock - 1) { + return sendRpc('evm_increaseTime', [seconds]).then(function () { + return sendRpc('evm_mine'); + }).then(resolve); + } + return sendRpc('evm_mine').then(asyncIterator); + }); + }; + asyncIterator(); + }); + } + function wait() { + var seconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 20; + var blocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + + return new Promise(function (resolve) { + return web3.eth.getBlock('latest', function (e, _ref2) { + var number = _ref2.number; + + resolve(blocks + number); + }); + }).then(function (targetBlock) { + return waitUntilBlock(seconds, targetBlock); + }); + } + return { wait: wait, waitUntilBlock: waitUntilBlock }; +}; \ No newline at end of file diff --git a/test/javascript/test_events.js b/test/javascript/test_events.js index 172a288..162c7a3 100644 --- a/test/javascript/test_events.js +++ b/test/javascript/test_events.js @@ -22,12 +22,12 @@ contract('Event', function (accounts) { etherToken = await WETH9.deployed() // create event - ipfsHash = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG' - oracle = utils.getParamFromTxEvent( + ipfsHash = web3.utils.utf8ToHex('QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG'); + oracle = await utils.getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle', CentralizedOracle ) - event = utils.getParamFromTxEvent( + event = await utils.getParamFromTxEvent( await eventFactory.createCategoricalEvent(etherToken.address, oracle.address, 2), 'categoricalEvent', CategoricalEvent ) @@ -36,18 +36,19 @@ contract('Event', function (accounts) { it('should buy and sell all outcomes', async () => { // Buy all outcomes const buyer = 0 - const collateralTokenCount = 1e19 + const collateralTokenCount = 1e19.toString() // https://github.com/ethereum/web3.js/issues/2077 + const collateralTokenCountOver10 = 1e18.toString() await etherToken.deposit({ value: collateralTokenCount, from: accounts[buyer] }) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), collateralTokenCount) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), collateralTokenCount) await etherToken.approve(event.address, collateralTokenCount, { from: accounts[buyer] }) for(let i = 0; i < 10; i++) - await event.buyAllOutcomes(collateralTokenCount / 10, { from: accounts[buyer] }) + await event.buyAllOutcomes(collateralTokenCountOver10, { from: accounts[buyer] }) assert.equal(await etherToken.balanceOf.call(event.address), collateralTokenCount) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) - const outcomeToken1 = OutcomeToken.at(await event.outcomeTokens.call(0)) - const outcomeToken2 = OutcomeToken.at(await event.outcomeTokens.call(1)) + const outcomeToken1 = await OutcomeToken.at(await event.outcomeTokens.call(0)) + const outcomeToken2 = await OutcomeToken.at(await event.outcomeTokens.call(1)) assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount) assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount) @@ -62,18 +63,19 @@ contract('Event', function (accounts) { it('should buy and verify outcomes', async () => { // Buy all outcomes const buyer = 1 - const collateralTokenCount = 1e18 + const collateralTokenCount = 1e19.toString() + const collateralTokenCountDividedBy10 = 1e18.toString() await etherToken.deposit({ value: collateralTokenCount, from: accounts[buyer] }) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), collateralTokenCount) await etherToken.approve(event.address, collateralTokenCount, { from: accounts[buyer] }) for(let i = 0; i < 10; i++) - await event.buyAllOutcomes(collateralTokenCount / 10, { from: accounts[buyer] }) + await event.buyAllOutcomes(collateralTokenCountDividedBy10, { from: accounts[buyer] }) assert.equal(await etherToken.balanceOf.call(event.address), collateralTokenCount) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) - const outcomeToken1 = OutcomeToken.at(await event.outcomeTokens.call(0)) - const outcomeToken2 = OutcomeToken.at(await event.outcomeTokens.call(1)) + const outcomeToken1 = await OutcomeToken.at(await event.outcomeTokens.call(0)) + const outcomeToken2 = await OutcomeToken.at(await event.outcomeTokens.call(1)) assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount) assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount) @@ -83,7 +85,7 @@ contract('Event', function (accounts) { //using parseInt and .valueOf because of strictEqual comparison in arrays.deepEqual() const outcomeTokenDistribution = await event.getOutcomeTokenDistribution.call(accounts[buyer]) assert.deepEqual( - [parseInt(outcomeTokenDistribution[0].valueOf(), 10), parseInt(outcomeTokenDistribution[1].valueOf(), 10)], + [parseInt(outcomeTokenDistribution[0].valueOf(), 10).toString(), parseInt(outcomeTokenDistribution[1].valueOf(), 10).toString()], [collateralTokenCount, collateralTokenCount]) }) @@ -99,8 +101,8 @@ contract('Event', function (accounts) { assert.equal(await etherToken.balanceOf.call(event.address), collateralTokenCount) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) - const outcomeToken1 = OutcomeToken.at(await event.outcomeTokens.call(0)) - const outcomeToken2 = OutcomeToken.at(await event.outcomeTokens.call(1)) + const outcomeToken1 = await OutcomeToken.at(await event.outcomeTokens.call(0)) + const outcomeToken2 = await OutcomeToken.at(await event.outcomeTokens.call(1)) assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount) assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount) @@ -115,7 +117,7 @@ contract('Event', function (accounts) { assert.equal(await event.isOutcomeSet.call(),true) //Redeem winnings for buyer account - const buyerWinnings = utils.getParamFromTxEvent( + const buyerWinnings = await utils.getParamFromTxEvent( await event.redeemWinnings({ from: accounts[buyer] }), 'winnings') assert.equal(buyerWinnings.valueOf(), collateralTokenCount) assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount) @@ -124,7 +126,7 @@ contract('Event', function (accounts) { }) it('should buy, set, and redeem outcomes for scalar event', async () => { - const scalarEvent = utils.getParamFromTxEvent( + const scalarEvent = await utils.getParamFromTxEvent( await eventFactory.createScalarEvent(etherToken.address, oracle.address, -100, 100), 'scalarEvent', ScalarEvent ) @@ -139,8 +141,8 @@ contract('Event', function (accounts) { assert.equal(await etherToken.balanceOf.call(scalarEvent.address), collateralTokenCount) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) - const outcomeToken1 = OutcomeToken.at(await scalarEvent.outcomeTokens(0)) - const outcomeToken2 = OutcomeToken.at(await scalarEvent.outcomeTokens(1)) + const outcomeToken1 = await OutcomeToken.at(await scalarEvent.outcomeTokens(0)) + const outcomeToken2 = await OutcomeToken.at(await scalarEvent.outcomeTokens(1)) assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount) assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount) @@ -155,7 +157,7 @@ contract('Event', function (accounts) { assert.equal(await scalarEvent.isOutcomeSet.call(), true) //Redeem winnings for buyer account - const buyerWinnings = utils.getParamFromTxEvent( + const buyerWinnings = await utils.getParamFromTxEvent( await scalarEvent.redeemWinnings({ from: accounts[buyer] }), 'winnings') assert.equal(buyerWinnings.valueOf(), collateralTokenCount) assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), 0) diff --git a/test/javascript/test_market_makers.js b/test/javascript/test_market_makers.js index 2a18781..6be7054 100644 --- a/test/javascript/test_market_makers.js +++ b/test/javascript/test_market_makers.js @@ -1,4 +1,8 @@ const _ = require('lodash') +const BigNumber = require('bignumber.js') + +const PRECISION = 80 +const Decimal = require('decimal.js').clone({ precision: PRECISION }) const utils = require('./utils') const { ONE, isClose, lmsrMarginalPrice, getParamFromTxEvent } = utils @@ -32,11 +36,11 @@ contract('MarketMaker', function(accounts) { it.skip('should move price of an outcome to 0 after participants sell lots of that outcome to market maker', async () => { // Create event const numOutcomes = 2 - const ipfsHash = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG' - const oracleAddress = getParamFromTxEvent( + const ipfsHash = web3.utils.utf8ToHex('QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG') + const oracleAddress = await getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle') - const event = getParamFromTxEvent( + const event = await getParamFromTxEvent( await eventFactory.createCategoricalEvent(etherToken.address, oracleAddress, numOutcomes), 'categoricalEvent', CategoricalEvent) @@ -44,7 +48,7 @@ contract('MarketMaker', function(accounts) { const investor = 0 const feeFactor = 0 // 0% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket) @@ -53,44 +57,45 @@ contract('MarketMaker', function(accounts) { const funding = 1e17 await etherToken.deposit({ value: funding, from: accounts[investor] }) - assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding) + assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding.toString()) - await etherToken.approve(market.address, funding, { from: accounts[investor] }) - await market.fund(funding, { from: accounts[investor] }) + await etherToken.approve(market.address, funding.toString(), { from: accounts[investor] }) + await market.fund(funding.toString(), { from: accounts[investor] }) assert.equal(await etherToken.balanceOf.call(accounts[investor]), 0) // User buys all outcomes const trader = 1 const outcome = 1 - const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(outcome)) + const outcomeToken = await OutcomeToken.at(await event.outcomeTokens.call(outcome)) const tokenCount = 1e18 const loopCount = 10 await etherToken.deposit({ value: tokenCount * loopCount, from: accounts[trader] }) - await etherToken.approve(event.address, tokenCount * loopCount, { from: accounts[trader] }) - await event.buyAllOutcomes(tokenCount * loopCount, { from: accounts[trader] }) + await etherToken.approve(event.address, (tokenCount * loopCount).toString(), { from: accounts[trader] }) + await event.buyAllOutcomes((tokenCount * loopCount).toString(), { from: accounts[trader] }) // User sells tokens const buyerBalance = await etherToken.balanceOf.call(accounts[trader]) let profit, outcomeTokenAmounts for(let i of _.range(loopCount)) { // Calculate profit for selling tokens - outcomeTokenAmounts = Array.from({length: numOutcomes}, (v, i) => i === outcome ? -tokenCount : 0) + outcomeTokenAmounts = Array.from({length: numOutcomes}, (v, i) => i === outcome ? (-tokenCount).toString() : 0) profit = (await lmsrMarketMaker.calcNetCost.call(market.address, outcomeTokenAmounts)).neg() if(profit == 0) break // Selling tokens - await outcomeToken.approve(market.address, tokenCount, { from: accounts[trader] }) - assert.equal(getParamFromTxEvent( + await outcomeToken.approve(market.address, tokenCount.toString(), { from: accounts[trader] }) + assert.equal((await getParamFromTxEvent( await market.trade(outcomeTokenAmounts, profit.neg(), { from: accounts[trader] }), 'outcomeTokenNetCost' - ).neg().valueOf(), profit.valueOf()) + )).neg().valueOf(), profit.toString()) let netOutcomeTokensSold = await Promise.all(_.range(numOutcomes).map((j) => market.netOutcomeTokensSold(j))) let expected = lmsrMarginalPrice(funding, netOutcomeTokensSold, outcome) - let actual = (await lmsrMarketMaker.calcMarginalPrice.call(market.address, outcome)).div(ONE) + let actual = new BigNumber((await lmsrMarketMaker.calcMarginalPrice.call(market.address, outcome.toString()))) + .div(ONE.toString()) assert( - isClose(actual, expected), + isClose(actual, expected, relTol=1e-3, absTol=1e-9), `Marginal price calculation is off for iteration ${i}:\n` + ` funding: ${funding}\n` + ` net outcome tokens sold: ${netOutcomeTokensSold}\n` + @@ -101,7 +106,7 @@ contract('MarketMaker', function(accounts) { // Selling of tokens is worth less than 1 Wei assert.equal(profit, 0) // User's Ether balance increased - assert.isAbove(await etherToken.balanceOf.call(accounts[trader]), buyerBalance) + assert(BigNumber(await etherToken.balanceOf.call(accounts[trader]).valueOf()).gte(buyerBalance)) }) it.skip('should move price of an outcome to 1 after participants buy lots of that outcome from market maker', async () => { @@ -112,27 +117,27 @@ contract('MarketMaker', function(accounts) { ]) { // Create event const numOutcomes = 2 - const ipfsHash = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG' - const oracleAddress = getParamFromTxEvent( + const ipfsHash = web3.utils.utf8ToHex('QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG') + const oracleAddress = await getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle') - const event = getParamFromTxEvent( + const event = await getParamFromTxEvent( await eventFactory.createCategoricalEvent(etherToken.address, oracleAddress, numOutcomes), 'categoricalEvent', CategoricalEvent) // Create market const feeFactor = 0 // 0% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket) // Fund market await etherToken.deposit({ value: funding, from: accounts[investor] }) - assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding) + assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding.toString()) - await etherToken.approve(market.address, funding, { from: accounts[investor] }) - await market.fund(funding, { from: accounts[investor] }) + await etherToken.approve(market.address, funding.toString(), { from: accounts[investor] }) + await market.fund(funding.toString(), { from: accounts[investor] }) assert.equal(await etherToken.balanceOf.call(accounts[investor]), 0) // User buys ether tokens @@ -145,18 +150,18 @@ contract('MarketMaker', function(accounts) { let cost, outcomeTokenAmounts for(let i of _.range(loopCount)) { // Calculate cost of buying tokens - outcomeTokenAmounts = Array.from({length: numOutcomes}, (v, i) => i === outcome ? tokenCount : 0) + outcomeTokenAmounts = Array.from({length: numOutcomes}, (v, i) => i === outcome.toString() ? tokenCount.toString() : 0) cost = await lmsrMarketMaker.calcNetCost.call(market.address, outcomeTokenAmounts) // Buying tokens - await etherToken.approve(market.address, tokenCount, { from: accounts[trader] }) - assert.equal(getParamFromTxEvent( - await market.trade(outcomeTokenAmounts, cost, { from: accounts[trader] }), 'outcomeTokenNetCost' - ).valueOf(), cost.valueOf()) + await etherToken.approve(market.address, tokenCount.toString(), { from: accounts[trader] }) + assert.equal(await getParamFromTxEvent( + await market.trade(outcomeTokenAmounts, cost.toString(), { from: accounts[trader] }), 'outcomeTokenNetCost' + ).valueOf(), cost.toString()) let netOutcomeTokensSold = await Promise.all(_.range(numOutcomes).map((j) => market.netOutcomeTokensSold(j))) let expected = lmsrMarginalPrice(funding, netOutcomeTokensSold, outcome) - let actual = (await lmsrMarketMaker.calcMarginalPrice.call(market.address, outcome)).div(ONE) + let actual = new BigNumber(await lmsrMarketMaker.calcMarginalPrice.call(market.address, outcome.toString())).div(ONE.toString()) assert( isClose(actual, expected) || expected.toString() == 'NaN', `Marginal price calculation is off for iteration ${i}:\n` + @@ -168,18 +173,18 @@ contract('MarketMaker', function(accounts) { } // Price is equal to 1 - assert.equal(cost, tokenCount) + assert.equal(cost.toString(), 1) } }) it('should allow buying and selling outcome tokens in the same transaction', async () => { // Create event const numOutcomes = 4 - const ipfsHash = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG' - const oracleAddress = getParamFromTxEvent( + const ipfsHash = web3.utils.utf8ToHex('QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG') + const oracleAddress = await getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle') - const event = getParamFromTxEvent( + const event = await getParamFromTxEvent( await eventFactory.createCategoricalEvent(etherToken.address, oracleAddress, numOutcomes), 'categoricalEvent', CategoricalEvent) @@ -187,13 +192,13 @@ contract('MarketMaker', function(accounts) { const investor = 5 const feeFactor = 0 // 0% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket) // Fund market - const funding = 1e18 + const funding = 1e18.toString() await etherToken.deposit({ value: funding, from: accounts[investor] }) assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding) @@ -207,28 +212,31 @@ contract('MarketMaker', function(accounts) { const initialWETH9Count = 10e18 // User buys all outcomes - await etherToken.deposit({ value: initialOutcomeTokenCount + initialWETH9Count, from: accounts[trader] }) - await etherToken.approve(event.address, initialOutcomeTokenCount, { from: accounts[trader] }) - await event.buyAllOutcomes(initialOutcomeTokenCount, { from: accounts[trader] }) + await etherToken.deposit({ value: (initialOutcomeTokenCount + initialWETH9Count).toString(), from: accounts[trader] }) + await etherToken.approve(event.address, initialOutcomeTokenCount.toString(), { from: accounts[trader] }) + await event.buyAllOutcomes(initialOutcomeTokenCount.toString(), { from: accounts[trader] }) // User trades with the market const tradeValues = [5e17, -1e18, -1e17, 2e18] - const cost = await lmsrMarketMaker.calcNetCost.call(market.address, tradeValues) + const tradeValuesAsStrings = [5e17.toString(), (-1e18).toString(), (-1e17).toString(), 2e18.toString()] + const cost = await lmsrMarketMaker.calcNetCost.call(market.address, tradeValuesAsStrings) + if(cost.gt(0)) await etherToken.approve(market.address, cost, { from: accounts[trader] }) const outcomeTokens = await Promise.all(_.range(numOutcomes).map(i => event.outcomeTokens.call(i).then(tokenAddr => OutcomeToken.at(tokenAddr)))) await Promise.all(tradeValues.map((v, i) => [v, i]).filter(([v]) => v < 0).map(([v, i]) => - outcomeTokens[i].approve(market.address, -v, { from: accounts[trader] }))) + outcomeTokens[i].approve(market.address, (-v).toString(), { from: accounts[trader] }))) - assert.equal(getParamFromTxEvent( - await market.trade(tradeValues, cost, { from: accounts[trader] }), 'outcomeTokenNetCost' - ), cost.valueOf()) + assert.equal(await getParamFromTxEvent( + await market.trade(tradeValuesAsStrings, cost, { from: accounts[trader] }), 'outcomeTokenNetCost' + ), cost.toString()) // All state transitions associated with trade have been performed for(let [tradeValue, i] of tradeValues.map((v, i) => [v, i])) { - assert.equal(await outcomeTokens[i].balanceOf.call(accounts[trader]), initialOutcomeTokenCount + tradeValue) + assert.equal(await outcomeTokens[i].balanceOf.call(accounts[trader]), (initialOutcomeTokenCount + tradeValue).toString()) } - - assert.equal(await etherToken.balanceOf.call(accounts[trader]), initialWETH9Count - cost.valueOf()) + + assert.equal(await etherToken.balanceOf.call(accounts[trader]), + new BigNumber(initialWETH9Count).minus(cost).toString() ) }) }) diff --git a/test/javascript/test_markets.js b/test/javascript/test_markets.js index 804418d..12df121 100644 --- a/test/javascript/test_markets.js +++ b/test/javascript/test_markets.js @@ -1,6 +1,7 @@ const _ = require('lodash') -const { wait } = require('@digix/tempo')(web3) +const { wait } = require('./digix_tempo')(web3) +const BigNumber = require('bignumber.js') const utils = require('./utils') const { getBlock, getParamFromTxEvent, assertRejects, Decimal, randrange, randnums } = utils @@ -26,6 +27,7 @@ contract('StandardMarket', function (accounts) { let campaignFactory let ipfsHash, centralizedOracle, event const numOutcomes = 3 + const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; beforeEach(async () => { @@ -37,12 +39,12 @@ contract('StandardMarket', function (accounts) { campaignFactory = await CampaignFactory.deployed() // create event - ipfsHash = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG' - centralizedOracle = getParamFromTxEvent( + ipfsHash = web3.utils.utf8ToHex('QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG') + centralizedOracle = await getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle', CentralizedOracle ) - event = getParamFromTxEvent( + event = await getParamFromTxEvent( await eventFactory.createCategoricalEvent(etherToken.address, centralizedOracle.address, numOutcomes), 'categoricalEvent', CategoricalEvent ) @@ -53,7 +55,7 @@ contract('StandardMarket', function (accounts) { const buyer = 5 const feeFactor = 0 - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[buyer] }), 'market', StandardMarket ) @@ -91,13 +93,13 @@ contract('StandardMarket', function (accounts) { const investor = 0 const feeFactor = 50000 // 5% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket ) // Fund market - const funding = 1e18 + const funding = 1e18.toString() await etherToken.deposit({ value: funding, from: accounts[investor] }) assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding) @@ -118,14 +120,14 @@ contract('StandardMarket', function (accounts) { const cost = fee.add(outcomeTokenCost) await etherToken.deposit({ value: cost, from: accounts[buyer] }) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), cost.valueOf()) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), cost.toString()) await etherToken.approve(market.address, cost, { from: accounts[buyer] }) - assert.equal(getParamFromTxEvent( + assert.equal(await getParamFromTxEvent( await market.buy(outcome, tokenCount, cost, { from: accounts[buyer] }), 'outcomeTokenCost' - ), outcomeTokenCost.valueOf()) + ), outcomeTokenCost.toString()) - const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(outcome)) + const outcomeToken = await OutcomeToken.at(await event.outcomeTokens.call(outcome)) assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) @@ -135,13 +137,13 @@ contract('StandardMarket', function (accounts) { const profit = outcomeTokenProfit.sub(fee) await outcomeToken.approve(market.address, tokenCount, { from: accounts[buyer] }) - assert.equal(getParamFromTxEvent( + assert.equal(await getParamFromTxEvent( await market.sell(outcome, tokenCount, profit, { from: accounts[buyer] }), 'outcomeTokenProfit' - ).valueOf(), outcomeTokenProfit.valueOf()) + ).valueOf(), outcomeTokenProfit.toString()) assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), 0) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), profit.valueOf()) - await etherToken.transfer(0, profit, { from: accounts[buyer] }) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), profit.toString()) + await etherToken.transfer(ZERO_ADDRESS, profit, { from: accounts[buyer] }) }) it('should allow short selling (legacy)', async () => { @@ -149,13 +151,13 @@ contract('StandardMarket', function (accounts) { const investor = 7 const feeFactor = 50000 // 5% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket ) // Fund market - const funding = 1e18 + const funding = 1e18.toString() await etherToken.deposit({ value: funding, from: accounts[investor] }) assert.equal((await etherToken.balanceOf.call(accounts[investor])).valueOf(), funding) @@ -172,29 +174,29 @@ contract('StandardMarket', function (accounts) { const tokenCount = 1e15 const outcomeTokenProfit = await lmsrMarketMaker.calcProfit.call(market.address, outcome, tokenCount) const fee = await market.calcMarketFee.call(outcomeTokenProfit) - const cost = fee.add(tokenCount).sub(outcomeTokenProfit) + const cost = fee.add(web3.utils.toBN(tokenCount)).sub(outcomeTokenProfit) await etherToken.deposit({ value: tokenCount, from: accounts[buyer] }) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), tokenCount) - await etherToken.approve(market.address, tokenCount, { from: accounts[buyer] }) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), tokenCount.toString()) + await etherToken.approve(market.address, tokenCount.toString(), { from: accounts[buyer] }) assert.equal( - getParamFromTxEvent( - await market.shortSell(outcome, tokenCount, outcomeTokenProfit - fee, { from: accounts[buyer] }), + await getParamFromTxEvent( + await market.shortSell(outcome, tokenCount.toString(), outcomeTokenProfit - fee, { from: accounts[buyer] }), 'cost', null, 'OutcomeTokenShortSale' - ).valueOf(), cost) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), tokenCount - cost) - await etherToken.transfer(0, tokenCount - cost, { from: accounts[buyer] }) - const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(oppositeOutcome)) - assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount) + ).valueOf(), cost.toString()) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), (tokenCount - cost).toString()) + await etherToken.transfer(ZERO_ADDRESS, (tokenCount - cost).toString(), { from: accounts[buyer] }) + const outcomeToken = await OutcomeToken.at(await event.outcomeTokens.call(oppositeOutcome)) + assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount.toString()) }) it('should be created by a successful campaign (legacy)', async () => { // Create campaign const feeFactor = 50000 // 5% - const funding = 1e18 - const deadline = web3.eth.getBlock('latest').timestamp + 60 // in 1h - const campaign = Campaign.at(getParamFromTxEvent( + const funding = 1e18.toString() + const deadline = (await web3.eth.getBlock('latest')).timestamp + 60 // in 1h + const campaign = await Campaign.at(await getParamFromTxEvent( await campaignFactory.createCampaign( event.address, standardMarketFactory.address, @@ -209,20 +211,20 @@ contract('StandardMarket', function (accounts) { let amount = 7.5e17 await etherToken.deposit({ value: amount, from: accounts[backer1] }) - await etherToken.approve(campaign.address, amount, { from: accounts[backer1] }) - await campaign.fund(amount, { from: accounts[backer1] }) + await etherToken.approve(campaign.address, amount.toString(), { from: accounts[backer1] }) + await campaign.fund(amount.toString(), { from: accounts[backer1] }) assert.equal((await campaign.stage()).valueOf(), 0) const backer2 = 3 amount = 2.5e17 await etherToken.deposit({ value: amount, from: accounts[backer2] }) - await etherToken.approve(campaign.address, amount, { from: accounts[backer2] }) - campaign.fund(amount, { from: accounts[backer2] }) + await etherToken.approve(campaign.address, amount.toString(), { from: accounts[backer2] }) + campaign.fund(amount.toString(), { from: accounts[backer2] }) assert.equal(await campaign.stage.call(), 1) // Create market - const market = StandardMarket.at(getParamFromTxEvent(await campaign.createMarket(), 'market')) + const market = await StandardMarket.at(await getParamFromTxEvent(await campaign.createMarket(), 'market')) // Trade const buyer = 4 @@ -231,17 +233,17 @@ contract('StandardMarket', function (accounts) { const outcomeTokenCost = await lmsrMarketMaker.calcCost.call(market.address, outcome, tokenCount) const fee = await market.calcMarketFee.call(outcomeTokenCost) - assert.equal(fee.valueOf(), outcomeTokenCost.mul(.05).floor().valueOf()) + assert.equal(fee.valueOf(), new BigNumber(outcomeTokenCost).times(.05).integerValue(BigNumber.ROUND_FLOOR).toString()) const cost = outcomeTokenCost.add(fee) await etherToken.deposit({ value: cost, from: accounts[buyer] }) - assert.equal((await etherToken.balanceOf.call(accounts[buyer])).valueOf(), cost.valueOf()) + assert.equal((await etherToken.balanceOf.call(accounts[buyer])).valueOf(), cost.toString()) await etherToken.approve(market.address, cost, { from: accounts[buyer] }) - assert.equal(getParamFromTxEvent( - await market.buy(outcome, tokenCount, cost, { from: accounts[buyer] }), 'outcomeTokenCost').valueOf() - , outcomeTokenCost.valueOf()) + assert.equal(await getParamFromTxEvent( + await market.buy(outcome, tokenCount.toString(), cost, { from: accounts[buyer] }), 'outcomeTokenCost').valueOf() + , outcomeTokenCost.toString()) // Set outcome await centralizedOracle.setOutcome(1) @@ -254,24 +256,24 @@ contract('StandardMarket', function (accounts) { assert(finalBalance.gt(funding)) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer1] }), 'fees' - ).valueOf(), finalBalance.mul(.75).floor().valueOf()) + ).valueOf(), BigNumber(finalBalance).times(.75).integerValue(BigNumber.ROUND_FLOOR).toString()) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer2] }), 'fees' - ).valueOf(), finalBalance.mul(.25).floor().valueOf()) + ).valueOf(), BigNumber(finalBalance).times(.25).integerValue(BigNumber.ROUND_FLOOR).toString()) // Withdraw works only once assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer1] }), 'fees' ).valueOf(), 0) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer2] }), 'fees' ).valueOf(), 0) @@ -281,14 +283,14 @@ contract('StandardMarket', function (accounts) { // Create campaign const feeFactor = 50000 // 5% const funding = 1e18 - const deadline = web3.eth.getBlock('latest').timestamp + 60 // in 1h - const campaign = Campaign.at(getParamFromTxEvent( + const deadline = (await web3.eth.getBlock('latest')).timestamp + 60 // in 1h + const campaign = await Campaign.at(await getParamFromTxEvent( await campaignFactory.createCampaign( event.address, standardMarketFactory.address, lmsrMarketMaker.address, feeFactor, - funding, + funding.toString(), deadline), 'campaign')) assert.equal(await campaign.stage.call(), 0) @@ -297,18 +299,18 @@ contract('StandardMarket', function (accounts) { const amount = 7.5e17 await etherToken.deposit({ value: amount, from: accounts[backer1] }) - await etherToken.approve(campaign.address, amount, { from: accounts[backer1] }) - await campaign.fund(amount, { from: accounts[backer1] }) + await etherToken.approve(campaign.address, amount.toString(), { from: accounts[backer1] }) + await campaign.fund(amount.toString(), { from: accounts[backer1] }) assert.equal((await campaign.stage()).valueOf(), 0) // Deadline passes await wait(61) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.refund({ from: accounts[backer1] }), 'refund'), amount) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.refund({ from: accounts[backer1] }), 'refund'), 0) }) @@ -318,7 +320,7 @@ contract('StandardMarket', function (accounts) { const investor = 0 const feeFactor = 50000 // 5% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket ) @@ -327,11 +329,11 @@ contract('StandardMarket', function (accounts) { const funding = 1e18 await etherToken.deposit({ value: funding, from: accounts[investor] }) - assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding) + assert.equal(await etherToken.balanceOf.call(accounts[investor]), funding.toString()) - await etherToken.approve(market.address, funding, { from: accounts[investor] }) + await etherToken.approve(market.address, funding.toString(), { from: accounts[investor] }) - await market.fund(funding, { from: accounts[investor] }) + await market.fund(funding.toString(), { from: accounts[investor] }) assert.equal(await etherToken.balanceOf.call(accounts[investor]), 0) // Buy outcome tokens @@ -346,15 +348,15 @@ contract('StandardMarket', function (accounts) { const cost = fee.add(outcomeTokenCost) await etherToken.deposit({ value: cost, from: accounts[buyer] }) - assert.equal((await etherToken.balanceOf.call(accounts[buyer])).valueOf(), cost.valueOf()) + assert.equal((await etherToken.balanceOf.call(accounts[buyer])).valueOf(), cost.toString()) await etherToken.approve(market.address, cost, { from: accounts[buyer] }) - assert.equal(getParamFromTxEvent( + assert.equal(await getParamFromTxEvent( await market.trade(outcomeTokenAmounts, cost, { from: accounts[buyer] }), 'outcomeTokenNetCost' - ), outcomeTokenCost.valueOf()) + ), outcomeTokenCost.toString()) - const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(outcome)) - assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount) + const outcomeToken = await OutcomeToken.at(await event.outcomeTokens.call(outcome)) + assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount.toString()) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) // Sell outcome tokens @@ -363,13 +365,13 @@ contract('StandardMarket', function (accounts) { fee = await market.calcMarketFee.call(outcomeTokenProfit) const profit = outcomeTokenProfit.sub(fee) - await outcomeToken.approve(market.address, tokenCount, { from: accounts[buyer] }) - assert.equal(getParamFromTxEvent( + await outcomeToken.approve(market.address, tokenCount.toString(), { from: accounts[buyer] }) + assert.equal((await getParamFromTxEvent( await market.trade(outcomeTokenAmounts, -profit, { from: accounts[buyer] }), 'outcomeTokenNetCost' - ).neg().valueOf(), outcomeTokenProfit.valueOf()) + )).neg().valueOf(), outcomeTokenProfit.toString()) assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), 0) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), profit.valueOf()) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), profit.toString()) }) it('should allow short selling', async () => { @@ -377,7 +379,7 @@ contract('StandardMarket', function (accounts) { const investor = 7 const feeFactor = 50000 // 5% - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }), 'market', StandardMarket ) @@ -386,11 +388,11 @@ contract('StandardMarket', function (accounts) { const funding = 1e18 await etherToken.deposit({ value: funding, from: accounts[investor] }) - assert.equal((await etherToken.balanceOf.call(accounts[investor])).valueOf(), funding) + assert.equal((await etherToken.balanceOf.call(accounts[investor])).valueOf(), funding.toString()) - await etherToken.approve(market.address, funding, { from: accounts[investor] }) + await etherToken.approve(market.address, funding.toString(), { from: accounts[investor] }) - await market.fund(funding, { from: accounts[investor] }) + await market.fund(funding.toString(), { from: accounts[investor] }) assert.equal(await etherToken.balanceOf.call(accounts[investor]), 0) // Short sell outcome tokens @@ -404,16 +406,16 @@ contract('StandardMarket', function (accounts) { const cost = outcomeTokenCost.add(fee) await etherToken.deposit({ value: cost, from: accounts[buyer] }) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), cost.valueOf()) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), cost.toString()) await etherToken.approve(market.address, cost, { from: accounts[buyer] }) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await market.trade(outcomeTokenAmounts, cost, { from: accounts[buyer] }), 'outcomeTokenNetCost' - ).valueOf(), outcomeTokenCost.valueOf()) + ).valueOf(), outcomeTokenCost.toString()) assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0) - const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(differentOutcome)) + const outcomeToken = await OutcomeToken.at(await event.outcomeTokens.call(differentOutcome)) assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount) }) @@ -422,13 +424,13 @@ contract('StandardMarket', function (accounts) { const feeFactor = 50000 // 5% const funding = 1e18 const deadline = (await getBlock('latest')).timestamp + 60 // in 1h - const campaign = Campaign.at(getParamFromTxEvent( + const campaign = await Campaign.at(await getParamFromTxEvent( await campaignFactory.createCampaign( event.address, standardMarketFactory.address, lmsrMarketMaker.address, feeFactor, - funding, + funding.toString(), deadline), 'campaign')) assert.equal(await campaign.stage.call(), 0) @@ -437,20 +439,20 @@ contract('StandardMarket', function (accounts) { let amount = 7.5e17 await etherToken.deposit({ value: amount, from: accounts[backer1] }) - await etherToken.approve(campaign.address, amount, { from: accounts[backer1] }) - await campaign.fund(amount, { from: accounts[backer1] }) + await etherToken.approve(campaign.address, amount.toString(), { from: accounts[backer1] }) + await campaign.fund(amount.toString(), { from: accounts[backer1] }) assert.equal((await campaign.stage()).valueOf(), 0) const backer2 = 3 amount = 2.5e17 await etherToken.deposit({ value: amount, from: accounts[backer2] }) - await etherToken.approve(campaign.address, amount, { from: accounts[backer2] }) - campaign.fund(amount, { from: accounts[backer2] }) + await etherToken.approve(campaign.address, amount.toString(), { from: accounts[backer2] }) + campaign.fund(amount.toString(), { from: accounts[backer2] }) assert.equal(await campaign.stage.call(), 1) // Create market - const market = StandardMarket.at(getParamFromTxEvent(await campaign.createMarket(), 'market')) + const market = await StandardMarket.at(await getParamFromTxEvent(await campaign.createMarket(), 'market')) // Trade const buyer = 4 @@ -459,18 +461,18 @@ contract('StandardMarket', function (accounts) { const outcomeTokenAmounts = Array.from({length: numOutcomes}, (v, i) => i === outcome ? tokenCount : 0) const outcomeTokenCost = await lmsrMarketMaker.calcNetCost.call(market.address, outcomeTokenAmounts) - const fee = await market.calcMarketFee.call(outcomeTokenCost) - assert.equal(fee.valueOf(), outcomeTokenCost.mul(.05).floor().valueOf()) + const fee = await market.calcMarketFee.call(outcomeTokenCost) + assert.equal(fee.valueOf(), new BigNumber(outcomeTokenCost).times(.05).integerValue(BigNumber.ROUND_FLOOR).toString()) const cost = outcomeTokenCost.add(fee) await etherToken.deposit({ value: cost, from: accounts[buyer] }) - assert.equal((await etherToken.balanceOf.call(accounts[buyer])).valueOf(), cost.valueOf()) + assert.equal((await etherToken.balanceOf.call(accounts[buyer])).valueOf(), cost.toString()) await etherToken.approve(market.address, cost, { from: accounts[buyer] }) - assert.equal(getParamFromTxEvent( + assert.equal(await getParamFromTxEvent( await market.trade(outcomeTokenAmounts, cost, { from: accounts[buyer] }), 'outcomeTokenNetCost').valueOf() - , outcomeTokenCost.valueOf()) + , outcomeTokenCost.toString()) // Set outcome await centralizedOracle.setOutcome(1) @@ -483,24 +485,24 @@ contract('StandardMarket', function (accounts) { assert(finalBalance.gt(funding)) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer1] }), 'fees' - ).valueOf(), finalBalance.mul(.75).floor().valueOf()) + ).valueOf(), new BigNumber(finalBalance).times(.75).integerValue(BigNumber.ROUND_FLOOR).toString()) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer2] }), 'fees' - ).valueOf(), finalBalance.mul(.25).floor().valueOf()) + ).valueOf(), new BigNumber(finalBalance).times(.25).integerValue(BigNumber.ROUND_FLOOR).toString()) // Withdraw works only once assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer1] }), 'fees' ).valueOf(), 0) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.withdrawFees({ from: accounts[backer2] }), 'fees' ).valueOf(), 0) @@ -511,13 +513,13 @@ contract('StandardMarket', function (accounts) { const feeFactor = 50000 // 5% const funding = 1e18 const deadline = (await getBlock('latest')).timestamp + 60 // in 1h - const campaign = Campaign.at(getParamFromTxEvent( + const campaign = await Campaign.at(await getParamFromTxEvent( await campaignFactory.createCampaign( event.address, standardMarketFactory.address, lmsrMarketMaker.address, feeFactor, - funding, + funding.toString(), deadline), 'campaign')) assert.equal(await campaign.stage.call(), 0) @@ -526,50 +528,50 @@ contract('StandardMarket', function (accounts) { const amount = 7.5e17 await etherToken.deposit({ value: amount, from: accounts[backer1] }) - await etherToken.approve(campaign.address, amount, { from: accounts[backer1] }) - await campaign.fund(amount, { from: accounts[backer1] }) + await etherToken.approve(campaign.address, amount.toString(), { from: accounts[backer1] }) + await campaign.fund(amount.toString(), { from: accounts[backer1] }) assert.equal((await campaign.stage()).valueOf(), 0) // Deadline passes await wait(61) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.refund({ from: accounts[backer1] }), 'refund'), - amount) + amount.toString()) assert.equal( - getParamFromTxEvent( + await getParamFromTxEvent( await campaign.refund({ from: accounts[backer1] }), 'refund'), 0) }) it('trading stress testing', async () => { - const MAX_VALUE = Decimal(2).pow(256).sub(1) + const MAX_VALUE = web3.utils.toBN(new BigNumber(2).pow(256).minus(1)) const trader = 9 const feeFactor = 0 - const market = getParamFromTxEvent( + const market = await getParamFromTxEvent( await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[trader] }), 'market', StandardMarket ) // Get ready for trading await etherToken.deposit({ value: 2e19, from: accounts[trader] }) - await etherToken.approve(event.address, 1e19, { from: accounts[trader] }) - await event.buyAllOutcomes(1e19, { from: accounts[trader] }) + await etherToken.approve(event.address, 1e19.toString(), { from: accounts[trader] }) + await event.buyAllOutcomes(1e19.toString(), { from: accounts[trader] }) // Allow all trading - const outcomeTokens = (await Promise.all( + const outcomeTokens = await Promise.all((await Promise.all( _.range(numOutcomes).map(i => event.outcomeTokens.call(i)) - )).map(OutcomeToken.at) + )).map(OutcomeToken.at)) - await etherToken.approve(market.address, MAX_VALUE.valueOf(), { from: accounts[trader] }) + await etherToken.approve(market.address, MAX_VALUE.toString(), { from: accounts[trader] }) await Promise.all(outcomeTokens.map(outcomeToken => - outcomeToken.approve(market.address, MAX_VALUE.valueOf(), { from: accounts[trader] }))) + outcomeToken.approve(market.address, MAX_VALUE.toString(), { from: accounts[trader] }))) // Fund market const funding = 1e16 - await market.fund(funding, { from: accounts[trader] }) + await market.fund(funding.toString(), { from: accounts[trader] }) for(let i = 0; i < 10; i++) { const outcome = Math.floor(numOutcomes * Math.random()) @@ -594,11 +596,10 @@ contract('StandardMarket', function (accounts) { assert(marketOutcomeTokenCount.add(limit).gte(tokenCount), `trade ${i}: ${marketOutcomeTokenCount} + ${limit} < ${tokenCount}`) } else if(method == 'sell') { - const BigNumber = web3.toBigNumber(0).constructor const newAmounts = marketOutcomeTokenCounts.slice() - newAmounts[outcome] = newAmounts[outcome].add(tokenCount) - const marketOutcomeSetAmount = BigNumber.min(newAmounts) - assert(marketOutcomeSetAmount.add(marketCollateralTokenCount).gte(limit), + newAmounts[outcome] = BigNumber(newAmounts[outcome]).plus(tokenCount) + const marketOutcomeSetAmount = BigNumber.min.apply(0, newAmounts) + assert(marketOutcomeSetAmount.plus(marketCollateralTokenCount).gte(limit), `trade ${i}: ${marketOutcomeSetAmount} + ${marketCollateralTokenCount} < ${limit}`) } @@ -632,8 +633,8 @@ contract('StandardMarket', function (accounts) { if(txResult) assert.equal( - getParamFromTxEvent(txResult, 'outcomeToken' + forWhat).valueOf(), - limit.valueOf()) + await getParamFromTxEvent(txResult, 'outcomeToken' + forWhat).valueOf(), + limit.toString()) } }) }) diff --git a/test/javascript/test_oracles.js b/test/javascript/test_oracles.js index e5f7f25..6f61ff1 100644 --- a/test/javascript/test_oracles.js +++ b/test/javascript/test_oracles.js @@ -1,6 +1,6 @@ const utils = require('./utils') const { getBlock } = utils -const { wait } = require('@digix/tempo')(web3) +const { wait } = require('./digix_tempo')(web3) const WETH9 = artifacts.require('WETH9') const CentralizedOracle = artifacts.require('CentralizedOracle') @@ -44,7 +44,7 @@ contract('Oracle', function (accounts) { etherToken = await WETH9.deployed() // ipfs hashes - ipfsHash = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG' + ipfsHash = web3.utils.utf8ToHex('QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG') ipfsBytes = '0x516d597741504a7a7635435a736e4136323573335866326e656d7459675070486457457a37396f6a576e50626447' // Ultimate oracle stuff @@ -56,7 +56,7 @@ contract('Oracle', function (accounts) { // Futarchy oracle stuff fee = 500000 // 5% deadline = 100 // 100s - funding = 10**18 // 1 ETH + funding = (10**18).toString() // 1 ETH startDate = 0 }) @@ -66,7 +66,7 @@ contract('Oracle', function (accounts) { const owner2 = 1 // create centralized oracle - const centralizedOracle = utils.getParamFromTxEvent( + const centralizedOracle = await utils.getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash, { from: accounts[owner1] }), 'centralizedOracle', CentralizedOracle ) @@ -88,7 +88,7 @@ contract('Oracle', function (accounts) { it('should test difficulty oracle', async () => { // Create difficulty oracle const targetBlock = (await getBlock('latest')).number + 100 - const difficultyOracle = utils.getParamFromTxEvent( + const difficultyOracle = await utils.getParamFromTxEvent( await difficultyOracleFactory.createDifficultyOracle(targetBlock), 'difficultyOracle', DifficultyOracle ) @@ -109,7 +109,7 @@ contract('Oracle', function (accounts) { it('can create futarchy oracles in the future, but not the past', async () => { // Create Oracles - const centralizedOracle = utils.getParamFromTxEvent( + const centralizedOracle = await utils.getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle', CentralizedOracle ) @@ -132,12 +132,12 @@ contract('Oracle', function (accounts) { it('should test futarchy oracle', async () => { // Create Oracles - const centralizedOracle = utils.getParamFromTxEvent( + const centralizedOracle = await utils.getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle', CentralizedOracle ) - const futarchyOracle = utils.getParamFromTxEvent( + const futarchyOracle = await utils.getParamFromTxEvent( await futarchyOracleFactory.createFutarchyOracle( etherToken.address, centralizedOracle.address, 2, -100, 100, lmsrMarketMaker.address, fee, deadline, startDate), @@ -150,13 +150,13 @@ contract('Oracle', function (accounts) { await etherToken.approve(futarchyOracle.address, funding, { from: accounts[creator] }) await futarchyOracle.fund(funding, { from: accounts[creator] }) - const market = StandardMarketWithPriceLogger.at(await futarchyOracle.markets(1)) - const categoricalEvent = CategoricalEvent.at(await futarchyOracle.categoricalEvent()) + const market = await StandardMarketWithPriceLogger.at(await futarchyOracle.markets(1)) + const categoricalEvent = await CategoricalEvent.at(await futarchyOracle.categoricalEvent()) // Buy into market for outcome token 1 const buyer = 1 const outcome = 1 - const tokenCount = 1e15 + const tokenCount = 1e15.toString() let outcomeTokenAmounts = Array.from({length: 2}, (v, i) => i === outcome ? tokenCount : 0) const outcomeTokenCost = await lmsrMarketMaker.calcNetCost.call(market.address, outcomeTokenAmounts) @@ -165,17 +165,17 @@ contract('Oracle', function (accounts) { // Buy all outcomes await etherToken.deposit({ value: cost, from: accounts[buyer] }) - assert.equal(await etherToken.balanceOf.call(accounts[buyer]), cost.valueOf()) + assert.equal(await etherToken.balanceOf.call(accounts[buyer]), cost.toString()) await etherToken.approve(categoricalEvent.address, cost, { from: accounts[buyer] }) await categoricalEvent.buyAllOutcomes(cost, { from: accounts[buyer] }) // Buy long tokens from market 1 - const collateralToken = OutcomeToken.at(await categoricalEvent.outcomeTokens(1)) + const collateralToken = await OutcomeToken.at(await categoricalEvent.outcomeTokens(1)) await collateralToken.approve(market.address, cost, { from: accounts[buyer] }) - assert.equal(utils.getParamFromTxEvent( + assert.equal(await utils.getParamFromTxEvent( await market.trade(outcomeTokenAmounts, cost, { from: accounts[buyer] }), 'outcomeTokenNetCost' - ), outcomeTokenCost.valueOf()) + ), outcomeTokenCost.toString()) // Set outcome of futarchy oracle await utils.assertRejects( @@ -192,7 +192,7 @@ contract('Oracle', function (accounts) { futarchyOracle.close(), 'Futarchy oracle cannot be closed if oracle for scalar market is not set') await centralizedOracle.setOutcome(-50) - const scalarEvent = ScalarEvent.at(await market.eventContract()) + const scalarEvent = await ScalarEvent.at(await market.eventContract()) await scalarEvent.setOutcome() // Close winning market and transfer collateral tokens to creator @@ -203,11 +203,13 @@ contract('Oracle', function (accounts) { it('should test majority oracle', async () => { // create Oracles const owners = [0, 1, 2] - const oracles = (await Promise.all( - owners.map((owner) => centralizedOracleFactory.createCentralizedOracle(ipfsHash, {from: accounts[owner]})) - )).map((tx) => utils.getParamFromTxEvent(tx, 'centralizedOracle', CentralizedOracle)) - - const majorityOracle = utils.getParamFromTxEvent( + const oracles = await Promise.all( + (await Promise.all( + owners.map((owner) => centralizedOracleFactory.createCentralizedOracle(ipfsHash, {from: accounts[owner]})) + )).map((tx) => utils.getParamFromTxEvent(tx, 'centralizedOracle', CentralizedOracle)) + ) + + const majorityOracle = await utils.getParamFromTxEvent( await majorityOracleFactory.createMajorityOracle(oracles.map((o) => o.address)), 'majorityOracle', MajorityOracle ) @@ -233,11 +235,11 @@ contract('Oracle', function (accounts) { it('should test ultimate oracle', async () => { // Create Oracles - const centralizedOracle = utils.getParamFromTxEvent( + const centralizedOracle = await utils.getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash), 'centralizedOracle', CentralizedOracle ) - const ultimateOracle = utils.getParamFromTxEvent( + const ultimateOracle = await utils.getParamFromTxEvent( await ultimateOracleFactory.createUltimateOracle( centralizedOracle.address, etherToken.address, spreadMultiplier, challengePeriod, challengeAmount, frontRunnerPeriod), @@ -291,7 +293,7 @@ contract('Oracle', function (accounts) { assert.equal(await ultimateOracle.getOutcome.call(), 3) // Withdraw winnings - assert.equal(utils.getParamFromTxEvent( + assert.equal(await utils.getParamFromTxEvent( await ultimateOracle.withdraw({from: accounts[sender2]}), 'amount' ).valueOf(), 300) }) @@ -299,11 +301,11 @@ contract('Oracle', function (accounts) { it('should test ultimate oracle challenge period', async () => { // create Oracles const owner1 = 0 - const centralizedOracle = utils.getParamFromTxEvent( + const centralizedOracle = await utils.getParamFromTxEvent( await centralizedOracleFactory.createCentralizedOracle(ipfsHash, {from: accounts[owner1]}), 'centralizedOracle', CentralizedOracle ) - const ultimateOracle = utils.getParamFromTxEvent( + const ultimateOracle = await utils.getParamFromTxEvent( await ultimateOracleFactory.createUltimateOracle( centralizedOracle.address, etherToken.address, spreadMultiplier, challengePeriod, challengeAmount, frontRunnerPeriod), diff --git a/test/javascript/utils.js b/test/javascript/utils.js index d78fb03..c81f5c8 100644 --- a/test/javascript/utils.js +++ b/test/javascript/utils.js @@ -6,11 +6,13 @@ const Decimal = require('decimal.js').clone({ precision: PRECISION }) const ONE = Decimal(2).pow(64) function isClose(a, b, relTol=1e-9, absTol=1e-18) { - return Decimal(a.valueOf()).sub(b).abs().lte( + a = Decimal(a.toString()).add(1) // Adding 1 is just for the case when a and b are both near to 0 + b = Decimal(b.toString()).add(1) + return Decimal(a).sub(b).abs().lte( Decimal.max( Decimal.max( - Decimal.abs(a.valueOf()), - Decimal.abs(b.valueOf()) + a.abs(), + b.abs() ).mul(relTol), absTol)) } @@ -24,7 +26,7 @@ function randnums(a, b, n) { return _.range(n).map(() => randrange(a, b)) } -function getParamFromTxEvent(transaction, paramName, contractFactory, eventName) { +async function getParamFromTxEvent(transaction, paramName, contractFactory, eventName) { assert.isObject(transaction) let logs = transaction.logs if(eventName != null) { @@ -33,7 +35,7 @@ function getParamFromTxEvent(transaction, paramName, contractFactory, eventName) assert.equal(logs.length, 1, `expected one log but got ${logs.length} logs`) let param = logs[0].args[paramName] if(contractFactory != null) { - let contract = contractFactory.at(param) + let contract = await contractFactory.at(param); assert.isObject(contract, `getting ${paramName} failed for ${param}`) return contract } else { @@ -63,11 +65,11 @@ function getBlock(b) { } function lmsrMarginalPrice(funding, netOutcomeTokensSold, outcomeIndex) { - const b = Decimal(funding.valueOf()).div(netOutcomeTokensSold.length).ln() + const b = Decimal(funding.toString()).div(netOutcomeTokensSold.length).ln() - return Decimal(netOutcomeTokensSold[outcomeIndex].valueOf()).div(b).exp().div( + return Decimal(netOutcomeTokensSold[outcomeIndex].toString()).div(b).exp().div( netOutcomeTokensSold.reduce( - (acc, tokensSold) => acc.add(Decimal(tokensSold.valueOf()).div(b).exp()), + (acc, tokensSold) => acc.add(Decimal(tokensSold.toString()).div(b).exp()), Decimal(0) ) ).valueOf() diff --git a/truffle.js b/truffle.js index 4201605..3329186 100644 --- a/truffle.js +++ b/truffle.js @@ -36,11 +36,6 @@ const config = { mocha: { enableTimeouts: false, grep: process.env.TEST_GREP - }, - compilers: { - solc: { - version: "0.5.6" - } } }