diff --git a/ethfull/apicalls.go b/ethfull/apicalls.go index 2c10644..32ab092 100644 --- a/ethfull/apicalls.go +++ b/ethfull/apicalls.go @@ -88,7 +88,7 @@ func getContractABI(ctx context.Context, address string, endpoint string) (*eth. res, err := httpClient.Do(req) if err != nil { - return nil, "", nil, fmt.Errorf("getting contract abi from etherscan: %w", err) + return nil, "", nil, fmt.Errorf("getting contract abi: %w", err) } defer res.Body.Close() diff --git a/ethfull/convo.go b/ethfull/convo.go index 6c00ef3..7fa6bfa 100644 --- a/ethfull/convo.go +++ b/ethfull/convo.go @@ -62,7 +62,7 @@ Supported networks: `+strings.Join(supportedChains, ", "), func NewWithSQL(factory *codegen.MsgWrapFactory) codegen.Conversation { h := &Convo{ - state: &Project{}, + state: &Project{currentContractIdx: -1}, factory: factory, outputType: outputTypeSQL, remoteBuildState: &codegen.RemoteBuildState{}, @@ -72,7 +72,7 @@ func NewWithSQL(factory *codegen.MsgWrapFactory) codegen.Conversation { func NewWithSubgraph(factory *codegen.MsgWrapFactory) codegen.Conversation { h := &Convo{ - state: &Project{}, + state: &Project{currentContractIdx: -1}, factory: factory, outputType: outputTypeSubgraph, remoteBuildState: &codegen.RemoteBuildState{}, @@ -94,7 +94,7 @@ func cmd(msg any) loop.Cmd { // This function does NOT mutate anything. Only reads. func (c *Convo) contextContract() *Contract { - if c.state.currentContractIdx > len(c.state.Contracts)-1 { + if c.state.currentContractIdx == -1 || c.state.currentContractIdx > len(c.state.Contracts)-1 { return nil } return c.state.Contracts[c.state.currentContractIdx] @@ -208,6 +208,9 @@ func (p *Project) NextStep() (out loop.Cmd) { if dynContract.abi == nil { if dynContract.RawABI == nil { if dynContract.referenceContractAddress == "" { + if p.ChainConfig().ApiEndpoint == "" { + return notifyContext(cmd(AskDynamicContractABI{})) + } return notifyContext(cmd(AskDynamicContractAddress{})) } return notifyContext(cmd(FetchDynamicContractABI{})) @@ -389,6 +392,15 @@ func (c *Convo) Update(msg loop.Msg) loop.Cmd { return c.action(InputContractABI{}).TextInput("Please paste the contract ABI", "Submit"). Cmd() + case AskDynamicContractABI: + contract := c.contextContract() + if contract == nil { + return QuitInvalidContext + } + + return c.action(InputDynamicContractABI{}).TextInput(fmt.Sprintf("Please paste the ABI for contracts that will be created by the event %q", contract.FactoryCreationEventName()), "Submit"). + Cmd() + case InputContractABI: // FIXME: dedupe all these QuitInvalidContext! contract := c.contextContract() @@ -480,6 +492,10 @@ func (c *Convo) Update(msg loop.Msg) loop.Cmd { return QuitInvalidContext } contract := c.state.dynamicContractOf(factory.Name) + config := c.state.ChainConfig() + if config.ApiEndpoint == "" { + return cmd(AskDynamicContractABI{}) + } return func() loop.Msg { abi, err := contract.FetchABI(c.state.ChainConfig()) return ReturnFetchDynamicContractABI{abi: abi, err: err} diff --git a/ethfull/convo_test.go b/ethfull/convo_test.go index 196e8ee..63e7c94 100644 --- a/ethfull/convo_test.go +++ b/ethfull/convo_test.go @@ -219,6 +219,7 @@ func TestContractNameAlreadyExists(t *testing.T) { f := &codegen.MsgWrapFactory{} conv := NewWithSQL(f).(*Convo) p := conv.state + p.currentContractIdx = 0 p.Contracts = append(p.Contracts, &Contract{ BaseContract: BaseContract{ Name: "test", @@ -239,6 +240,7 @@ func TestDynamicContractNameAlreadyExists(t *testing.T) { f := &codegen.MsgWrapFactory{} conv := NewWithSQL(f).(*Convo) p := conv.state + p.currentContractIdx = 0 p.Contracts = append(p.Contracts, &Contract{ BaseContract: BaseContract{ Name: "test", @@ -259,6 +261,7 @@ func TestContractAddressAlreadyExists(t *testing.T) { f := &codegen.MsgWrapFactory{} conv := NewWithSQL(f).(*Convo) p := conv.state + p.currentContractIdx = 0 p.Contracts = append(p.Contracts, &Contract{ Address: "0x1f98431c8ad98523631ae4a59f267346ea31f984", }) @@ -277,6 +280,7 @@ func TestDynamicContractAddressAlreadyExists(t *testing.T) { f := &codegen.MsgWrapFactory{} conv := NewWithSQL(f).(*Convo) p := conv.state + p.currentContractIdx = 0 p.Contracts = append(p.Contracts, &Contract{ Address: "0x1f98431c8ad98523631ae4a59f267346ea31f984", })