diff --git a/cmd/consts/da.go b/cmd/consts/da.go index d990091cc..0226c252b 100644 --- a/cmd/consts/da.go +++ b/cmd/consts/da.go @@ -25,6 +25,7 @@ const ( Celestia DAType = "celestia" Avail DAType = "avail" WeaveVM DAType = "weavevm" + Near DAType = "near" ) type DaNetwork string @@ -37,6 +38,8 @@ const ( AvailMainnet DaNetwork = "avail-1" // change this with correct mainnet id WeaveVMTestnet DaNetwork = "alphanet" WeaveVMMainnet DaNetwork = "weavevm" // change this with correct mainnet id + NearTestnet DaNetwork = "testnet" + NearMainnet DaNetwork = "mainnet" ) var DaNetworks = map[string]DaData{ @@ -114,4 +117,22 @@ var DaNetworks = map[string]DaData{ StateNodes: []string{}, GasPrice: "", }, + string(NearTestnet): { + Backend: Near, + ApiUrl: "", + ID: NearTestnet, + RpcUrl: "", + CurrentStateNode: "", + StateNodes: []string{}, + GasPrice: "", + }, + string(NearMainnet): { + Backend: Near, + ApiUrl: "", + ID: NearMainnet, + RpcUrl: "", + CurrentStateNode: "", + StateNodes: []string{}, + GasPrice: "", + }, } diff --git a/cmd/rollapp/init/utils.go b/cmd/rollapp/init/utils.go index 9ee61e5e8..42cab90e6 100644 --- a/cmd/rollapp/init/utils.go +++ b/cmd/rollapp/init/utils.go @@ -116,6 +116,23 @@ func runInit( }) } + case consts.Near: + // Initialize DAManager for Near + damanager := datalayer.NewDAManager(consts.Near, home, kb) + + // Retrieve DA account address + daAddress, err := damanager.GetDAAccountAddress() + if err != nil { + return fmt.Errorf("failed to get Near account address: %w", err) + } + + // Append DA account address if available + if daAddress != nil { + addresses = append(addresses, keys.KeyInfo{ + Name: damanager.GetKeyName(), + Address: daAddress.Address, + }) + } default: return fmt.Errorf("unsupported DA backend: %s", ic.DA.Backend) } diff --git a/data_layer/da_layer.go b/data_layer/da_layer.go index fdd60ca23..3148a8325 100644 --- a/data_layer/da_layer.go +++ b/data_layer/da_layer.go @@ -8,6 +8,7 @@ import ( "github.com/dymensionxyz/roller/data_layer/avail" "github.com/dymensionxyz/roller/data_layer/celestia" "github.com/dymensionxyz/roller/data_layer/damock" + "github.com/dymensionxyz/roller/data_layer/near" "github.com/dymensionxyz/roller/data_layer/weavevm" "github.com/dymensionxyz/roller/utils/keys" "github.com/dymensionxyz/roller/utils/roller" @@ -48,6 +49,8 @@ func NewDAManager(datype consts.DAType, home string, kb consts.SupportedKeyringB dalayer = avail.NewAvail(home) case consts.WeaveVM: dalayer = weavevm.NewWeaveVM(home) + case consts.Near: + dalayer = near.NewNear(home) case consts.Local: dalayer = &damock.DAMock{} default: @@ -72,6 +75,8 @@ func GetDaInfo(env, daBackend string) (*consts.DaData, error) { daNetwork = string(consts.AvailTestnet) case string(consts.WeaveVM): daNetwork = string(consts.WeaveVMTestnet) + case string(consts.Near): + daNetwork = string(consts.NearTestnet) default: return nil, fmt.Errorf("unsupported DA backend: %s", daBackend) } @@ -83,6 +88,8 @@ func GetDaInfo(env, daBackend string) (*consts.DaData, error) { daNetwork = string(consts.AvailMainnet) case string(consts.WeaveVM): daNetwork = string(consts.WeaveVMMainnet) + case string(consts.Near): + daNetwork = string(consts.NearMainnet) default: return nil, fmt.Errorf("unsupported DA backend: %s", daBackend) } @@ -94,6 +101,8 @@ func GetDaInfo(env, daBackend string) (*consts.DaData, error) { daNetwork = string(consts.AvailTestnet) case string(consts.WeaveVM): daNetwork = string(consts.WeaveVMTestnet) + case string(consts.Near): + daNetwork = string(consts.NearTestnet) default: return nil, fmt.Errorf("unsupported DA backend: %s", daBackend) } diff --git a/data_layer/near/near.go b/data_layer/near/near.go new file mode 100644 index 000000000..69fc0634f --- /dev/null +++ b/data_layer/near/near.go @@ -0,0 +1,103 @@ +package near + +import ( + "os/exec" + + "github.com/dymensionxyz/roller/utils/keys" + "github.com/dymensionxyz/roller/utils/roller" +) + +const ( + ConfigFileName = "near.toml" +) + +type RequestPayload struct { + JSONRPC string `json:"jsonrpc"` + Method string `json:"method"` + Params []interface{} `json:"params"` + ID int `json:"id"` +} + +type EthBalanceResponse struct { + ID int `json:"id"` + JsonRPC string `json:"jsonrpc"` + Result string `json:"result"` +} + +type Near struct { + Root string + PrivateKey string + RpcEndpoint string + ChainID uint32 +} + +func (w *Near) GetPrivateKey() (string, error) { + return w.PrivateKey, nil +} + +func (w *Near) SetMetricsEndpoint(endpoint string) { +} + +func NewNear(root string) *Near { + return nil +} + +func (w *Near) InitializeLightNodeConfig() (string, error) { + return "", nil +} + +func (w *Near) GetDAAccountAddress() (*keys.KeyInfo, error) { + return nil, nil +} + +func (w *Near) GetRootDirectory() string { + return w.Root +} + +func (w *Near) CheckDABalance() ([]keys.NotFundedAddressData, error) { + return nil, nil +} + +func (w *Near) GetStartDACmd() *exec.Cmd { + return nil +} + +func (w *Near) GetDAAccData(cfg roller.RollappConfig) ([]keys.AccountData, error) { + return nil, nil +} + +func (w *Near) GetSequencerDAConfig(_ string) string { + return "" +} + +func (w *Near) SetRPCEndpoint(rpc string) { + w.RpcEndpoint = rpc +} + +func (w *Near) GetLightNodeEndpoint() string { + return "" +} + +func (w *Near) GetNetworkName() string { + return "near" +} + +func (w *Near) GetStatus(c roller.RollappConfig) string { + return "Active" +} + +func (w *Near) GetKeyName() string { + return "near" +} + +func (w *Near) GetNamespaceID() string { + return "" +} + +func (w *Near) GetAppID() uint32 { + return 0 +} + +func GetBalance(jsonRPCURL, key string) (string, error) { + return "", nil +} diff --git a/data_layer/near/utils.go b/data_layer/near/utils.go new file mode 100644 index 000000000..61297a4e6 --- /dev/null +++ b/data_layer/near/utils.go @@ -0,0 +1,47 @@ +package near + +import ( + "os" + "path/filepath" + + "github.com/pelletier/go-toml" + + "github.com/dymensionxyz/roller/cmd/consts" +) + +func writeConfigToTOML(path string, w Near) error { + tomlBytes, err := toml.Marshal(w) + if err != nil { + return err + } + dir := filepath.Dir(path) + // nolint:gofumpt + if err := os.MkdirAll(dir, 0o755); err != nil { + return err + } + // nolint:gofumpt + err = os.WriteFile(path, tomlBytes, 0o644) + if err != nil { + return err + } + + return nil +} + +func loadConfigFromTOML(path string) (Near, error) { + var config Near + tomlBytes, err := os.ReadFile(path) + if err != nil { + return config, err + } + err = toml.Unmarshal(tomlBytes, &config) + if err != nil { + return config, err + } + + return config, nil +} + +func GetCfgFilePath(rollerHome string) string { + return filepath.Join(rollerHome, consts.ConfigDirName.DALightNode, ConfigFileName) +} diff --git a/utils/roller/types.go b/utils/roller/types.go index 373321701..a6c9cd255 100644 --- a/utils/roller/types.go +++ b/utils/roller/types.go @@ -2,7 +2,7 @@ package roller import "github.com/dymensionxyz/roller/cmd/consts" -var SupportedDas = []consts.DAType{consts.Celestia, consts.Avail, consts.WeaveVM, consts.Local} +var SupportedDas = []consts.DAType{consts.Celestia, consts.Avail, consts.WeaveVM, consts.Near, consts.Local} type RollappConfig struct { // new roller.toml diff --git a/utils/roller/validation.go b/utils/roller/validation.go index 78e4f7e90..e7adb2b24 100644 --- a/utils/roller/validation.go +++ b/utils/roller/validation.go @@ -10,7 +10,7 @@ import ( func IsValidDAType(t string) bool { switch consts.DAType(t) { - case consts.Local, consts.Celestia, consts.Avail, consts.WeaveVM: + case consts.Local, consts.Celestia, consts.Avail, consts.WeaveVM, consts.Near: return true } return false