diff --git a/Cargo.lock b/Cargo.lock index e92bae295..9b9710967 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1781,7 +1781,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/paritytech/js-precompiled.git#b6fbfc59f044546ccd3b928fb17daa3812ae856e" +source = "git+https://github.com/paritytech/js-precompiled.git#0826776d9190ee6945bfe481e10b19ec05b3a049" dependencies = [ "parity-dapps-glue 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/js/package.json b/js/package.json index 3d30a8df5..cd223942e 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "1.7.68", + "version": "1.7.69", "main": "release/index.js", "jsnext:main": "src/index.js", "author": "Parity Team ", diff --git a/js/src/abi/spec/event/event.js b/js/src/abi/spec/event/event.js index 071a73965..604f58cb1 100644 --- a/js/src/abi/spec/event/event.js +++ b/js/src/abi/spec/event/event.js @@ -99,15 +99,15 @@ export default class Event { const namedTokens = {}; topicParams.forEach((param, idx) => { - namedTokens[param.name] = topicTokens[idx]; + namedTokens[param.name || idx] = topicTokens[idx]; }); dataParams.forEach((param, idx) => { - namedTokens[param.name] = dataTokens[idx]; + namedTokens[param.name || idx] = dataTokens[idx]; }); const inputParamTypes = this.inputParamTypes(); const decodedParams = this.inputParamNames() - .map((name, idx) => new DecodedLogParam(name, inputParamTypes[idx], namedTokens[name])); + .map((name, idx) => new DecodedLogParam(name, inputParamTypes[idx], namedTokens[name || idx])); return new DecodedLog(decodedParams, address); } diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js index 77c9568a9..d6c71e3df 100644 --- a/js/src/api/contract/contract.js +++ b/js/src/api/contract/contract.js @@ -182,10 +182,11 @@ export default class Contract { log.params = {}; log.event = event.name; - decoded.params.forEach((param) => { + decoded.params.forEach((param, index) => { const { type, value } = param.token; + const key = param.name || index; - log.params[param.name] = { type, value }; + log.params[key] = { type, value }; }); return log; diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js index ddb8b79f8..a712da5fe 100644 --- a/js/src/api/format/output.js +++ b/js/src/api/format/output.js @@ -93,6 +93,16 @@ export function outChainStatus (status) { } export function outDate (date) { + if (typeof date.toISOString === 'function') { + return date; + } + + try { + if (typeof date === 'string' && (new Date(date)).toISOString() === date) { + return new Date(date); + } + } catch (error) {} + return new Date(outNumber(date).toNumber() * 1000); } diff --git a/js/src/views/Contract/Events/Event/event.js b/js/src/views/Contract/Events/Event/event.js index eb370e7f1..fc2436f8e 100644 --- a/js/src/views/Contract/Events/Event/event.js +++ b/js/src/views/Contract/Events/Event/event.js @@ -112,11 +112,16 @@ export default class Event extends Component { } renderParam (name, param) { + // Don't add a label id the name is an index key (ie. a Number) + const label = parseInt(name).toString() === name.toString() + ? undefined + : name; + return ( this.reloadContracts()); + return Promise.all([ + this.fetchSolidityVersions(), + this.reloadContracts(undefined, undefined, false) + ]); } fetchSolidityVersions () { @@ -397,11 +398,10 @@ export default class ContractDevelopStore { const { errors = [] } = data; const errorAnnotations = this.parseErrors(errors); - const formalAnnotations = this.parseErrors(data.formal && data.formal.errors, true); + // const formalAnnotations = this.parseErrors(data.formal && data.formal.errors, true); const annotations = [].concat( - errorAnnotations, - formalAnnotations + errorAnnotations ); const contractKeys = Object.keys(contracts || {}); @@ -493,7 +493,7 @@ export default class ContractDevelopStore { this.reloadContracts(cId); } - @action reloadContracts = (id, sourcecode) => { + @action reloadContracts = (id, sourcecode, recompile = true) => { const localStore = store.get(WRITE_CONTRACT_STORE_KEY) || {}; this.savedContracts = localStore.saved || {}; @@ -513,7 +513,9 @@ export default class ContractDevelopStore { this.resizeEditor(); - return this.handleCompile(); + if (recompile) { + return this.handleCompile(); + } } @action handleLoadContract = (contract) => { diff --git a/js/src/views/Wallet/WalletSettings/walletSettings.js b/js/src/views/Wallet/WalletSettings/walletSettings.js index 73d821530..2bf7ac3b5 100644 --- a/js/src/views/Wallet/WalletSettings/walletSettings.js +++ b/js/src/views/Wallet/WalletSettings/walletSettings.js @@ -247,8 +247,6 @@ class WalletSettings extends Component { } renderChange (change) { - const { accountsInfo } = this.props; - switch (change.type) { case 'dailylimit': return ( @@ -279,14 +277,50 @@ class WalletSettings extends Component { id='walletSettings.ownersChange.details' defaultMessage=' from {from} to {to} ' values={ { - from: change.initial.toNumber(), - to: change.value.toNumber() + from: { change.initial.toNumber() }, + to: { change.value.toNumber() } } } /> ); + case 'change_owner': + return ( +
+
+ +
+
+ + } + text + value={ change.value.from } + /> + + } + text + value={ change.value.to } + /> +
+
+ ); + case 'add_owner': return (
@@ -299,8 +333,8 @@ class WalletSettings extends Component {
@@ -318,8 +352,8 @@ class WalletSettings extends Component {
diff --git a/js/src/views/Wallet/WalletSettings/walletSettingsStore.js b/js/src/views/Wallet/WalletSettings/walletSettingsStore.js index d00532462..cfc448617 100644 --- a/js/src/views/Wallet/WalletSettings/walletSettingsStore.js +++ b/js/src/views/Wallet/WalletSettings/walletSettingsStore.js @@ -78,12 +78,16 @@ export default class WalletSettingsStore { const changes = data.map((datum) => { const [ type, valueStr ] = datum.split(';'); - let value = valueStr; + let value; - // Only addresses start with `0x`, the others - // are BigNumbers - if (!/^0x/.test(valueStr)) { - value = new BigNumber(valueStr, 16); + if (/^#BN#/.test(valueStr)) { + value = new BigNumber(valueStr.replace(/^#BN#/, ''), 16); + } else { + try { + value = JSON.parse(valueStr); + } catch (e) { + value = valueStr; + } } return { type, value }; @@ -104,8 +108,8 @@ export default class WalletSettingsStore { const { type, value } = change; const valueStr = (value && typeof value.plus === 'function') - ? value.toString(16) - : value; + ? '#BN#' + value.toString(16) + : JSON.stringify(value); return [ type, @@ -147,14 +151,26 @@ export default class WalletSettingsStore { const ownersToRemove = prevOwners.filter((owner) => !nextOwners.includes(owner)); const ownersToAdd = nextOwners.filter((owner) => !prevOwners.includes(owner)); - ownersToRemove.forEach((owner) => { + const ownersChangeCount = Math.min(ownersToRemove.length, ownersToAdd.length); + + for (let i = 0; i < ownersChangeCount; i++) { + changes.push({ + type: 'change_owner', + value: { + from: ownersToRemove[i], + to: ownersToAdd[i] + } + }); + } + + ownersToRemove.slice(ownersChangeCount).forEach((owner) => { changes.push({ type: 'remove_owner', value: owner }); }); - ownersToAdd.forEach((owner) => { + ownersToAdd.slice(ownersChangeCount).forEach((owner) => { changes.push({ type: 'add_owner', value: owner @@ -182,6 +198,12 @@ export default class WalletSettingsStore { this.wallet.require = value; break; + case 'change_owner': + this.wallet.owners = this.wallet.owners + .filter((owner) => owner !== value.from) + .concat(value.to); + break; + case 'remove_owner': this.wallet.owners = this.wallet.owners.filter((owner) => owner !== value); break; @@ -309,6 +331,13 @@ export default class WalletSettingsStore { }; } + if (change.type === 'change_owner') { + return { + method: walletInstance.changeOwner, + values: [ change.value.from, change.value.to ] + }; + } + if (change.type === 'remove_owner') { return { method: walletInstance.removeOwner,