Skip to content

Commit a9aaeef

Browse files
committed
Moved address functions to utils (things without need ofr signing do not need all the extra requires).
1 parent 8257e3f commit a9aaeef

File tree

6 files changed

+123
-123
lines changed

6 files changed

+123
-123
lines changed

index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ utils.defineProperty(exportUtils, 'sha256', utils.sha256);
2626

2727
// http://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed
2828
utils.defineProperty(exportUtils, 'getContractAddress', function(transaction) {
29-
return SigningKey.getAddress('0x' + utils.sha3(rlp.encode([
30-
utils.hexOrBuffer(SigningKey.getAddress(transaction.from)),
29+
return utils.getAddress('0x' + utils.sha3(rlp.encode([
30+
utils.hexOrBuffer(utils.getAddress(transaction.from)),
3131
utils.hexOrBuffer(utils.hexlify(transaction.nonce, 'nonce'))
3232
])).slice(12).toString('hex'));
3333
});
@@ -40,8 +40,8 @@ utils.defineProperty(Wallet, 'etherSymbol', '\uD835\uDF63');
4040
utils.defineProperty(Wallet, 'formatEther', units.formatEther);
4141
utils.defineProperty(Wallet, 'parseEther', units.parseEther);
4242

43-
//utils.defineProperty(Wallet, 'getAddress', SigningKey.getAddress);
44-
//utils.defineProperty(Wallet, 'getIcapAddress', SigningKey.getIcapAddress);
43+
utils.defineProperty(Wallet, 'getAddress', utils.getAddress);
44+
utils.defineProperty(Wallet, 'getIcapAddress', utils.getIcapAddress);
4545

4646
utils.defineProperty(Wallet, 'isCrowdsaleWallet', secretStorage.isCrowdsaleWallet);
4747
utils.defineProperty(Wallet, 'isValidWallet', secretStorage.isValidWallet);

lib/providers.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
var inherits = require('inherits');
44
var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
55

6-
var SigningKey = require('./signing-key.js');
76
var utils = require('./utils.js');
87

98
// The required methods a provider must support
@@ -120,13 +119,17 @@ function postProcess(client, method, params, makeBN) {
120119
}
121120

122121
utils.defineProperty(SendAsyncProvider.prototype, 'getBalance', function(address, blockNumber) {
123-
address = SigningKey.getAddress(address);
124-
return postProcess(this.client, 'eth_getBalance', [address, validBlock(blockNumber)], true);
122+
return postProcess(this.client, 'eth_getBalance', [
123+
utils.getAddress(address),
124+
validBlock(blockNumber)
125+
], true);
125126
});
126127

127128
utils.defineProperty(SendAsyncProvider.prototype, 'getTransactionCount', function(address, blockNumber) {
128-
address = SigningKey.getAddress(address);
129-
return postProcess(this.client, 'eth_getTransactionCount', [address, validBlock(blockNumber)], false);
129+
return postProcess(this.client, 'eth_getTransactionCount', [
130+
utils.getAddress(address),
131+
validBlock(blockNumber)
132+
], false);
130133
});
131134

132135
utils.defineProperty(SendAsyncProvider.prototype, 'getGasPrice', function() {
@@ -260,14 +263,14 @@ function EtherscanProvider(options) {
260263
utils.defineProperty(providers, 'EtherscanProvider', EtherscanProvider);
261264

262265
utils.defineProperty(EtherscanProvider.prototype, 'getBalance', function(address, blockNumber) {
263-
address = SigningKey.getAddress(address);
266+
address = utils.getAddress(address);
264267
blockNumber = validBlock(blockNumber);
265268
var query = ('module=account&action=balance&address=' + address + '&tag=' + blockNumber);
266269
return this._send(query, base10ToBN);
267270
});
268271

269272
utils.defineProperty(EtherscanProvider.prototype, 'getTransactionCount', function(address, blockNumber) {
270-
address = SigningKey.getAddress(address);
273+
address = utils.getAddress(address);
271274
blockNumber = validBlock(blockNumber);
272275
var query = ('module=proxy&action=eth_getTransactionCount&address=' + address + '&tag=' + blockNumber);
273276
return this._send(query, hexToNumber);
@@ -285,15 +288,15 @@ utils.defineProperty(EtherscanProvider.prototype, 'sendTransaction', function(si
285288
});
286289

287290
utils.defineProperty(EtherscanProvider.prototype, 'call', function(transaction) {
288-
var address = SigningKey.getAddress(transaction.to);
291+
var address = utils.getAddress(transaction.to);
289292
var data = transaction.data;
290293
if (!utils.isHexString(data)) { throw new Error('invalid data'); }
291294
var query = ('module=proxy&action=eth_call&to=' + address + '&data=' + data);
292295
return this._send(query, ensureHex);
293296
});
294297

295298
utils.defineProperty(EtherscanProvider.prototype, 'estimateGas', function(transaction) {
296-
var address = SigningKey.getAddress(transaction.to);
299+
var address = utils.getAddress(transaction.to);
297300

298301
var query = 'module=proxy&action=eth_estimateGas&to=' + address;
299302
if (transaction.gasPrice) {
@@ -303,7 +306,7 @@ utils.defineProperty(EtherscanProvider.prototype, 'estimateGas', function(transa
303306
query += '&gas=' + utils.hexlify(transaction.gasLimit);
304307
}
305308
if (transaction.from) {
306-
query += '&from=' + SigningKey.getAddress(transaction.from);
309+
query += '&from=' + utils.getAddress(transaction.from);
307310
}
308311
if (transaction.data) {
309312
query += '&data=' + ensureHex(transaction.data);

lib/secret-storage.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ utils.defineProperty(secretStorage, 'decryptCrowdsale', function(json, password)
8282
var data = JSON.parse(json);
8383

8484
// Ethereum Address
85-
var ethaddr = SigningKey.getAddress(searchPath(data, 'ethaddr'));
85+
var ethaddr = utils.getAddress(searchPath(data, 'ethaddr'));
8686

8787
// Encrypted Seed
8888
var encseed = new Buffer(searchPath(data, 'encseed'), 'hex');
@@ -203,7 +203,7 @@ utils.defineProperty(secretStorage, 'decrypt', function(json, password, progress
203203
}
204204

205205
var signingKey = new SigningKey(privateKey);
206-
if (signingKey.address !== SigningKey.getAddress(data.address)) {
206+
if (signingKey.address !== utils.getAddress(data.address)) {
207207
reject(new Error('address mismatch'));
208208
return;
209209
}

lib/signing-key.js

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -7,98 +7,6 @@ var utils = require('./utils.js');
77
var secp256k1 = new (elliptic.ec)('secp256k1');
88

99

10-
function getChecksumAddress(address) {
11-
if (typeof(address) !== 'string' || !address.match(/^0x[0-9A-Fa-f]{40}$/)) {
12-
throw new Error('invalid address');
13-
}
14-
15-
address = address.substring(2).toLowerCase();
16-
var hashed = utils.sha3(address);
17-
18-
address = address.split('');
19-
for (var i = 0; i < 40; i += 2) {
20-
if ((hashed[i >> 1] >> 4) >= 8) {
21-
address[i] = address[i].toUpperCase();
22-
}
23-
if ((hashed[i >> 1] & 0x0f) >= 8) {
24-
address[i + 1] = address[i + 1].toUpperCase();
25-
}
26-
}
27-
28-
return '0x' + address.join('');
29-
}
30-
31-
function getAddress(address) {
32-
var result = null;
33-
34-
if (typeof(address) !== 'string') { throw new Error('invalid address'); }
35-
36-
if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {
37-
38-
// Missing the 0x prefix
39-
if (address.substring(0, 2) !== '0x') { address = '0x' + address; }
40-
41-
result = getChecksumAddress(address);
42-
43-
// It is a checksummed address with a bad checksum
44-
if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) {
45-
throw new Error('invalid address checksum');
46-
}
47-
48-
// Maybe ICAP? (we only support direct mode)
49-
} else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {
50-
51-
// It is an ICAP address with a bad checksum
52-
if (address.substring(2, 4) !== ibanChecksum(address)) {
53-
throw new Error('invalid address icap checksum');
54-
}
55-
56-
result = (new utils.BN(address.substring(4), 36)).toString(16);
57-
while (result.length < 40) { result = '0' + result; }
58-
result = getChecksumAddress('0x' + result);
59-
60-
} else {
61-
throw new Error('invalid address');
62-
}
63-
64-
return result;
65-
}
66-
67-
// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number
68-
var ibanChecksum = (function() {
69-
70-
// Create lookup table
71-
var ibanLookup = {};
72-
for (var i = 0; i < 10; i++) { ibanLookup[String(i)] = String(i); }
73-
for (var i = 0; i < 26; i++) { ibanLookup[String.fromCharCode(65 + i)] = String(10 + i); }
74-
75-
// How many decimal digits can we process? (for 64-bit float, this is 15)
76-
var safeDigits = Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));
77-
78-
return function(address) {
79-
address = address.toUpperCase();
80-
address = address.substring(4) + address.substring(0, 2) + '00';
81-
82-
var expanded = address.split('');
83-
for (var i = 0; i < expanded.length; i++) {
84-
expanded[i] = ibanLookup[expanded[i]];
85-
}
86-
expanded = expanded.join('');
87-
88-
// Javascript can handle integers safely up to 15 (decimal) digits
89-
while (expanded.length >= safeDigits){
90-
var block = expanded.substring(0, safeDigits);
91-
expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);
92-
}
93-
94-
var checksum = String(98 - (parseInt(expanded, 10) % 97));
95-
while (checksum.length < 2) { checksum = '0' + checksum; }
96-
97-
return checksum;
98-
};
99-
})();
100-
101-
10210
function SigningKey(privateKey) {
10311
if (!(this instanceof SigningKey)) { throw new Error('missing new'); }
10412

@@ -112,22 +20,13 @@ function SigningKey(privateKey) {
11220
var keyPair = secp256k1.keyFromPrivate(privateKey);
11321
var publicKey = (new Buffer(keyPair.getPublic(false, 'hex'), 'hex')).slice(1);
11422

115-
var address = getAddress(utils.sha3(publicKey).slice(12).toString('hex'));
23+
var address = utils.getAddress(utils.sha3(publicKey).slice(12).toString('hex'));
11624
utils.defineProperty(this, 'address', address)
11725

11826
utils.defineProperty(this, 'signDigest', function(digest) {
11927
return keyPair.sign(digest, {canonical: true});
12028
});
12129
}
12230

123-
utils.defineProperty(SigningKey, 'getAddress', getAddress);
124-
125-
utils.defineProperty(SigningKey, 'getIcapAddress', function(address) {
126-
address = getAddress(address).substring(2);
127-
var base36 = (new utils.BN(address, 16)).toString(36).toUpperCase();
128-
while (base36.length < 30) { base36 = '0' + base36; }
129-
return 'XE' + ibanChecksum('XE00' + base36) + base36;
130-
});
131-
13231

13332
module.exports = SigningKey;

lib/utils.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,105 @@ function defineProperty(object, name, value) {
213213
});
214214
}
215215

216+
function getChecksumAddress(address) {
217+
if (typeof(address) !== 'string' || !address.match(/^0x[0-9A-Fa-f]{40}$/)) {
218+
throw new Error('invalid address');
219+
}
220+
221+
address = address.substring(2).toLowerCase();
222+
var hashed = sha3(address);
223+
224+
address = address.split('');
225+
for (var i = 0; i < 40; i += 2) {
226+
if ((hashed[i >> 1] >> 4) >= 8) {
227+
address[i] = address[i].toUpperCase();
228+
}
229+
if ((hashed[i >> 1] & 0x0f) >= 8) {
230+
address[i + 1] = address[i + 1].toUpperCase();
231+
}
232+
}
233+
234+
return '0x' + address.join('');
235+
}
236+
237+
function getAddress(address) {
238+
var result = null;
239+
240+
if (typeof(address) !== 'string') { throw new Error('invalid address'); }
241+
242+
if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {
243+
244+
// Missing the 0x prefix
245+
if (address.substring(0, 2) !== '0x') { address = '0x' + address; }
246+
247+
result = getChecksumAddress(address);
248+
249+
// It is a checksummed address with a bad checksum
250+
if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) {
251+
throw new Error('invalid address checksum');
252+
}
253+
254+
// Maybe ICAP? (we only support direct mode)
255+
} else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {
256+
257+
// It is an ICAP address with a bad checksum
258+
if (address.substring(2, 4) !== ibanChecksum(address)) {
259+
throw new Error('invalid address icap checksum');
260+
}
261+
262+
result = (new BN(address.substring(4), 36)).toString(16);
263+
while (result.length < 40) { result = '0' + result; }
264+
result = getChecksumAddress('0x' + result);
265+
266+
} else {
267+
throw new Error('invalid address');
268+
}
269+
270+
return result;
271+
}
272+
273+
// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number
274+
var ibanChecksum = (function() {
275+
276+
// Create lookup table
277+
var ibanLookup = {};
278+
for (var i = 0; i < 10; i++) { ibanLookup[String(i)] = String(i); }
279+
for (var i = 0; i < 26; i++) { ibanLookup[String.fromCharCode(65 + i)] = String(10 + i); }
280+
281+
// How many decimal digits can we process? (for 64-bit float, this is 15)
282+
var safeDigits = Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));
283+
284+
return function(address) {
285+
address = address.toUpperCase();
286+
address = address.substring(4) + address.substring(0, 2) + '00';
287+
288+
var expanded = address.split('');
289+
for (var i = 0; i < expanded.length; i++) {
290+
expanded[i] = ibanLookup[expanded[i]];
291+
}
292+
expanded = expanded.join('');
293+
294+
// Javascript can handle integers safely up to 15 (decimal) digits
295+
while (expanded.length >= safeDigits){
296+
var block = expanded.substring(0, safeDigits);
297+
expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);
298+
}
299+
300+
var checksum = String(98 - (parseInt(expanded, 10) % 97));
301+
while (checksum.length < 2) { checksum = '0' + checksum; }
302+
303+
return checksum;
304+
};
305+
})();
306+
307+
308+
function getIcapAddress(address) {
309+
address = getAddress(address).substring(2);
310+
var base36 = (new BN(address, 16)).toString(36).toUpperCase();
311+
while (base36.length < 30) { base36 = '0' + base36; }
312+
return 'XE' + ibanChecksum('XE00' + base36) + base36;
313+
}
314+
216315
function cloneObject(object) {
217316
var clone = {};
218317
for (var key in object) { clone[key] = object[key]; }
@@ -275,6 +374,9 @@ module.exports = {
275374

276375
defineProperty: defineProperty,
277376

377+
getAddress: getAddress,
378+
getIcapAddress: getIcapAddress,
379+
278380
cloneObject: cloneObject,
279381

280382
bnToBuffer: bnToBuffer,

lib/wallet.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ utils.defineProperty(Wallet.prototype, 'sendTransaction', function(transaction)
205205
});
206206

207207
utils.defineProperty(Wallet.prototype, 'send', function(address, amountWei, options) {
208-
address = SigningKey.getAddress(address);
208+
address = utils.getAddress(address);
209209
if (utils.BN.isBN(amountWei)) {
210210
amountWei = '0x' + utils.bnToBuffer(amountWei).toString('hex');
211211
}
@@ -226,10 +226,6 @@ utils.defineProperty(Wallet.prototype, 'getContract', function(address, abi) {
226226
return new Contract(this, address, new Contract.Interface(abi));
227227
});
228228

229-
230-
utils.defineProperty(Wallet, 'getAddress', SigningKey.getAddress);
231-
utils.defineProperty(Wallet, 'getIcapAddress', SigningKey.getIcapAddress);
232-
233229
utils.defineProperty(Wallet, '_Contract', Contract);
234230

235231
module.exports = Wallet;

0 commit comments

Comments
 (0)