cipher-ethereum
Version:
An Ethereum library used by Cipher Browser, a mobile Ethereum client
86 lines (80 loc) • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Address = undefined;
var _js = require('keccak/js');
var _js2 = _interopRequireDefault(_js);
var _util = require('./util');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Address = /** @class */function () {
function Address(publicKey) {
this._publicKey = (0, _util.decompressPublicKey)(publicKey);
}
Address.from = function (publicKey) {
return new Address(publicKey);
};
Address.checksumAddress = function (address) {
var addrLowerCase = address.toLowerCase();
if (!Address.isValid(addrLowerCase)) {
throw new Error('invalid address');
}
var addr = addrLowerCase.startsWith('0x') ? addrLowerCase.slice(2) : addrLowerCase;
var hash = (0, _js2.default)('keccak256').update(addr, 'ascii').digest('hex');
var newAddr = '0x';
for (var i = 0; i < addr.length; i++) {
if (hash[i] >= '8') {
newAddr += addr[i].toUpperCase();
} else {
newAddr += addr[i];
}
}
return newAddr;
};
Address.isValid = function (address) {
var addr = address.match(/^0[xX]/) ? address.slice(2) : address;
if (addr.length !== 40) {
return false;
}
if (addr.match(/[0-9a-f]{40}/) || addr.match(/[0-9A-F]{40}/)) {
return true;
}
var checksumAddress;
try {
checksumAddress = Address.checksumAddress(addr);
} catch (_err) {
return false;
}
return addr === checksumAddress.slice(2);
};
Object.defineProperty(Address.prototype, "publicKey", {
get: function () {
return this._publicKey;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Address.prototype, "rawAddress", {
get: function () {
if (!this._rawAddress) {
this._rawAddress = (0, _js2.default)('keccak256').update(this._publicKey.slice(1)).digest().slice(-20);
}
return this._rawAddress;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Address.prototype, "address", {
get: function () {
if (!this._address) {
var rawAddress = this.rawAddress.toString('hex');
this._address = Address.checksumAddress(rawAddress);
}
return this._address;
},
enumerable: false,
configurable: true
});
return Address;
}();
exports.Address = Address;