UNPKG

@okxweb3/coin-ethereum

Version:

An Ethereum SDK for building Web3 wallets and applications.

154 lines 7.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validSignedTransaction = exports.getSignHash = exports.getSignedTransaction = exports.getMPCSignedMessage = exports.getMPCTransaction = exports.verifyMessage = exports.signMPCMessage = exports.signMessage = exports.signTransaction = exports.validAddress = exports.validPrivateKey = exports.getNewAddress = void 0; const crypto_lib_1 = require("@okxweb3/crypto-lib"); const coin_base_1 = require("@okxweb3/coin-base"); const sdk_1 = require("./lib/sdk"); const message_1 = require("./message"); const eth_sig_util_1 = require("./lib/sdk/eth-sig-util"); const eth_sig_util_2 = require("@metamask/eth-sig-util"); function getNewAddress(privateKeyHex) { if (!validPrivateKey(privateKeyHex)) { throw new Error('invalid key'); } const privateKey = coin_base_1.base.fromHex(privateKeyHex); const publicKey = (0, sdk_1.privateToPublicRaw)(privateKey); const address = (0, sdk_1.publicToAddress)(publicKey.slice(1)); return { address: coin_base_1.base.toHex(address, true), publicKey: coin_base_1.base.toHex(publicKey, true), }; } exports.getNewAddress = getNewAddress; function validPrivateKey(privateKeyHex) { if (!coin_base_1.base.validateHexString(privateKeyHex)) { return false; } const privateKey = coin_base_1.base.fromHex(privateKeyHex.toLowerCase()); if (privateKey.length != 32 || privateKey.every((byte) => byte === 0)) { return false; } return true; } exports.validPrivateKey = validPrivateKey; function validAddress(address) { let checksumAddress = ''; const isValid = (0, sdk_1.isValidAddress)(address); checksumAddress = (0, sdk_1.toChecksumAddress)(address); return { isValid: isValid, address: checksumAddress, }; } exports.validAddress = validAddress; function signTransaction(privateKeyHex, txData) { const tx = sdk_1.TransactionFactory.fromTxData(txData); if (!privateKeyHex) { return { raw: coin_base_1.base.toHex(Buffer.from(JSON.stringify(txData))), hash: coin_base_1.base.toHex(tx.getMessageToSign(true)), serializeRaw: coin_base_1.base.toHex(tx.serialize()), }; } const privateKey = coin_base_1.base.fromHex(privateKeyHex); const signedTx = tx.sign(privateKey); return coin_base_1.base.toHex(signedTx.serialize(), true); } exports.signTransaction = signTransaction; function signMessage(messageType, message, privateKey) { if (!privateKey) { return signMPCMessage(messageType, message); } if (messageType == message_1.MessageTypes.TYPE_DATA_V1) { return (0, eth_sig_util_2.signTypedData)({ privateKey: privateKey, data: JSON.parse(message), version: eth_sig_util_1.SignTypedDataVersion.V1, }); } else if (messageType == message_1.MessageTypes.TYPE_DATA_V3) { return (0, eth_sig_util_2.signTypedData)({ privateKey: privateKey, data: JSON.parse(message), version: eth_sig_util_1.SignTypedDataVersion.V3, }); } else if (messageType == message_1.MessageTypes.TYPE_DATA_V4) { return (0, eth_sig_util_2.signTypedData)({ privateKey: privateKey, data: JSON.parse(message), version: eth_sig_util_1.SignTypedDataVersion.V4, }); } const msgHash = (0, message_1.hashMessage)(messageType, message); const { v, r, s } = (0, sdk_1.ecdsaSign)(coin_base_1.base.fromHex(msgHash), privateKey); return (0, sdk_1.makeSignature)(v, r, s); } exports.signMessage = signMessage; function signMPCMessage(messageType, message) { if (messageType == message_1.MessageTypes.TYPE_DATA_V1) { return (0, eth_sig_util_2.typedSignatureHash)(JSON.parse(message)); } else if (messageType == message_1.MessageTypes.TYPE_DATA_V3) { return coin_base_1.base.toHex(eth_sig_util_2.TypedDataUtils.eip712Hash(JSON.parse(message), eth_sig_util_1.SignTypedDataVersion.V3)); } else if (messageType == message_1.MessageTypes.TYPE_DATA_V4) { return coin_base_1.base.toHex(eth_sig_util_2.TypedDataUtils.eip712Hash(JSON.parse(message), eth_sig_util_1.SignTypedDataVersion.V4)); } return (0, message_1.hashMessage)(messageType, message); } exports.signMPCMessage = signMPCMessage; function verifyMessage(messageType, message, signature) { const msgHash = (0, message_1.hashMessage)(messageType, message); const [r, s, v] = [ signature.slice(0, 32), signature.slice(32, 64), signature[64], ]; return (0, sdk_1.recoverFromSignature)(coin_base_1.base.fromHex(msgHash), v, r, s); } exports.verifyMessage = verifyMessage; function getMPCTransaction(raw, sig, publicKey) { let tx = sdk_1.TransactionFactory.fromTxData(JSON.parse(coin_base_1.base.fromHex(raw).toString())); const msgHash = tx.getMessageToSign(true); const signature = coin_base_1.base.fromHex(sig); const r = signature.slice(0, 32); const s = signature.slice(32, 64); const v = crypto_lib_1.signUtil.secp256k1.getV(msgHash, coin_base_1.base.toHex(r), coin_base_1.base.toHex(s), coin_base_1.base.fromHex(publicKey)); tx = tx.processSignature(v + 27, r, s); return coin_base_1.base.toHex(tx.serialize(), true); } exports.getMPCTransaction = getMPCTransaction; function getMPCSignedMessage(hash, sig, publicKey) { const signature = coin_base_1.base.fromHex(sig); const r = signature.slice(0, 32); const s = signature.slice(32, 64); const v = crypto_lib_1.signUtil.secp256k1.getV(coin_base_1.base.fromHex(hash), coin_base_1.base.toHex(r), coin_base_1.base.toHex(s), coin_base_1.base.fromHex(publicKey)) + 27; return (0, sdk_1.makeSignature)(v, r, s); } exports.getMPCSignedMessage = getMPCSignedMessage; function getSignedTransaction(raw, r, s, v) { let tx = sdk_1.TransactionFactory.fromSerializedData(coin_base_1.base.fromHex(raw)); tx = tx.processSignatureWithRawV(parseInt(v, 16), coin_base_1.base.fromHex(r), coin_base_1.base.fromHex(s)); return coin_base_1.base.toHex(tx.serialize(), true); } exports.getSignedTransaction = getSignedTransaction; function getSignHash(raw) { let tx = sdk_1.TransactionFactory.fromSerializedData(coin_base_1.base.fromHex(raw)); return coin_base_1.base.toHex(tx.getMessageToSign(true)); } exports.getSignHash = getSignHash; function validSignedTransaction(tx, chainId, publicKey) { const signedTx = sdk_1.TransactionFactory.fromSerializedData(coin_base_1.base.fromHex(tx), chainId); const msgHash = signedTx.getMessageToSign(true); const rStr = (0, eth_sig_util_1.padWithZeroes)(coin_base_1.base.toHex(signedTx.r.toArrayLike(Buffer)), 64); const sStr = (0, eth_sig_util_1.padWithZeroes)(coin_base_1.base.toHex(signedTx.s.toArrayLike(Buffer)), 64); const rs = coin_base_1.base.fromHex(rStr.concat(sStr)); if (publicKey && !crypto_lib_1.signUtil.secp256k1.verifyWithNoRecovery(msgHash, rs, coin_base_1.base.fromHex(publicKey))) { return new Error('signature error'); } return signedTx; } exports.validSignedTransaction = validSignedTransaction; //# sourceMappingURL=api.js.map