/* This file is part of web3.js. web3.js is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. web3.js is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3.js. If not, see . */ import { Web3Context } from 'web3-core'; import { Address, EthPersonalAPI, HexString, Transaction } from 'web3-types'; import * as rpcWrappers from './rpc_method_wrappers.js'; export class Personal extends Web3Context { /** *Returns a list of accounts the node controls by using the provider and calling the RPC method personal_listAccounts. Using `web3.eth.accounts.create()` will not add accounts into this list. For that use `web3.eth.personal.newAccount()`. * @returns - An array of addresses controlled by the node. * @example * ```ts * const accounts = await personal.getAccounts(); * console.log(accounts); * > * [ * '0x79D7BbaC53C9aF700d0B250e9AE789E503Fcd6AE', * '0xe2597eB05CF9a87eB1309e86750C903EC38E527e', * '0x7eD0e85B8E1E925600B4373e6d108F34AB38a401', * '0xE4bEEf667408b99053dC147Ed19592aDa0d77F59', * '0x7AB80aeB6bb488B7f6c41c58e83Ef248eB39c882', * '0x12B1D9d74d73b1C3A245B19C1C5501c653aF1af9', * '0x1a6075A263Ee140e00Dbf8E374Fc5A443d097894', * '0x4FEC0A51024B13030D26E70904B066C6d41157A5', * '0x03095dc4857BB26f3a4550c5651Df8b7f6b6B1Ef', * '0xac0B9b6e8A17991cb172B2ABAF45Fb5eb769E540' * ] * ``` */ public async getAccounts() { return rpcWrappers.getAccounts(this.requestManager); } /** * Creates a new account and returns its address. * **_NOTE:_** This function sends a sensitive information like password. Never call this function over a unsecured Websocket or HTTP provider, as your password will be sent in plain text! * @param password - The password to encrypt the account with. * @returns - The address of the new account. * @example * ```ts * const addr = await web3.eth.personal.newAccount('password'); * console.log(addr); * > '0x1234567891011121314151617181920212223456' * ``` */ public async newAccount(password: string) { return rpcWrappers.newAccount(this.requestManager, password); } /** * Unlocks an account for a given duration. * @param address - The address of the account to unlock. * @param password - The password of the account to unlock. * @param unlockDuration - The duration in seconds to unlock the account for. * @example * ```ts * await personal.unlockAccount( * "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", * "123456", * 600 * ); * ``` */ public async unlockAccount(address: Address, password: string, unlockDuration: number) { return rpcWrappers.unlockAccount(this.requestManager, address, password, unlockDuration); } /** * Locks the given account * @param address - The address of the account to lock. * @returns - `true` if the account was locked, otherwise `false`. * @example * ```ts * await personal.lockAccount( * "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e" * ); */ public async lockAccount(address: Address) { return rpcWrappers.lockAccount(this.requestManager, address); } /** * Imports the given private key into the key store, encrypting it with the passphrase. * @param keyData - An unencrypted private key (hex string). * @param passphrase - The password of the account * @returns - The address of the new account. * @example * ```ts * const accountAddress = await personal.importRawKey( * "abe40cb08850da918ee951b237fa87946499b2d8643e4aa12b0610b050c731f6", * "123456" * ); * * console.log(unlockTx); * > 0x8727a8b34ec833154b72b62cac05d69f86eb6556 * ``` */ public async importRawKey(keyData: HexString, passphrase: string) { return rpcWrappers.importRawKey(this.requestManager, keyData, passphrase); } /** * This method sends a transaction over the management API. * **_NOTE:_** Sending your account password over an unsecured HTTP RPC connection is highly unsecure. * @param tx - The transaction options * @param passphrase - The passphrase of the current account * @returns - The transaction hash * @example * ```ts * const txHash = personal * .sendTransaction({ * from: "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", * gasPrice: "20000000000", * gas: "21000", * to: "0x3535353535353535353535353535353535353535", * value: "1000000", * data: "", * nonce: 0, * }, * "123456"); * * console.log(txHash); * > 0x9445325c3c5638c9fe425b003b8c32f03e9f99d409555a650a6838ba712bb51b * ``` */ public async sendTransaction(tx: Transaction, passphrase: string) { return rpcWrappers.sendTransaction(this.requestManager, tx, passphrase); } /** * Signs a transaction. This account needs to be unlocked. * **_NOTE:_** Sending your account password over an unsecured HTTP RPC connection is highly unsecure. * @param tx - The transaction data to sign. See {@link sendTransaction} for more information. * @param passphrase - The password of the `from` account, to sign the transaction with. * @returns - The RLP encoded transaction. The `raw` property can be used to send the transaction using {@link sendSignedTransaction}. * @example * ```ts * const tx = personal * .signTransaction({ * from: "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", * gasPrice: "20000000000", * gas: "21000", * to: "0x3535353535353535353535353535353535353535", * value: "1000000000000000000", * data: "", * nonce: 0, * }, * "123456"); * * console.log(tx); * * > { * raw: '0xf86e808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a764000080820a95a0c951c03238fe930e6e69ab9d6af9f29248a514048e44884f0e60c4de40de3526a038b71399bf0c8925749ab79e91ce6cd2fc068c84c18ff6a197b48c4cbef01e00', * tx: { * type: '0x0', * nonce: '0x0', * gasPrice: '0x4a817c800', * maxPriorityFeePerGas: null, * maxFeePerGas: null, * gas: '0x5208', * value: '0xde0b6b3a7640000', * input: '0x', * v: '0xa95', * r: '0xc951c03238fe930e6e69ab9d6af9f29248a514048e44884f0e60c4de40de3526', * s: '0x38b71399bf0c8925749ab79e91ce6cd2fc068c84c18ff6a197b48c4cbef01e00', * to: '0x3535353535353535353535353535353535353535', * hash: '0x65e3df790ab2a32068b13cff970b26445b8995229ae4abbed61bd996f09fce69' * } * } * ``` */ public async signTransaction(tx: Transaction, passphrase: string) { return rpcWrappers.signTransaction(this.requestManager, tx, passphrase); } /** * Calculates an Ethereum specific signature with: * sign(keccak256("\x19Ethereum Signed Message:\n" + dataToSign.length + dataToSign))) * Adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature. * * If you have the original message and the signed message, you can discover the signing account address using web3.eth.personal.ecRecover * **_NOTE:_** Sending your account password over an unsecured HTTP RPC connection is highly unsecure. * @param data - The data to sign. * @param address - The address to sign with. * @param passphrase - The passphrase to decrypt the account with. * @returns - The signature. * @example * ```ts * const sig = await personal .sign("Hello world", "0x0D4Aa485ECbC499c70860fEb7e5AaeAf5fd8172E", "123456") * console.log(sig) * > 0x5d21d01b3198ac34d0585a9d76c4d1c8123e5e06746c8962318a1c08ffb207596e6fce4a6f377b7c0fc98c5f646cd73438c80e8a1a95cbec55a84c2889dca0301b * ``` */ public async sign(data: HexString, address: Address, passphrase: string) { return rpcWrappers.sign(this.requestManager, data, address, passphrase); } /** * Recovers the account that signed the data. * @param signedData - Data that was signed. If String it will be converted using {@link utf8ToHex} * @param signature - The signature * @returns - The address of the account that signed the data. * @example * ```ts * const address = await personal.ecRecover( * "Hello world", * "0x5d21d01b3198ac34d0585a9d76c4d1c8123e5e06746c8962318a1c08ffb207596e6fce4a6f377b7c0fc98c5f646cd73438c80e8a1a95cbec55a84c2889dca0301b" * ); * console.log(address); * > 0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e * ``` */ public async ecRecover(signedData: HexString, signature: string) { return rpcWrappers.ecRecover(this.requestManager, signedData, signature); } }