Skip to content

Commit

Permalink
Merge pull request #1589 from AmbireTech/fix/humanizer
Browse files Browse the repository at this point in the history
Humanizer bug fixes
  • Loading branch information
stojnovsky authored Jun 4, 2024
2 parents a875df2 + d8a7fb9 commit 6747313
Show file tree
Hide file tree
Showing 5 changed files with 374 additions and 216 deletions.
32 changes: 17 additions & 15 deletions src/components/common/TxnPreview/TxnPreview.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,21 +92,23 @@ export default function TxnPreview({
<div className={styles.summary}>
{extendedSummary.map((entry) => {
// If entry is extended summary parse it
if (Array.isArray(entry)) {
return entry.map((item, i) => (
<ExtendedSummaryItem
key={`item-${i}`}
item={item}
i={i}
networkDetails={networkDetails}
feeAssets={feeAssets}
/>
))
}
if (typeof entry !== 'string') {
return `operation with address ${txn[0]} (unable to parse)`
}
return entry
return <div className={styles.subSummary}>
{
Array.isArray(entry) ?
entry.map((item, i) => (
<ExtendedSummaryItem
key={`item-${i}`}
item={item}
i={i}
networkDetails={networkDetails}
feeAssets={feeAssets}
/>
))
: typeof entry !== 'string' ?
`operation with address ${txn[0]} (unable to parse)`
: entry
}
</div>
})}
</div>
{onDismiss ? (
Expand Down
14 changes: 9 additions & 5 deletions src/components/common/TxnPreview/TxnPreview.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,17 @@ $extended-summary-height: 2.25rem;

.summary {
width: 100%;
display: flex;
align-items: center;
column-gap: 0.625rem;
row-gap: 0.5rem;
flex-wrap: wrap;
word-break: break-word;
font-size: 0.875rem;
row-gap: 0.5rem;
}
.subSummary{
align-items: center;
display: flex;
flex-wrap: wrap;
}
.subSummary > *{
margin-right: 0.625rem;
}
}

Expand Down
91 changes: 90 additions & 1 deletion src/lib/humanReadableTransactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { formatUnits } from 'ethers/lib/utils'
import { constants } from 'ethers'
import networks from 'consts/networks'
import humanizers from './humanizers'
import { isZeroAddress } from 'ethereumjs-util'

// address (lowercase) => name
let knownAliases = {}
Expand All @@ -10,6 +11,93 @@ const knownTokens = {}
// address (lowercase) => name
const knownAddressNames = {}

function parseActions(actions){
const result = []
for(let i=0;i<actions.length;i++){

const notLast = i < actions.length-1
if(!notLast){
result.push(actions[i])
continue
}

if(
// are valid [obj]
actions[i].length>=4 &&
actions[i+1].length>=2 &&
Array.isArray(actions[i]) &&
Array.isArray(actions[i+1]) &&
// are actual swap and unwrap
typeof actions[i][0] === 'string' &&
actions[i][0].startsWith('Swap') &&
actions[i][3].type==='token' &&
// isWrappedAsset(actions[i][3].address) &&
typeof actions[i+1][3] === 'string' &&
actions[i+1][0].startsWith('Unwrap') &&
actions[i+1][1].type==='token' &&
// have proper values and addresses
actions[i][3].amount === actions[i+1][1].amount &&
isZeroAddress(actions[i+1][1].address)
){
// swap x for at least y
result.push(["Swap", actions[i][1], actions[i][2],actions[i+1][1]])
// skip next ccall, since two were merged
i++
continue
}

if(
// are valid [obj]
actions[i].length>=2 &&
actions[i+1].length>=4 &&
Array.isArray(actions[i]) &&
Array.isArray(actions[i+1]) &&
// are actual Wrap and Swap
typeof actions[i][0] === 'string' &&
actions[i][0].startsWith('Wrap') &&
actions[i][1].type==='token' &&
typeof actions[i+1][0] === 'string' &&
actions[i+1][0].startsWith('Swap') &&
actions[i+1][3].type==='token' &&
// have proper values and addresses
actions[i+1][1].amount === actions[i][1].amount &&
isZeroAddress(actions[i][1].address)
){
// swap x for at least y
result.push(["Swap", actions[i][1], actions[i+1][2],actions[i+1][3]])
// skip next ccall, since two were merged
i++
continue
}



if(
// are valid [obj]
actions[i].length==2 &&
actions[i+1].length==2 &&
Array.isArray(actions[i]) &&
Array.isArray(actions[i+1]) &&
// are actual Unwrap and Sweep
typeof actions[i][0] === 'string' &&
actions[i][0].startsWith('Unwrap') &&
actions[i][1].type==='token' &&
typeof actions[i+1][0] === 'string' &&
actions[i+1][0].startsWith('Sweep') &&
actions[i+1][1].type==='token'
){
result.push(["Remove liquidity and withdraw", actions[i][1], "and", actions[i+1][1]])
// skip next ccall, since two were merged
i++
continue
}

result.push(actions[i])
continue
}
return result
}

export const formatNativeTokenAddress = (address) =>
address.toLowerCase() === `0x${'e'.repeat(40)}` ? `0x${'0'.repeat(40)}` : address.toLowerCase()

Expand Down Expand Up @@ -82,7 +170,8 @@ export function getTransactionSummary(

if (humanizer) {
try {
const actions = humanizer({ to, value, data, from: accountAddr }, network, opts)
let actions = humanizer({ to, value, data, from: accountAddr }, network, opts)
actions = parseActions(actions)
return opts.extended === true ? actions : actions.join(', ')
} catch (e) {
callSummary = opts.extended
Expand Down
Loading

0 comments on commit 6747313

Please sign in to comment.