Skip to content

Commit 3623590

Browse files
authored
Merge pull request #1997 from onflow/cf/simplify-dep-alias
Dependency Manager: Smartly auto-apply alias from matching account
2 parents f0d97be + 4731464 commit 3623590

2 files changed

Lines changed: 126 additions & 1 deletion

File tree

internal/dependencymanager/dependencyinstaller.go

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ type DependencyInstaller struct {
113113
SkipAlias bool
114114
logs categorizedLogs
115115
dependencies map[string]config.Dependency
116+
accountAliases map[string]map[string]flowsdk.Address // network -> account -> alias
116117
}
117118

118119
// NewDependencyInstaller creates a new instance of DependencyInstaller
@@ -148,6 +149,7 @@ func NewDependencyInstaller(logger output.Logger, state *flowkit.State, saveStat
148149
SkipAlias: flags.skipAlias,
149150
dependencies: make(map[string]config.Dependency),
150151
logs: categorizedLogs{},
152+
accountAliases: make(map[string]map[string]flowsdk.Address),
151153
}, nil
152154
}
153155

@@ -552,16 +554,38 @@ func (di *DependencyInstaller) updateDependencyAlias(contractName, aliasNetwork
552554
}
553555

554556
for _, missingNetwork := range missingNetworks {
557+
// Check if we already have an alias for this account on this network
558+
accountAddress := di.getCurrentContractAccountAddress(contractName, aliasNetwork)
559+
if accountAddress != "" {
560+
if existingAlias, exists := di.getAccountAlias(accountAddress, missingNetwork); exists {
561+
// Automatically apply the existing alias
562+
contract, err := di.State.Contracts().ByName(contractName)
563+
if err != nil {
564+
return err
565+
}
566+
contract.Aliases.Add(missingNetwork, existingAlias)
567+
di.Logger.Info(fmt.Sprintf("%s Automatically applied alias %s for %s on %s (from same account)",
568+
util.PrintEmoji("🔄"), existingAlias.String(), contractName, missingNetwork))
569+
continue
570+
}
571+
}
572+
555573
label := fmt.Sprintf("Enter an alias address for %s on %s if you have one, otherwise leave blank", contractName, missingNetwork)
556574
raw := prompt.AddressPromptOrEmpty(label, "Invalid alias address")
557575

558576
if raw != "" {
577+
aliasAddress := flowsdk.HexToAddress(raw)
578+
579+
if accountAddress != "" {
580+
di.setAccountAlias(accountAddress, missingNetwork, aliasAddress)
581+
}
582+
559583
contract, err := di.State.Contracts().ByName(contractName)
560584
if err != nil {
561585
return err
562586
}
563587

564-
contract.Aliases.Add(missingNetwork, flowsdk.HexToAddress(raw))
588+
contract.Aliases.Add(missingNetwork, aliasAddress)
565589
}
566590
}
567591

@@ -591,3 +615,31 @@ func (di *DependencyInstaller) updateDependencyState(networkName, contractAddres
591615

592616
return nil
593617
}
618+
619+
// getCurrentContractAccountAddress returns the account address for the current contract being processed
620+
func (di *DependencyInstaller) getCurrentContractAccountAddress(contractName, networkName string) string {
621+
for _, dep := range di.dependencies {
622+
if dep.Name == contractName && dep.Source.NetworkName == networkName {
623+
return dep.Source.Address.String()
624+
}
625+
}
626+
return ""
627+
}
628+
629+
// getAccountAlias returns the stored alias for an account on a specific network
630+
func (di *DependencyInstaller) getAccountAlias(accountAddress, networkName string) (flowsdk.Address, bool) {
631+
if networkAliases, exists := di.accountAliases[networkName]; exists {
632+
if alias, exists := networkAliases[accountAddress]; exists {
633+
return alias, true
634+
}
635+
}
636+
return flowsdk.Address{}, false
637+
}
638+
639+
// setAccountAlias stores an alias for an account on a specific network
640+
func (di *DependencyInstaller) setAccountAlias(accountAddress, networkName string, alias flowsdk.Address) {
641+
if di.accountAliases[networkName] == nil {
642+
di.accountAliases[networkName] = make(map[string]flowsdk.Address)
643+
}
644+
di.accountAliases[networkName][accountAddress] = alias
645+
}

internal/dependencymanager/dependencyinstaller_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"testing"
2424

2525
"github.com/onflow/flow-go-sdk"
26+
flowsdk "github.com/onflow/flow-go-sdk"
2627
"github.com/stretchr/testify/assert"
2728
"github.com/stretchr/testify/mock"
2829

@@ -290,3 +291,75 @@ func TestDependencyInstallerAddMany(t *testing.T) {
290291
}
291292
})
292293
}
294+
295+
func TestDependencyInstallerAliasTracking(t *testing.T) {
296+
logger := output.NewStdoutLogger(output.NoneLog)
297+
_, state, _ := util.TestMocks(t)
298+
299+
serviceAcc, _ := state.EmulatorServiceAccount()
300+
serviceAddress := serviceAcc.Address
301+
302+
t.Run("AutoApplyAliasForSameAccount", func(t *testing.T) {
303+
gw := mocks.DefaultMockGateway()
304+
305+
// Mock the same account for both contracts
306+
gw.GetAccount.Run(func(args mock.Arguments) {
307+
addr := args.Get(1).(flow.Address)
308+
assert.Equal(t, addr.String(), serviceAcc.Address.String())
309+
acc := tests.NewAccountWithAddress(addr.String())
310+
acc.Contracts = map[string][]byte{
311+
"ContractOne": []byte("access(all) contract ContractOne {}"),
312+
"ContractTwo": []byte("access(all) contract ContractTwo {}"),
313+
}
314+
315+
gw.GetAccount.Return(acc, nil)
316+
})
317+
318+
di := &DependencyInstaller{
319+
Gateways: map[string]gateway.Gateway{
320+
config.EmulatorNetwork.Name: gw.Mock,
321+
config.TestnetNetwork.Name: gw.Mock,
322+
config.MainnetNetwork.Name: gw.Mock,
323+
},
324+
Logger: logger,
325+
State: state,
326+
SaveState: true,
327+
TargetDir: "",
328+
SkipDeployments: true,
329+
SkipAlias: false,
330+
dependencies: make(map[string]config.Dependency),
331+
accountAliases: make(map[string]map[string]flowsdk.Address),
332+
}
333+
334+
dep1 := config.Dependency{
335+
Name: "ContractOne",
336+
Source: config.Source{
337+
NetworkName: "mainnet",
338+
Address: flow.HexToAddress(serviceAddress.String()),
339+
ContractName: "ContractOne",
340+
},
341+
}
342+
di.dependencies["mainnet://"+serviceAddress.String()+".ContractOne"] = dep1
343+
344+
aliasAddress := flowsdk.HexToAddress("0x1234567890abcdef")
345+
di.setAccountAlias(serviceAddress.String(), "testnet", aliasAddress)
346+
347+
// Add second contract - this should automatically use the same alias
348+
dep2 := config.Dependency{
349+
Name: "ContractTwo",
350+
Source: config.Source{
351+
NetworkName: "mainnet",
352+
Address: flow.HexToAddress(serviceAddress.String()),
353+
ContractName: "ContractTwo",
354+
},
355+
}
356+
di.dependencies["mainnet://"+serviceAddress.String()+".ContractTwo"] = dep2
357+
358+
existingAlias, exists := di.getAccountAlias(serviceAddress.String(), "testnet")
359+
assert.True(t, exists, "Alias should exist for the account")
360+
assert.Equal(t, aliasAddress, existingAlias, "Alias should match the stored value")
361+
362+
accountAddr := di.getCurrentContractAccountAddress("ContractOne", "mainnet")
363+
assert.Equal(t, serviceAddress.String(), accountAddr, "Should return correct account address")
364+
})
365+
}

0 commit comments

Comments
 (0)