Added basic authentication to JsonRpcProvider.

This commit is contained in:
Richard Moore 2018-04-14 16:10:26 -04:00
parent eddf9de8f9
commit e649a22ccf
No known key found for this signature in database
GPG Key ID: 525F70A6FCABC295
16 changed files with 412 additions and 124 deletions

@ -4231,7 +4231,7 @@ utils.defineProperty(EtherscanProvider.prototype, 'getHistory', function(address
module.exports = EtherscanProvider;;
},{"../utils/convert.js":18,"../utils/properties.js":23,"./provider.js":13}],8:[function(require,module,exports){
},{"../utils/convert.js":19,"../utils/properties.js":24,"./provider.js":13}],8:[function(require,module,exports){
'use strict';
var inherits = require('inherits');
@ -4295,7 +4295,7 @@ utils.defineProperty(FallbackProvider.prototype, 'perform', function(method, par
module.exports = FallbackProvider;
},{"../utils/properties.js":23,"./provider.js":13,"inherits":3}],9:[function(require,module,exports){
},{"../utils/properties.js":24,"./provider.js":13,"inherits":3}],9:[function(require,module,exports){
'use strict';
var Provider = require('./provider');
@ -4337,7 +4337,7 @@ if (IpcProvider) {
module.exports = exports;
},{"./etherscan-provider":7,"./fallback-provider":8,"./infura-provider":10,"./ipc-provider":19,"./json-rpc-provider":11,"./provider":13,"./web3-provider":14}],10:[function(require,module,exports){
},{"./etherscan-provider":7,"./fallback-provider":8,"./infura-provider":10,"./ipc-provider":20,"./json-rpc-provider":11,"./provider":13,"./web3-provider":14}],10:[function(require,module,exports){
'use strict';
var Provider = require('./provider');
@ -4399,7 +4399,7 @@ utils.defineProperty(InfuraProvider.prototype, 'listAccounts', function() {
module.exports = InfuraProvider;
},{"../utils/errors":20,"../utils/properties":23,"./json-rpc-provider":11,"./provider":13}],11:[function(require,module,exports){
},{"../utils/errors":21,"../utils/properties":24,"./json-rpc-provider":11,"./provider":13}],11:[function(require,module,exports){
'use strict';
// See: https://github.com/ethereum/wiki/wiki/JSON-RPC
@ -4561,7 +4561,7 @@ function JsonRpcProvider(url, network) {
network = Provider.getNetwork(url);
url = null;
} catch (error) { }
} else {
} else if (url && url.url == null) {
network = url;
url = null;
}
@ -4699,7 +4699,7 @@ utils.defineProperty(JsonRpcProvider, '_hexlifyTransaction', function(transactio
module.exports = JsonRpcProvider;
},{"../utils/address":15,"../utils/convert":18,"../utils/errors":20,"../utils/properties":23,"../utils/utf8":26,"./provider.js":13}],12:[function(require,module,exports){
},{"../utils/address":15,"../utils/convert":19,"../utils/errors":21,"../utils/properties":24,"../utils/utf8":27,"./provider.js":13}],12:[function(require,module,exports){
module.exports={
"unspecified": {
"chainId": 0,
@ -4760,6 +4760,7 @@ var networks = require('./networks.json');
var utils = (function() {
var convert = require('../utils/convert');
var utf8 = require('../utils/utf8');
return {
defineProperty: require('../utils/properties').defineProperty,
@ -4776,14 +4777,19 @@ var utils = (function() {
hexStripZeros: convert.hexStripZeros,
stripZeros: convert.stripZeros,
base64: require('../utils/base64'),
namehash: require('../utils/namehash'),
toUtf8String: require('../utils/utf8').toUtf8String,
toUtf8String: utf8.toUtf8String,
toUtf8Bytes: utf8.toUtf8Bytes,
RLP: require('../utils/rlp'),
}
})();
var errors = require('../utils/errors');
function copyObject(obj) {
var result = {};
for (var key in obj) { result[key] = obj[key]; }
@ -5313,17 +5319,36 @@ utils.defineProperty(Provider, 'getNetwork', function(network) {
utils.defineProperty(Provider, 'networks', networks);
utils.defineProperty(Provider, 'fetchJSON', function(url, json, processFunc) {
var headers = [ ];
if (typeof(url) === 'object' && url.url != null && url.user != null && url.password != null) {
if (url.url.substring(0, 6) !== 'https:' && url.forceInsecure !== true) {
errors.throwError('basic authentication requires a secure https url', errors.INVALID_ARGUMENT, { arg: 'url', url: url.url, user: url.user, password: '[REDACTED]' });
}
var authorization = url.user + ':' + url.password;
headers.push({
key: 'Authorization',
value: 'Basic ' + utils.base64.encode(utils.toUtf8Bytes(authorization))
});
url = url.url;
}
return new Promise(function(resolve, reject) {
var request = new XMLHttpRequest();
if (json) {
request.open('POST', url, true);
request.setRequestHeader('Content-Type','application/json');
headers.push({ key: 'Content-Type', value: 'application/json' });
} else {
request.open('GET', url, true);
}
headers.forEach(function(header) {
request.setRequestHeader(header.key, header.value);
});
request.onreadystatechange = function() {
if (request.readyState !== 4) { return; }
@ -5906,7 +5931,7 @@ utils.defineProperty(Provider, '_formatters', {
module.exports = Provider;
},{"../utils/address":15,"../utils/bignumber":16,"../utils/contract-address":17,"../utils/convert":18,"../utils/namehash":22,"../utils/properties":23,"../utils/rlp":24,"../utils/utf8":26,"./networks.json":12,"inherits":3,"xmlhttprequest":6}],14:[function(require,module,exports){
},{"../utils/address":15,"../utils/base64":17,"../utils/bignumber":16,"../utils/contract-address":18,"../utils/convert":19,"../utils/errors":21,"../utils/namehash":23,"../utils/properties":24,"../utils/rlp":25,"../utils/utf8":27,"./networks.json":12,"inherits":3,"xmlhttprequest":6}],14:[function(require,module,exports){
'use strict';
var Provider = require('./provider');
@ -5976,7 +6001,7 @@ utils.defineProperty(Web3Provider.prototype, 'send', function(method, params) {
module.exports = Web3Provider;
},{"../utils/errors":20,"../utils/properties":23,"./json-rpc-provider":11,"./provider":13}],15:[function(require,module,exports){
},{"../utils/errors":21,"../utils/properties":24,"./json-rpc-provider":11,"./provider":13}],15:[function(require,module,exports){
var BN = require('bn.js');
@ -6102,7 +6127,7 @@ module.exports = {
getAddress: getAddress,
}
},{"./convert":18,"./keccak256":21,"./throw-error":25,"bn.js":1}],16:[function(require,module,exports){
},{"./convert":19,"./keccak256":22,"./throw-error":26,"bn.js":1}],16:[function(require,module,exports){
/**
* BigNumber
*
@ -6253,7 +6278,33 @@ module.exports = {
BigNumber: BigNumber
};
},{"./convert":18,"./properties":23,"./throw-error":25,"bn.js":1}],17:[function(require,module,exports){
},{"./convert":19,"./properties":24,"./throw-error":26,"bn.js":1}],17:[function(require,module,exports){
'use strict';
var convert = require('./convert');
module.exports = {
decode: function(textData) {
textData = atob(textData);
var data = [];
for (var i = 0; i < textData.length; i++) {
data.push(textData.charCodeAt(i));
}
return convert.arrayify(data);
},
encode: function(data) {
data = convert.arrayify(data);
var textData = '';
for (var i = 0; i < data.length; i++) {
textData += String.fromCharCode(data[i]);
}
return btoa(textData);
}
};
},{"./convert":19}],18:[function(require,module,exports){
var getAddress = require('./address').getAddress;
var convert = require('./convert');
@ -6275,7 +6326,7 @@ module.exports = {
getContractAddress: getContractAddress,
}
},{"./address":15,"./convert":18,"./keccak256":21,"./rlp":24}],18:[function(require,module,exports){
},{"./address":15,"./convert":19,"./keccak256":22,"./rlp":25}],19:[function(require,module,exports){
/**
* Conversion Utilities
*
@ -6501,10 +6552,10 @@ module.exports = {
hexZeroPad: hexZeroPad,
};
},{"./errors":20,"./properties.js":23}],19:[function(require,module,exports){
},{"./errors":21,"./properties.js":24}],20:[function(require,module,exports){
module.exports = undefined;
},{}],20:[function(require,module,exports){
},{}],21:[function(require,module,exports){
'use strict';
var defineProperty = require('./properties').defineProperty;
@ -6577,7 +6628,7 @@ defineProperty(codes, 'checkNew', function(self, kind) {
module.exports = codes;
},{"./properties":23}],21:[function(require,module,exports){
},{"./properties":24}],22:[function(require,module,exports){
'use strict';
var sha3 = require('js-sha3');
@ -6591,7 +6642,7 @@ function keccak256(data) {
module.exports = keccak256;
},{"./convert.js":18,"js-sha3":4}],22:[function(require,module,exports){
},{"./convert.js":19,"js-sha3":4}],23:[function(require,module,exports){
'use strict';
var convert = require('./convert');
@ -6631,7 +6682,7 @@ function namehash(name, depth) {
module.exports = namehash;
},{"./convert":18,"./keccak256":21,"./utf8":26}],23:[function(require,module,exports){
},{"./convert":19,"./keccak256":22,"./utf8":27}],24:[function(require,module,exports){
'use strict';
function defineProperty(object, name, value) {
@ -6655,7 +6706,7 @@ module.exports = {
defineProperty: defineProperty,
};
},{}],24:[function(require,module,exports){
},{}],25:[function(require,module,exports){
//See: https://github.com/ethereum/wiki/wiki/RLP
var convert = require('./convert.js');
@ -6799,7 +6850,7 @@ module.exports = {
decode: decode,
}
},{"./convert.js":18}],25:[function(require,module,exports){
},{"./convert.js":19}],26:[function(require,module,exports){
'use strict';
function throwError(message, params) {
@ -6812,7 +6863,7 @@ function throwError(message, params) {
module.exports = throwError;
},{}],26:[function(require,module,exports){
},{}],27:[function(require,module,exports){
var convert = require('./convert.js');
@ -6927,5 +6978,5 @@ module.exports = {
toUtf8String: bytesToUtf8,
};
},{"./convert.js":18}]},{},[9])(9)
},{"./convert.js":19}]},{},[9])(9)
});

File diff suppressed because one or more lines are too long

65
dist/ethers-utils.js vendored

@ -5412,7 +5412,7 @@ utils.defineProperty(Coder, 'defaultCoder', new Coder());
module.exports = Coder
},{"../utils/address":20,"../utils/bignumber.js":21,"../utils/convert.js":24,"../utils/properties.js":30,"../utils/throw-error":34,"../utils/utf8.js":36}],20:[function(require,module,exports){
},{"../utils/address":20,"../utils/bignumber.js":21,"../utils/convert.js":25,"../utils/properties.js":31,"../utils/throw-error":35,"../utils/utf8.js":37}],20:[function(require,module,exports){
var BN = require('bn.js');
@ -5538,7 +5538,7 @@ module.exports = {
getAddress: getAddress,
}
},{"./convert":24,"./keccak256":28,"./throw-error":34,"bn.js":1}],21:[function(require,module,exports){
},{"./convert":25,"./keccak256":29,"./throw-error":35,"bn.js":1}],21:[function(require,module,exports){
/**
* BigNumber
*
@ -5689,7 +5689,33 @@ module.exports = {
BigNumber: BigNumber
};
},{"./convert":24,"./properties":30,"./throw-error":34,"bn.js":1}],22:[function(require,module,exports){
},{"./convert":25,"./properties":31,"./throw-error":35,"bn.js":1}],22:[function(require,module,exports){
'use strict';
var convert = require('./convert');
module.exports = {
decode: function(textData) {
textData = atob(textData);
var data = [];
for (var i = 0; i < textData.length; i++) {
data.push(textData.charCodeAt(i));
}
return convert.arrayify(data);
},
encode: function(data) {
data = convert.arrayify(data);
var textData = '';
for (var i = 0; i < data.length; i++) {
textData += String.fromCharCode(data[i]);
}
return btoa(textData);
}
};
},{"./convert":25}],23:[function(require,module,exports){
(function (global){
'use strict';
@ -5736,7 +5762,7 @@ if (crypto._weakCrypto === true) {
module.exports = randomBytes;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./convert":24,"./properties":30}],23:[function(require,module,exports){
},{"./convert":25,"./properties":31}],24:[function(require,module,exports){
var getAddress = require('./address').getAddress;
var convert = require('./convert');
@ -5758,7 +5784,7 @@ module.exports = {
getContractAddress: getContractAddress,
}
},{"./address":20,"./convert":24,"./keccak256":28,"./rlp":31}],24:[function(require,module,exports){
},{"./address":20,"./convert":25,"./keccak256":29,"./rlp":32}],25:[function(require,module,exports){
/**
* Conversion Utilities
*
@ -5984,7 +6010,7 @@ module.exports = {
hexZeroPad: hexZeroPad,
};
},{"./errors":25,"./properties.js":30}],25:[function(require,module,exports){
},{"./errors":26,"./properties.js":31}],26:[function(require,module,exports){
'use strict';
var defineProperty = require('./properties').defineProperty;
@ -6057,7 +6083,7 @@ defineProperty(codes, 'checkNew', function(self, kind) {
module.exports = codes;
},{"./properties":30}],26:[function(require,module,exports){
},{"./properties":31}],27:[function(require,module,exports){
'use strict';
var keccak256 = require('./keccak256');
@ -6069,7 +6095,7 @@ function id(text) {
module.exports = id;
},{"./keccak256":28,"./utf8":36}],27:[function(require,module,exports){
},{"./keccak256":29,"./utf8":37}],28:[function(require,module,exports){
'use strict';
// This is SUPER useful, but adds 140kb (even zipped, adds 40kb)
@ -6077,6 +6103,7 @@ module.exports = id;
var address = require('./address');
var AbiCoder = require('./abi-coder');
var base64 = require('./base64');
var bigNumber = require('./bignumber');
var contractAddress = require('./contract-address');
var convert = require('./convert');
@ -6111,6 +6138,8 @@ module.exports = {
padZeros: convert.padZeros,
stripZeros: convert.stripZeros,
base64: base64,
bigNumberify: bigNumber.bigNumberify,
BigNumber: bigNumber.BigNumber,
@ -6143,7 +6172,7 @@ module.exports = {
splitSignature: convert.splitSignature,
}
},{"./abi-coder":19,"./address":20,"./bignumber":21,"./contract-address":23,"./convert":24,"./id":26,"./keccak256":28,"./namehash":29,"./properties":30,"./random-bytes":22,"./rlp":31,"./sha2":32,"./solidity":33,"./units":35,"./utf8":36}],28:[function(require,module,exports){
},{"./abi-coder":19,"./address":20,"./base64":22,"./bignumber":21,"./contract-address":24,"./convert":25,"./id":27,"./keccak256":29,"./namehash":30,"./properties":31,"./random-bytes":23,"./rlp":32,"./sha2":33,"./solidity":34,"./units":36,"./utf8":37}],29:[function(require,module,exports){
'use strict';
var sha3 = require('js-sha3');
@ -6157,7 +6186,7 @@ function keccak256(data) {
module.exports = keccak256;
},{"./convert.js":24,"js-sha3":16}],29:[function(require,module,exports){
},{"./convert.js":25,"js-sha3":16}],30:[function(require,module,exports){
'use strict';
var convert = require('./convert');
@ -6197,7 +6226,7 @@ function namehash(name, depth) {
module.exports = namehash;
},{"./convert":24,"./keccak256":28,"./utf8":36}],30:[function(require,module,exports){
},{"./convert":25,"./keccak256":29,"./utf8":37}],31:[function(require,module,exports){
'use strict';
function defineProperty(object, name, value) {
@ -6221,7 +6250,7 @@ module.exports = {
defineProperty: defineProperty,
};
},{}],31:[function(require,module,exports){
},{}],32:[function(require,module,exports){
//See: https://github.com/ethereum/wiki/wiki/RLP
var convert = require('./convert.js');
@ -6365,7 +6394,7 @@ module.exports = {
decode: decode,
}
},{"./convert.js":24}],32:[function(require,module,exports){
},{"./convert.js":25}],33:[function(require,module,exports){
'use strict';
var hash = require('hash.js');
@ -6390,7 +6419,7 @@ module.exports = {
createSha512: hash.sha512,
}
},{"./convert.js":24,"hash.js":3}],33:[function(require,module,exports){
},{"./convert.js":25,"hash.js":3}],34:[function(require,module,exports){
'use strict';
var bigNumberify = require('./bignumber').bigNumberify;
@ -6489,7 +6518,7 @@ module.exports = {
sha256: sha256,
}
},{"./address":20,"./bignumber":21,"./convert":24,"./keccak256":28,"./sha2":32,"./utf8":36}],34:[function(require,module,exports){
},{"./address":20,"./bignumber":21,"./convert":25,"./keccak256":29,"./sha2":33,"./utf8":37}],35:[function(require,module,exports){
'use strict';
function throwError(message, params) {
@ -6502,7 +6531,7 @@ function throwError(message, params) {
module.exports = throwError;
},{}],35:[function(require,module,exports){
},{}],36:[function(require,module,exports){
var bigNumberify = require('./bignumber.js').bigNumberify;
var throwError = require('./throw-error');
@ -6652,7 +6681,7 @@ module.exports = {
parseUnits: parseUnits,
}
},{"./bignumber.js":21,"./throw-error":34}],36:[function(require,module,exports){
},{"./bignumber.js":21,"./throw-error":35}],37:[function(require,module,exports){
var convert = require('./convert.js');
@ -6767,5 +6796,5 @@ module.exports = {
toUtf8String: bytesToUtf8,
};
},{"./convert.js":24}]},{},[27])(27)
},{"./convert.js":25}]},{},[28])(28)
});

File diff suppressed because one or more lines are too long

83
dist/ethers-wallet.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

136
dist/ethers.js vendored

File diff suppressed because one or more lines are too long

10
dist/ethers.min.js vendored

File diff suppressed because one or more lines are too long

@ -1,6 +1,6 @@
{
"name": "ethers",
"version": "3.0.11",
"version": "3.0.12",
"description": "Ethereum wallet library.",
"main": "index.js",
"scripts": {
@ -35,6 +35,7 @@
"browser": {
"fs": "./tests/browser-fs.js",
"zlib": "browserify-zlib",
"./utils/base64.js": "./utils/browser-base64.js",
"./utils/random-bytes.js": "./utils/browser-random-bytes.js",
"./providers/ipc-provider.js": "./utils/empty.js",
"xmlhttprequest": "./providers/browser-xmlhttprequest.js"

@ -159,7 +159,7 @@ function JsonRpcProvider(url, network) {
network = Provider.getNetwork(url);
url = null;
} catch (error) { }
} else {
} else if (url && url.url == null) {
network = url;
url = null;
}

@ -8,6 +8,7 @@ var networks = require('./networks.json');
var utils = (function() {
var convert = require('../utils/convert');
var utf8 = require('../utils/utf8');
return {
defineProperty: require('../utils/properties').defineProperty,
@ -24,14 +25,19 @@ var utils = (function() {
hexStripZeros: convert.hexStripZeros,
stripZeros: convert.stripZeros,
base64: require('../utils/base64'),
namehash: require('../utils/namehash'),
toUtf8String: require('../utils/utf8').toUtf8String,
toUtf8String: utf8.toUtf8String,
toUtf8Bytes: utf8.toUtf8Bytes,
RLP: require('../utils/rlp'),
}
})();
var errors = require('../utils/errors');
function copyObject(obj) {
var result = {};
for (var key in obj) { result[key] = obj[key]; }
@ -561,17 +567,36 @@ utils.defineProperty(Provider, 'getNetwork', function(network) {
utils.defineProperty(Provider, 'networks', networks);
utils.defineProperty(Provider, 'fetchJSON', function(url, json, processFunc) {
var headers = [ ];
if (typeof(url) === 'object' && url.url != null && url.user != null && url.password != null) {
if (url.url.substring(0, 6) !== 'https:' && url.forceInsecure !== true) {
errors.throwError('basic authentication requires a secure https url', errors.INVALID_ARGUMENT, { arg: 'url', url: url.url, user: url.user, password: '[REDACTED]' });
}
var authorization = url.user + ':' + url.password;
headers.push({
key: 'Authorization',
value: 'Basic ' + utils.base64.encode(utils.toUtf8Bytes(authorization))
});
url = url.url;
}
return new Promise(function(resolve, reject) {
var request = new XMLHttpRequest();
if (json) {
request.open('POST', url, true);
request.setRequestHeader('Content-Type','application/json');
headers.push({ key: 'Content-Type', value: 'application/json' });
} else {
request.open('GET', url, true);
}
headers.forEach(function(header) {
request.setRequestHeader(header.key, header.value);
});
request.onreadystatechange = function() {
if (request.readyState !== 4) { return; }

@ -407,3 +407,47 @@ describe('Test extra Etherscan operations', function() {
});
});
});
describe('Test Basic Authentication', function() {
// https://stackoverflow.com/questions/6509278/authentication-test-servers#16756383
var Provider = require('..').providers.Provider;
function test(name, url) {
it('tests ' + name, function() {
return Provider.fetchJSON(url).then(function(data) {
assert.equal(data.authenticated, true, 'authenticates user');
});
});
}
var secure = {
url: 'https://httpbin.org/basic-auth/user/passwd',
user: 'user',
password: 'passwd'
};
var insecure = {
url: 'http://httpbin.org/basic-auth/user/passwd',
user: 'user',
password: 'passwd'
};
var insecureForced = {
url: 'http://httpbin.org/basic-auth/user/passwd',
user: 'user',
password: 'passwd',
forceInsecure: true
};
test('secure url', secure);
test('insecure url', insecureForced);
it('tests insecure connections fail', function() {
assert.throws(function() {
Provider.fetchJSON(insecure);
}, function(error) {
return (error.reason === 'basic authentication requires a secure https url');
}, 'throws an exception for insecure connections');
})
});

@ -211,3 +211,18 @@ describe('Test Solidity splitSignature', function() {
}
});
});
describe('Test Base64 coder', function() {
var utf8 = require('../utils/utf8')
var base64 = require('../utils').base64;
// https://en.wikipedia.org/wiki/Base64#Examples
it('encodes and decodes the example from wikipedia', function() {
var decodedText = 'Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.';
var decoded = utf8.toUtf8Bytes(decodedText);
var encoded = 'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=';
assert.equal(base64.encode(decoded), encoded, 'encodes to base64 string');
assert.equal(utf8.toUtf8String(base64.decode(encoded)), decodedText, 'decodes from base64 sstring');
});
});

13
utils/base64.js Normal file

@ -0,0 +1,13 @@
'use strict';
var convert = require('./convert');
module.exports = {
decode: function(textData) {
return convert.arrayify(new Buffer(textData, 'base64'));
},
encode: function(data) {
return (new Buffer(convert.arrayify(data))).toString('base64');
}
};

24
utils/browser-base64.js Normal file

@ -0,0 +1,24 @@
'use strict';
var convert = require('./convert');
module.exports = {
decode: function(textData) {
textData = atob(textData);
var data = [];
for (var i = 0; i < textData.length; i++) {
data.push(textData.charCodeAt(i));
}
return convert.arrayify(data);
},
encode: function(data) {
data = convert.arrayify(data);
var textData = '';
for (var i = 0; i < data.length; i++) {
textData += String.fromCharCode(data[i]);
}
return btoa(textData);
}
};

@ -5,6 +5,7 @@
var address = require('./address');
var AbiCoder = require('./abi-coder');
var base64 = require('./base64');
var bigNumber = require('./bignumber');
var contractAddress = require('./contract-address');
var convert = require('./convert');
@ -39,6 +40,8 @@ module.exports = {
padZeros: convert.padZeros,
stripZeros: convert.stripZeros,
base64: base64,
bigNumberify: bigNumber.bigNumberify,
BigNumber: bigNumber.BigNumber,