File tree Expand file tree Collapse file tree 1 file changed +15
-2
lines changed Expand file tree Collapse file tree 1 file changed +15
-2
lines changed Original file line number Diff line number Diff line change @@ -105,14 +105,27 @@ impl<'a> Linker<'a> {
105
105
) -> Result < ( ) , LinkerError > {
106
106
let contract = self . contracts . get ( target) . ok_or ( LinkerError :: MissingTargetArtifact ) ?;
107
107
108
+ // Deep-merge link references from creation and deployed bytecode.
109
+ // This ensures we don't lose libraries when both bytecode objects reference
110
+ // libraries under the same source file key but with different library names.
108
111
let mut references = BTreeMap :: new ( ) ;
109
112
if let Some ( bytecode) = & contract. bytecode {
110
- references. extend ( bytecode. link_references . clone ( ) ) ;
113
+ for ( file, libs) in & bytecode. link_references {
114
+ let entry = references. entry ( file. clone ( ) ) . or_insert_with ( BTreeMap :: new) ;
115
+ for ( name, offsets) in libs {
116
+ entry. entry ( name. clone ( ) ) . or_insert_with ( Vec :: new) . extend ( offsets. clone ( ) ) ;
117
+ }
118
+ }
111
119
}
112
120
if let Some ( deployed_bytecode) = & contract. deployed_bytecode
113
121
&& let Some ( bytecode) = & deployed_bytecode. bytecode
114
122
{
115
- references. extend ( bytecode. link_references . clone ( ) ) ;
123
+ for ( file, libs) in & bytecode. link_references {
124
+ let entry = references. entry ( file. clone ( ) ) . or_insert_with ( BTreeMap :: new) ;
125
+ for ( name, offsets) in libs {
126
+ entry. entry ( name. clone ( ) ) . or_insert_with ( Vec :: new) . extend ( offsets. clone ( ) ) ;
127
+ }
128
+ }
116
129
}
117
130
118
131
for ( file, libs) in & references {
You can’t perform that action at this time.
0 commit comments