@@ -8,7 +8,12 @@ function libraryHashPlaceholder (input) {
8
8
return '$' + keccak256 ( input ) . toString ( 'hex' ) . slice ( 0 , 34 ) + '$' ;
9
9
}
10
10
11
- var linkBytecode = function ( bytecode , libraries ) {
11
+ var linkBytecode = function ( bytecode , libraries , linkReferences ) {
12
+
13
+ if ( typeof linkReferences === typeof '' || linkReferences === null || linkReferences === undefined ) {
14
+ linkReferences = findLinkReferences ( bytecode ) ;
15
+ }
16
+
12
17
// NOTE: for backwards compatibility support old compiler which didn't use file names
13
18
var librariesComplete = { } ;
14
19
for ( var libraryName in libraries ) {
@@ -39,7 +44,7 @@ var linkBytecode = function (bytecode, libraries) {
39
44
40
45
// Support old (library name) and new (hash of library name)
41
46
// placeholders.
42
- var replace = function ( name ) {
47
+ var findAndReplace = function ( name ) {
43
48
// truncate to 37 characters
44
49
var truncatedName = name . slice ( 0 , 36 ) ;
45
50
var libLabel = '__' + truncatedName + Array ( 37 - truncatedName . length ) . join ( '_' ) + '__' ;
@@ -48,6 +53,22 @@ var linkBytecode = function (bytecode, libraries) {
48
53
}
49
54
} ;
50
55
56
+ var replace = function ( name ) {
57
+ // truncate to 37 characters
58
+ var truncatedName = name . slice ( 0 , 36 ) ;
59
+ if ( linkReferences && linkReferences [ truncatedName ] ) {
60
+ linkReferences [ truncatedName ] . forEach ( function ( reference ) {
61
+ var start = reference . start * 2 ;
62
+ var end = ( reference . start + reference . length ) * 2 ;
63
+ bytecode = bytecode . slice ( 0 , start ) + hexAddress + bytecode . slice ( end ) ;
64
+ } ) ;
65
+
66
+ } else {
67
+ // manually find and replace if link reference is not present
68
+ findAndReplace ( name ) ;
69
+ }
70
+ }
71
+
51
72
replace ( libraryName ) ;
52
73
replace ( libraryHashPlaceholder ( libraryName ) ) ;
53
74
}
0 commit comments