Compare commits

..

8 Commits

Author SHA1 Message Date
Richard Moore
a7d0b41d98 Reduce number of HDNode tests which cause TravisCI to timeout. 2019-07-09 20:16:37 -04:00
Richard Moore
a980fc3db0 Updated dist files. 2019-07-09 16:56:49 -04:00
Richard Moore
a34ca6b3a3 Added test cases for case-agnostic mnemonics (#557). 2019-07-09 16:55:44 -04:00
Richard Moore
ef91dcd757 Make mnemonics case-agnostic (#557). 2019-07-09 16:51:07 -04:00
Richard Moore
a5296a9258 Added tests for testnet extended private key (#553). 2019-06-28 15:42:41 -04:00
Richard Moore
f827ae68e2 Updated dist files. 2019-06-28 15:42:04 -04:00
Richard Moore
fbf15c0ffe Fixed testnet exteneded private keys (#553). 2019-06-28 15:38:19 -04:00
Richard Moore
10fdbe7274 Updated dist files. 2019-06-21 19:18:49 -04:00
14 changed files with 1082 additions and 1046 deletions

2
_version.d.ts vendored
View File

@@ -1 +1 @@
export declare const version = "4.0.30";
export declare const version = "4.0.33";

View File

@@ -1,3 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "4.0.30";
exports.version = "4.0.33";

57
dist/ethers.js vendored
View File

@@ -1,7 +1,7 @@
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ethers = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "4.0.30";
exports.version = "4.0.33";
},{}],2:[function(require,module,exports){
"use strict";
@@ -8646,24 +8646,28 @@ exports.shr64_lo = shr64_lo;
if (typeof Object.create === 'function') {
// implementation from standard node.js 'util' module
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
if (superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
})
}
};
} else {
// old school shim for old browsers
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
if (superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
}
}
}
@@ -9620,7 +9624,7 @@ module.exports = { browser: true };
}).call(this,require("timers").setImmediate)
},{"timers":45}],44:[function(require,module,exports){
(function (process,global){
(function (process,global,clearImmediate){
(function (global, undefined) {
"use strict";
@@ -9797,8 +9801,8 @@ module.exports = { browser: true };
attachTo.clearImmediate = clearImmediate;
}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"_process":42}],45:[function(require,module,exports){
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").clearImmediate)
},{"_process":42,"timers":45}],45:[function(require,module,exports){
(function (global){
module.exports = { setImmediate: global.setImmediate };
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
@@ -12292,6 +12296,7 @@ utils.defineProperty(Web3Signer, 'onchange', {
});
*/
var _nextId = 42;
var Web3Provider = /** @class */ (function (_super) {
__extends(Web3Provider, _super);
function Web3Provider(web3Provider, network) {
@@ -12325,7 +12330,7 @@ var Web3Provider = /** @class */ (function (_super) {
var request = {
method: method,
params: params,
id: 42,
id: (_nextId++),
jsonrpc: "2.0"
};
_this._sendAsync(request, function (error, result) {
@@ -12335,10 +12340,10 @@ var Web3Provider = /** @class */ (function (_super) {
}
if (result.error) {
// @TODO: not any
var error = new Error(result.error.message);
error.code = result.error.code;
error.data = result.error.data;
reject(error);
var error_1 = new Error(result.error.message);
error_1.code = result.error.code;
error_1.data = result.error.data;
reject(error_1);
return;
}
resolve(result.result);
@@ -14317,7 +14322,7 @@ function fromExtendedKey(extendedKey) {
return new HDNode(_constructorGuard, null, bytes_1.hexlify(key), parentFingerprint, chainCode, index, depth, null, null);
// Private Key
case "0x0488ade4":
case "0x04358394 ":
case "0x04358394":
if (key[0] !== 0) {
break;
}
@@ -14338,8 +14343,8 @@ function _fromSeed(seed, mnemonic) {
return new HDNode(_constructorGuard, bytes32(I.slice(0, 32)), null, "0x00000000", bytes32(I.slice(32)), 0, 0, mnemonic, 'm');
}
function fromMnemonic(mnemonic, wordlist, password) {
// Check that the checksum s valid (will throw an error)
mnemonicToEntropy(mnemonic, wordlist);
// Normalize the mnemonic (also throws if the checksum is invalid)
mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist);
return _fromSeed(mnemonicToSeed(mnemonic, password), mnemonic);
}
exports.fromMnemonic = fromMnemonic;

2
dist/ethers.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -266,7 +266,7 @@ declare module 'ethers/utils/shims' {
}
declare module 'ethers/_version' {
export const version = "4.0.30";
export const version = "4.0.33";
}
declare module 'ethers/utils/bignumber' {

2
dist/shims.js vendored

File diff suppressed because one or more lines are too long

1952
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "ethers",
"version": "4.0.30",
"version": "4.0.33",
"description": "Ethereum wallet library.",
"main": "./index.js",
"types": "./index.d.ts",

View File

@@ -27,6 +27,7 @@ utils.defineProperty(Web3Signer, 'onchange', {
});
*/
var _nextId = 42;
var Web3Provider = /** @class */ (function (_super) {
__extends(Web3Provider, _super);
function Web3Provider(web3Provider, network) {
@@ -60,7 +61,7 @@ var Web3Provider = /** @class */ (function (_super) {
var request = {
method: method,
params: params,
id: 42,
id: (_nextId++),
jsonrpc: "2.0"
};
_this._sendAsync(request, function (error, result) {
@@ -70,10 +71,10 @@ var Web3Provider = /** @class */ (function (_super) {
}
if (result.error) {
// @TODO: not any
var error = new Error(result.error.message);
error.code = result.error.code;
error.data = result.error.data;
reject(error);
var error_1 = new Error(result.error.message);
error_1.code = result.error.code;
error_1.data = result.error.data;
reject(error_1);
return;
}
resolve(result.result);

View File

@@ -1 +1 @@
export const version = "4.0.30";
export const version = "4.0.33";

View File

@@ -240,7 +240,7 @@ export function fromExtendedKey(extendedKey: string): HDNode {
return new HDNode(_constructorGuard, null, hexlify(key), parentFingerprint, chainCode, index, depth, null, null);
// Private Key
case "0x0488ade4": case "0x04358394 ":
case "0x0488ade4": case "0x04358394":
if (key[0] !== 0) { break; }
return new HDNode(_constructorGuard, hexlify(key.slice(1)), null, parentFingerprint, chainCode, index, depth, null, null);
}
@@ -261,8 +261,8 @@ function _fromSeed(seed: Arrayish, mnemonic: string): HDNode {
}
export function fromMnemonic(mnemonic: string, wordlist?: Wordlist, password?: string): HDNode {
// Check that the checksum s valid (will throw an error)
mnemonicToEntropy(mnemonic, wordlist);
// Normalize the mnemonic (also throws if the checksum is invalid)
mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist);
return _fromSeed(mnemonicToSeed(mnemonic, password), mnemonic);
}

View File

@@ -5,11 +5,20 @@ var assert = require('assert');
var utils = require('./utils');
var ethers = utils.getEthers(__filename);
function skip(name) {
var match = name.match(/^random-([0-9]+)$/);
if (match && parseInt(match[1]) > 512) {
return true;
}
return false;
}
describe('Test HD Node Derivation', function(test) {
var tests = utils.loadTests('hdnode');
tests.forEach(function(test) {
it('Derives the HD nodes - ' + test.name, function() {
if (skip(test.name)) { return; }
it('Derives the HD nodes - ' + test.name, function() {
this.timeout(10000);
//var rootNode = new ethers.utils.HDNode.fromSeed(test.seed);
@@ -87,6 +96,7 @@ describe('Test HD Node Derivation', function(test) {
describe('Test HD Mnemonic Phrases', function testMnemonic() {
var tests = utils.loadTests('hdnode');
tests.forEach(function(test) {
if (skip(test.name)) { return; }
it(('converts mnemonic phrases - ' + test.name), function() {
this.timeout(1000000);
@@ -128,3 +138,71 @@ testEasySeed(ethers.wordlists.zh_cn, 'zh_cn');
testEasySeed(ethers.wordlists.zh_tw, 'zh_tw');
testEasySeed(ethers.wordlists.it, 'it');
testEasySeed(ethers.wordlists.ko, 'ko');
describe('Testnet Extended Key (#553)', function testMnemonic() {
var tests = [
{
name: "testnet extended public key",
extended: "tpubD6NzVbkrYhZ4Xbv9K5Ajt49a8XEPydLyfyFBNvqt3TRBa9S8L3PVoKBthRS8gimY2ZU2LQ3gXQKpXHRR6fu9W1rWp6jaBToyZ5ar7wbRNYs",
node: {
publicKey: "0x02ead6f326f28baf5af54ab4a1688d5784f92848bba73c004365da8871b1e8677e",
parentFingerprint: "0x00000000",
fingerprint: "0x68ff1104",
address: "0xc17Ee49BA46A41FBdA2306d00DA5Ce410925a7cb",
chainCode: "0x7eee1a867c6938de05f0677d290769a6db3d135d4c1b5ba84c753b56b027cfb7",
index: 0,
depth: 0
}
},
{
name: "testnet extended private key",
extended: "tprv8ZgxMBicQKsPe8tMRRW9UeVTZViTpJA56feQ6QoadBcnjfBMheZucpa2XHqF6iuRJSngkasg1yXD7VpGgGafFJwhY5RoETMSbiyEDBzxdCd",
node: {
privateKey: "0x949219063180d462349e358ec93cec1067fc346b37530e44b592a8a6dbe96d4c",
publicKey: "0x02ead6f326f28baf5af54ab4a1688d5784f92848bba73c004365da8871b1e8677e",
parentFingerprint: "0x00000000",
fingerprint: "0x68ff1104",
address: "0xc17Ee49BA46A41FBdA2306d00DA5Ce410925a7cb",
chainCode: "0x7eee1a867c6938de05f0677d290769a6db3d135d4c1b5ba84c753b56b027cfb7",
index: 0,
depth: 0
}
}
];
tests.forEach(function(test) {
it(test.name, function() {
var node = ethers.utils.HDNode.fromExtendedKey(test.extended);
Object.keys(test.node).forEach(function(key) {
assert.equal(node[key], test.node[key], "does not match " + key);
});
});
});
});
describe("Test Mnemonic is Case Agnostic", function() {
function randomCase(seed, text) {
return text.split("").map(function(c, index) {
if (utils.randomNumber(seed + "-" + index, 0, 1000) > 500) {
return c.toUpperCase();
}
return c
}).join("");
}
function addTest(mnemonic, altMnemonic) {
it(altMnemonic, function() {
var node = ethers.utils.HDNode.fromMnemonic(mnemonic);
var altNode = ethers.utils.HDNode.fromMnemonic(altMnemonic);
assert.equal(node.privateKey, altNode.privateKey, altMnemonic);
});
}
for (var i = 0; i < 128; i++) {
var seed = "test-" + i;
var entropy = utils.randomBytes(seed, 16, 16);
var mnemonic = ethers.utils.HDNode.entropyToMnemonic(entropy);
var altMnemonic = randomCase(seed, mnemonic);
addTest(mnemonic, altMnemonic);
}
});

View File

@@ -205,7 +205,7 @@ function fromExtendedKey(extendedKey) {
return new HDNode(_constructorGuard, null, bytes_1.hexlify(key), parentFingerprint, chainCode, index, depth, null, null);
// Private Key
case "0x0488ade4":
case "0x04358394 ":
case "0x04358394":
if (key[0] !== 0) {
break;
}
@@ -226,8 +226,8 @@ function _fromSeed(seed, mnemonic) {
return new HDNode(_constructorGuard, bytes32(I.slice(0, 32)), null, "0x00000000", bytes32(I.slice(32)), 0, 0, mnemonic, 'm');
}
function fromMnemonic(mnemonic, wordlist, password) {
// Check that the checksum s valid (will throw an error)
mnemonicToEntropy(mnemonic, wordlist);
// Normalize the mnemonic (also throws if the checksum is invalid)
mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist);
return _fromSeed(mnemonicToSeed(mnemonic, password), mnemonic);
}
exports.fromMnemonic = fromMnemonic;