openethereum/js/src/api/rpc/parity/parity.js

598 lines
14 KiB
JavaScript
Raw Normal View History

// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity 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 General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import { inAddress, inAddresses, inBlockNumber, inData, inDeriveHash, inDeriveIndex, inHex, inNumber16, inOptions } from '../../format/input';
import { outAccountInfo, outAddress, outAddresses, outBlock, outChainStatus, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeers, outRecentDapps, outTransaction, outVaultMeta } from '../../format/output';
export default class Parity {
constructor (transport) {
this._transport = transport;
}
acceptNonReservedPeers () {
return this._transport
.execute('parity_acceptNonReservedPeers');
}
accountsInfo () {
return this._transport
.execute('parity_accountsInfo')
.then(outAccountInfo);
}
allAccountsInfo () {
return this._transport
.execute('parity_allAccountsInfo')
.then(outAccountInfo);
}
addReservedPeer (enode) {
return this._transport
.execute('parity_addReservedPeer', enode);
}
call (requests, blockNumber = 'latest') {
return this._transport
.execute(
'parity_call',
requests.map((options) => inOptions(options)),
inBlockNumber(blockNumber)
);
}
chainStatus () {
return this._transport
.execute('parity_chainStatus')
.then(outChainStatus);
}
changePassword (account, password, newPassword) {
return this._transport
.execute('parity_changePassword', inAddress(account), password, newPassword);
}
changeVault (account, vaultName) {
return this._transport
.execute('parity_changeVault', inAddress(account), vaultName);
}
changeVaultPassword (vaultName, password) {
return this._transport
.execute('parity_changeVaultPassword', vaultName, password);
}
checkRequest (requestId) {
return this._transport
.execute('parity_checkRequest', inNumber16(requestId));
}
cidV0 (data) {
return this._transport
.execute('parity_cidV0', inData(data));
}
closeVault (vaultName) {
return this._transport
.execute('parity_closeVault', vaultName);
}
composeTransaction (options) {
return this._transport
.execute('parity_composeTransaction', inOptions(options));
}
consensusCapability () {
return this._transport
.execute('parity_consensusCapability');
}
dappsList () {
return this._transport
.execute('parity_dappsList');
}
dappsRefresh () {
return this._transport
.execute('parity_dappsRefresh');
}
dappsUrl () {
return this._transport
.execute('parity_dappsUrl');
}
decryptMessage (address, data) {
return this._transport
.execute('parity_decryptMessage', inAddress(address), inHex(data));
}
defaultAccount () {
return this._transport
.execute('parity_defaultAccount')
.then(outAddress);
}
defaultExtraData () {
return this._transport
.execute('parity_defaultExtraData');
}
devLogs () {
return this._transport
.execute('parity_devLogs');
}
devLogsLevels () {
return this._transport
.execute('parity_devLogsLevels');
}
deriveAddressHash (address, password, hash, shouldSave) {
return this._transport
.execute('parity_deriveAddressHash', inAddress(address), password, inDeriveHash(hash), !!shouldSave)
.then(outAddress);
}
deriveAddressIndex (address, password, index, shouldSave) {
return this._transport
.execute('parity_deriveAddressIndex', inAddress(address), password, inDeriveIndex(index), !!shouldSave)
.then(outAddress);
}
dropNonReservedPeers () {
return this._transport
.execute('parity_dropNonReservedPeers');
}
enode () {
return this._transport
.execute('parity_enode');
}
encryptMessage (pubkey, data) {
return this._transport
.execute('parity_encryptMessage', inHex(pubkey), inHex(data));
}
executeUpgrade () {
return this._transport
.execute('parity_executeUpgrade');
}
exportAccount (address, password) {
return this._transport
.execute('parity_exportAccount', inAddress(address), password);
}
extraData () {
return this._transport
.execute('parity_extraData');
}
futureTransactions () {
return this._transport
.execute('parity_futureTransactions');
}
gasCeilTarget () {
return this._transport
.execute('parity_gasCeilTarget')
.then(outNumber);
}
gasFloorTarget () {
return this._transport
.execute('parity_gasFloorTarget')
.then(outNumber);
}
gasPriceHistogram () {
return this._transport
.execute('parity_gasPriceHistogram')
.then(outHistogram);
}
generateSecretPhrase () {
return this._transport
.execute('parity_generateSecretPhrase');
}
getBlockHeaderByNumber (blockNumber = 'latest') {
return this._transport
.execute('parity_getBlockHeaderByNumber', inBlockNumber(blockNumber))
.then(outBlock);
}
getDappAddresses (dappId) {
return this._transport
.execute('parity_getDappAddresses', dappId)
.then(outAddresses);
}
getDappDefaultAddress (dappId) {
return this._transport
.execute('parity_getDappDefaultAddress', dappId)
.then(outAddress);
}
getNewDappsAddresses () {
return this._transport
.execute('parity_getNewDappsAddresses')
.then((addresses) => addresses ? addresses.map(outAddress) : null);
}
getNewDappsDefaultAddress () {
return this._transport
.execute('parity_getNewDappsDefaultAddress')
.then(outAddress);
}
getVaultMeta (vaultName) {
return this._transport
.execute('parity_getVaultMeta', vaultName)
.then(outVaultMeta);
}
UI support for hardware wallets (#4539) * Add parity_hardwareAccountsInfo * Ledger Promise interface wrapper * Initial hardwarestore * Move ~/views/historyStore to ~/mobx * split scanLedger * test createEntry * Also scan via parity_hardwareAccountsInfo * Explanation for scanning options * react-intl-inify tooltips * add hwstore * Listen for hw walet updates * Return arrays from scanning * Readability * add u2f-api polyfill * check response.errorCode * Support hardware types in state.personal * Tooltips (to be split into sep. PR) * Tooltips support intl strings * FormattedMessage for strings to Tooltip * Fix TabBar tooltip display * signLedger * Use wallets as an object map * PendingForm -> FormattedMessage * Pending form doesn't render password for hardware * Groundwork for JS API signing * Show hardware accounts in list * Cleanup rendering conditions * Update RequestPending rendering tests (verification) * Tests for extended signer middleware * sign properly & handle response, error * Align outputs between Parity & Ledger u2f * Ledger returns checksummed addresses * Update ethereum-tx for EIP155 support * Update construction of tx * Updates after sanity checks (thanks @tomusdrw) * Allow display for disabled IdentityIcon * Disabled accounts * Disabled auto-disabling * Password button ebaled for hardware * Don't display password hint for hardware * Disable non-applicable options when not connected * Fix failing test * Confirmation via ledger (u2f) * Confirm on device message * Cleanups & support checks * Mark u2f as unsupported (until https) * rewording * Pass account & disabled flags * Render attach device message * Use isConnected for checking availability * Show hardware accounts in defaults list * Pass signerstore * Update u2f to correct version * remove debug u2f lib * Update test (prop name change) * Add ETC path (future work) * new Buffer -> Buffer.from (thanks @derhuerst)
2017-03-02 23:51:56 +01:00
hardwareAccountsInfo () {
return this._transport
.execute('parity_hardwareAccountsInfo')
.then(outHwAccountInfo);
}
Trezor Support (#6403) * Copy modal from keepkey branch and generalize The keepkey PinMatrix modal needs to be the same for Trezor, but we should probably try to keep it general since it can be used for both. * Add trezor communication code This is a result of much trial-and-error and a couple of dead-ends in how to communicate and wire everything up. Code here is still a bit WIP with lots of debug prints and stuff. The test works though, it is possible to sign a transaction. * Extend the basic lib to allow Trezor This is kind of ugly and needs some cleanup and generalization. I’ve just copy-pasted some things to bring in the trezor wallets. I’ve also had to add a lock to the USB API so that only one thing talks to the USB at once. * Add RPC plumbing needed We need to be able to get “locked” devices from the frontend to figure out if we’re going to display the PinMatrix or not. Then we need to be able to send a pin to a device. * Add logic to query backend for Trezor and display PinMatrix There’s a bug somewhere here because signing a transaction fails if you take too long to press the confirm button on the device. * Change back to paritytech branch As my fork has been merged in. * Converting spaces to tabs, as it should be * Incorporate correct handling of EIP-155 Turns out the Trezor was adjusting the v part of the signature, and we’re already doing that so it was done twice. * Some circular logic here that was incorrect BE-encoded U256 is almost the same as RLP encoded without the size-byte, except for <u8 sized values. What’s really done is BE-encoded U256 and then left-trimmed to the smallest size. Kind of obvious in hindsight. * Resolve issue where not clicking fast enough fails The device will not repeat a ButtonRequest when you read from it, so you need to have a blocking `read` for whatever amount of time that you want to give the user to click. You could also have a shorter timeout but keep retrying for some amount of time, but it would amount to the same thing. * Scan after pin entry to make accepting it faster * Remove ability to cancel pin request * Some slight cleanup * Probe for the correct HID Version to determine padding * Move the PinMatrix from Accounts to Application * Removing unused dependencies * Mistake in copying over stuff from keepkey branch * Simplify FormattedMessage * Move generated code to external crate * Remove ethcore-util dependency * Fix broken import in test This test is useless without a connected Trezor, not sure how to make it useful without one. * Merge branch 'master' into fh-4500-trezor-support # Conflicts: # rpc/src/v1/helpers/dispatch.rs * Ignore test that can't be run without trezor device * Fixing grumbles * Avoiding owning data in RPC method * Checking for overflow in v part of signature * s/network_id/chain_id * Propagating an error from the HID Api * Condensing code a little bit * Fixing UI. * Debugging trezor. * Minor styling tweak * Make message type into an actual type This makes the message type that the RPC message accepts into an actual type as opposed to just a string, based on feedback. Although I’m not 100% sure this has actually improved the situation. Overall I think the hardware wallet interface needs some refactoring love. * Split the trezor RPC endpoint It’s split into two more generic endpoints that should be suitable for any hardware wallets with the same behavior to sit behind. * Reflect RPC method split in javascript * Fix bug with pin entry * Fix deadlock for Ledger * Avoid having a USB lock in just listing locked wallets * Fix javascript issue (see #6509) * Replace Mutex with RwLock * Update Ledger test * Fix typo causing faulty signatures (sometimes) * *Actually* fix tests * Update git submodule Needed to make tests pass * Swap line orders to prevent possible deadlock * Make setPinMatrixRequest an @action
2017-09-14 19:28:43 +02:00
lockedHardwareAccountsInfo () {
return this._transport
.execute('parity_lockedHardwareAccountsInfo');
}
hardwarePinMatrixAck (path, pin) {
return this._transport
.execute('parity_hardwarePinMatrixAck', path, pin);
}
hashContent (url) {
return this._transport
.execute('parity_hashContent', url);
}
2016-11-17 10:15:11 +01:00
importGethAccounts (accounts) {
return this._transport
.execute('parity_importGethAccounts', inAddresses(accounts))
.then(outAddresses);
2016-11-17 10:15:11 +01:00
}
2016-11-22 15:52:23 +01:00
killAccount (account, password) {
return this._transport
.execute('parity_killAccount', inAddress(account), password);
}
listAccounts (count, offset = null, blockNumber = 'latest') {
return this._transport
.execute('parity_listAccounts', count, inAddress(offset), inBlockNumber(blockNumber))
.then((accounts) => (accounts || []).map(outAddress));
}
listOpenedVaults () {
return this._transport
.execute('parity_listOpenedVaults');
}
listVaults () {
return this._transport
.execute('parity_listVaults');
}
listRecentDapps () {
return this._transport
Home landing page (#4178) * Home entry point (basics) * WIP store for web * Add DappUrlInput component * Updated tests * WIP store update * Adjust styling * Add home tab * Collapse first/last without extra divs * Navigation actually navigates * styling * Encoding of ethlink.io URLs * encodedUrl setup * base58 encoded URLs * Added decoding, updated tests to Parity-compliant * Base32 (synced with Rust implementation via tests) * Split URL into 63 character chunks * Fix store test * Cleanups * s/ethlink/dapplink/ * Display app navigation & histroy * Start on /accounts (for now, until expanded fully) * Update tests * ethlink.io -> web3.site * Basic list layout * Store history on navigation * Show Accounts & Dapps * Add skeleton for DappIcon (WIP) * DappIcon WIP * DappIcon in place * Split into maneable sub-components * WIP * Tests for views/Home * Swap default entry-point to /home * Expose registry.get via lookupMeta * Add getEntry interface, fix instance retrieval (with tests) * Add news display component * Add tests for added contracts/registry methods * Fix GHH test refactoring * render news via SectionList * News items store directly * Images * News & Urls has new layout * Convert remainder * First run-through of MVP for SectionList * Update tests * Deploycontract should not override global p styles * Allow styles overrides for head & body * Adjust layout styling * revert Container>flex * Adjust sizes of history items * Cleanups * HistoryStore for tracking relevant routes * Default route is still /accounts * Fix tests * Update 2015-2017 * Add lookupMeta & tests * Add getEntry & tests * Split Dapp icon into ui/DappIcon * Update copyright dates * Encoding for *.web3.site urls * Dapp history retrieval * Grow to only 40% on hover * Update description * Add DappUrlInput component * Update Web views with store * Update spec description * Update spec description * edited url does not allow in-place store edits * Use /web/<hash> urls for iframe * Removed (now) unused _list.css * Mistamtched merge fixed * Tab split (WIP) * Split Tab component * Update tests after merge * typo * Remove background !important * Set item width to parent * Set width, remove overflow-x: hidden * Align hover overlays * Container defaults to some opacity * Display history from listRecentDapps * Override styles for a tags * Open URLs in new window when extension is available * Fix tests after update * AccountCard width 100% * Re-add opening correct url in tab * Cleanup link rendering * Remove hardcoded news URL * pre-merge * Extra padding at Home bottom (Pr grumble) * Match js-vaults stretch * s/Web Apps via URL/Web Apps/ (PR grumble) * Store recent wallets (PR grumble) * Simplify inline style matching (PR comment) * Add store for new retrieval * Add missing observer * Auto-link based on account type * Fix UI overlaps * Extra spacing * Only show account when accountInfo is available * Align timestamp line-heights * Fix tests * Update tests * Really fix failing test (check for Connect(Account))
2017-02-14 08:29:32 +01:00
.execute('parity_listRecentDapps')
.then(outRecentDapps);
}
listStorageKeys (address, count, hash = null, blockNumber = 'latest') {
return this._transport
.execute('parity_listStorageKeys', inAddress(address), count, inHex(hash), inBlockNumber(blockNumber));
}
2016-12-07 16:53:46 +01:00
removeAddress (address) {
return this._transport
.execute('parity_removeAddress', inAddress(address));
}
listGethAccounts () {
return this._transport
.execute('parity_listGethAccounts')
.then(outAddresses);
}
2016-11-17 10:15:11 +01:00
localTransactions () {
return this._transport
2016-11-17 10:15:11 +01:00
.execute('parity_localTransactions')
.then(transactions => {
Object.values(transactions)
.filter(tx => tx.transaction)
2016-11-17 14:00:53 +01:00
.map(tx => {
tx.transaction = outTransaction(tx.transaction);
});
2016-11-17 10:15:11 +01:00
return transactions;
});
}
minGasPrice () {
return this._transport
.execute('parity_minGasPrice')
.then(outNumber);
}
mode () {
return this._transport
.execute('parity_mode');
}
// DEPRECATED - use chain instead.
netChain () {
return this._transport
.execute('parity_chain');
}
nodeKind () {
return this._transport
.execute('parity_nodeKind')
.then(outNodeKind);
}
chain () {
return this._transport
.execute('parity_chain');
}
netPeers () {
return this._transport
.execute('parity_netPeers')
.then(outPeers);
}
netMaxPeers () {
return this._transport
.execute('parity_netMaxPeers')
.then(outNumber);
}
netPort () {
return this._transport
.execute('parity_netPort')
.then(outNumber);
}
newAccountFromPhrase (phrase, password) {
return this._transport
.execute('parity_newAccountFromPhrase', phrase, password)
.then(outAddress);
}
newAccountFromSecret (secret, password) {
return this._transport
.execute('parity_newAccountFromSecret', inHex(secret), password)
.then(outAddress);
}
newAccountFromWallet (json, password) {
return this._transport
.execute('parity_newAccountFromWallet', json, password)
.then(outAddress);
}
newVault (vaultName, password) {
return this._transport
.execute('parity_newVault', vaultName, password);
}
nextNonce (account) {
return this._transport
.execute('parity_nextNonce', inAddress(account))
.then(outNumber);
}
nodeHealth () {
return this._transport
.execute('parity_nodeHealth');
}
nodeName () {
return this._transport
.execute('parity_nodeName');
}
openVault (vaultName, password) {
return this._transport
.execute('parity_openVault', vaultName, password);
}
2016-11-17 10:15:11 +01:00
pendingTransactions () {
return this._transport
.execute('parity_pendingTransactions')
.then(data => data.map(outTransaction));
}
pendingTransactionsStats () {
return this._transport
.execute('parity_pendingTransactionsStats');
}
phraseToAddress (phrase) {
return this._transport
.execute('parity_phraseToAddress', phrase)
.then(outAddress);
}
postSign (address, hash) {
return this._transport
.execute('parity_postSign', inAddress(address), inHex(hash));
}
postTransaction (options = {}) {
return this._transport
.execute('parity_postTransaction', inOptions(options));
}
registryAddress () {
return this._transport
.execute('parity_registryAddress')
.then(outAddress);
}
releasesInfo () {
return this._transport
.execute('parity_releasesInfo');
}
removeReservedPeer (enode) {
return this._transport
.execute('parity_removeReservedPeer', enode);
}
removeTransaction (hash) {
return this._transport
.execute('parity_removeTransaction', inHex(hash))
.then(outTransaction);
}
rpcSettings () {
return this._transport
.execute('parity_rpcSettings');
}
setAccountName (address, name) {
return this._transport
.execute('parity_setAccountName', inAddress(address), name);
}
setAccountMeta (address, meta) {
return this._transport
.execute('parity_setAccountMeta', inAddress(address), JSON.stringify(meta));
}
setAuthor (address) {
return this._transport
.execute('parity_setAuthor', inAddress(address));
}
setDappAddresses (dappId, addresses) {
return this._transport
.execute('parity_setDappAddresses', dappId, inAddresses(addresses));
}
setDappDefaultAddress (dappId, address) {
return this._transport
.execute('parity_setDappDefaultAddress', dappId, address ? inAddress(address) : null);
}
setEngineSigner (address, password) {
return this._transport
.execute('parity_setEngineSigner', inAddress(address), password);
}
setExtraData (data) {
return this._transport
.execute('parity_setExtraData', inData(data));
}
setGasCeilTarget (quantity) {
return this._transport
.execute('parity_setGasCeilTarget', inNumber16(quantity));
}
setGasFloorTarget (quantity) {
return this._transport
.execute('parity_setGasFloorTarget', inNumber16(quantity));
}
setMaxTransactionGas (quantity) {
return this._transport
.execute('parity_setMaxTransactionGas', inNumber16(quantity));
}
setMinGasPrice (quantity) {
return this._transport
.execute('parity_setMinGasPrice', inNumber16(quantity));
}
setMode (mode) {
return this._transport
.execute('parity_setMode', mode);
}
setChain (specName) {
return this._transport
.execute('parity_setChain', specName);
}
setNewDappsAddresses (addresses) {
return this._transport
.execute('parity_setNewDappsAddresses', addresses ? inAddresses(addresses) : null);
}
setNewDappsDefaultAddress (address) {
return this._transport
.execute('parity_setNewDappsDefaultAddress', inAddress(address));
}
setTransactionsLimit (quantity) {
return this._transport
.execute('parity_setTransactionsLimit', inNumber16(quantity));
}
setVaultMeta (vaultName, meta) {
return this._transport
.execute('parity_setVaultMeta', vaultName, JSON.stringify(meta));
}
signMessage (address, password, messageHash) {
return this._transport
.execute('parity_signMessage', inAddress(address), password, inHex(messageHash));
}
testPassword (account, password) {
return this._transport
.execute('parity_testPassword', inAddress(account), password);
}
transactionsLimit () {
return this._transport
.execute('parity_transactionsLimit')
.then(outNumber);
}
unsignedTransactionsCount () {
return this._transport
.execute('parity_unsignedTransactionsCount')
.then(outNumber);
}
2016-12-12 02:57:19 +01:00
upgradeReady () {
return this._transport
2016-12-12 02:58:35 +01:00
.execute('parity_upgradeReady');
2016-12-12 02:57:19 +01:00
}
versionInfo () {
2016-12-12 02:57:19 +01:00
return this._transport
.execute('parity_versionInfo');
2016-12-12 02:57:19 +01:00
}
wsUrl () {
return this._transport
.execute('parity_wsUrl');
}
}