Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions accounts/abi/bind/bind.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const (
// to be used as is in client code, but rather as an intermediate struct which
// enforces compile time type safety and naming convention opposed to having to
// manually maintain hard coded strings that break on runtime.
func Bind(types []string, abis []string, bytecodes []string, pkg string, lang Lang) (string, error) {
func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang) (string, error) {
// Process each individual contract requested binding
contracts := make(map[string]*tmplContract)

Expand Down Expand Up @@ -125,6 +125,9 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
Transacts: transacts,
Events: events,
}
if len(fsigs) > i {
contracts[types[i]].FuncSigs = fsigs[i]
}
}
// Generate the contract template data content and render it
data := &tmplData{
Expand Down Expand Up @@ -180,8 +183,7 @@ func bindBasicTypeGo(kind abi.Type) string {
case abi.BytesTy:
return "[]byte"
case abi.FunctionTy:
// todo(rjl493456442)
return ""
return "[24]byte"
default:
// string, bool types
return kind.String()
Expand Down Expand Up @@ -240,8 +242,7 @@ func bindBasicTypeJava(kind abi.Type) string {
case abi.StringTy:
return "String"
case abi.FunctionTy:
// todo(rjl493456442)
return ""
return "byte[24]"
default:
return kind.String()
}
Expand Down
65 changes: 62 additions & 3 deletions accounts/abi/bind/bind_test.go

Large diffs are not rendered by default.

23 changes: 22 additions & 1 deletion accounts/abi/bind/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type tmplContract struct {
Type string // Type name of the main contract binding
InputABI string // JSON ABI used as the input to generate the binding from
InputBin string // Optional EVM bytecode used to denetare deploy code from
FuncSigs map[string]string // Optional map: string signature -> 4-byte signature
Constructor abi.Method // Contract constructor for deploy parametrization
Calls map[string]*tmplMethod // Contract calls that only read state data
Transacts map[string]*tmplMethod // Contract calls that write state data
Expand Down Expand Up @@ -92,6 +93,15 @@ var (
// {{.Type}}ABI is the input ABI used to generate the binding from.
const {{.Type}}ABI = "{{.InputABI}}"

{{if $contract.FuncSigs}}
// {{.Type}}FuncSigs maps the 4-byte function signature to its string representation.
var {{.Type}}FuncSigs = map[string]string{
{{range $strsig, $binsig := .FuncSigs}}
"{{$binsig}}": "{{$strsig}}",
{{end}}
}
{{end}}

{{if .InputBin}}
// {{.Type}}Bin is the compiled bytecode used for deploying new contracts.
const {{.Type}}Bin = ` + "`" + `{{.InputBin}}` + "`" + `
Expand Down Expand Up @@ -452,12 +462,23 @@ const tmplSourceJava = `
package {{.Package}};

import org.ethereum.geth.*;
import java.util.*;

{{range $contract := .Contracts}}
public class {{.Type}} {
// ABI is the input ABI used to generate the binding from.
public final static String ABI = "{{.InputABI}}";

{{if $contract.FuncSigs}}
// {{.Type}}FuncSigs maps the 4-byte function signature to its string representation.
public final static Map<String, String> {{.Type}}FuncSigs;
static {
Hashtable<String, String> temp = new Hashtable<String, String>();
{{range $strsig, $binsig := .FuncSigs}}
temp.put("{{$binsig}}", "{{$strsig}}");
{{end}}
{{.Type}}FuncSigs = Collections.unmodifiableMap(temp);
}
{{end}}
{{if .InputBin}}
// BYTECODE is the compiled bytecode used for deploying new contracts.
public final static String BYTECODE = "0x{{.InputBin}}";
Expand Down
4 changes: 3 additions & 1 deletion cmd/abigen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ func main() {
abis []string
bins []string
types []string
sigs []map[string]string
)
if *solFlag != "" || *vyFlag != "" || *abiFlag == "-" {
// Generate the list of types to exclude from binding
Expand Down Expand Up @@ -121,6 +122,7 @@ func main() {
}
abis = append(abis, string(abi))
bins = append(bins, contract.Code)
sigs = append(sigs, contract.Hashes)

nameParts := strings.Split(name, ":")
types = append(types, nameParts[len(nameParts)-1])
Expand Down Expand Up @@ -151,7 +153,7 @@ func main() {
types = append(types, kind)
}
// Generate the contract binding
code, err := bind.Bind(types, abis, bins, *pkgFlag, lang)
code, err := bind.Bind(types, abis, bins, sigs, *pkgFlag, lang)
if err != nil {
fmt.Printf("Failed to generate ABI binding: %v\n", err)
os.Exit(-1)
Expand Down
7 changes: 4 additions & 3 deletions common/compiler/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`)

// Contract contains information about a compiled contract, alongside its code and runtime code.
type Contract struct {
Code string `json:"code"`
RuntimeCode string `json:"runtime-code"`
Info ContractInfo `json:"info"`
Code string `json:"code"`
RuntimeCode string `json:"runtime-code"`
Info ContractInfo `json:"info"`
Hashes map[string]string `json:"hashes"`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any need to keep this backwards compatible, or do we assume that ppl always regenerate stuff and there's no need to parse stuff which doesn't have hashes ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is backwards-compatible in the sense that this is a convenience conversion table so that client code can quickly lookup a function name given its hash. Older client code that won't be regenerated will simply have to do the translation themselves.

}

// ContractInfo contains information about a compiled contract, including access
Expand Down
4 changes: 3 additions & 1 deletion common/compiler/solidity.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ type solcOutput struct {
BinRuntime string `json:"bin-runtime"`
SrcMapRuntime string `json:"srcmap-runtime"`
Bin, SrcMap, Abi, Devdoc, Userdoc, Metadata string
Hashes map[string]string
}
Version string
}
Expand All @@ -49,7 +50,7 @@ func (s *Solidity) makeArgs() []string {
"--optimize", // code optimizer switched on
}
if s.Major > 0 || s.Minor > 4 || s.Patch > 6 {
p[1] += ",metadata"
p[1] += ",metadata,hashes"
}
return p
}
Expand Down Expand Up @@ -161,6 +162,7 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin
contracts[name] = &Contract{
Code: "0x" + info.Bin,
RuntimeCode: "0x" + info.BinRuntime,
Hashes: info.Hashes,
Info: ContractInfo{
Source: source,
Language: "Solidity",
Expand Down