mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-12 20:57:12 +01:00
94 lines
2.9 KiB
JavaScript
94 lines
2.9 KiB
JavaScript
// path constants
|
|
const STATUS_PATH = '/status'
|
|
const GAS_PRICE_PATH = '/txParams/gasPrice'
|
|
|
|
// status constants
|
|
const UNAPPROVED_STATUS = 'unapproved'
|
|
const SUBMITTED_STATUS = 'submitted'
|
|
const CONFIRMED_STATUS = 'confirmed'
|
|
const DROPPED_STATUS = 'dropped'
|
|
|
|
// op constants
|
|
const REPLACE_OP = 'replace'
|
|
|
|
// event constants
|
|
const TRANSACTION_CREATED_EVENT = 'transactionCreated'
|
|
const TRANSACTION_UPDATED_GAS_EVENT = 'transactionUpdatedGas'
|
|
const TRANSACTION_SUBMITTED_EVENT = 'transactionSubmitted'
|
|
const TRANSACTION_CONFIRMED_EVENT = 'transactionConfirmed'
|
|
const TRANSACTION_DROPPED_EVENT = 'transactionDropped'
|
|
const TRANSACTION_UPDATED_EVENT = 'transactionUpdated'
|
|
const TRANSACTION_ERRORED_EVENT = 'transactionErrored'
|
|
|
|
const eventPathsHash = {
|
|
[STATUS_PATH]: true,
|
|
[GAS_PRICE_PATH]: true,
|
|
}
|
|
|
|
const statusHash = {
|
|
[SUBMITTED_STATUS]: TRANSACTION_SUBMITTED_EVENT,
|
|
[CONFIRMED_STATUS]: TRANSACTION_CONFIRMED_EVENT,
|
|
[DROPPED_STATUS]: TRANSACTION_DROPPED_EVENT,
|
|
}
|
|
|
|
function eventCreator (eventKey, timestamp, value) {
|
|
return {
|
|
eventKey,
|
|
timestamp,
|
|
value,
|
|
}
|
|
}
|
|
|
|
export function getActivities (transaction) {
|
|
const { history = [], txReceipt: { status } = {} } = transaction
|
|
|
|
const historyActivities = history.reduce((acc, base) => {
|
|
// First history item should be transaction creation
|
|
if (!Array.isArray(base) && base.status === UNAPPROVED_STATUS && base.txParams) {
|
|
const { time, txParams: { value } = {} } = base
|
|
return acc.concat(eventCreator(TRANSACTION_CREATED_EVENT, time, value))
|
|
// An entry in the history may be an array of more sub-entries.
|
|
} else if (Array.isArray(base)) {
|
|
const events = []
|
|
|
|
base.forEach(entry => {
|
|
const { op, path, value, timestamp: entryTimestamp } = entry
|
|
// Not all sub-entries in a history entry have a timestamp. If the sub-entry does not have a
|
|
// timestamp, the first sub-entry in a history entry should.
|
|
const timestamp = entryTimestamp || base[0] && base[0].timestamp
|
|
|
|
if (path in eventPathsHash && op === REPLACE_OP) {
|
|
switch (path) {
|
|
case STATUS_PATH: {
|
|
if (value in statusHash) {
|
|
events.push(eventCreator(statusHash[value], timestamp))
|
|
}
|
|
|
|
break
|
|
}
|
|
|
|
case GAS_PRICE_PATH: {
|
|
events.push(eventCreator(TRANSACTION_UPDATED_GAS_EVENT, timestamp, value))
|
|
break
|
|
}
|
|
|
|
default: {
|
|
events.push(eventCreator(TRANSACTION_UPDATED_EVENT, timestamp))
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
return acc.concat(events)
|
|
}
|
|
|
|
return acc
|
|
}, [])
|
|
|
|
// If txReceipt.status is '0x0', that means that an on-chain error occured for the transaction,
|
|
// so we add an error entry to the Activity Log.
|
|
return status === '0x0'
|
|
? historyActivities.concat(eventCreator(TRANSACTION_ERRORED_EVENT))
|
|
: historyActivities
|
|
}
|