Skip to content
Closed
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: 11 additions & 0 deletions cmd/generate-bindings/generate-bindings.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,17 @@ func (h *handler) processAbiDirectory(inputs Inputs) error {
return fmt.Errorf("no .abi files found in directory: %s", inputs.AbiPath)
}

packageNames := make(map[string]bool)
for _, abiFile := range files {
contractName := filepath.Base(abiFile)
contractName = contractName[:len(contractName)-4]
packageName := contractNameToPackage(contractName)
if _, exists := packageNames[packageName]; exists {
return fmt.Errorf("package name collision: multiple contracts would generate the same package name '%s' (contracts are converted to snake_case for package names). Please rename one of your contract files to avoid this conflict", packageName)
}
packageNames[packageName] = true
}

// Process each ABI file
for _, abiFile := range files {
// Extract contract name from filename (remove .abi extension)
Expand Down
41 changes: 41 additions & 0 deletions cmd/generate-bindings/generate-bindings_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,47 @@ func TestProcessAbiDirectory_NoAbiFiles(t *testing.T) {
assert.Contains(t, err.Error(), "no .abi files found")
}

func TestProcessAbiDirectory_PackageNameCollision(t *testing.T) {
tempDir, err := os.MkdirTemp("", "generate-bindings-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

abiDir := filepath.Join(tempDir, "abi")
outDir := filepath.Join(tempDir, "generated")

err = os.MkdirAll(abiDir, 0755)
require.NoError(t, err)

abiContent := `[{"type":"function","name":"test","inputs":[],"outputs":[]}]`

// "TestContract" -> "test_contract"
// "test_contract" -> "test_contract"
err = os.WriteFile(filepath.Join(abiDir, "TestContract.abi"), []byte(abiContent), 0600)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(abiDir, "test_contract.abi"), []byte(abiContent), 0600)
require.NoError(t, err)

logger := zerolog.New(os.Stderr).With().Timestamp().Logger()
runtimeCtx := &runtime.Context{
Logger: &logger,
}
handler := newHandler(runtimeCtx)

inputs := Inputs{
ProjectRoot: tempDir,
ChainFamily: "evm",
Language: "go",
AbiPath: abiDir,
PkgName: "bindings",
OutPath: outDir,
}

err = handler.processAbiDirectory(inputs)
fmt.Println(err.Error())
require.Error(t, err)
require.Equal(t, err.Error(), "package name collision: multiple contracts would generate the same package name 'test_contract' (contracts are converted to snake_case for package names). Please rename one of your contract files to avoid this conflict")
}

func TestProcessAbiDirectory_NonExistentDirectory(t *testing.T) {
logger := zerolog.New(os.Stderr).With().Timestamp().Logger()
runtimeCtx := &runtime.Context{
Expand Down
Loading