Merge pull request #56 from gnosis/feature/store-tx-subject-locally
Feature: Store TX' subject internally
This commit is contained in:
commit
2406a2d29d
|
@ -6,6 +6,7 @@ import { makeOwner } from '~/routes/safe/store/model/owner'
|
||||||
import { makeTransaction, type Transaction, type TransactionProps } from '~/routes/safe/store/model/transaction'
|
import { makeTransaction, type Transaction, type TransactionProps } from '~/routes/safe/store/model/transaction'
|
||||||
import { load, TX_KEY } from '~/utils/localStorage'
|
import { load, TX_KEY } from '~/utils/localStorage'
|
||||||
import { type Confirmation, type ConfirmationProps, makeConfirmation } from '~/routes/safe/store/model/confirmation'
|
import { type Confirmation, type ConfirmationProps, makeConfirmation } from '~/routes/safe/store/model/confirmation'
|
||||||
|
import { loadSafeSubjects } from '~/utils/localStorage/transactions'
|
||||||
import addTransactions from './addTransactions'
|
import addTransactions from './addTransactions'
|
||||||
|
|
||||||
export const loadSafeTransactions = () => {
|
export const loadSafeTransactions = () => {
|
||||||
|
@ -14,10 +15,13 @@ export const loadSafeTransactions = () => {
|
||||||
return Map().withMutations((map: Map<string, List<Confirmation>>) =>
|
return Map().withMutations((map: Map<string, List<Confirmation>>) =>
|
||||||
Object.keys(safes).map((safe: string) => {
|
Object.keys(safes).map((safe: string) => {
|
||||||
const safeTxs = safes[safe]
|
const safeTxs = safes[safe]
|
||||||
|
const safeSubjects = loadSafeSubjects(safe)
|
||||||
const safeTxsRecord = safeTxs.map((tx: TransactionProps) => {
|
const safeTxsRecord = safeTxs.map((tx: TransactionProps) => {
|
||||||
const { confirmations } = tx
|
const { confirmations } = tx
|
||||||
|
const name = safeSubjects.get(String(tx.nonce)) || 'Unknown'
|
||||||
const txRecord = makeTransaction({
|
const txRecord = makeTransaction({
|
||||||
...tx,
|
...tx,
|
||||||
|
name,
|
||||||
confirmations: List(confirmations.map((conf: ConfirmationProps) =>
|
confirmations: List(confirmations.map((conf: ConfirmationProps) =>
|
||||||
makeConfirmation({ ...conf, owner: makeOwner(conf.owner) }))),
|
makeConfirmation({ ...conf, owner: makeOwner(conf.owner) }))),
|
||||||
})
|
})
|
||||||
|
|
|
@ -29,7 +29,7 @@ describe('Transactions Suite', () => {
|
||||||
if (!secondOwner) { throw new Error() }
|
if (!secondOwner) { throw new Error() }
|
||||||
})
|
})
|
||||||
|
|
||||||
it('adds first confirmation to stored safe', async () => {
|
it('adds first transaction to stored safe', async () => {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
const txName = 'Buy butteries for project'
|
const txName = 'Buy butteries for project'
|
||||||
const nonce: number = 10
|
const nonce: number = 10
|
||||||
|
@ -49,7 +49,7 @@ describe('Transactions Suite', () => {
|
||||||
testTransactionFrom(safeTransactions, 0, txName, nonce, value, 2, destination, EMPTY_DATA, 'foo', 'confirmationHash', owners.get(0), owners.get(1))
|
testTransactionFrom(safeTransactions, 0, txName, nonce, value, 2, destination, EMPTY_DATA, 'foo', 'confirmationHash', owners.get(0), owners.get(1))
|
||||||
})
|
})
|
||||||
|
|
||||||
it('adds second confirmation to stored safe with one confirmation', async () => {
|
it('adds second transaction to stored safe with one transaction', async () => {
|
||||||
// GIVEN
|
// GIVEN
|
||||||
const firstTxName = 'Buy butteries for project'
|
const firstTxName = 'Buy butteries for project'
|
||||||
const firstNonce: number = Date.now()
|
const firstNonce: number = Date.now()
|
||||||
|
@ -77,7 +77,7 @@ describe('Transactions Suite', () => {
|
||||||
testTransactionFrom(safeTxs, 1, secondTxName, secondNonce, value, 2, destination, EMPTY_DATA, 'foo', 'confirmationHash', owners.get(0), owners.get(1))
|
testTransactionFrom(safeTxs, 1, secondTxName, secondNonce, value, 2, destination, EMPTY_DATA, 'foo', 'confirmationHash', owners.get(0), owners.get(1))
|
||||||
})
|
})
|
||||||
|
|
||||||
it('adds second confirmation to stored safe having two safes with one confirmation each', async () => {
|
it('adds second transaction to stored safe having two safes with one transaction each', async () => {
|
||||||
const txName = 'Buy batteris for Alplha project'
|
const txName = 'Buy batteris for Alplha project'
|
||||||
const nonce = 10
|
const nonce = 10
|
||||||
const safeAddress = safe.address
|
const safeAddress = safe.address
|
||||||
|
@ -113,7 +113,7 @@ describe('Transactions Suite', () => {
|
||||||
const txConfirmations: List<Confirmation> = buildConfirmationsFrom(owners, creator, 'secondConfirmationHash')
|
const txConfirmations: List<Confirmation> = buildConfirmationsFrom(owners, creator, 'secondConfirmationHash')
|
||||||
storeTransaction(
|
storeTransaction(
|
||||||
txFirstName, txFirstNonce, destination, value, creator,
|
txFirstName, txFirstNonce, destination, value, creator,
|
||||||
txConfirmations, '', safe.get('address'), safe.get('threshold'), EMPTY_DATA,
|
txConfirmations, '', safeAddress, safe.get('threshold'), EMPTY_DATA,
|
||||||
)
|
)
|
||||||
|
|
||||||
transactions = loadSafeTransactions()
|
transactions = loadSafeTransactions()
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
// @flow
|
||||||
|
import { Map } from 'immutable'
|
||||||
|
import { load } from '~/utils/localStorage'
|
||||||
|
|
||||||
|
const getSubjectKeyFrom = (safeAddress: string) => `TXS-SUBJECTS-${safeAddress}`
|
||||||
|
|
||||||
|
export const storeSubject = (safeAddress: string, nonce: number, subject: string) => {
|
||||||
|
const key = getSubjectKeyFrom(safeAddress)
|
||||||
|
const subjects = Map(load(key)) || Map()
|
||||||
|
|
||||||
|
try {
|
||||||
|
const updatedSubjects = subjects.set(nonce, subject)
|
||||||
|
const serializedState = JSON.stringify(updatedSubjects)
|
||||||
|
localStorage.setItem(key, serializedState)
|
||||||
|
} catch (err) {
|
||||||
|
// eslint-disable-next-line
|
||||||
|
console.log('Error storing transaction subject in localstorage')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const loadSafeSubjects = (safeAddress: string): Map<string, string> => {
|
||||||
|
const key = getSubjectKeyFrom(safeAddress)
|
||||||
|
const data: any = load(key)
|
||||||
|
|
||||||
|
return data ? Map(data) : Map()
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ import { getWeb3 } from '~/wallets/getWeb3'
|
||||||
import { type Safe } from '~/routes/safe/store/model/safe'
|
import { type Safe } from '~/routes/safe/store/model/safe'
|
||||||
import { sameAddress } from '~/wallets/ethAddresses'
|
import { sameAddress } from '~/wallets/ethAddresses'
|
||||||
import { checkReceiptStatus, calculateGasOf, calculateGasPrice, EMPTY_DATA } from '~/wallets/ethTransactions'
|
import { checkReceiptStatus, calculateGasOf, calculateGasPrice, EMPTY_DATA } from '~/wallets/ethTransactions'
|
||||||
|
import { storeSubject } from '~/utils/localStorage/transactions'
|
||||||
|
|
||||||
export const TX_NAME_PARAM = 'txName'
|
export const TX_NAME_PARAM = 'txName'
|
||||||
export const TX_DESTINATION_PARAM = 'txDestination'
|
export const TX_DESTINATION_PARAM = 'txDestination'
|
||||||
|
@ -53,9 +54,12 @@ export const storeTransaction = (
|
||||||
if (notMinedWhenOneOwnerSafe) {
|
if (notMinedWhenOneOwnerSafe) {
|
||||||
throw new Error('The tx should be mined before storing it in safes with one owner')
|
throw new Error('The tx should be mined before storing it in safes with one owner')
|
||||||
}
|
}
|
||||||
|
// fetch actual transactions from endpoint and check nonce is higher than the last one
|
||||||
|
// send tx to service
|
||||||
|
// store subject in local storage (for testing it the actual name should be '')
|
||||||
|
|
||||||
const transaction: Transaction = makeTransaction({
|
const transaction: Transaction = makeTransaction({
|
||||||
name, nonce, value, confirmations, destination, threshold: safeThreshold, tx, data,
|
name: '', nonce, value, confirmations, destination, threshold: safeThreshold, tx, data,
|
||||||
})
|
})
|
||||||
|
|
||||||
const safeTransactions = load(TX_KEY) || {}
|
const safeTransactions = load(TX_KEY) || {}
|
||||||
|
@ -66,8 +70,9 @@ export const storeTransaction = (
|
||||||
throw new Error(`Transaction with same nonce: ${nonce} already created for safe: ${safeAddress}`)
|
throw new Error(`Transaction with same nonce: ${nonce} already created for safe: ${safeAddress}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
safeTransactions[safeAddress] = txsRecord.push(transaction)
|
storeSubject(safeAddress, nonce, name)
|
||||||
|
|
||||||
|
safeTransactions[safeAddress] = txsRecord.push(transaction)
|
||||||
localStorage.setItem(TX_KEY, JSON.stringify(safeTransactions))
|
localStorage.setItem(TX_KEY, JSON.stringify(safeTransactions))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue