Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Contract command #2008

Merged
merged 24 commits into from
Jul 1, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7f64698
add interchain command group, file renaming to ictt where needed
felipemadero Jun 29, 2024
3f345f7
rename bridge to ictt
felipemadero Jun 29, 2024
7969ded
fix unit test tmp file generation
felipemadero Jun 29, 2024
5446eae
start replacing to transferer
felipemadero Jun 29, 2024
3758327
create package localnet to be able to fix some import cycles
felipemadero Jun 29, 2024
3cabd4b
add missing files
felipemadero Jun 29, 2024
d0156a6
add transferer word to lint
felipemadero Jun 29, 2024
96a4a7c
last renaming
felipemadero Jun 29, 2024
8b6dac2
base for contract command
felipemadero Jun 30, 2024
a45b78b
keep build env
felipemadero Jun 30, 2024
58cff97
add skel for avalanche contract deploy erc20
felipemadero Jun 30, 2024
33db6ea
move private key stuff to pkg
felipemadero Jun 30, 2024
89d9dbe
add missing file
felipemadero Jun 30, 2024
6d9a897
add flags for chain options. v0
felipemadero Jun 30, 2024
ece7013
add missing file
felipemadero Jul 1, 2024
ab675bb
add private key prompt
felipemadero Jul 1, 2024
e8995c8
add prompts for token and balance
felipemadero Jul 1, 2024
b8ef878
cmd working
felipemadero Jul 1, 2024
d6102c0
transferer -> transferrer
felipemadero Jul 1, 2024
ab21775
use main branch of ictt repo
felipemadero Jul 1, 2024
2343c2c
rm transferer word from lint exceptions
felipemadero Jul 1, 2024
3fd05ac
Merge branch 'avalanche-itt' into contract-command
felipemadero Jul 1, 2024
d4be982
address PR comments
felipemadero Jul 1, 2024
e2e2ac9
Merge branch 'main' into contract-command
felipemadero Jul 1, 2024
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
Prev Previous commit
Next Next commit
add missing files
  • Loading branch information
felipemadero committed Jun 29, 2024
commit 3cabd4b891a248fecebce7f5840af1c9bed3178c
16 changes: 8 additions & 8 deletions cmd/interchaincmd/tokentransferercmd/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func CallDeploy(_ []string, flags DeployFlags) error {
}
network, err := networkoptions.GetNetworkFromCmdLineFlags(
app,
"On what Network do you want to deploy Avalanche InterChain Token Transfer?",
"On what Network do you want to deploy the Transferer?",
flags.Network,
true,
false,
Expand Down Expand Up @@ -130,7 +130,7 @@ func CallDeploy(_ []string, flags DeployFlags) error {
if err != nil {
return err
}
prompt := "What kind of token do you want to transfer?"
prompt := "What kind of token do you want to be able to transfer?"
popularOption := "A popular token (e.g. AVAX, USDC, WAVAX, ...) (recommended)"
homeDeployedOption := "A token that already has a Home deployed (recommended)"
deployNewHomeOption := "Deploy a new Home for the token"
Expand Down Expand Up @@ -226,7 +226,7 @@ func CallDeploy(_ []string, flags DeployFlags) error {
flags.homeFlags.erc20Address = ""
case deployANewHupOption:
case explainOption:
ux.Logger.PrintToUser("There is already an InterChain Token Transfer Home deployed for the popular token %s on %s.",
ux.Logger.PrintToUser("There is already a Transferer Home deployed for the popular token %s on %s.",
p.TokenName,
homeChain,
)
Expand All @@ -239,8 +239,8 @@ func CallDeploy(_ []string, flags DeployFlags) error {
}
}
case explainOption:
ux.Logger.PrintToUser("An Avalanche InterChain Token Transfer consists of one Home and at least one but possibly many Remotes.")
ux.Logger.PrintToUser("The Home manages the asset to be transferred to Remote instances. It lives on the Subnet")
ux.Logger.PrintToUser("An Avalanche InterChain Token Transferer consists of one Home and at least one but possibly many Remotes.")
ux.Logger.PrintToUser("The Home manages the asset to be shared to Remote instances. It lives on the Subnet")
ux.Logger.PrintToUser("where the asset exists")
ux.Logger.PrintToUser("The Remotes live on the other Subnets that want to import the asset managed by the Home.")
ux.Logger.PrintToUser("")
Expand Down Expand Up @@ -274,7 +274,7 @@ func CallDeploy(_ []string, flags DeployFlags) error {

// Remote Chain Prompts
if !flags.remoteFlags.CChain && flags.remoteFlags.SubnetName == "" {
prompt := "Where should the token be transferred as an ERC-20?"
prompt := "Where should the token be available as an ERC-20?"
if cancel, err := promptChain(prompt, network, flags.homeFlags.chainFlags.CChain, flags.homeFlags.chainFlags.SubnetName, &flags.remoteFlags); err != nil {
return err
} else if cancel {
Expand All @@ -288,11 +288,11 @@ func CallDeploy(_ []string, flags DeployFlags) error {
return err
}
if flags.remoteFlags.SubnetName == flags.homeFlags.chainFlags.SubnetName {
return fmt.Errorf("trying to make an InterChain Token Transfer were home and remote are on the same subnet")
return fmt.Errorf("trying to make an Transferer were home and remote are on the same subnet")
}
}
if flags.remoteFlags.CChain && flags.homeFlags.chainFlags.CChain {
return fmt.Errorf("trying to make an InterChain Token Transfer were home and remote are on the same subnet")
return fmt.Errorf("trying to make an Transferer were home and remote are on the same subnet")
}

// Setup Contracts
Expand Down
80 changes: 80 additions & 0 deletions pkg/localnet/localnet.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Copyright (C) 2022, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package localnet

import (
"encoding/json"
"os"
"path/filepath"

"github.com/ava-labs/avalanche-cli/pkg/binutils"
"github.com/ava-labs/avalanche-cli/pkg/constants"
"github.com/ava-labs/avalanche-cli/pkg/utils"
"github.com/ava-labs/avalanche-network-runner/rpcpb"
)

func GetClusterInfo() (*rpcpb.ClusterInfo, error) {
cli, err := binutils.NewGRPCClient()
if err != nil {
return nil, err
}
ctx, cancel := utils.GetAPIContext()
defer cancel()
resp, err := cli.Status(ctx)
if err != nil {
return nil, err
}
return resp.GetClusterInfo(), nil
}

type ExtraLocalNetworkData struct {
CChainTeleporterMessengerAddress string
CChainTeleporterRegistryAddress string
}

func GetExtraLocalNetworkData() (bool, ExtraLocalNetworkData, error) {
extraLocalNetworkData := ExtraLocalNetworkData{}
clusterInfo, err := GetClusterInfo()
if err != nil {
return false, extraLocalNetworkData, err
}
extraLocalNetworkDataPath := filepath.Join(clusterInfo.GetRootDataDir(), constants.ExtraLocalNetworkDataFilename)
if !utils.FileExists(extraLocalNetworkDataPath) {
return false, extraLocalNetworkData, nil
}
bs, err := os.ReadFile(extraLocalNetworkDataPath)
if err != nil {
return false, extraLocalNetworkData, err
}
if err := json.Unmarshal(bs, &extraLocalNetworkData); err != nil {
return false, extraLocalNetworkData, err
}
return true, extraLocalNetworkData, nil
}

func WriteExtraLocalNetworkData(cchainTeleporterMessengerAddress string, cchainTeleporterRegistryAddress string) error {
clusterInfo, err := GetClusterInfo()
if err != nil {
return err
}
extraLocalNetworkDataPath := filepath.Join(clusterInfo.GetRootDataDir(), constants.ExtraLocalNetworkDataFilename)
extraLocalNetworkData := ExtraLocalNetworkData{}
if utils.FileExists(extraLocalNetworkDataPath) {
var err error
_, extraLocalNetworkData, err = GetExtraLocalNetworkData()
if err != nil {
return err
}
}
if cchainTeleporterMessengerAddress != "" {
extraLocalNetworkData.CChainTeleporterMessengerAddress = cchainTeleporterMessengerAddress
}
if cchainTeleporterRegistryAddress != "" {
extraLocalNetworkData.CChainTeleporterRegistryAddress = cchainTeleporterRegistryAddress
}
bs, err := json.Marshal(&extraLocalNetworkData)
if err != nil {
return err
}
return os.WriteFile(extraLocalNetworkDataPath, bs, constants.WriteReadReadPerms)
}
94 changes: 94 additions & 0 deletions pkg/teleporter/helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// Copyright (C) 2022, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package teleporter

import (
_ "embed"
"fmt"

"github.com/ava-labs/avalanche-cli/pkg/application"
"github.com/ava-labs/avalanche-cli/pkg/key"
"github.com/ava-labs/avalanche-cli/pkg/localnet"
"github.com/ava-labs/avalanche-cli/pkg/models"
"github.com/ava-labs/avalanche-cli/pkg/utils"
"github.com/ava-labs/avalanchego/ids"
)

// For the given network and chain name, return parameters commonly used in interchain apps:
// - url endpoint
// - subnet ID
// - chain ID
// - messenger address
// - registry address
// - preconfigured key for interchain
func GetSubnetParams(
app *application.Avalanche,
network models.Network,
subnetName string,
isCChain bool,
) (string, ids.ID, ids.ID, string, string, *key.SoftKey, error) {
var (
subnetID ids.ID
chainID ids.ID
err error
teleporterMessengerAddress string
teleporterRegistryAddress string
k *key.SoftKey
endpoint string
)
if isCChain {
subnetID = ids.Empty
chainID, err = utils.GetChainID(network.Endpoint, "C")
if err != nil {
return "", ids.Empty, ids.Empty, "", "", nil, err
}
if network.Kind == models.Local {
b, extraLocalNetworkData, err := localnet.GetExtraLocalNetworkData()
if err != nil {
return "", ids.Empty, ids.Empty, "", "", nil, err
}
if !b {
return "", ids.Empty, ids.Empty, "", "", nil, fmt.Errorf("no extra local network data available")
}
teleporterMessengerAddress = extraLocalNetworkData.CChainTeleporterMessengerAddress
teleporterRegistryAddress = extraLocalNetworkData.CChainTeleporterRegistryAddress
} else if network.ClusterName != "" {
clusterConfig, err := app.GetClusterConfig(network.ClusterName)
if err != nil {
return "", ids.Empty, ids.Empty, "", "", nil, err
}
teleporterMessengerAddress = clusterConfig.ExtraNetworkData.CChainTeleporterMessengerAddress
teleporterRegistryAddress = clusterConfig.ExtraNetworkData.CChainTeleporterRegistryAddress
}
k, err = key.LoadEwoq(network.ID)
if err != nil {
return "", ids.Empty, ids.Empty, "", "", nil, err
}
endpoint = network.CChainEndpoint()
} else {
sc, err := app.LoadSidecar(subnetName)
if err != nil {
return "", ids.Empty, ids.Empty, "", "", nil, err
}
if !sc.TeleporterReady {
return "", ids.Empty, ids.Empty, "", "", nil, fmt.Errorf("subnet %s is not enabled for teleporter", subnetName)
}
subnetID = sc.Networks[network.Name()].SubnetID
chainID = sc.Networks[network.Name()].BlockchainID
teleporterMessengerAddress = sc.Networks[network.Name()].TeleporterMessengerAddress
teleporterRegistryAddress = sc.Networks[network.Name()].TeleporterRegistryAddress
keyPath := app.GetKeyPath(sc.TeleporterKey)
k, err = key.LoadSoft(network.ID, keyPath)
if err != nil {
return "", ids.Empty, ids.Empty, "", "", nil, err
}
endpoint = network.BlockchainEndpoint(chainID.String())
}
if chainID == ids.Empty {
return "", ids.Empty, ids.Empty, "", "", nil, fmt.Errorf("chainID for subnet %s not found on network %s", subnetName, network.Name())
}
if teleporterMessengerAddress == "" {
return "", ids.Empty, ids.Empty, "", "", nil, fmt.Errorf("teleporter messenger address for subnet %s not found on network %s", subnetName, network.Name())
}
return endpoint, subnetID, chainID, teleporterMessengerAddress, teleporterRegistryAddress, k, nil
}