abi/bind: fix error-handling in generated wrappers for functions returning structs (#22005)
Fixes the template used when generating code, which in some scenarios would lead to panic instead of returning an error.
This commit is contained in:
parent
4d48980e74
commit
38c1d592b7
@ -569,6 +569,45 @@ var bindTests = []struct {
|
|||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
`NonExistentStruct`,
|
||||||
|
`
|
||||||
|
contract NonExistentStruct {
|
||||||
|
function Struct() public view returns(uint256 a, uint256 b) {
|
||||||
|
return (10, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
[]string{`6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d5f6622514602d575b600080fd5b6033604c565b6040805192835260208301919091528051918290030190f35b600a809156fea264697066735822beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef64736f6c6343decafe0033`},
|
||||||
|
[]string{`[{"inputs":[],"name":"Struct","outputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"stateMutability":"pure","type":"function"}]`},
|
||||||
|
`
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core"
|
||||||
|
`,
|
||||||
|
`
|
||||||
|
// Create a simulator and wrap a non-deployed contract
|
||||||
|
|
||||||
|
sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000))
|
||||||
|
defer sim.Close()
|
||||||
|
|
||||||
|
nonexistent, err := NewNonExistentStruct(common.Address{}, sim)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to access non-existent contract: %v", err)
|
||||||
|
}
|
||||||
|
// Ensure that contract calls fail with the appropriate error
|
||||||
|
if res, err := nonexistent.Struct(nil); err == nil {
|
||||||
|
t.Fatalf("Call succeeded on non-existent contract: %v", res)
|
||||||
|
} else if (err != bind.ErrNoCode) {
|
||||||
|
t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode)
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
},
|
||||||
// Tests that gas estimation works for contracts with weird gas mechanics too.
|
// Tests that gas estimation works for contracts with weird gas mechanics too.
|
||||||
{
|
{
|
||||||
`FunkyGasPattern`,
|
`FunkyGasPattern`,
|
||||||
|
@ -304,6 +304,9 @@ var (
|
|||||||
err := _{{$contract.Type}}.contract.Call(opts, &out, "{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}})
|
err := _{{$contract.Type}}.contract.Call(opts, &out, "{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}})
|
||||||
{{if .Structured}}
|
{{if .Structured}}
|
||||||
outstruct := new(struct{ {{range .Normalized.Outputs}} {{.Name}} {{bindtype .Type $structs}}; {{end}} })
|
outstruct := new(struct{ {{range .Normalized.Outputs}} {{.Name}} {{bindtype .Type $structs}}; {{end}} })
|
||||||
|
if err != nil {
|
||||||
|
return *outstruct, err
|
||||||
|
}
|
||||||
{{range $i, $t := .Normalized.Outputs}}
|
{{range $i, $t := .Normalized.Outputs}}
|
||||||
outstruct.{{.Name}} = out[{{$i}}].({{bindtype .Type $structs}}){{end}}
|
outstruct.{{.Name}} = out[{{$i}}].({{bindtype .Type $structs}}){{end}}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user