@@ -4,7 +4,11 @@ function libraryHashPlaceholder (input) {
44 return '$' + keccak256 ( input ) . slice ( 0 , 34 ) + '$' ;
55}
66
7- var linkBytecode = function ( bytecode , libraries ) {
7+ var linkBytecode = function ( bytecode , libraries , linkReferences ) {
8+ if ( typeof linkReferences === typeof '' || linkReferences === null || linkReferences === undefined ) {
9+ linkReferences = findLinkReferences ( bytecode ) ;
10+ }
11+
812 // NOTE: for backwards compatibility support old compiler which didn't use file names
913 var librariesComplete = { } ;
1014 for ( var libraryName in libraries ) {
@@ -35,7 +39,7 @@ var linkBytecode = function (bytecode, libraries) {
3539
3640 // Support old (library name) and new (hash of library name)
3741 // placeholders.
38- var replace = function ( name ) {
42+ var findAndReplace = function ( name ) {
3943 // truncate to 37 characters
4044 var truncatedName = name . slice ( 0 , 36 ) ;
4145 var libLabel = '__' + truncatedName + Array ( 37 - truncatedName . length ) . join ( '_' ) + '__' ;
@@ -44,6 +48,21 @@ var linkBytecode = function (bytecode, libraries) {
4448 }
4549 } ;
4650
51+ var replace = function ( name ) {
52+ // truncate to 37 characters
53+ var truncatedName = name . slice ( 0 , 36 ) ;
54+ if ( linkReferences && linkReferences [ truncatedName ] ) {
55+ linkReferences [ truncatedName ] . forEach ( function ( reference ) {
56+ var start = reference . start * 2 ;
57+ var end = ( reference . start + reference . length ) * 2 ;
58+ bytecode = bytecode . slice ( 0 , start ) + hexAddress + bytecode . slice ( end ) ;
59+ } ) ;
60+ } else {
61+ // manually find and replace if link reference is not present
62+ findAndReplace ( name ) ;
63+ }
64+ } ;
65+
4766 replace ( libraryName ) ;
4867 replace ( libraryHashPlaceholder ( libraryName ) ) ;
4968 }
0 commit comments