Skip to content

Commit 3a76f0a

Browse files
committed
Auto add alias for already prompted
1 parent 44983fb commit 3a76f0a

2 files changed

Lines changed: 132 additions & 1 deletion

File tree

internal/dependencymanager/dependencyinstaller.go

Lines changed: 55 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,39 @@ 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+
// Store the alias for this account and network
580+
if accountAddress != "" {
581+
di.setAccountAlias(accountAddress, missingNetwork, aliasAddress)
582+
}
583+
559584
contract, err := di.State.Contracts().ByName(contractName)
560585
if err != nil {
561586
return err
562587
}
563588

564-
contract.Aliases.Add(missingNetwork, flowsdk.HexToAddress(raw))
589+
contract.Aliases.Add(missingNetwork, aliasAddress)
565590
}
566591
}
567592

@@ -591,3 +616,32 @@ func (di *DependencyInstaller) updateDependencyState(networkName, contractAddres
591616

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

internal/dependencymanager/dependencyinstaller_test.go

Lines changed: 77 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,79 @@ 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+
// Add first contract - this should prompt for alias
335+
dep1 := config.Dependency{
336+
Name: "ContractOne",
337+
Source: config.Source{
338+
NetworkName: "mainnet",
339+
Address: flow.HexToAddress(serviceAddress.String()),
340+
ContractName: "ContractOne",
341+
},
342+
}
343+
di.dependencies["mainnet://"+serviceAddress.String()+".ContractOne"] = dep1
344+
345+
// Simulate user providing an alias for the first contract
346+
aliasAddress := flowsdk.HexToAddress("0x1234567890abcdef")
347+
di.setAccountAlias(serviceAddress.String(), "testnet", aliasAddress)
348+
349+
// Add second contract - this should automatically use the same alias
350+
dep2 := config.Dependency{
351+
Name: "ContractTwo",
352+
Source: config.Source{
353+
NetworkName: "mainnet",
354+
Address: flow.HexToAddress(serviceAddress.String()),
355+
ContractName: "ContractTwo",
356+
},
357+
}
358+
di.dependencies["mainnet://"+serviceAddress.String()+".ContractTwo"] = dep2
359+
360+
// Verify that the alias is automatically applied
361+
existingAlias, exists := di.getAccountAlias(serviceAddress.String(), "testnet")
362+
assert.True(t, exists, "Alias should exist for the account")
363+
assert.Equal(t, aliasAddress, existingAlias, "Alias should match the stored value")
364+
365+
// Test that getCurrentContractAccountAddress works correctly
366+
accountAddr := di.getCurrentContractAccountAddress("ContractOne", "mainnet")
367+
assert.Equal(t, serviceAddress.String(), accountAddr, "Should return correct account address")
368+
})
369+
}

0 commit comments

Comments
 (0)