2019-03-18 15:29:26 +03:00
|
|
|
// Copyright 2019 The go-ethereum Authors
|
2016-04-14 19:18:24 +03:00
|
|
|
// This file is part of go-ethereum.
|
2016-03-16 12:48:33 +02:00
|
|
|
//
|
2016-04-14 19:18:24 +03:00
|
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
2016-03-16 12:48:33 +02:00
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
2016-04-14 19:18:24 +03:00
|
|
|
// go-ethereum is distributed in the hope that it will be useful,
|
2016-03-16 12:48:33 +02:00
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2016-04-14 19:18:24 +03:00
|
|
|
// GNU General Public License for more details.
|
2016-03-16 12:48:33 +02:00
|
|
|
//
|
2016-04-14 19:18:24 +03:00
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
2016-03-16 12:48:33 +02:00
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2016-03-21 14:34:49 +02:00
|
|
|
"encoding/json"
|
2016-03-16 12:48:33 +02:00
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
2016-03-26 11:43:09 +02:00
|
|
|
"strings"
|
2016-03-16 12:48:33 +02:00
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
2016-03-21 14:34:49 +02:00
|
|
|
"github.com/ethereum/go-ethereum/common/compiler"
|
2016-03-16 12:48:33 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
cmd/abigen: support for reading solc output from stdin (#16683)
Allow the --abi flag to be given - to indicate that it should read the
ABI information from standard input. It expects to read the solc output
with the --combined-json flag providing bin, abi, userdoc, devdoc, and
metadata, and works very similarly to the internal invocation of solc,
except it allows external invocation of solc.
This facilitates integration with more complex solc invocations, such
as invocations that require path remapping or --allow-paths tweaks.
Simple usage example:
solc --combined-json bin,abi,userdoc,devdoc,metadata *.sol | abigen --abi -
2018-06-05 13:22:02 +03:00
|
|
|
abiFlag = flag.String("abi", "", "Path to the Ethereum contract ABI json to bind, - for STDIN")
|
2016-03-17 19:27:37 +02:00
|
|
|
binFlag = flag.String("bin", "", "Path to the Ethereum contract bytecode (generate deploy method)")
|
2016-09-05 19:07:57 +03:00
|
|
|
typFlag = flag.String("type", "", "Struct name for the binding (default = package name)")
|
2016-03-21 14:34:49 +02:00
|
|
|
|
|
|
|
solFlag = flag.String("sol", "", "Path to the Ethereum contract Solidity source to build and bind")
|
|
|
|
solcFlag = flag.String("solc", "solc", "Solidity compiler to use if source builds are requested")
|
2016-03-26 11:43:09 +02:00
|
|
|
excFlag = flag.String("exc", "", "Comma separated types to exclude from binding")
|
2016-03-21 14:34:49 +02:00
|
|
|
|
2019-03-18 15:29:26 +03:00
|
|
|
vyFlag = flag.String("vy", "", "Path to the Ethereum contract Vyper source to build and bind")
|
|
|
|
vyperFlag = flag.String("vyper", "vyper", "Vyper compiler to use if source builds are requested")
|
|
|
|
|
2016-09-05 19:07:57 +03:00
|
|
|
pkgFlag = flag.String("pkg", "", "Package name to generate the binding into")
|
|
|
|
outFlag = flag.String("out", "", "Output file for the generated binding (default = stdout)")
|
|
|
|
langFlag = flag.String("lang", "go", "Destination language for the bindings (go, java, objc)")
|
2016-03-16 12:48:33 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
2016-03-21 14:34:49 +02:00
|
|
|
// Parse and ensure all needed inputs are specified
|
2016-03-16 12:48:33 +02:00
|
|
|
flag.Parse()
|
|
|
|
|
2019-03-18 15:29:26 +03:00
|
|
|
if *abiFlag == "" && *solFlag == "" && *vyFlag == "" {
|
|
|
|
fmt.Printf("No contract ABI (--abi), Solidity source (--sol), or Vyper source (--vy) specified\n")
|
|
|
|
os.Exit(-1)
|
|
|
|
} else if (*abiFlag != "" || *binFlag != "" || *typFlag != "") && (*solFlag != "" || *vyFlag != "") {
|
|
|
|
fmt.Printf("Contract ABI (--abi), bytecode (--bin) and type (--type) flags are mutually exclusive with the Solidity (--sol) and Vyper (--vy) flags\n")
|
2016-03-21 14:34:49 +02:00
|
|
|
os.Exit(-1)
|
2019-03-18 15:29:26 +03:00
|
|
|
} else if *solFlag != "" && *vyFlag != "" {
|
|
|
|
fmt.Printf("Solidity (--sol) and Vyper (--vy) flags are mutually exclusive\n")
|
2016-03-16 12:48:33 +02:00
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
if *pkgFlag == "" {
|
2016-09-05 19:07:57 +03:00
|
|
|
fmt.Printf("No destination package specified (--pkg)\n")
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
var lang bind.Lang
|
|
|
|
switch *langFlag {
|
|
|
|
case "go":
|
|
|
|
lang = bind.LangGo
|
|
|
|
case "java":
|
|
|
|
lang = bind.LangJava
|
|
|
|
default:
|
|
|
|
fmt.Printf("Unsupported destination language \"%s\" (--lang)\n", *langFlag)
|
2016-03-16 12:48:33 +02:00
|
|
|
os.Exit(-1)
|
|
|
|
}
|
2016-03-21 14:34:49 +02:00
|
|
|
// If the entire solidity code was specified, build and bind based on that
|
|
|
|
var (
|
|
|
|
abis []string
|
|
|
|
bins []string
|
|
|
|
types []string
|
2019-07-02 10:52:58 +03:00
|
|
|
sigs []map[string]string
|
2016-03-21 14:34:49 +02:00
|
|
|
)
|
2019-05-27 21:28:17 +03:00
|
|
|
if *solFlag != "" || *vyFlag != "" || *abiFlag == "-" {
|
2016-03-26 11:43:09 +02:00
|
|
|
// Generate the list of types to exclude from binding
|
|
|
|
exclude := make(map[string]bool)
|
|
|
|
for _, kind := range strings.Split(*excFlag, ",") {
|
|
|
|
exclude[strings.ToLower(kind)] = true
|
|
|
|
}
|
cmd/abigen: support for reading solc output from stdin (#16683)
Allow the --abi flag to be given - to indicate that it should read the
ABI information from standard input. It expects to read the solc output
with the --combined-json flag providing bin, abi, userdoc, devdoc, and
metadata, and works very similarly to the internal invocation of solc,
except it allows external invocation of solc.
This facilitates integration with more complex solc invocations, such
as invocations that require path remapping or --allow-paths tweaks.
Simple usage example:
solc --combined-json bin,abi,userdoc,devdoc,metadata *.sol | abigen --abi -
2018-06-05 13:22:02 +03:00
|
|
|
|
|
|
|
var contracts map[string]*compiler.Contract
|
|
|
|
var err error
|
2019-03-18 15:29:26 +03:00
|
|
|
|
|
|
|
switch {
|
|
|
|
case *solFlag != "":
|
cmd/abigen: support for reading solc output from stdin (#16683)
Allow the --abi flag to be given - to indicate that it should read the
ABI information from standard input. It expects to read the solc output
with the --combined-json flag providing bin, abi, userdoc, devdoc, and
metadata, and works very similarly to the internal invocation of solc,
except it allows external invocation of solc.
This facilitates integration with more complex solc invocations, such
as invocations that require path remapping or --allow-paths tweaks.
Simple usage example:
solc --combined-json bin,abi,userdoc,devdoc,metadata *.sol | abigen --abi -
2018-06-05 13:22:02 +03:00
|
|
|
contracts, err = compiler.CompileSolidity(*solcFlag, *solFlag)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Failed to build Solidity contract: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
2019-03-18 15:29:26 +03:00
|
|
|
case *vyFlag != "":
|
|
|
|
contracts, err = compiler.CompileVyper(*vyperFlag, *vyFlag)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Failed to build Vyper contract: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
default:
|
cmd/abigen: support for reading solc output from stdin (#16683)
Allow the --abi flag to be given - to indicate that it should read the
ABI information from standard input. It expects to read the solc output
with the --combined-json flag providing bin, abi, userdoc, devdoc, and
metadata, and works very similarly to the internal invocation of solc,
except it allows external invocation of solc.
This facilitates integration with more complex solc invocations, such
as invocations that require path remapping or --allow-paths tweaks.
Simple usage example:
solc --combined-json bin,abi,userdoc,devdoc,metadata *.sol | abigen --abi -
2018-06-05 13:22:02 +03:00
|
|
|
contracts, err = contractsFromStdin()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Failed to read input ABIs from STDIN: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
2016-03-21 14:34:49 +02:00
|
|
|
}
|
2016-03-26 11:43:09 +02:00
|
|
|
// Gather all non-excluded contract for binding
|
2016-03-21 14:34:49 +02:00
|
|
|
for name, contract := range contracts {
|
2016-03-26 11:43:09 +02:00
|
|
|
if exclude[strings.ToLower(name)] {
|
|
|
|
continue
|
|
|
|
}
|
2019-03-18 15:29:26 +03:00
|
|
|
abi, err := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Failed to parse ABIs from compiler output: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
2016-03-21 14:34:49 +02:00
|
|
|
abis = append(abis, string(abi))
|
|
|
|
bins = append(bins, contract.Code)
|
2019-07-02 10:52:58 +03:00
|
|
|
sigs = append(sigs, contract.Hashes)
|
2017-02-06 20:16:56 +03:00
|
|
|
|
|
|
|
nameParts := strings.Split(name, ":")
|
|
|
|
types = append(types, nameParts[len(nameParts)-1])
|
2016-03-21 14:34:49 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Otherwise load up the ABI, optional bytecode and type name from the parameters
|
2019-05-27 21:28:17 +03:00
|
|
|
abi, err := ioutil.ReadFile(*abiFlag)
|
|
|
|
|
2016-03-21 14:34:49 +02:00
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Failed to read input ABI: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
abis = append(abis, string(abi))
|
|
|
|
|
2019-02-15 02:02:11 +03:00
|
|
|
var bin []byte
|
2016-03-21 14:34:49 +02:00
|
|
|
if *binFlag != "" {
|
|
|
|
if bin, err = ioutil.ReadFile(*binFlag); err != nil {
|
|
|
|
fmt.Printf("Failed to read input bytecode: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bins = append(bins, string(bin))
|
|
|
|
|
|
|
|
kind := *typFlag
|
|
|
|
if kind == "" {
|
|
|
|
kind = *pkgFlag
|
|
|
|
}
|
|
|
|
types = append(types, kind)
|
2016-03-17 19:27:37 +02:00
|
|
|
}
|
|
|
|
// Generate the contract binding
|
2019-07-02 10:52:58 +03:00
|
|
|
code, err := bind.Bind(types, abis, bins, sigs, *pkgFlag, lang)
|
2016-03-16 12:48:33 +02:00
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Failed to generate ABI binding: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
// Either flush it out to a file or display on the standard output
|
|
|
|
if *outFlag == "" {
|
|
|
|
fmt.Printf("%s\n", code)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if err := ioutil.WriteFile(*outFlag, []byte(code), 0600); err != nil {
|
|
|
|
fmt.Printf("Failed to write ABI binding: %v\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
}
|
cmd/abigen: support for reading solc output from stdin (#16683)
Allow the --abi flag to be given - to indicate that it should read the
ABI information from standard input. It expects to read the solc output
with the --combined-json flag providing bin, abi, userdoc, devdoc, and
metadata, and works very similarly to the internal invocation of solc,
except it allows external invocation of solc.
This facilitates integration with more complex solc invocations, such
as invocations that require path remapping or --allow-paths tweaks.
Simple usage example:
solc --combined-json bin,abi,userdoc,devdoc,metadata *.sol | abigen --abi -
2018-06-05 13:22:02 +03:00
|
|
|
|
|
|
|
func contractsFromStdin() (map[string]*compiler.Contract, error) {
|
|
|
|
bytes, err := ioutil.ReadAll(os.Stdin)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return compiler.ParseCombinedJSON(bytes, "", "", "", "")
|
|
|
|
}
|