@@ -6,6 +6,7 @@ import {renderReserve, renderReserveDiff} from './reserve';
66import { AaveV3Reserve , type AaveV3Snapshot } from './snapshot-types' ;
77import { renderStrategy , renderStrategyDiff } from './strategy' ;
88import { diffCode , downloadContract } from './code-diff' ;
9+ import { bytes32ToAddress } from '../utils/storageSlots' ;
910
1011function hasDiff ( input : Record < string , any > ) : boolean {
1112 if ( ! input ) return false ;
@@ -23,72 +24,83 @@ export async function diffReports<A extends AaveV3Snapshot, B extends AaveV3Snap
2324 post : B ,
2425) {
2526 const chainId = pre . chainId ;
27+ // if raw is present, it already is a diff, so no need to diff it
28+ let raw ;
29+ if ( post . raw ) {
30+ raw = { ...post . raw } ;
31+ delete post . raw ;
32+ }
2633 const diffResult = diff ( pre , post ) ;
2734 const diffResultWithoutUnchanged = diff ( pre , post , true ) ;
35+ if ( raw ) {
36+ diffResultWithoutUnchanged . raw = raw as any ;
37+ }
2838
2939 // create report
3040 let content = '' ;
31- const reservesAdded = Object . keys ( diffResult . reserves )
32- . map ( ( reserveKey ) => {
33- // to being present on reserve level % trueish means reserve was added
34- if ( ( diffResult . reserves [ reserveKey ] as any ) . to ) {
35- let report = renderReserve ( ( diffResult . reserves [ reserveKey ] as any ) . to , chainId ) ;
36- report += renderStrategy ( post . strategies [ reserveKey ] ) ;
37- report += `| interestRate |  } ) |\n` ;
41+ if ( diffResult . reserves ) {
42+ const reservesAdded = Object . keys ( diffResult . reserves )
43+ . map ( ( reserveKey ) => {
44+ // to being present on reserve level % trueish means reserve was added
45+ if ( ( diffResult . reserves [ reserveKey ] as any ) . to ) {
46+ let report = renderReserve ( ( diffResult . reserves [ reserveKey ] as any ) . to , chainId ) ;
47+ report += renderStrategy ( post . strategies [ reserveKey ] ) ;
48+ report += `| interestRate |  } ) |\n` ;
3849
39- return report ;
40- }
41- } )
42- . filter ( ( i ) => i ) ;
43- const reservesRemoved = Object . keys ( diffResult . reserves )
44- . map ( ( reserveKey ) => {
45- // from being present on reserve level % trueish means reserve was removed
46- if ( ( diffResult . reserves [ reserveKey ] as any ) . from ) {
47- return renderReserve ( ( diffResult . reserves [ reserveKey ] as any ) . from , chainId ) ;
48- }
49- } )
50- . filter ( ( i ) => i ) ;
51- const reservesAltered = Object . keys ( diffResult . reserves )
52- . map ( ( reserveKey ) => {
53- // "from" being present on reserses key means reserve was removed
54- if ( ! ( diffResult . reserves [ reserveKey ] as any ) . hasOwnProperty ( 'from' ) ) {
55- const hasChangedReserveProperties = hasDiff ( diffResult . reserves [ reserveKey ] ) ;
56- const preIr = getStrategyImageUrl ( pre . strategies [ reserveKey ] ) ;
57- const postIr = getStrategyImageUrl ( post . strategies [ reserveKey ] ) ;
58- const hasChangedIr = preIr !== postIr ;
59- if ( ! hasChangedReserveProperties && ! hasChangedIr ) return ;
60- // diff reserve
61- let report = renderReserveDiff ( diffResult . reserves [ reserveKey ] as any , chainId ) ;
62- // diff irs
63- if ( hasChangedIr ) {
64- report += renderStrategyDiff (
65- diff ( pre . strategies [ reserveKey ] , post . strategies [ reserveKey ] ) as any ,
66- ) ;
67- report += `| interestRate |  |  |` ;
50+ return report ;
6851 }
52+ } )
53+ . filter ( ( i ) => i ) ;
54+ const reservesRemoved = Object . keys ( diffResult . reserves )
55+ . map ( ( reserveKey ) => {
56+ // from being present on reserve level % trueish means reserve was removed
57+ if ( ( diffResult . reserves [ reserveKey ] as any ) . from ) {
58+ return renderReserve ( ( diffResult . reserves [ reserveKey ] as any ) . from , chainId ) ;
59+ }
60+ } )
61+ . filter ( ( i ) => i ) ;
62+ const reservesAltered = Object . keys ( diffResult . reserves )
63+ . map ( ( reserveKey ) => {
64+ // "from" being present on reserses key means reserve was removed
65+ if ( ! ( diffResult . reserves [ reserveKey ] as any ) . hasOwnProperty ( 'from' ) ) {
66+ const hasChangedReserveProperties = hasDiff ( diffResult . reserves [ reserveKey ] ) ;
67+ const preIr = getStrategyImageUrl ( pre . strategies [ reserveKey ] ) ;
68+ const postIr = getStrategyImageUrl ( post . strategies [ reserveKey ] ) ;
69+ const hasChangedIr = preIr !== postIr ;
70+ if ( ! hasChangedReserveProperties && ! hasChangedIr ) return ;
71+ // diff reserve
72+ let report = renderReserveDiff ( diffResult . reserves [ reserveKey ] as any , chainId ) ;
73+ // diff irs
74+ if ( hasChangedIr ) {
75+ report += renderStrategyDiff (
76+ diff ( pre . strategies [ reserveKey ] , post . strategies [ reserveKey ] ) as any ,
77+ ) ;
78+ report += `| interestRate |  |  |` ;
79+ }
6980
70- return report ;
81+ return report ;
82+ }
83+ } )
84+ . filter ( ( i ) => i ) ;
85+ if ( reservesAdded . length || reservesRemoved . length || reservesAltered . length ) {
86+ content += '## Reserve changes\n\n' ;
87+ if ( reservesAdded . length ) {
88+ content += `### ${ reservesAdded . length > 1 ? 'Reserve' : 'Reserves' } added\n\n` ;
89+ content += reservesAdded . join ( '\n\n' ) ;
90+ content += '\n\n' ;
7191 }
72- } )
73- . filter ( ( i ) => i ) ;
74- if ( reservesAdded . length || reservesRemoved . length || reservesAltered . length ) {
75- content += '## Reserve changes\n\n' ;
76- if ( reservesAdded . length ) {
77- content += `### ${ reservesAdded . length > 1 ? 'Reserve' : 'Reserves' } added\n\n` ;
78- content += reservesAdded . join ( '\n\n' ) ;
79- content += '\n\n' ;
80- }
8192
82- if ( reservesAltered . length ) {
83- content += `### ${ reservesAltered . length > 1 ? 'Reserve' : 'Reserves' } altered\n\n` ;
84- content += reservesAltered . join ( '\n\n' ) ;
85- content += '\n\n' ;
86- }
93+ if ( reservesAltered . length ) {
94+ content += `### ${ reservesAltered . length > 1 ? 'Reserve' : 'Reserves' } altered\n\n` ;
95+ content += reservesAltered . join ( '\n\n' ) ;
96+ content += '\n\n' ;
97+ }
8798
88- if ( reservesRemoved . length ) {
89- content += `### ${ reservesRemoved . length > 1 ? 'Reserve' : 'Reserves' } removed\n\n` ;
90- content += reservesRemoved . join ( '\n\n' ) ;
91- content += '\n\n' ;
99+ if ( reservesRemoved . length ) {
100+ content += `### ${ reservesRemoved . length > 1 ? 'Reserve' : 'Reserves' } removed\n\n` ;
101+ content += reservesRemoved . join ( '\n\n' ) ;
102+ content += '\n\n' ;
103+ }
92104 }
93105 }
94106
@@ -114,6 +126,24 @@ export async function diffReports<A extends AaveV3Snapshot, B extends AaveV3Snap
114126 }
115127 }
116128
129+ if ( raw ) {
130+ // ERC1967 slot https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/ERC1967/ERC1967Utils.sol#L21C53-L21C119
131+ const erc1967Slot = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc' ;
132+ Object . keys ( raw ) . map ( ( contract ) => {
133+ if ( raw [ contract ] . stateDiff [ erc1967Slot ] ) {
134+ const fromAddress = bytes32ToAddress ( raw [ contract ] . stateDiff [ erc1967Slot ] . previousValue ) ;
135+ const toAddress = bytes32ToAddress ( raw [ contract ] . stateDiff [ erc1967Slot ] . newValue ) ;
136+ const from = downloadContract ( pre . chainId , fromAddress ) ;
137+ const to = downloadContract ( pre . chainId , toAddress ) ;
138+ const result = diffCode ( from , to ) ;
139+ writeFileSync (
140+ `./diffs/${ pre . chainId } _${ contract } _${ fromAddress } _${ toAddress } .diff` ,
141+ result ,
142+ ) ;
143+ }
144+ } ) ;
145+ }
146+
117147 try {
118148 if ( diffResultWithoutUnchanged . poolConfig ) {
119149 for ( const key of Object . keys ( diffResult . poolConfig ) ) {
0 commit comments