Skip to content

Commit af845d2

Browse files
authored
Cleaning up manage whitelist (#21997)
1 parent 9a4d7ff commit af845d2

2 files changed

Lines changed: 61 additions & 2 deletions

File tree

deployment/vault/changeset/manage_whitelist.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,14 @@ func (s whitelistChangeset) Apply(e cldf.Environment, cfg types.SetWhitelistConf
3030
lggr := e.Logger
3131

3232
ds := datastore.NewMemoryDataStore()
33+
// Merge only chain metadata from the environment, not the full datastore. A full Merge would
34+
// copy every AddressRef from e.DataStore into the output artifact; the catalog/runtime can
35+
// carry duplicate contract keys (e.g. qualifier "" vs address-type from deploy_timelock_vault
36+
// or address-book migration), and passing those through would upsert unwanted rows into
37+
// address_refs.json even though this changeset only updates whitelist chain metadata.
3338
if e.DataStore != nil {
34-
if err := ds.Merge(e.DataStore); err != nil {
35-
return cldf.ChangesetOutput{}, fmt.Errorf("failed to merge existing datastore: %w", err)
39+
if err := mergeChainMetadataOnly(ds, e.DataStore); err != nil {
40+
return cldf.ChangesetOutput{}, fmt.Errorf("failed to merge existing chain metadata: %w", err)
3641
}
3742
}
3843

@@ -79,6 +84,19 @@ func (s whitelistChangeset) Apply(e cldf.Environment, cfg types.SetWhitelistConf
7984
}, nil
8085
}
8186

87+
func mergeChainMetadataOnly(dst datastore.MutableDataStore, src datastore.DataStore) error {
88+
records, err := src.ChainMetadata().Fetch()
89+
if err != nil {
90+
return err
91+
}
92+
for _, record := range records {
93+
if err := dst.ChainMetadata().Upsert(record); err != nil {
94+
return err
95+
}
96+
}
97+
return nil
98+
}
99+
82100
func mergeWhitelistEntries(existing, incoming []types.WhitelistAddress) []types.WhitelistAddress {
83101
if len(existing) == 0 && len(incoming) == 0 {
84102
return nil

deployment/vault/changeset/manage_whitelist_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"slices"
55
"testing"
66

7+
"github.com/Masterminds/semver/v3"
78
"github.com/ethereum/go-ethereum/common"
89
"github.com/stretchr/testify/require"
910

@@ -633,3 +634,43 @@ func TestOverwriteWhitelistChangeset(t *testing.T) {
633634
require.Empty(t, whitelist[selector1])
634635
})
635636
}
637+
638+
func TestSetWhitelistOutputOmitsEnvironmentAddressRefs(t *testing.T) {
639+
t.Parallel()
640+
641+
selector := chainselectors.TEST_90000001.Selector
642+
version := semver.MustParse("1.0.0")
643+
644+
ds := datastore.NewMemoryDataStore()
645+
err := ds.Addresses().Add(datastore.AddressRef{
646+
ChainSelector: selector,
647+
Address: "0x52b93FCA1F672800B5FdBCbDAF7c76646470C506",
648+
Type: datastore.ContractType("RBACTimeLock"),
649+
Version: version,
650+
Qualifier: "0x52b93FCA1F672800B5FdBCbDAF7c76646470C506-RBACTimeLock",
651+
})
652+
require.NoError(t, err)
653+
654+
env, err := environment.New(t.Context(),
655+
environment.WithEVMSimulated(t, []uint64{selector}),
656+
environment.WithDatastore(ds.Seal()),
657+
)
658+
require.NoError(t, err)
659+
660+
cfg := types.SetWhitelistConfig{
661+
WhitelistByChain: map[uint64][]types.WhitelistAddress{
662+
selector: {{
663+
Address: common.HexToAddress(whitelistTestAddr1).Hex(),
664+
Description: "test",
665+
Labels: []string{"team"},
666+
}},
667+
},
668+
}
669+
670+
out, err := SetWhitelistChangeset.Apply(*env, cfg)
671+
require.NoError(t, err)
672+
673+
refs, err := out.DataStore.Addresses().Fetch()
674+
require.NoError(t, err)
675+
require.Empty(t, refs, "output must not merge address refs from environment; pipeline merge would upsert them into address_refs.json")
676+
}

0 commit comments

Comments
 (0)