diff --git a/.gitignore b/.gitignore index 6a01432..ed3081b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ coverage.json .solcover.js __pycache__/ +.vscode \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d2acd36..ca7c703 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,6 +188,15 @@ "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", "dev": true }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", @@ -207,7 +216,6 @@ "version": "6.6.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -241,6 +249,11 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -554,11 +567,23 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -591,6 +616,11 @@ } } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -603,12 +633,32 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -684,8 +734,15 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } }, "big.js": { "version": "3.2.0", @@ -693,27 +750,65 @@ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" - }, "binary-extensions": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", "dev": true }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "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=", + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } }, "brace-expansion": { "version": "1.1.11", @@ -727,8 +822,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { "version": "1.3.0", @@ -739,7 +833,6 @@ "version": "1.2.0", "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -753,7 +846,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -764,7 +856,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -776,17 +867,24 @@ "version": "4.0.1", "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" } }, + "browserify-sha3": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", + "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", + "requires": { + "js-sha3": "^0.6.1", + "safe-buffer": "^5.1.1" + } + }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, "requires": { "bn.js": "^4.1.1", "browserify-rsa": "^4.0.0", @@ -817,17 +915,45 @@ "isarray": "^1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", @@ -840,6 +966,11 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "cacache": { "version": "11.3.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", @@ -900,6 +1031,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -1049,7 +1185,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -1129,11 +1264,18 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" }, "commondir": { "version": "1.0.1", @@ -1179,6 +1321,29 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -1202,14 +1367,21 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" @@ -1219,7 +1391,6 @@ "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -1232,7 +1403,6 @@ "version": "1.1.7", "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -1259,7 +1429,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -1274,17 +1443,20 @@ "randomfill": "^1.0.3" } }, - "crypto-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" - }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1307,8 +1479,104 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "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==", + "requires": { + "object-keys": "^1.0.12" + } }, "define-property": { "version": "2.0.2", @@ -1363,33 +1631,56 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "diffie-hellman": { "version": "5.0.3", "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, "duplexify": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", @@ -1402,11 +1693,24 @@ "stream-shift": "^1.0.0" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "elliptic": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "dev": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -1423,11 +1727,15 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -1460,6 +1768,38 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "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==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1500,6 +1840,46 @@ } } }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "keccakjs": "^0.2.1", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, "events": { "version": "1.1.1", "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1510,7 +1890,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -1531,6 +1910,58 @@ "strip-eof": "^1.0.0" } }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -1552,17 +1983,28 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { "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 + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } }, "figgy-pudding": { "version": "3.5.1", @@ -1570,6 +2012,35 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "find-cache-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", @@ -1600,12 +2071,40 @@ "readable-stream": "^2.0.4" } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -1615,6 +2114,11 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -1625,6 +2129,11 @@ "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "0.30.0", "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -1637,6 +2146,28 @@ "rimraf": "^2.2.8" } }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "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=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + } + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -2209,6 +2740,22 @@ } } }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "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==" + }, "ganache-cli": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.4.1.tgz", @@ -2542,8 +3089,7 @@ "get-stream": { "version": "3.0.0", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", @@ -2551,6 +3097,14 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -2564,28 +3118,110 @@ "path-is-absolute": "^1.0.0" } }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + } + } + }, + "global-modules-path": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", "dev": true }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "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==", + "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", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "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", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2650,7 +3286,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2660,7 +3295,6 @@ "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", "minimalistic-assert": "^1.0.1" @@ -2675,7 +3309,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -2687,17 +3320,51 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, "iferr": { "version": "0.1.5", @@ -2751,6 +3418,11 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2788,6 +3460,11 @@ "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -2797,6 +3474,11 @@ "kind-of": "^3.0.2" } }, + "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=" + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2830,6 +3512,31 @@ "number-is-nan": "^1.0.0" } }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2847,11 +3554,36 @@ } } }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "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", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -2867,8 +3599,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -2876,17 +3607,50 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "js-sha3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", + "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "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 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "0.5.1", @@ -2902,6 +3666,26 @@ "graceful-fs": "^4.1.6" } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keccakjs": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", + "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", + "requires": { + "browserify-sha3": "^0.0.4", + "sha3": "^1.2.2" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -2985,6 +3769,11 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -2999,7 +3788,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { "pify": "^3.0.0" }, @@ -3007,8 +3795,7 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -3040,13 +3827,17 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, "mem": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", @@ -3073,33 +3864,71 @@ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", @@ -3161,6 +3990,14 @@ "minimist": "0.0.8" } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, "mocha": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", @@ -3203,6 +4040,16 @@ } } }, + "mock-fs": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.2.tgz", + "integrity": "sha512-ewPQ83O4U8/Gd8I15WoB6vgTTmq5khxBskUWCRvswUqjCfOOTREmxllztQOm+PXMWUxATry+VBWXQJloAyxtbQ==" + }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -3222,6 +4069,26 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3261,6 +4128,11 @@ } } }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, "neo-async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", @@ -3346,6 +4218,32 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -3368,6 +4266,16 @@ } } }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3402,6 +4310,22 @@ } } }, + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", + "requires": { + "http-https": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3434,6 +4358,11 @@ "lcid": "^1.0.0" } }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -3443,8 +4372,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "1.1.0", @@ -3470,6 +4398,14 @@ "p-limit": "^2.0.0" } }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", @@ -3497,7 +4433,6 @@ "version": "5.1.1", "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -3506,6 +4441,15 @@ "pbkdf2": "^3.0.3" } }, + "parse-headers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", + "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", + "requires": { + "for-each": "^0.3.3", + "string.prototype.trim": "^1.1.2" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -3514,6 +4458,11 @@ "error-ex": "^1.2.0" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -3556,6 +4505,11 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -3570,7 +4524,6 @@ "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -3579,6 +4532,16 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "2.3.0", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -3623,6 +4586,11 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3632,8 +4600,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "promise-inflight": { "version": "1.0.1", @@ -3641,6 +4608,15 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -3653,11 +4629,15 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -3703,8 +4683,22 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } }, "querystring": { "version": "0.2.0", @@ -3722,7 +4716,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -3731,12 +4724,32 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -3760,7 +4773,6 @@ "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4103,6 +5115,40 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4165,7 +5211,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -4183,8 +5228,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -4195,6 +5239,11 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "schema-utils": { "version": "0.4.7", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", @@ -4205,17 +5254,125 @@ "ajv-keywords": "^3.1.0" } }, + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "requires": { + "nan": "^2.0.8" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "requires": { + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, "serialize-javascript": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", "dev": true }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -4247,19 +5404,30 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { "version": "2.4.11", "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, + "sha3": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.3.tgz", + "integrity": "sha512-sOWDZi8cDBRkLfWOw18wvJyNblXDHzwMGnRWut8zNNeIeLnmMRO17bjpLc7OzMuj1ASUgx2IyohzUCAl+Kx5vA==", + "requires": { + "nan": "2.13.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -4291,6 +5459,21 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -4504,6 +5687,22 @@ "extend-shallow": "^3.0.0" } }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -4534,6 +5733,11 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stream-browserify": { "version": "2.0.1", "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -4573,6 +5777,11 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4583,11 +5792,38 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", + "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -4608,12 +5844,28 @@ "is-utf8": "^0.2.0" } }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "^4.0.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4623,12 +5875,95 @@ "has-flag": "^3.0.0" } }, + "swarm-js": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", + "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "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", + "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", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + } + } + }, "tapable": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "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==", + "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": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, "terser": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/terser/-/terser-3.11.0.tgz", @@ -4669,6 +6004,27 @@ } } }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "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=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -4679,6 +6035,11 @@ "xtend": "~4.0.1" } }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", @@ -4694,6 +6055,11 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -4736,6 +6102,27 @@ } } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, "truffle": { "version": "4.1.14", "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.14.tgz", @@ -4767,12 +6154,72 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -4803,6 +6250,11 @@ "imurmurhash": "^0.1.4" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -4859,7 +6311,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -4888,6 +6339,24 @@ } } }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -4895,9 +6364,9 @@ "dev": true }, "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" }, "util": { "version": "0.10.4", @@ -4911,8 +6380,17 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "v8-compile-cache": { "version": "2.0.2", @@ -4929,6 +6407,21 @@ "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -4950,15 +6443,269 @@ } }, "web3": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", - "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.31.tgz", + "integrity": "sha1-xWI55ScUB8mCy4WEqd/IH9rEfjY=", + "requires": { + "web3-bzz": "1.0.0-beta.31", + "web3-core": "1.0.0-beta.31", + "web3-eth": "1.0.0-beta.31", + "web3-eth-personal": "1.0.0-beta.31", + "web3-net": "1.0.0-beta.31", + "web3-shh": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-bzz": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.31.tgz", + "integrity": "sha1-rrp8lVhhqZupLdHKj3x6EngyhZ0=", + "requires": { + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" + } + }, + "web3-core": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.31.tgz", + "integrity": "sha1-q9FJzEEshTZb9NEZfHSeP1Dj6qE=", + "requires": { + "web3-core-helpers": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-core-requestmanager": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-core-helpers": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.31.tgz", + "integrity": "sha1-cETI89P3NRWLoeZrhPbECQiCFlw=", "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xhr2": "*", - "xmlhttprequest": "*" + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-core-method": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.31.tgz", + "integrity": "sha1-IRkLm4zxUDUT6Diw9O73Jg/uCTs=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.31", + "web3-core-promievent": "1.0.0-beta.31", + "web3-core-subscriptions": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-core-promievent": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.31.tgz", + "integrity": "sha1-3alb5l7NeSTjAKXphHfBuwpX6PM=", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "1.1.1" + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.31.tgz", + "integrity": "sha1-S/ZntBTUbgZtmTCZTzT0b7QI++c=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.31", + "web3-providers-http": "1.0.0-beta.31", + "web3-providers-ipc": "1.0.0-beta.31", + "web3-providers-ws": "1.0.0-beta.31" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.31.tgz", + "integrity": "sha1-fpAG3iCosEB6wTZO9WuHz8TQ8ks=", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.31" + } + }, + "web3-eth": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.31.tgz", + "integrity": "sha1-t7SwdVNLOjsKtbVpe9UIXXnrYcY=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.31", + "web3-core-helpers": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-core-subscriptions": "1.0.0-beta.31", + "web3-eth-abi": "1.0.0-beta.31", + "web3-eth-accounts": "1.0.0-beta.31", + "web3-eth-contract": "1.0.0-beta.31", + "web3-eth-iban": "1.0.0-beta.31", + "web3-eth-personal": "1.0.0-beta.31", + "web3-net": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-eth-abi": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.31.tgz", + "integrity": "sha1-xQ457cINFrTDWQKegpuEE5THL8E=", + "requires": { + "bn.js": "4.11.6", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-accounts": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.31.tgz", + "integrity": "sha1-Mnm9BpbYK8ThUswddWx74i0xkq0=", + "requires": { + "any-promise": "^1.3.0", + "crypto-browserify": "^3.12.0", + "eth-lib": "0.2.7", + "scrypt.js": "0.2.0", + "underscore": "1.8.3", + "uuid": "2.0.1", + "web3-core": "1.0.0-beta.31", + "web3-core-helpers": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + }, + "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=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "web3-eth-contract": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.31.tgz", + "integrity": "sha1-J5RkM/kdiVMBPi2X/Yt4qe1rbtw=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.31", + "web3-core-helpers": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-core-promievent": "1.0.0-beta.31", + "web3-core-subscriptions": "1.0.0-beta.31", + "web3-eth-abi": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-eth-iban": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.31.tgz", + "integrity": "sha1-7WS+0zO7BApvKU+06dGOrdvr/8o=", + "requires": { + "bn.js": "^4.11.6", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-eth-personal": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.31.tgz", + "integrity": "sha1-Kw1ghZIOndzfu63yCnFfDMN3HYA=", + "requires": { + "web3-core": "1.0.0-beta.31", + "web3-core-helpers": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-net": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-net": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.31.tgz", + "integrity": "sha1-0mv8oOoXUvX9XXITTgDlE60efhk=", + "requires": { + "web3-core": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-utils": "1.0.0-beta.31" + } + }, + "web3-providers-http": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.31.tgz", + "integrity": "sha1-E0Ce9ErhYjzVxNzT20sI1vu6RTI=", + "requires": { + "web3-core-helpers": "1.0.0-beta.31", + "xhr2": "0.1.4" + } + }, + "web3-providers-ipc": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.31.tgz", + "integrity": "sha1-zm2mcPqhlFjmIt/tm+QAWE/DNyQ=", + "requires": { + "oboe": "2.1.3", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.31" + } + }, + "web3-providers-ws": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.31.tgz", + "integrity": "sha1-zHG3Do2LUyAaUzdDcHww6MCZ4o0=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.31", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" + } + }, + "web3-shh": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.31.tgz", + "integrity": "sha1-AW0gS+K7obfzs5FQJyGdJ07+XlI=", + "requires": { + "web3-core": "1.0.0-beta.31", + "web3-core-method": "1.0.0-beta.31", + "web3-core-subscriptions": "1.0.0-beta.31", + "web3-net": "1.0.0-beta.31" + } + }, + "web3-utils": { + "version": "1.0.0-beta.31", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.31.tgz", + "integrity": "sha1-DxgSXT6WmK6Cy/b6Ka3B4WFvKTY=", + "requires": { + "bn.js": "4.11.6", + "eth-lib": "^0.1.27", + "ethjs-unit": "0.1.6", + "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=" + } } }, "webpack": { @@ -5427,6 +7174,26 @@ "source-map": "~0.6.1" } }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", + "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", + "requires": { + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5469,27 +7236,69 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "xhr2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", - "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==" + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "^1.0.1" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -5525,6 +7334,15 @@ "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } diff --git a/package.json b/package.json index ac6838f..2ee9208 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "openzeppelin-solidity": "2.0.0", "truffle": "4.1.14", "truper": "0.0.2", - "web3": "0.18.4" + "web3": "1.0.0-beta.31" }, "scripts": { "test": "./node_modules/.bin/truffle test", diff --git a/test/helpers/blockTimestamp.js b/test/helpers/blockTimestamp.js new file mode 100644 index 0000000..f51d60b --- /dev/null +++ b/test/helpers/blockTimestamp.js @@ -0,0 +1,7 @@ +const blockTimestamp = async web3 => { + const blockNumber = await web3.eth.getBlockNumber(); + const block = await web3.eth.getBlock(blockNumber); + return block.timestamp; +}; + +module.exports = blockTimestamp; diff --git a/test/helpers/saltGenerator.js b/test/helpers/saltGenerator.js index 3582c94..6cf2d75 100644 --- a/test/helpers/saltGenerator.js +++ b/test/helpers/saltGenerator.js @@ -1,13 +1,13 @@ const saltGenerator = (len = 40) => { - const maxlen = 8 - const min = Math.pow(16, Math.min(len, maxlen) - 1) - const max = Math.pow(16, Math.min(len, maxlen)) - 1 - const n = Math.floor(Math.random() * (max - min + 1)) + min - let r = n.toString(16) + const maxlen = 8; + const min = Math.pow(16, Math.min(len, maxlen) - 1); + const max = Math.pow(16, Math.min(len, maxlen)) - 1; + const n = Math.floor(Math.random() * (max - min + 1)) + min; + let r = n.toString(16); while (r.length < len) { - r = r + saltGenerator(len - maxlen) + r = r + saltGenerator(len - maxlen); } - return r -} + return r; +}; - module.exports = saltGenerator; +module.exports = saltGenerator; diff --git a/test/test_cancel_kernel.js b/test/test_cancel_kernel.js index 2ce94a6..4d55c3e 100644 --- a/test/test_cancel_kernel.js +++ b/test/test_cancel_kernel.js @@ -1,26 +1,24 @@ // helpers const mineTx = require("./helpers/mineTx.js"); -const delay = require("./helpers/delay.js"); const saltGenerator = require("./helpers/saltGenerator.js"); +const blockTimestamp = require("./helpers/blockTimestamp"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); - -contract("Protocol", function (addresses) { - - beforeEach(async function () { - this.ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; +contract("Protocol - cancel_kernel", function(addresses) { + beforeEach(async function() { + this.ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); - let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); await mineTx(tx); - tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, {from:addresses[0]}); + tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, { from: addresses[0] }); await mineTx(tx); this.lender = addresses[1]; this.borrower = addresses[2]; @@ -28,351 +26,433 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; //// kernel terms // uint256 values - this.kernel_daily_interest_rate = 10 + this.kernel_daily_interest_rate = 10; // timedelta values - this.kernel_position_duration_in_seconds = 5 - this.wrangler_approval_duration_in_seconds = 5 * 60 + this.kernel_position_duration_in_seconds = 5; + this.wrangler_approval_duration_in_seconds = 5 * 60; // wei values - this.kernel_lending_currency_maximum_value = web3._extend.utils.toWei('40', 'ether') - this.kernel_relayer_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_monitoring_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_rollover_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_closure_fee = web3._extend.utils.toWei('10', 'ether') - // timestamp values - this.kernel_expires_at = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400*2 - // bytes32 values - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_lending_currency_maximum_value = web3.utils.toWei("40", "ether"); + this.kernel_relayer_fee = web3.utils.toWei("10", "ether"); + this.kernel_monitoring_fee = web3.utils.toWei("10", "ether"); + this.kernel_rollover_fee = web3.utils.toWei("10", "ether"); + this.kernel_closure_fee = web3.utils.toWei("10", "ether"); // position terms - this.position_lending_currency_fill_value = web3._extend.utils.toWei('30', 'ether') - this.position_borrow_currency_fill_value = web3._extend.utils.toWei('3', 'ether') - this.position_lending_currency_owed_value = web3._extend.utils.toWei('30', 'ether') + this.position_lending_currency_fill_value = web3.utils.toWei("30", "ether"); + this.position_borrow_currency_fill_value = web3.utils.toWei("3", "ether"); + this.position_lending_currency_owed_value = web3.utils.toWei("30", "ether"); // open position - tx = this.protocolToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.protocolToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.protocolToken.approve(this.protocolContract.address, web3._extend.utils.toWei('100', 'ether'), {from: this.lender}) + tx = this.protocolToken.approve(this.protocolContract.address, web3.utils.toWei("100", "ether"), { + from: this.lender, + }); await mineTx(tx); // set allowance from lender to protocol contract for loan transfer - tx = this.LendToken.mint(this.lender, web3._extend.utils.toWei('40', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.lender, web3.utils.toWei("40", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('40', 'ether'), {from: this.lender}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("40", "ether"), { from: this.lender }); await mineTx(tx); // set allowance from borrower to protocol contract for collateral transfer - tx = this.BorrowToken.mint(this.borrower, web3._extend.utils.toWei('5', 'ether'), {from: addresses[0]}) + tx = this.BorrowToken.mint(this.borrower, web3.utils.toWei("5", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.BorrowToken.approve(this.protocolContract.address, web3._extend.utils.toWei('5', 'ether'), {from: this.borrower}) + tx = this.BorrowToken.approve(this.protocolContract.address, web3.utils.toWei("5", "ether"), { + from: this.borrower, + }); await mineTx(tx); // Approve wrangler as protocol owner - tx = this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + tx = this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); await mineTx(tx); - // Sign kernel hash as lender - let kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee - ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - this.kernel_creator_signature= web3.eth.sign(this.lender, kernel_hash) - // let _kernel_creator_signature= web3.eth.sign(this.lender, kernel_hash) - // _kernel_creator_signature = _kernel_creator_signature.substr(2) + // timestamp values + this.kernel_expires_at = (await blockTimestamp(web3)) + 86400 * 2; + // bytes32 values + this.kernel_creator_salt = `0x${saltGenerator()}`; + // kernel addresses - lender this.kernel_addresses = [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ] + this.lender, + this.ZERO_ADDRESS, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, + ]; + // kernel values - lender this.kernel_values = [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee - ] + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + ]; + // Sign kernel hash as lender + let kernel_hash = await this.protocolContract.kernel_hash( + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, + { from: this.lender } + ); + this.kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); }); it("cancel_kernel should be callable only by creator", async function() { - let _lend_currency_cancel_value = web3._extend.utils.toWei('40', 'ether') - let errr = false + let _lend_currency_cancel_value = web3.utils.toWei("40", "ether"); + let errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.borrower} + { from: this.borrower } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'borrower should not be able to cancel kernel') - errr = false + assert.isTrue(errr, "borrower should not be able to cancel kernel"); + errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.relayer} + { from: this.relayer } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'relayer should not be able to cancel kernel') - errr = false + assert.isTrue(errr, "relayer should not be able to cancel kernel"); + errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.wrangler} + { from: this.wrangler } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'wrangler should not be able to cancel kernel') - errr = false + assert.isTrue(errr, "wrangler should not be able to cancel kernel"); + errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'lender should be able to cancel kernel') + assert.isTrue(!errr, "lender should be able to cancel kernel"); }); it("cancel_kernel should not work if cancel value exceeds the maximum value", async function() { - let _lend_currency_cancel_value = web3._extend.utils.toWei('41', 'ether') - let errr = false + let _lend_currency_cancel_value = web3.utils.toWei("41", "ether"); + let errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'borrower should not be able to cancel kernel') + assert.isTrue(errr, "borrower should not be able to cancel kernel"); }); it("cancel_kernel should work for the same kernel parameters except the creator salt", async function() { - let _lend_currency_cancel_value = web3._extend.utils.toWei('40', 'ether') + let _lend_currency_cancel_value = web3.utils.toWei("40", "ether"); await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_creator_salt = `0x${saltGenerator()}`; kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], + [this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - this.kernel_creator_signature = web3.eth.sign(this.lender, kernel_hash) - let errr = false + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds + ); + this.kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); + let errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'lender should be able to cancel a similar kernel') + assert.isTrue(!errr, "lender should be able to cancel a similar kernel"); }); it("cancel_kernel should work if cancel value = maximum value - filled value", async function() { // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); - let _lend_currency_cancel_value = web3._extend.utils.toWei('10', 'ether') - let errr = false + let _lend_currency_cancel_value = web3.utils.toWei("10", "ether"); + let errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'kernel creator should be able to cancel kernel') + assert.isTrue(!errr, "kernel creator should be able to cancel kernel"); }); it("cancel_kernel should not work if cancel_value > maximum value - filled value", async function() { // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); - let _lend_currency_cancel_value = web3._extend.utils.toWei('11', 'ether') - let errr = false + let _lend_currency_cancel_value = web3.utils.toWei("11", "ether"); + let errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'kernel creator should not be able to cancel kernel') + assert.isTrue(errr, "kernel creator should not be able to cancel kernel"); }); it("cancel_kernel should work if cancel_value < maximum value - filled value", async function() { // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); - let _lend_currency_cancel_value = web3._extend.utils.toWei('9', 'ether') - let errr = false + let _lend_currency_cancel_value = web3.utils.toWei("9", "ether"); + let errr = false; try { await this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} + { from: this.lender } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'kernel creator should be able to cancel kernel') + assert.isTrue(!errr, "kernel creator should be able to cancel kernel"); }); - }); diff --git a/test/test_close_position.js b/test/test_close_position.js index ae3229b..21454e9 100644 --- a/test/test_close_position.js +++ b/test/test_close_position.js @@ -2,24 +2,24 @@ const mineTx = require("./helpers/mineTx.js"); const delay = require("./helpers/delay.js"); const saltGenerator = require("./helpers/saltGenerator.js"); +const blockTimestamp = require("./helpers/blockTimestamp"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); -contract("Protocol", function (addresses) { - - beforeEach(async function () { - this.ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; +contract("Protocol - close_position", function(addresses) { + beforeEach(async function() { + this.ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); - let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); await mineTx(tx); - tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, {from:addresses[0]}); + tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, { from: addresses[0] }); await mineTx(tx); this.lender = addresses[1]; this.borrower = addresses[2]; @@ -27,160 +27,182 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; //// kernel terms // uint256 values - this.kernel_daily_interest_rate = 10 + this.kernel_daily_interest_rate = 10; // timedelta values - this.kernel_position_duration_in_seconds = 5 - this.wrangler_approval_duration_in_seconds = 5 * 60 + this.kernel_position_duration_in_seconds = 5; + this.wrangler_approval_duration_in_seconds = 5 * 60; // wei values - this.kernel_lending_currency_maximum_value = web3._extend.utils.toWei('40', 'ether') - this.kernel_relayer_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_monitoring_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_rollover_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_closure_fee = web3._extend.utils.toWei('10', 'ether') - // timestamp values - this.kernel_expires_at = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400*2 - // bytes32 values - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_lending_currency_maximum_value = web3.utils.toWei("40", "ether"); + this.kernel_relayer_fee = web3.utils.toWei("10", "ether"); + this.kernel_monitoring_fee = web3.utils.toWei("10", "ether"); + this.kernel_rollover_fee = web3.utils.toWei("10", "ether"); + this.kernel_closure_fee = web3.utils.toWei("10", "ether"); // position terms - this.position_lending_currency_fill_value = web3._extend.utils.toWei('30', 'ether') - this.position_borrow_currency_fill_value = web3._extend.utils.toWei('3', 'ether') - this.position_lending_currency_owed_value = web3._extend.utils.toWei('30', 'ether') + this.position_lending_currency_fill_value = web3.utils.toWei("30", "ether"); + this.position_borrow_currency_fill_value = web3.utils.toWei("3", "ether"); + this.position_lending_currency_owed_value = web3.utils.toWei("30", "ether"); // open position - tx = this.protocolToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.protocolToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.protocolToken.approve(this.protocolContract.address, web3._extend.utils.toWei('100', 'ether'), {from: this.lender}) + tx = this.protocolToken.approve(this.protocolContract.address, web3.utils.toWei("100", "ether"), { + from: this.lender, + }); await mineTx(tx); // set allowance from lender to protocol contract for loan transfer - tx = this.LendToken.mint(this.lender, web3._extend.utils.toWei('40', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.lender, web3.utils.toWei("40", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('40', 'ether'), {from: this.lender}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("40", "ether"), { from: this.lender }); await mineTx(tx); // set allowance from borrower to protocol contract for collateral transfer - tx = this.BorrowToken.mint(this.borrower, web3._extend.utils.toWei('5', 'ether'), {from: addresses[0]}) + tx = this.BorrowToken.mint(this.borrower, web3.utils.toWei("5", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.BorrowToken.approve(this.protocolContract.address, web3._extend.utils.toWei('5', 'ether'), {from: this.borrower}) + tx = this.BorrowToken.approve(this.protocolContract.address, web3.utils.toWei("5", "ether"), { + from: this.borrower, + }); await mineTx(tx); // Approve wrangler as protocol owner - tx = this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + tx = this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); await mineTx(tx); + // timestamp values + this.kernel_expires_at = (await blockTimestamp(web3)) + 86400 * 2; + // bytes32 values + this.kernel_creator_salt = `0x${saltGenerator()}`; // Sign kernel hash as lender let kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], + [this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - let _kernel_creator_signature = web3.eth.sign(this.lender, kernel_hash) + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds + ); + let _kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, _kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); - this.position_index = await this.protocolContract.borrow_positions_count(this.borrower) - this.position_hash = await this.protocolContract.borrow_positions(this.borrower, this.position_index) - this.position = await this.protocolContract.position(this.position_hash) + this.position_index = await this.protocolContract.borrow_positions_count(this.borrower); + this.position_hash = await this.protocolContract.borrow_positions(this.borrower, this.position_index); + this.position = await this.protocolContract.position(this.position_hash); // borrower prepares to repay // set allowance from borrower to protocol contract for loan repayment - tx = this.LendToken.mint(this.borrower, web3._extend.utils.toWei('30', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.borrower, web3.utils.toWei("30", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('30', 'ether'), {from: this.borrower}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("30", "ether"), { + from: this.borrower, + }); await mineTx(tx); }); - it("close_position should not be callable by lender", async function() { - let errr = false + let errr = false; try { - await this.protocolContract.close_position(this.position_hash, {from:this.lender}); + await this.protocolContract.close_position(this.position_hash, { from: this.lender }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'lender should not be able to close a position') + assert.isTrue(errr, "lender should not be able to close a position"); }); it("close_position should not be callable by wrangler", async function() { - let errr = false + let errr = false; try { - await this.protocolContract.close_position(this.position_hash, {from:this.wrangler}); + await this.protocolContract.close_position(this.position_hash, { from: this.wrangler }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'wrangler should not be able to close a position') + assert.isTrue(errr, "wrangler should not be able to close a position"); }); it("close_position should be callable by borrower before position has expired", async function() { - if (!(web3.eth.getBlock(web3.eth.blockNumber).timestamp > this.position[8].toNumber())) { - let errr = false + if (!((await blockTimestamp(web3)) > this.position[8].toNumber())) { + let errr = false; try { - await this.protocolContract.close_position(this.position_hash, {from:this.borrower}); + await this.protocolContract.close_position(this.position_hash, { from: this.borrower }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'borrower should be able to close a position') + assert.isTrue(!errr, "borrower should be able to close a position"); } }); it("close_position should not be callable by borrower after position has expired", async function() { - console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`) - while (!(web3.eth.getBlock(web3.eth.blockNumber).timestamp > this.position[8].toNumber())) { - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}. Will check after 1s ...`) - web3.currentProvider.send({ - jsonrpc: "2.0", - method: "evm_mine", - id: new Date().getTime() - }) - await delay(1000) + console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`); + while (!((await blockTimestamp(web3)) > this.position[8].toNumber())) { + web3.currentProvider.send( + { + jsonrpc: "2.0", + method: "evm_mine", + id: new Date().getTime(), + }, + (err, result) => { + if (err) return console.error(err); + console.log(result); + } + ); + await delay(1000); } - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}`) - let errr = false + console.log(`Current blocktimestamp: ${await blockTimestamp(web3)}`); + let errr = false; try { - await this.protocolContract.close_position(this.position_hash, {from:this.borrower}); + await this.protocolContract.close_position(this.position_hash, { from: this.borrower }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'borrower should not be able to close a position after position has expired') + assert.isTrue(errr, "borrower should not be able to close a position after position has expired"); }); - }); diff --git a/test/test_escape_hatches.js b/test/test_escape_hatches.js index d1060e5..118a08a 100644 --- a/test/test_escape_hatches.js +++ b/test/test_escape_hatches.js @@ -1,74 +1,93 @@ // helpers const mineTx = require("./helpers/mineTx.js"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); -contract("Protocol", function (addresses) { - - - beforeEach(async function () { +contract("Protocol - escape_hatch_token", function(addresses) { + beforeEach(async function() { this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); }); - it("protocol contract should not accept ether", async function() { - assert.isTrue(web3.toDecimal(web3.eth.getBalance(this.protocolContract.address)) === 0, `protocol contract's initial balance should be 0 ether`) - let errr = false + assert.isTrue( + web3.utils.toDecimal(await web3.eth.getBalance(this.protocolContract.address)) === 0, + `protocol contract's initial balance should be 0 ether` + ); + let errr = false; try { - web3.eth.sendTransaction({from: addresses[7], to:this.protocolContract.address, value: web3.toWei(1, 'ether'), gasLimit: 21000, gasPrice: 20000000000}) + await web3.eth.sendTransaction({ + from: addresses[7], + to: this.protocolContract.address, + value: web3.utils.toWei(1, "ether"), + gasLimit: 21000, + gasPrice: 20000000000, + }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'Protocol contract should reject ETH transfer') - assert.isTrue(web3.toDecimal(web3.eth.getBalance(this.protocolContract.address)) === 0, `protocol contract's initial balance should be 0 ether`) + assert.isTrue(errr, "Protocol contract should reject ETH transfer"); + assert.isTrue( + web3.utils.toDecimal(await web3.eth.getBalance(this.protocolContract.address)) === 0, + `protocol contract's initial balance should be 0 ether` + ); }); it("escape_hatch_token should be called only by owner", async function() { - assert.isTrue(await this.protocolContract.owner() === addresses[0], 'protocol owner is not the first address'); - let errr = false + assert.isTrue((await this.protocolContract.owner()) === addresses[0], "protocol owner is not the first address"); + let errr = false; try { - await this.protocolContract.escape_hatch_token(this.BorrowToken.address, {from:addresses[7]}); + await this.protocolContract.escape_hatch_token(this.BorrowToken.address, { from: addresses[7] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'a non-owner should not able to call escape_hatch_token') - errr = false + assert.isTrue(errr, "a non-owner should not able to call escape_hatch_token"); + errr = false; try { - await this.protocolContract.escape_hatch_token(this.BorrowToken.address, {from:addresses[0]}); + await this.protocolContract.escape_hatch_token(this.BorrowToken.address, { from: addresses[0] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'owner is not not able to call escape_hatch_token') + assert.isTrue(!errr, "owner is not not able to call escape_hatch_token"); }); it("tokens should be wihdrawable under an escape-hatch condition", async function() { - let maliciousUserAddress = addresses[7] - let maliciousToken = await ERC20.new("Test Yet Another Token", "TYT", 18, 2, {from: maliciousUserAddress}); - let tokenBalance = await maliciousToken.balanceOf(maliciousUserAddress) - assert.isTrue(tokenBalance.toString() === "2000000000000000000", `maliciousUserAddress should have a token balance of 2 TYT`) - tx = maliciousToken.transfer(this.protocolContract.address, web3._extend.utils.toWei('2', 'ether'), {from: maliciousUserAddress}) + let maliciousUserAddress = addresses[7]; + let maliciousToken = await ERC20.new("Test Yet Another Token", "TYT", 18, 2, { from: maliciousUserAddress }); + let tokenBalance = await maliciousToken.balanceOf(maliciousUserAddress); + assert.isTrue( + tokenBalance.toString() === "2000000000000000000", + `maliciousUserAddress should have a token balance of 2 TYT` + ); + tx = maliciousToken.transfer(this.protocolContract.address, web3.utils.toWei("2", "ether"), { + from: maliciousUserAddress, + }); await mineTx(tx); - tokenBalance = await maliciousToken.balanceOf(maliciousUserAddress) - assert.isTrue(tokenBalance.toString() === "0", `maliciousUserAddress should have a token balance of 0 TYT`) - tokenBalance = await maliciousToken.balanceOf(this.protocolContract.address) - assert.isTrue(tokenBalance.toString() === "2000000000000000000", `protocolContract should have a token balance of 2 TYT`) - tokenBalance = await maliciousToken.balanceOf(addresses[0]) - assert.isTrue(tokenBalance.toString() === "0", `protocolContract owner should have a token balance of 0 TYT`) - tx = this.protocolContract.escape_hatch_token(maliciousToken.address, {from: addresses[0]}) + tokenBalance = await maliciousToken.balanceOf(maliciousUserAddress); + assert.isTrue(tokenBalance.toString() === "0", `maliciousUserAddress should have a token balance of 0 TYT`); + tokenBalance = await maliciousToken.balanceOf(this.protocolContract.address); + assert.isTrue( + tokenBalance.toString() === "2000000000000000000", + `protocolContract should have a token balance of 2 TYT` + ); + tokenBalance = await maliciousToken.balanceOf(addresses[0]); + assert.isTrue(tokenBalance.toString() === "0", `protocolContract owner should have a token balance of 0 TYT`); + tx = this.protocolContract.escape_hatch_token(maliciousToken.address, { from: addresses[0] }); await mineTx(tx); - tokenBalance = await maliciousToken.balanceOf(maliciousUserAddress) - assert.isTrue(tokenBalance.toString() === "0", `maliciousUserAddress should have a token balance of 0 TYT`) - tokenBalance = await maliciousToken.balanceOf(this.protocolContract.address) - assert.isTrue(tokenBalance.toString() === "0", `protocolContract should have a token balance of 0 TYT`) - tokenBalance = await maliciousToken.balanceOf(addresses[0]) - assert.isTrue(tokenBalance.toString() === "2000000000000000000", `protocolContract owner should have a token balance of 2 TYT`) + tokenBalance = await maliciousToken.balanceOf(maliciousUserAddress); + assert.isTrue(tokenBalance.toString() === "0", `maliciousUserAddress should have a token balance of 0 TYT`); + tokenBalance = await maliciousToken.balanceOf(this.protocolContract.address); + assert.isTrue(tokenBalance.toString() === "0", `protocolContract should have a token balance of 0 TYT`); + tokenBalance = await maliciousToken.balanceOf(addresses[0]); + assert.isTrue( + tokenBalance.toString() === "2000000000000000000", + `protocolContract owner should have a token balance of 2 TYT` + ); }); - }); diff --git a/test/test_fill_kernel.js b/test/test_fill_kernel.js index 2845cec..17c8269 100644 --- a/test/test_fill_kernel.js +++ b/test/test_fill_kernel.js @@ -1,24 +1,24 @@ // helpers const mineTx = require("./helpers/mineTx.js"); const saltGenerator = require("./helpers/saltGenerator.js"); +const blockTimestamp = require("./helpers/blockTimestamp"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); -contract("Protocol", function (addresses) { - - beforeEach(async function () { - this.ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; +contract("Protocol - fill_kernel", function(addresses) { + beforeEach(async function() { + this.ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); - let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); await mineTx(tx); - tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, {from:addresses[0]}); + tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, { from: addresses[0] }); await mineTx(tx); this.lender = addresses[1]; this.borrower = addresses[2]; @@ -26,159 +26,191 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; //// kernel terms // uint256 values - this.kernel_daily_interest_rate = web3._extend.utils.toWei('0.000001', 'ether') + this.kernel_daily_interest_rate = 10; // timedelta values - this.kernel_position_duration_in_seconds = 90 * 60 * 60 * 24 - this.wrangler_approval_duration_in_seconds = 5 * 60 + this.kernel_position_duration_in_seconds = 90 * 60 * 60 * 24; + this.wrangler_approval_duration_in_seconds = 5 * 60; // wei values - this.kernel_lending_currency_maximum_value = web3._extend.utils.toWei('40', 'ether') - this.kernel_relayer_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_monitoring_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_rollover_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_closure_fee = web3._extend.utils.toWei('10', 'ether') + this.kernel_lending_currency_maximum_value = web3.utils.toWei("40", "ether"); + this.kernel_relayer_fee = web3.utils.toWei("10", "ether"); + this.kernel_monitoring_fee = web3.utils.toWei("10", "ether"); + this.kernel_rollover_fee = web3.utils.toWei("10", "ether"); + this.kernel_closure_fee = web3.utils.toWei("10", "ether"); // timestamp values - this.kernel_expires_at = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400*2 + this.kernel_expires_at = (await blockTimestamp(web3)) + 86400 * 2; // bytes32 values - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_creator_salt = `0x${saltGenerator()}`; // position terms - this.position_lending_currency_fill_value = web3._extend.utils.toWei('10', 'ether') - this.position_borrow_currency_fill_value = web3._extend.utils.toWei('1.1', 'ether') + this.position_lending_currency_fill_value = web3.utils.toWei("10", "ether"); + this.position_borrow_currency_fill_value = web3.utils.toWei("1.1", "ether"); this.position_lending_currency_owed_value = await this.protocolContract.owed_value( this.position_lending_currency_fill_value, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) + ); }); - it("fill_kernel should work as expected", async function() { // setup // set allowance from lender to protocol contract for relayer_fee + monitoring_fee - tx = this.protocolToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.protocolToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.protocolToken.approve(this.protocolContract.address, web3._extend.utils.toWei('100', 'ether'), {from: this.lender}) + tx = this.protocolToken.approve(this.protocolContract.address, web3.utils.toWei("100", "ether"), { + from: this.lender, + }); await mineTx(tx); // set allowance from lender to protocol contract for loan transfer - tx = this.LendToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('40', 'ether'), {from: this.lender}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("40", "ether"), { from: this.lender }); await mineTx(tx); // set allowance from borrower to protocol contract for collateral transfer - tx = this.BorrowToken.mint(this.borrower, web3._extend.utils.toWei('10', 'ether'), {from: addresses[0]}) + tx = this.BorrowToken.mint(this.borrower, web3.utils.toWei("10", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.BorrowToken.approve(this.protocolContract.address, web3._extend.utils.toWei('5', 'ether'), {from: this.borrower}) + tx = this.BorrowToken.approve(this.protocolContract.address, web3.utils.toWei("5", "ether"), { + from: this.borrower, + }); await mineTx(tx); // Approve wrangler as protocol owner - tx = this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + tx = this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); await mineTx(tx); // position_index check - let last_position_index = await this.protocolContract.last_position_index() - assert.isTrue(last_position_index.toString() === '0', 'last_position_index should be 0') + let last_position_index = await this.protocolContract.last_position_index(); + assert.isTrue(last_position_index.toString() === "0", "last_position_index should be 0"); // lender check let lenderPositionCounts = await this.protocolContract.position_counts(this.lender); let lenderBorrowPositionsCount = lenderPositionCounts[0]; let lenderLendPositionsCount = lenderPositionCounts[1]; - assert.isTrue(lenderBorrowPositionsCount.toString() === '0', "lender's borrow position count should be 0"); - assert.isTrue(lenderLendPositionsCount.toString() === '0', "lender's lend position count should be 0"); - assert.isTrue(await this.protocolContract.can_lend(this.lender), 'lender should be able to lend') + assert.isTrue(lenderBorrowPositionsCount.toString() === "0", "lender's borrow position count should be 0"); + assert.isTrue(lenderLendPositionsCount.toString() === "0", "lender's lend position count should be 0"); + assert.isTrue(await this.protocolContract.can_lend(this.lender), "lender should be able to lend"); // borrower check let borrowerPositionCounts = await this.protocolContract.position_counts(this.borrower); let borrowerBorrowPositionsCount = borrowerPositionCounts[0]; let borrowerLendPositionsCount = borrowerPositionCounts[1]; - assert.isTrue(borrowerBorrowPositionsCount.toString() === '0', "borrower's borrow position count should be 0"); - assert.isTrue(borrowerLendPositionsCount.toString() === '0', "borrower's lend position count should be 0"); - assert.isTrue(await this.protocolContract.can_lend(this.borrower), 'borrower should be able to lend') + assert.isTrue(borrowerBorrowPositionsCount.toString() === "0", "borrower's borrow position count should be 0"); + assert.isTrue(borrowerLendPositionsCount.toString() === "0", "borrower's lend position count should be 0"); + assert.isTrue(await this.protocolContract.can_lend(this.borrower), "borrower should be able to lend"); // balances check let protocolContractBorrowTokenBalance = await this.BorrowToken.balanceOf(this.protocolContract.address); - assert.isTrue(protocolContractBorrowTokenBalance.toString() === '0', "protocolContract's BorrowToken balance should be 0"); + assert.isTrue( + protocolContractBorrowTokenBalance.toString() === "0", + "protocolContract's BorrowToken balance should be 0" + ); let borrowerLendTokenBalance = await this.LendToken.balanceOf(this.borrower); - assert.isTrue(borrowerLendTokenBalance.toString() === '0', "borrower's LendToken balance should be 0"); + assert.isTrue(borrowerLendTokenBalance.toString() === "0", "borrower's LendToken balance should be 0"); let wranglerProtocolTokenBalance = await this.protocolToken.balanceOf(this.wrangler); - assert.isTrue(wranglerProtocolTokenBalance.toString() === '0', "wrangler's protocolToken balance should be 0"); + assert.isTrue(wranglerProtocolTokenBalance.toString() === "0", "wrangler's protocolToken balance should be 0"); let relayerProtocolTokenBalance = await this.protocolToken.balanceOf(this.relayer); - assert.isTrue(relayerProtocolTokenBalance.toString() === '0', "relayer's protocolToken balance should be 0"); + assert.isTrue(relayerProtocolTokenBalance.toString() === "0", "relayer's protocolToken balance should be 0"); // fill kernel and open position // Sign kernel hash as lender let kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], + [this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - this.kernel_creator_signature= web3.eth.sign(this.lender, kernel_hash) + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds + ); + this.kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = + (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // test pre-call let _kernel_amount_filled = await this.protocolContract.kernels_filled(kernel_hash); - assert.isTrue(_kernel_amount_filled.toString() === '0'); + assert.isTrue(_kernel_amount_filled.toString() === "0"); let _kernel_amount_cancelled = await this.protocolContract.kernels_cancelled(kernel_hash); - assert.isTrue(_kernel_amount_cancelled.toString() === '0'); + assert.isTrue(_kernel_amount_cancelled.toString() === "0"); // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); // test post-call - last_position_index = await this.protocolContract.last_position_index() - assert.isTrue(last_position_index.toString() === '1', 'last_position_index should be 1') + last_position_index = await this.protocolContract.last_position_index(); + assert.isTrue(last_position_index.toString() === "1", "last_position_index should be 1"); lenderPositionCounts = await this.protocolContract.position_counts(this.lender); lenderBorrowPositionsCount = lenderPositionCounts[0]; lenderLendPositionsCount = lenderPositionCounts[1]; - assert.isTrue(lenderBorrowPositionsCount.toString() === '0', "lender's borrow position count should be 0"); - assert.isTrue(lenderLendPositionsCount.toString() === '1', "lender's lend position count should be 1"); + assert.isTrue(lenderBorrowPositionsCount.toString() === "0", "lender's borrow position count should be 0"); + assert.isTrue(lenderLendPositionsCount.toString() === "1", "lender's lend position count should be 1"); borrowerPositionCounts = await this.protocolContract.position_counts(this.borrower); borrowerBorrowPositionsCount = borrowerPositionCounts[0]; borrowerLendPositionsCount = borrowerPositionCounts[1]; - assert.isTrue(borrowerBorrowPositionsCount.toString() === '1', "borrower's borrow position count should be 1"); - assert.isTrue(borrowerLendPositionsCount.toString() === '0', "borrower's lend position count should be 0"); + assert.isTrue(borrowerBorrowPositionsCount.toString() === "1", "borrower's borrow position count should be 1"); + assert.isTrue(borrowerLendPositionsCount.toString() === "0", "borrower's lend position count should be 0"); protocolContractBorrowTokenBalance = await this.BorrowToken.balanceOf(this.protocolContract.address); - assert.isTrue(protocolContractBorrowTokenBalance.toString() === this.position_borrow_currency_fill_value, `protocolContract's BorrowToken balance should be ${this.position_borrow_currency_fill_value}`); + assert.isTrue( + protocolContractBorrowTokenBalance.toString() === this.position_borrow_currency_fill_value, + `protocolContract's BorrowToken balance should be ${this.position_borrow_currency_fill_value}` + ); borrowerLendTokenBalance = await this.LendToken.balanceOf(this.borrower); - assert.isTrue(borrowerLendTokenBalance.toString() === this.position_lending_currency_fill_value, `borrower's LendToken balance should be ${this.position_lending_currency_fill_value}`); + assert.isTrue( + borrowerLendTokenBalance.toString() === this.position_lending_currency_fill_value, + `borrower's LendToken balance should be ${this.position_lending_currency_fill_value}` + ); wranglerProtocolTokenBalance = await this.protocolToken.balanceOf(this.wrangler); - assert.isTrue(wranglerProtocolTokenBalance.toString() === this.kernel_monitoring_fee, `wrangler's protocolToken balance should be ${this.kernel_monitoring_fee}`); + assert.isTrue( + wranglerProtocolTokenBalance.toString() === this.kernel_monitoring_fee, + `wrangler's protocolToken balance should be ${this.kernel_monitoring_fee}` + ); relayerProtocolTokenBalance = await this.protocolToken.balanceOf(this.relayer); - assert.isTrue(relayerProtocolTokenBalance.toString() === this.kernel_relayer_fee, `relayer's protocolToken balance should be ${this.kernel_relayer_fee}`); + assert.isTrue( + relayerProtocolTokenBalance.toString() === this.kernel_relayer_fee, + `relayer's protocolToken balance should be ${this.kernel_relayer_fee}` + ); }); }); diff --git a/test/test_liquidate_position.js b/test/test_liquidate_position.js index 3c9b40b..f75472b 100644 --- a/test/test_liquidate_position.js +++ b/test/test_liquidate_position.js @@ -2,24 +2,24 @@ const mineTx = require("./helpers/mineTx.js"); const delay = require("./helpers/delay.js"); const saltGenerator = require("./helpers/saltGenerator.js"); +const blockTimestamp = require("./helpers/blockTimestamp"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); -contract("Protocol", function (addresses) { - - beforeEach(async function () { - this.ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; +contract("Protocol - liquidate_position", function(addresses) { + beforeEach(async function() { + this.ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); - let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); await mineTx(tx); - tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, {from:addresses[0]}); + tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, { from: addresses[0] }); await mineTx(tx); this.lender = addresses[1]; this.borrower = addresses[2]; @@ -27,181 +27,210 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; //// kernel terms // uint256 values - this.kernel_daily_interest_rate = 10 + this.kernel_daily_interest_rate = 10; // timedelta values - this.kernel_position_duration_in_seconds = 5 - this.wrangler_approval_duration_in_seconds = 5 * 60 + this.kernel_position_duration_in_seconds = 5; + this.wrangler_approval_duration_in_seconds = 5 * 60; // wei values - this.kernel_lending_currency_maximum_value = web3._extend.utils.toWei('40', 'ether') - this.kernel_relayer_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_monitoring_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_rollover_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_closure_fee = web3._extend.utils.toWei('10', 'ether') - // timestamp values - this.kernel_expires_at = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400*2 - // bytes32 values - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_lending_currency_maximum_value = web3.utils.toWei("40", "ether"); + this.kernel_relayer_fee = web3.utils.toWei("10", "ether"); + this.kernel_monitoring_fee = web3.utils.toWei("10", "ether"); + this.kernel_rollover_fee = web3.utils.toWei("10", "ether"); + this.kernel_closure_fee = web3.utils.toWei("10", "ether"); // position terms - this.position_lending_currency_fill_value = web3._extend.utils.toWei('30', 'ether') - this.position_borrow_currency_fill_value = web3._extend.utils.toWei('3', 'ether') - this.position_lending_currency_owed_value = web3._extend.utils.toWei('30', 'ether') + this.position_lending_currency_fill_value = web3.utils.toWei("30", "ether"); + this.position_borrow_currency_fill_value = web3.utils.toWei("3", "ether"); + this.position_lending_currency_owed_value = web3.utils.toWei("30", "ether"); // open position - tx = this.protocolToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.protocolToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.protocolToken.approve(this.protocolContract.address, web3._extend.utils.toWei('100', 'ether'), {from: this.lender}) + tx = this.protocolToken.approve(this.protocolContract.address, web3.utils.toWei("100", "ether"), { + from: this.lender, + }); await mineTx(tx); // set allowance from lender to protocol contract for loan transfer - tx = this.LendToken.mint(this.lender, web3._extend.utils.toWei('40', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.lender, web3.utils.toWei("40", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('40', 'ether'), {from: this.lender}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("40", "ether"), { from: this.lender }); await mineTx(tx); // set allowance from borrower to protocol contract for collateral transfer - tx = this.BorrowToken.mint(this.borrower, web3._extend.utils.toWei('5', 'ether'), {from: addresses[0]}) + tx = this.BorrowToken.mint(this.borrower, web3.utils.toWei("5", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.BorrowToken.approve(this.protocolContract.address, web3._extend.utils.toWei('5', 'ether'), {from: this.borrower}) + tx = this.BorrowToken.approve(this.protocolContract.address, web3.utils.toWei("5", "ether"), { + from: this.borrower, + }); await mineTx(tx); // Approve wrangler as protocol owner - tx = this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + tx = this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); await mineTx(tx); + // timestamp values + this.kernel_expires_at = (await blockTimestamp(web3)) + 86400 * 2; + // bytes32 values + this.kernel_creator_salt = `0x${saltGenerator()}`; // Sign kernel hash as lender let kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], + [this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - let _kernel_creator_signature = web3.eth.sign(this.lender, kernel_hash) + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds + ); + let _kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, _kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); - this.position_index = await this.protocolContract.borrow_positions_count(this.borrower) - this.position_hash = await this.protocolContract.borrow_positions(this.borrower, this.position_index) - this.position = await this.protocolContract.position(this.position_hash) + this.position_index = await this.protocolContract.borrow_positions_count(this.borrower); + this.position_hash = await this.protocolContract.borrow_positions(this.borrower, this.position_index); + this.position = await this.protocolContract.position(this.position_hash); }); - it("liquidate_position should not work before position has expired", async function() { - let errr = false + let errr = false; try { - await this.protocolContract.liquidate_position(this.position_hash, {from:this.lender}); + await this.protocolContract.liquidate_position(this.position_hash, { from: this.lender }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'lender should not be able to liquidate a position before position has expired') - errr = false + assert.isTrue(errr, "lender should not be able to liquidate a position before position has expired"); + errr = false; try { - await this.protocolContract.liquidate_position(this.position_hash, {from:this.wrangler}); + await this.protocolContract.liquidate_position(this.position_hash, { from: this.wrangler }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'wrangler should not be able to liquidate a position before position has expired') + assert.isTrue(errr, "wrangler should not be able to liquidate a position before position has expired"); }); - it("liquidate_position should be callable by lender", async function() { - console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`) - while (web3.eth.getBlock(web3.eth.blockNumber).timestamp <= this.position[8].toNumber()) { - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}. Will check after 1s ...`) - web3.currentProvider.send({ - jsonrpc: "2.0", - method: "evm_mine", - id: new Date().getTime() - }) - await delay(5001) + console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`); + while ((await blockTimestamp(web3)) <= this.position[8].toNumber()) { + web3.currentProvider.send( + { + jsonrpc: "2.0", + method: "evm_mine", + id: new Date().getTime(), + }, + (err, result) => { + if (err) return console.error(err); + console.log(result); + } + ); + await delay(5001); } - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}`) - let errr = false + console.log(`Current blocktimestamp: ${await blockTimestamp(web3)}`); + let errr = false; try { - await this.protocolContract.liquidate_position(this.position_hash, {from:this.lender}); + await this.protocolContract.liquidate_position(this.position_hash, { from: this.lender }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'lender should be able to liquidate a position') + assert.isTrue(!errr, "lender should be able to liquidate a position"); }); it("liquidate_position should be callable by wrangler", async function() { - console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`) - while (web3.eth.getBlock(web3.eth.blockNumber).timestamp <= this.position[8].toNumber()) { - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}. Will check after 1s ...`) - web3.currentProvider.send({ - jsonrpc: "2.0", - method: "evm_mine", - id: new Date().getTime() - }) - await delay(5001) + console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`); + while ((await blockTimestamp(web3)) <= this.position[8].toNumber()) { + web3.currentProvider.send( + { + jsonrpc: "2.0", + method: "evm_mine", + id: new Date().getTime(), + }, + (err, result) => { + if (err) return console.error(err); + console.log(result); + } + ); + await delay(5001); } - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}`) - let errr = false + console.log(`Current blocktimestamp: ${await blockTimestamp(web3)}`); + let errr = false; try { - await this.protocolContract.liquidate_position(this.position_hash, {from:this.wrangler}); + await this.protocolContract.liquidate_position(this.position_hash, { from: this.wrangler }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'wrangler should be able to liquidate a position') + assert.isTrue(!errr, "wrangler should be able to liquidate a position"); }); it("liquidate_position should not be callable by borrower", async function() { - console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`) - while (web3.eth.getBlock(web3.eth.blockNumber).timestamp <= this.position[8].toNumber()) { - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}. Will check after 1s ...`) - web3.currentProvider.send({ - jsonrpc: "2.0", - method: "evm_mine", - id: new Date().getTime() - }) - await delay(5001) + console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`); + while ((await blockTimestamp(web3)) <= this.position[8].toNumber()) { + web3.currentProvider.send( + { + jsonrpc: "2.0", + method: "evm_mine", + id: new Date().getTime(), + }, + (err, result) => { + if (err) return console.error(err); + console.log(result); + } + ); + await delay(5001); } - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}`) - let errr = false + console.log(`Current blocktimestamp: ${await blockTimestamp(web3)}`); + let errr = false; try { - await this.protocolContract.liquidate_position(this.position_hash, {from:this.borrower}); + await this.protocolContract.liquidate_position(this.position_hash, { from: this.borrower }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'borrower should be able to close a position') + assert.isTrue(errr, "borrower should be able to close a position"); }); - }); diff --git a/test/test_multiple_positions.js b/test/test_multiple_positions.js index 9d534bc..f80b240 100644 --- a/test/test_multiple_positions.js +++ b/test/test_multiple_positions.js @@ -1,27 +1,25 @@ // helpers const mineTx = require("./helpers/mineTx.js"); -const delay = require("./helpers/delay.js"); const saltGenerator = require("./helpers/saltGenerator.js"); +const blockTimestamp = require("./helpers/blockTimestamp"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); - -contract("Protocol", function (addresses) { - - beforeEach(async function () { - this.ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; - this.EMPTY_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000'; +contract("Protocol - multiple position_hash", function(addresses) { + beforeEach(async function() { + this.ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; + this.EMPTY_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000"; this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); - let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); await mineTx(tx); - tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, {from:addresses[0]}); + tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, { from: addresses[0] }); await mineTx(tx); this.lender = addresses[1]; this.borrower = addresses[2]; @@ -29,494 +27,607 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; //// kernel terms // uint256 values - this.kernel_daily_interest_rate = 10 + this.kernel_daily_interest_rate = 10; // timedelta values - this.kernel_position_duration_in_seconds = 5 - this.wrangler_approval_duration_in_seconds = 5 * 60 + this.kernel_position_duration_in_seconds = 5; + this.wrangler_approval_duration_in_seconds = 5 * 60; // wei values - this.kernel_lending_currency_maximum_value = web3._extend.utils.toWei('40', 'ether') - this.kernel_relayer_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_monitoring_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_rollover_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_closure_fee = web3._extend.utils.toWei('10', 'ether') - // timestamp values - this.kernel_expires_at = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400*2 - // bytes32 values - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_lending_currency_maximum_value = web3.utils.toWei("40", "ether"); + this.kernel_relayer_fee = web3.utils.toWei("10", "ether"); + this.kernel_monitoring_fee = web3.utils.toWei("10", "ether"); + this.kernel_rollover_fee = web3.utils.toWei("10", "ether"); + this.kernel_closure_fee = web3.utils.toWei("10", "ether"); // position terms - let position_lending_currency_fill_value = web3._extend.utils.toWei('30', 'ether') - let position_borrow_currency_fill_value = web3._extend.utils.toWei('3', 'ether') - let position_lending_currency_owed_value = web3._extend.utils.toWei('30', 'ether') + let position_lending_currency_fill_value = web3.utils.toWei("30", "ether"); + let position_borrow_currency_fill_value = web3.utils.toWei("3", "ether"); + let position_lending_currency_owed_value = web3.utils.toWei("30", "ether"); // open position - tx = this.protocolToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.protocolToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.protocolToken.approve(this.protocolContract.address, web3._extend.utils.toWei('100', 'ether'), {from: this.lender}) + tx = this.protocolToken.approve(this.protocolContract.address, web3.utils.toWei("100", "ether"), { + from: this.lender, + }); await mineTx(tx); // set allowance from lender to protocol contract for loan transfer - tx = this.LendToken.mint(this.lender, web3._extend.utils.toWei('40', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.lender, web3.utils.toWei("40", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('40', 'ether'), {from: this.lender}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("40", "ether"), { from: this.lender }); await mineTx(tx); // set allowance from borrower to protocol contract for collateral transfer - tx = this.BorrowToken.mint(this.borrower, web3._extend.utils.toWei('5', 'ether'), {from: addresses[0]}) + tx = this.BorrowToken.mint(this.borrower, web3.utils.toWei("5", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.BorrowToken.approve(this.protocolContract.address, web3._extend.utils.toWei('5', 'ether'), {from: this.borrower}) + tx = this.BorrowToken.approve(this.protocolContract.address, web3.utils.toWei("5", "ether"), { + from: this.borrower, + }); await mineTx(tx); // Approve wrangler as protocol owner - tx = this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + tx = this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); await mineTx(tx); + // timestamp values + this.kernel_expires_at = (await blockTimestamp(web3)) + 86400 * 2; + // bytes32 values + this.kernel_creator_salt = `0x${saltGenerator()}`; // Sign kernel hash as lender let kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], + [this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - this.kernel_creator_signature= web3.eth.sign(this.lender, kernel_hash) + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds + ); + this.kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); this.kernel_addresses = [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ] + this.lender, + this.ZERO_ADDRESS, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, + ]; this.kernel_values = [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee - ] + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + ]; // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); }); it("should fill the same kernel with two different positions each with a different nonce and fill_value within available kernel lend currency value", async function() { - position_borrow_currency_fill_value = web3._extend.utils.toWei('1', 'ether') - _nonce = '2' - position_lending_currency_fill_value = web3._extend.utils.toWei('10', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('10', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("1", "ether"); + _nonce = "2"; + position_lending_currency_fill_value = web3.utils.toWei("10", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("10", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; - let errr = false + let errr = false; try { await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'two positions should be created with different nonce value for a givel kernel') + assert.isTrue(!errr, "two positions should be created with different nonce value for a givel kernel"); }); it("should not fill the same kernel with two different positions each with the same nonce and fill_value within available kernel lend currency value", async function() { - position_borrow_currency_fill_value = web3._extend.utils.toWei('1', 'ether') - _nonce = '1' - position_lending_currency_fill_value = web3._extend.utils.toWei('10', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('10', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("1", "ether"); + _nonce = "1"; + position_lending_currency_fill_value = web3.utils.toWei("10", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("10", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; - let errr = false + let errr = false; try { await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'second position with the same nonce value for a givel kernel should not be created') + assert.isTrue(errr, "second position with the same nonce value for a givel kernel should not be created"); }); it("should not fill the same kernel with two different positions each with a different nonce and fill_value above available kernel lend currency value", async function() { - position_borrow_currency_fill_value = web3._extend.utils.toWei('2', 'ether') - _nonce = '1' - position_lending_currency_fill_value = web3._extend.utils.toWei('20', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('20', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("2", "ether"); + _nonce = "1"; + position_lending_currency_fill_value = web3.utils.toWei("20", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("20", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; - let errr = false + let errr = false; try { await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'second position above kernel limit should not be created') + assert.isTrue(errr, "second position above kernel limit should not be created"); }); it("should work in the sequence: 1st position, kernel limit minimized, 2nd position", async function() { - let _lend_currency_cancel_value = web3._extend.utils.toWei('5', 'ether') + let _lend_currency_cancel_value = web3.utils.toWei("5", "ether"); tx = this.protocolContract.cancel_kernel( - this.kernel_addresses, this.kernel_values, - this.kernel_expires_at, this.kernel_creator_salt, this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds, + this.kernel_addresses, + this.kernel_values, + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds, this.kernel_creator_signature, _lend_currency_cancel_value, - {from: this.lender} - ) + { from: this.lender } + ); await mineTx(tx); - position_borrow_currency_fill_value = web3._extend.utils.toWei('0.5', 'ether') - _nonce = '2' - position_lending_currency_fill_value = web3._extend.utils.toWei('5', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('5', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("0.5", "ether"); + _nonce = "2"; + position_lending_currency_fill_value = web3.utils.toWei("5", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("5", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; - let errr = false + let errr = false; try { await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'second position should be created after kernel cancel and amount to lend still available') + assert.isTrue(!errr, "second position should be created after kernel cancel and amount to lend still available"); }); it("no position should be overridden according to the sequence: Open 3 borrow positions, close 1st position, open new position.", async function() { - // borrower opens 2nd position - position_borrow_currency_fill_value = web3._extend.utils.toWei('0.3', 'ether') - _nonce = '2' - position_lending_currency_fill_value = web3._extend.utils.toWei('3', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('3', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("0.3", "ether"); + _nonce = "2"; + position_lending_currency_fill_value = web3.utils.toWei("3", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("3", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} - ) + { from: addresses[0] } + ); await mineTx(tx); - let position_count = await this.protocolContract.position_counts(this.borrower) - assert.isTrue(position_count[0].toNumber() === 2, `borrower should have 2 borrow positions`) + let position_count = await this.protocolContract.position_counts(this.borrower); + assert.isTrue(position_count[0].toNumber() === 2, `borrower should have 2 borrow positions`); // borrower opens 3rd position - position_borrow_currency_fill_value = web3._extend.utils.toWei('0.2', 'ether') - _nonce = '3' - position_lending_currency_fill_value = web3._extend.utils.toWei('2', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('2', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("0.2", "ether"); + _nonce = "3"; + position_lending_currency_fill_value = web3.utils.toWei("2", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("2", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} - ) + { from: addresses[0] } + ); await mineTx(tx); - position_count = await this.protocolContract.position_counts(this.borrower) - assert.isTrue(position_count[0].toNumber() === 3, `borrower should have 3 borrow positions`) + position_count = await this.protocolContract.position_counts(this.borrower); + assert.isTrue(position_count[0].toNumber() === 3, `borrower should have 3 borrow positions`); - let first_position_1 = await this.protocolContract.borrow_positions(this.borrower, 1) - let second_position_1 = await this.protocolContract.borrow_positions(this.borrower, 2) - let third_position_1 = await this.protocolContract.borrow_positions(this.borrower, 3) + let first_position_1 = await this.protocolContract.borrow_positions(this.borrower, 1); + let second_position_1 = await this.protocolContract.borrow_positions(this.borrower, 2); + let third_position_1 = await this.protocolContract.borrow_positions(this.borrower, 3); // borrower closes 1st position // borrower prepares to repay // set allowance from borrower to protocol contract for loan repayment - tx = this.LendToken.mint(this.borrower, web3._extend.utils.toWei('30', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.borrower, web3.utils.toWei("30", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('30', 'ether'), {from: this.borrower}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("30", "ether"), { + from: this.borrower, + }); await mineTx(tx); - tx = await this.protocolContract.close_position(first_position_1, {from:this.borrower}) + tx = await this.protocolContract.close_position(first_position_1, { from: this.borrower }); await mineTx(tx); - position_count = await this.protocolContract.position_counts(this.borrower) - assert.isTrue(position_count[0].toNumber() === 2, `borrower should have 2 borrow positions`) + position_count = await this.protocolContract.position_counts(this.borrower); + assert.isTrue(position_count[0].toNumber() === 2, `borrower should have 2 borrow positions`); - first_position_2 = await this.protocolContract.borrow_positions(this.borrower, 1) - second_position_2 = await this.protocolContract.borrow_positions(this.borrower, 2) - third_position_2 = await this.protocolContract.borrow_positions(this.borrower, 3) + first_position_2 = await this.protocolContract.borrow_positions(this.borrower, 1); + second_position_2 = await this.protocolContract.borrow_positions(this.borrower, 2); + third_position_2 = await this.protocolContract.borrow_positions(this.borrower, 3); - assert.isTrue(first_position_2 === third_position_1, `1st position hash should now be ${third_position_1}, NOT ${first_position_2}`) - assert.isTrue(second_position_2 === second_position_1, `2st position hash should now be ${second_position_1}, NOT ${second_position_2}`) - assert.isTrue(third_position_2 === this.EMPTY_BYTES32, `3rd position hash should now be ${this.EMPTY_BYTES32}, NOT ${third_position_2}`) + assert.isTrue( + first_position_2 === third_position_1, + `1st position hash should now be ${third_position_1}, NOT ${first_position_2}` + ); + assert.isTrue( + second_position_2 === second_position_1, + `2st position hash should now be ${second_position_1}, NOT ${second_position_2}` + ); + assert.isTrue( + third_position_2 === this.EMPTY_BYTES32, + `3rd position hash should now be ${this.EMPTY_BYTES32}, NOT ${third_position_2}` + ); // borrower opens a new position - position_borrow_currency_fill_value = web3._extend.utils.toWei('0.5', 'ether') - _nonce = '4' - position_lending_currency_fill_value = web3._extend.utils.toWei('5', 'ether') - position_lending_currency_owed_value = web3._extend.utils.toWei('5', 'ether') + position_borrow_currency_fill_value = web3.utils.toWei("0.5", "ether"); + _nonce = "4"; + position_lending_currency_fill_value = web3.utils.toWei("5", "ether"); + position_lending_currency_owed_value = web3.utils.toWei("5", "ether"); position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], position_lending_currency_owed_value, _nonce - ) - _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - _wrangler_signature = web3.eth.sign(this.wrangler, position_hash) - _is_creator_lender = true + ); + _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + _wrangler_signature = await web3.eth.sign(position_hash, this.wrangler); + _is_creator_lender = true; tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - position_lending_currency_fill_value + position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, this.kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} - ) + { from: addresses[0] } + ); await mineTx(tx); - position_count = await this.protocolContract.position_counts(this.borrower) - assert.isTrue(position_count[0].toNumber() === 3, `borrower should have 3 borrow positions`) + position_count = await this.protocolContract.position_counts(this.borrower); + assert.isTrue(position_count[0].toNumber() === 3, `borrower should have 3 borrow positions`); - first_position_3 = await this.protocolContract.borrow_positions(this.borrower, 1) - second_position_3 = await this.protocolContract.borrow_positions(this.borrower, 2) - third_position_3 = await this.protocolContract.borrow_positions(this.borrower, 3) - - assert.isTrue(first_position_3 === third_position_1, `1st position hash should now be ${third_position_1}, NOT ${first_position_3}`) - assert.isTrue(second_position_3 === second_position_1, `2st position hash should now be ${second_position_1}, NOT ${second_position_3}`) - assert.isTrue(third_position_3 !== this.EMPTY_BYTES32, `3rd position hash should now NOT be ${this.EMPTY_BYTES32}`) + first_position_3 = await this.protocolContract.borrow_positions(this.borrower, 1); + second_position_3 = await this.protocolContract.borrow_positions(this.borrower, 2); + third_position_3 = await this.protocolContract.borrow_positions(this.borrower, 3); + assert.isTrue( + first_position_3 === third_position_1, + `1st position hash should now be ${third_position_1}, NOT ${first_position_3}` + ); + assert.isTrue( + second_position_3 === second_position_1, + `2st position hash should now be ${second_position_1}, NOT ${second_position_3}` + ); + assert.isTrue(third_position_3 !== this.EMPTY_BYTES32, `3rd position hash should now NOT be ${this.EMPTY_BYTES32}`); }); - }); diff --git a/test/test_protocol_parameter_settings.js b/test/test_protocol_parameter_settings.js index d38d161..acdfba5 100644 --- a/test/test_protocol_parameter_settings.js +++ b/test/test_protocol_parameter_settings.js @@ -1,16 +1,9 @@ -// helpers -const mineTx = require("./helpers/mineTx.js"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); -// provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); -contract("Protocol", function (addresses) { - - - beforeEach(async function () { +contract("Protocol - settings : [set_wrangler_status, set_position_threshold]", function(addresses) { + beforeEach(async function() { this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); @@ -18,109 +11,104 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; }); - it("set_wrangler_status should be called only by owner", async function() { - assert.isTrue(await this.protocolContract.owner() === addresses[0], 'protocol owner is not the first address'); - let errr = false + assert.isTrue((await this.protocolContract.owner()) === addresses[0], "protocol owner is not the first address"); + let errr = false; try { - await this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[7]}); + await this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[7] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'a non-owner should not able to set the position_threshold value') - errr = false + assert.isTrue(errr, "a non-owner should not able to set the position_threshold value"); + errr = false; try { - await this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + await this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'owner is not not able to set the wrangler activation status') + assert.isTrue(!errr, "owner is not not able to set the wrangler activation status"); }); - it("set_wrangler_status should allow owner to activate / deactivate wrangler status", async function() { let wrangler_status = await this.protocolContract.wranglers(this.wrangler); - assert.isTrue(!wrangler_status, 'wrangler should have been deactivated'); - await this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + assert.isTrue(!wrangler_status, "wrangler should have been deactivated"); + await this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); wrangler_status = await this.protocolContract.wranglers(this.wrangler); - assert.isTrue(wrangler_status, 'wrangler should have been activated'); - await this.protocolContract.set_wrangler_status(this.wrangler, false, {from:addresses[0]}); + assert.isTrue(wrangler_status, "wrangler should have been activated"); + await this.protocolContract.set_wrangler_status(this.wrangler, false, { from: addresses[0] }); wrangler_status = await this.protocolContract.wranglers(this.wrangler); - assert.isTrue(!wrangler_status, 'wrangler should have been deactivated'); + assert.isTrue(!wrangler_status, "wrangler should have been deactivated"); }); - it("set_position_threshold should be called only by owner", async function() { - assert.isTrue(await this.protocolContract.owner() === addresses[0], 'protocol owner is not the first address'); - let errr = false + assert.isTrue((await this.protocolContract.owner()) === addresses[0], "protocol owner is not the first address"); + let errr = false; try { - await this.protocolContract.set_position_threshold(11, {from:addresses[7]}); + await this.protocolContract.set_position_threshold(11, { from: addresses[7] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'a non-owner should not able to set the position_threshold value') - errr = false + assert.isTrue(errr, "a non-owner should not able to set the position_threshold value"); + errr = false; try { - await this.protocolContract.set_position_threshold(11, {from:addresses[0]}); + await this.protocolContract.set_position_threshold(11, { from: addresses[0] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'owner is not not able to set the position_threshold value') + assert.isTrue(!errr, "owner is not not able to set the position_threshold value"); }); - it("set_position_threshold should be changeable", async function() { let currentThreshold = await this.protocolContract.position_threshold(); - assert.isTrue(currentThreshold.toString() === '10', 'position_threshold does not have the default value'); - await this.protocolContract.set_position_threshold(11, {from:addresses[0]}); + assert.isTrue(currentThreshold.toString() === "10", "position_threshold does not have the default value"); + await this.protocolContract.set_position_threshold(11, { from: addresses[0] }); currentThreshold = await this.protocolContract.position_threshold(); - assert.isTrue(currentThreshold.toString() === '11', 'position_threshold value should have changed'); + assert.isTrue(currentThreshold.toString() === "11", "position_threshold value should have changed"); }); it("set_token_support should be called only by owner", async function() { - assert.isTrue(await this.protocolContract.owner() === addresses[0], 'protocol owner is not the first address'); - let errr = false + assert.isTrue((await this.protocolContract.owner()) === addresses[0], "protocol owner is not the first address"); + let errr = false; try { - await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[7]}); + await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[7] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'a non-owner should not able to specify token support') - errr = false + assert.isTrue(errr, "a non-owner should not able to specify token support"); + errr = false; try { - await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'owner is not not able to specify token support') + assert.isTrue(!errr, "owner is not not able to specify token support"); }); - it("set_token_support should allow owner to activate / deactivate tokens", async function() { let is_token_supported = await this.protocolContract.supported_tokens(this.LendToken.address); - assert.isTrue(!is_token_supported, 'LendToken should have NOT been supported'); - await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + assert.isTrue(!is_token_supported, "LendToken should have NOT been supported"); + await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); is_token_supported = await this.protocolContract.supported_tokens(this.LendToken.address); - assert.isTrue(is_token_supported, 'LendToken should have been supported'); - await this.protocolContract.set_token_support(this.LendToken.address, false, {from:addresses[0]}); + assert.isTrue(is_token_supported, "LendToken should have been supported"); + await this.protocolContract.set_token_support(this.LendToken.address, false, { from: addresses[0] }); is_token_supported = await this.protocolContract.supported_tokens(this.LendToken.address); - assert.isTrue(!is_token_supported, 'LendToken should have NOT been supported'); + assert.isTrue(!is_token_supported, "LendToken should have NOT been supported"); }); it("set_token_support should not accept non-contract addresses", async function() { - let errr = false + let errr = false; try { - await this.protocolContract.set_token_support(addresses[7], true, {from:addresses[0]}); + await this.protocolContract.set_token_support(addresses[7], true, { from: addresses[0] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'a non-contract token address should be rejected') - errr = false + assert.isTrue(errr, "a non-contract token address should be rejected"); + errr = false; try { - await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'owner should be able to set_token_support for Lend token') + assert.isTrue(!errr, "owner should be able to set_token_support for Lend token"); }); }); diff --git a/test/test_topup_position.js b/test/test_topup_position.js index 5fdf44e..a239a4c 100644 --- a/test/test_topup_position.js +++ b/test/test_topup_position.js @@ -2,24 +2,24 @@ const mineTx = require("./helpers/mineTx.js"); const delay = require("./helpers/delay.js"); const saltGenerator = require("./helpers/saltGenerator.js"); +const blockTimestamp = require("./helpers/blockTimestamp"); // contracts -var ERC20 = artifacts.require('ERC20.vyper'), - Protocol = artifacts.require('protocol.vyper'); +var ERC20 = artifacts.require("ERC20.vyper"), + Protocol = artifacts.require("protocol.vyper"); // provider -const Web3 = require('web3'); -const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")) +const Web3 = require("web3"); +const web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545")); -contract("Protocol", function (addresses) { - - beforeEach(async function () { - this.ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; +contract("Protocol - topup_position", function(addresses) { + beforeEach(async function() { + this.ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; this.protocolToken = await ERC20.new("Lendroid Support Token", "LST", 18, 12000000000); this.LendToken = await ERC20.new("Test Lend Token", "TLT", 18, 1000000000); this.BorrowToken = await ERC20.new("Test Borrow Token", "TBT", 18, 1000000000); this.protocolContract = await Protocol.new(this.protocolToken.address); - let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, {from:addresses[0]}); + let tx = await this.protocolContract.set_token_support(this.LendToken.address, true, { from: addresses[0] }); await mineTx(tx); - tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, {from:addresses[0]}); + tx = await this.protocolContract.set_token_support(this.BorrowToken.address, true, { from: addresses[0] }); await mineTx(tx); this.lender = addresses[1]; this.borrower = addresses[2]; @@ -27,170 +27,207 @@ contract("Protocol", function (addresses) { this.wrangler = addresses[4]; //// kernel terms // uint256 values - this.kernel_daily_interest_rate = 10 + this.kernel_daily_interest_rate = 10; // timedelta values - this.kernel_position_duration_in_seconds = 5 - this.wrangler_approval_duration_in_seconds = 5 * 60 + this.kernel_position_duration_in_seconds = 5; + this.wrangler_approval_duration_in_seconds = 5 * 60; // wei values - this.kernel_lending_currency_maximum_value = web3._extend.utils.toWei('40', 'ether') - this.kernel_relayer_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_monitoring_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_rollover_fee = web3._extend.utils.toWei('10', 'ether') - this.kernel_closure_fee = web3._extend.utils.toWei('10', 'ether') + this.kernel_lending_currency_maximum_value = web3.utils.toWei("40", "ether"); + this.kernel_relayer_fee = web3.utils.toWei("10", "ether"); + this.kernel_monitoring_fee = web3.utils.toWei("10", "ether"); + this.kernel_rollover_fee = web3.utils.toWei("10", "ether"); + this.kernel_closure_fee = web3.utils.toWei("10", "ether"); // timestamp values - this.kernel_expires_at = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400*2 + this.kernel_expires_at = (await blockTimestamp(web3)) + 86400 * 2; // bytes32 values - this.kernel_creator_salt = `0x${saltGenerator()}` + this.kernel_creator_salt = `0x${saltGenerator()}`; // position terms - this.position_lending_currency_fill_value = web3._extend.utils.toWei('30', 'ether') - this.position_borrow_currency_fill_value = web3._extend.utils.toWei('3', 'ether') - this.position_lending_currency_owed_value = web3._extend.utils.toWei('30', 'ether') + this.position_lending_currency_fill_value = web3.utils.toWei("30", "ether"); + this.position_borrow_currency_fill_value = web3.utils.toWei("3", "ether"); + this.position_lending_currency_owed_value = web3.utils.toWei("30", "ether"); // open position - tx = this.protocolToken.mint(this.lender, web3._extend.utils.toWei('100', 'ether'), {from: addresses[0]}) + tx = this.protocolToken.mint(this.lender, web3.utils.toWei("100", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.protocolToken.approve(this.protocolContract.address, web3._extend.utils.toWei('100', 'ether'), {from: this.lender}) + tx = this.protocolToken.approve(this.protocolContract.address, web3.utils.toWei("100", "ether"), { + from: this.lender, + }); await mineTx(tx); // set allowance from lender to protocol contract for loan transfer - tx = this.LendToken.mint(this.lender, web3._extend.utils.toWei('40', 'ether'), {from: addresses[0]}) + tx = this.LendToken.mint(this.lender, web3.utils.toWei("40", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.LendToken.approve(this.protocolContract.address, web3._extend.utils.toWei('40', 'ether'), {from: this.lender}) + tx = this.LendToken.approve(this.protocolContract.address, web3.utils.toWei("40", "ether"), { from: this.lender }); await mineTx(tx); // set allowance from borrower to protocol contract for collateral transfer - tx = this.BorrowToken.mint(this.borrower, web3._extend.utils.toWei('5', 'ether'), {from: addresses[0]}) + tx = this.BorrowToken.mint(this.borrower, web3.utils.toWei("5", "ether"), { from: addresses[0] }); await mineTx(tx); - tx = this.BorrowToken.approve(this.protocolContract.address, web3._extend.utils.toWei('5', 'ether'), {from: this.borrower}) + tx = this.BorrowToken.approve(this.protocolContract.address, web3.utils.toWei("5", "ether"), { + from: this.borrower, + }); await mineTx(tx); // Approve wrangler as protocol owner - tx = this.protocolContract.set_wrangler_status(this.wrangler, true, {from:addresses[0]}); + tx = this.protocolContract.set_wrangler_status(this.wrangler, true, { from: addresses[0] }); await mineTx(tx); // Sign kernel hash as lender let kernel_hash = await this.protocolContract.kernel_hash( - [ - this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], + [this.lender, this.ZERO_ADDRESS, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, ], - this.kernel_expires_at, this.kernel_creator_salt, - this.kernel_daily_interest_rate, this.kernel_position_duration_in_seconds - ) - let _kernel_creator_signature = web3.eth.sign(this.lender, kernel_hash) + this.kernel_expires_at, + this.kernel_creator_salt, + this.kernel_daily_interest_rate, + this.kernel_position_duration_in_seconds + ); + let _kernel_creator_signature = await web3.eth.sign(kernel_hash, this.lender); // Sign position hash as wrangler - let _nonce = '1'; + let _nonce = "1"; this.position_hash = await this.protocolContract.position_hash( [ - this.lender, this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address + this.lender, + this.lender, + this.borrower, + this.relayer, + this.wrangler, + this.BorrowToken.address, + this.LendToken.address, ], [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], this.position_lending_currency_owed_value, _nonce - ) - let _wrangler_approval_expiry_timestamp = web3.eth.getBlock(web3.eth.blockNumber).timestamp + this.wrangler_approval_duration_in_seconds - let _wrangler_signature = web3.eth.sign(this.wrangler, this.position_hash) + ); + let _wrangler_approval_expiry_timestamp = (await blockTimestamp(web3)) + this.wrangler_approval_duration_in_seconds; + let _wrangler_signature = await web3.eth.sign(this.position_hash, this.wrangler); // prepare inputs let _is_creator_lender = true; // do call tx = await this.protocolContract.fill_kernel( + [this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address], [ - this.lender, this.borrower, this.relayer, this.wrangler, this.BorrowToken.address, this.LendToken.address - ], - [ - this.position_borrow_currency_fill_value, this.kernel_lending_currency_maximum_value, - this.kernel_relayer_fee, this.kernel_monitoring_fee, this.kernel_rollover_fee, this.kernel_closure_fee, - this.position_lending_currency_fill_value + this.position_borrow_currency_fill_value, + this.kernel_lending_currency_maximum_value, + this.kernel_relayer_fee, + this.kernel_monitoring_fee, + this.kernel_rollover_fee, + this.kernel_closure_fee, + this.position_lending_currency_fill_value, ], _nonce, this.kernel_daily_interest_rate, _is_creator_lender, - [ - this.kernel_expires_at, _wrangler_approval_expiry_timestamp - ], + [this.kernel_expires_at, _wrangler_approval_expiry_timestamp], this.kernel_position_duration_in_seconds, this.kernel_creator_salt, _kernel_creator_signature, _wrangler_signature, - {from: addresses[0]} + { from: addresses[0] } ); await mineTx(tx); - this.position_index = await this.protocolContract.borrow_positions_count(this.borrower) - this.position_hash = await this.protocolContract.borrow_positions(this.borrower, this.position_index) - this.position = await this.protocolContract.position(this.position_hash) + this.position_index = await this.protocolContract.borrow_positions_count(this.borrower); + this.position_hash = await this.protocolContract.borrow_positions(this.borrower, this.position_index); + this.position = await this.protocolContract.position(this.position_hash); // topup amount - this.borrow_currency_topup_value = web3._extend.utils.toWei('1', 'ether') + this.borrow_currency_topup_value = web3.utils.toWei("1", "ether"); }); - it("topup_position should not be callable by lender", async function() { - let errr = false + let errr = false; try { - await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, {from:this.lender}); + await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, { + from: this.lender, + }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'lender should not be able to topup a position') + assert.isTrue(errr, "lender should not be able to topup a position"); }); it("topup_position should not be callable by wrangler", async function() { - let errr = false + let errr = false; try { - await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, {from:this.wrangler}); + await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, { + from: this.wrangler, + }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'wrangler should not be able to topup a position') + assert.isTrue(errr, "wrangler should not be able to topup a position"); }); it("topup_position should be callable by borrower before position has expired", async function() { - if (!(web3.eth.getBlock(web3.eth.blockNumber).timestamp > this.position[8].toNumber())) { - let errr = false + if (!((await blockTimestamp(web3)) > this.position[8].toNumber())) { + let errr = false; try { - await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, {from:this.borrower}); + await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, { + from: this.borrower, + }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(!errr, 'borrower should be able to topup a position') + assert.isTrue(!errr, "borrower should be able to topup a position"); } }); it("topup_position should not be callable by borrower after position has expired", async function() { - console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`) - while (!(web3.eth.getBlock(web3.eth.blockNumber).timestamp > this.position[8].toNumber())) { - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}. Will check after 1s ...`) - web3.currentProvider.send({ - jsonrpc: "2.0", - method: "evm_mine", - id: new Date().getTime() - }) - await delay(1000) + console.log(`Position expiry timestamp: ${this.position[8].toNumber()}`); + while (!((await blockTimestamp(web3)) > this.position[8].toNumber())) { + console.log(`Current blocktimestamp: ${await blockTimestamp(web3)}. Will check after 1s ...`); + web3.currentProvider.send( + { + jsonrpc: "2.0", + method: "evm_mine", + id: new Date().getTime(), + }, + (err, result) => { + if (err) return console.error(err); + console.log(result); + } + ); + await delay(1000); } - console.log(`Current blocktimestamp: ${web3.eth.getBlock(web3.eth.blockNumber).timestamp}`) - let errr = false + console.log(`Current blocktimestamp: ${await blockTimestamp(web3)}`); + let errr = false; try { - await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, {from:this.borrower}); + await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, { + from: this.borrower, + }); } catch (e) { - errr = true + errr = true; } - assert.isTrue(errr, 'borrower should not be able to topup a position after position has expired') + assert.isTrue(errr, "borrower should not be able to topup a position after position has expired"); }); it("topup_position should increment borrow_currency_current_value correctly", async function() { - if (!(web3.eth.getBlock(web3.eth.blockNumber).timestamp > this.position[8].toNumber())) { - let borrow_currency_value = this.position[11] - let borrow_currency_current_value = this.position[12] - assert.isTrue(borrow_currency_value.toNumber() === borrow_currency_current_value.toNumber(), `borrow_currency_current_value should be ${borrow_currency_value}, NOT ${borrow_currency_current_value}`) - let tx = await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, {from:this.borrower}); + if (!((await blockTimestamp(web3)) > this.position[8].toNumber())) { + let borrow_currency_value = this.position[11]; + let borrow_currency_current_value = this.position[12]; + assert.isTrue( + borrow_currency_value.toNumber() === borrow_currency_current_value.toNumber(), + `borrow_currency_current_value should be ${borrow_currency_value}, NOT ${borrow_currency_current_value}` + ); + let tx = await this.protocolContract.topup_position(this.position_hash, this.borrow_currency_topup_value, { + from: this.borrower, + }); await mineTx(tx); - this.position = await this.protocolContract.position(this.position_hash) - borrow_currency_current_value = this.position[12] - let expected_borrow_currency_current_value = borrow_currency_value.add(this.borrow_currency_topup_value) - assert.isTrue(borrow_currency_current_value.toNumber() === expected_borrow_currency_current_value.toNumber(), `borrow_currency_current_value should be ${expected_borrow_currency_current_value.toNumber()}, NOT ${borrow_currency_current_value.toNumber()}`) + this.position = await this.protocolContract.position(this.position_hash); + borrow_currency_current_value = this.position[12]; + let expected_borrow_currency_current_value = borrow_currency_value.add(this.borrow_currency_topup_value); + assert.isTrue( + borrow_currency_current_value.toNumber() === expected_borrow_currency_current_value.toNumber(), + `borrow_currency_current_value should be ${expected_borrow_currency_current_value.toNumber()}, NOT ${borrow_currency_current_value.toNumber()}` + ); } }); - });