From 5f2fd1420c8a1a3421516a634ab6cae088a857ae Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 15:26:43 +0200 Subject: [PATCH 01/22] Mint to deployer, 10m KUJI, add CodeIds --- pond/chain/init.go | 2 +- pond/deployer/deployer.go | 25 ++++++++++++++++++++++++- pond/pond.go | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pond/chain/init.go b/pond/chain/init.go index 42e9351..ea67ab8 100644 --- a/pond/chain/init.go +++ b/pond/chain/init.go @@ -29,7 +29,7 @@ func (c *Chain) Init(namespace string, options map[string]string) error { image := fmt.Sprintf("docker.io/%s/%s:%s", namespace, c.Type, version) - amount := 1_000_000_000_000 + amount := 10_000_000_000_000 var wg sync.WaitGroup diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 49f6699..4eadd4b 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -28,6 +28,7 @@ type Deployer struct { node node.Node Denoms map[string]Denom Contracts map[string]Contract + CodeIds map[string]string addresses map[string]struct{} codes map[string]string plan Plan @@ -778,6 +779,14 @@ func (d *Deployer) UpdateDeployedCodes() error { d.codes[code.DataHash] = code.CodeId } + for name, code := range d.registry { + codeId, found := d.codes[code.Checksum] + if !found { + continue + } + d.CodeIds[name] = codeId + } + key = info.Pagination.NextKey } @@ -1143,7 +1152,21 @@ func (d *Deployer) StringToFunds(str string) ([]Funds, error) { return funds, nil } - regex := regexp.MustCompile(`^(\d+)([/A-Za-z0-1]+)$`) + tmpl, err := template.New("").Parse(str) + if err != nil { + return nil, d.error(err) + } + + var buffer bytes.Buffer + + err = tmpl.Execute(&buffer, d) + if err != nil { + return nil, d.error(err) + } + + str = buffer.String() + + regex := regexp.MustCompile(`^(\d+)([/A-Za-z0-9]+)$`) for _, part := range strings.Split(str, ",") { matches := regex.FindStringSubmatch(part) diff --git a/pond/pond.go b/pond/pond.go index 0598d0c..84b8bc8 100644 --- a/pond/pond.go +++ b/pond/pond.go @@ -110,7 +110,7 @@ func (p *Pond) init() error { accounts := []string{} for name, account := range p.info.Accounts { - if strings.HasPrefix(name, "test") { + if strings.HasPrefix(name, "test") || name == "deployer" { accounts = append(accounts, account.Addresses["kujira"]) } } From f4ea44e441fcf0e25450d1fdefc7849e90545952 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 15:35:29 +0200 Subject: [PATCH 02/22] Add trace message, Fix nil map --- pond/deployer/deployer.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 4eadd4b..e93d19e 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -104,6 +104,7 @@ func NewDeployer( codes: map[string]string{}, Denoms: map[string]Denom{}, Contracts: map[string]Contract{}, + CodeIds: map[string]string{}, address: "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", addresses: map[string]struct{}{}, apiUrl: apiUrl, @@ -871,6 +872,8 @@ func (d *Deployer) SignAndSend(msgs []json.RawMessage) error { return err } + d.logger.Trace().Msg(string(data)) + unsigned, err := os.CreateTemp(d.node.Home, "tx") if err != nil { return d.error(err) From 7114835d03aedb14a5b2b12eaab3fa4a0ab76a3e Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 15:42:48 +0200 Subject: [PATCH 03/22] Sort funds by denom --- pond/deployer/deployer.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index e93d19e..eab49c5 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -13,6 +13,7 @@ import ( "os" "path/filepath" "regexp" + "sort" "strings" "sync" @@ -1182,5 +1183,9 @@ func (d *Deployer) StringToFunds(str string) ([]Funds, error) { }) } + sort.Slice(funds, func(i, j int) bool { + return funds[i].Denom < funds[j].Denom + }) + return funds, nil } From 300c1c87baf9c461eddd947aaac74c6ef22fbe23 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 15:55:43 +0200 Subject: [PATCH 04/22] Skip checking empty checksums --- pond/deployer/deployer.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index eab49c5..65e9187 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -968,6 +968,11 @@ func (d *Deployer) GetCode(code Code) ([]byte, error) { return nil, d.error(err) } + // if no checksum is defined, don't try to check it + if code.Checksum == "" { + return data, nil + } + checksum := utils.Sha256(data) if !strings.EqualFold(checksum, code.Checksum) { err = fmt.Errorf("checksum mismatch") From 0bdbfca8bda49611d391f08b610b1b5db9f4246e Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 17:52:37 +0200 Subject: [PATCH 05/22] Convert registry checksum to uppercase --- pond/registry.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pond/registry.go b/pond/registry.go index e2193ca..19f62c3 100644 --- a/pond/registry.go +++ b/pond/registry.go @@ -6,6 +6,7 @@ import ( "net/url" "os" "sort" + "strings" "pond/pond/deployer" "pond/utils" @@ -53,7 +54,13 @@ func (r *Registry) Load(filename string) error { return r.error(err) } - r.Data = items + r.Data = map[string]deployer.Code{} + for name, item := range items { + r.Data[name] = deployer.Code{ + Source: item.Source, + Checksum: strings.ToUpper(item.Checksum), + } + } return nil } @@ -107,7 +114,11 @@ func (r *Registry) List() error { for _, key := range keys { code := r.Data[key] - checksum := code.Checksum[:8] + "…" + code.Checksum[56:] + checksum := "................." + if len(code.Checksum) > 57 { + checksum = code.Checksum[:8] + "…" + code.Checksum[56:] + } + fmt.Printf("%s %-*s %s\n", checksum, padding, key, code.Source) } From 0ef57fceadf8cda0ea5748d2c9cfe9765eb80366 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 17:53:12 +0200 Subject: [PATCH 06/22] Add json template integer conversion --- pond/deployer/deployer.go | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 65e9187..f426984 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -163,7 +163,7 @@ func (d *Deployer) Deploy(filenames []string) error { contentType := http.DetectContentType(buf) switch contentType { - case "text/plain; charset=utf-8": + case "text/plain; charset=utf-8", "application/octet-stream": // return d.DeployPlanfiles([]string{filename}) err := d.LoadPlanFile(filename) if err != nil { @@ -677,7 +677,10 @@ func (d *Deployer) CreateContractMsgs( return nil, d.error(err) } - msg := buffer.Bytes() + msg, err := d.Convert(buffer.Bytes()) + if err != nil { + return nil, err + } funds, err := d.StringToFunds(contract.Funds) if err != nil { @@ -1194,3 +1197,31 @@ func (d *Deployer) StringToFunds(str string) ([]Funds, error) { return funds, nil } + +func (d *Deployer) Convert(data []byte) ([]byte, error) { + raw := json.RawMessage(data) + + data, err := json.Marshal(raw) + if err != nil { + return nil, d.error(err) + } + + buffer := new(bytes.Buffer) + err = json.Compact(buffer, data) + if err != nil { + return nil, d.error(err) + } + + regex := regexp.MustCompile(`^(.*)"(([^"])\s*\|\s*int\s*)"(.*)$`) + + parts := strings.Split(buffer.String(), ":") + for i, p := range parts { + matches := regex.FindStringSubmatch(p) + if len(matches) != 5 { + continue + } + parts[i] = matches[1] + matches[3] + matches[4] + } + + return []byte(strings.Join(parts, ":")), nil +} From a2f5391dc243c1c2c92e53c0f9b37e9818d5974a Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 17:58:18 +0200 Subject: [PATCH 07/22] Set default gas to 1b --- pond/deployer/deployer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index f426984..348dc8e 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -895,7 +895,7 @@ func (d *Deployer) SignAndSend(msgs []json.RawMessage) error { d.logger.Debug().Msg("sign tx") output, err := d.node.Tx([]string{ "sign", "/home/kujira/.kujira/" + filepath.Base(unsigned.Name()), - "--from", "deployer", + "--from", "deployer", "--gas", "1000000000", }) if err != nil { return err From 051e94e83dbb72b612ec27f7a481079cbc6213bc Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 29 May 2024 20:50:23 +0200 Subject: [PATCH 08/22] Rework int replacement --- pond/deployer/deployer.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 348dc8e..31e3d61 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -125,7 +125,14 @@ func NewDeployer( return deployer, err } - deployer.registry = registry + deployer.registry = map[string]Code{} + + for name, code := range registry { + deployer.registry[name] = Code{ + Source: code.Source, + Checksum: strings.ToUpper(code.Checksum), + } + } return deployer, nil } @@ -1212,16 +1219,7 @@ func (d *Deployer) Convert(data []byte) ([]byte, error) { return nil, d.error(err) } - regex := regexp.MustCompile(`^(.*)"(([^"])\s*\|\s*int\s*)"(.*)$`) - - parts := strings.Split(buffer.String(), ":") - for i, p := range parts { - matches := regex.FindStringSubmatch(p) - if len(matches) != 5 { - continue - } - parts[i] = matches[1] + matches[3] + matches[4] - } + regex := regexp.MustCompile(`"((\d+)\s*\|\s*int\s*)"`) - return []byte(strings.Join(parts, ":")), nil + return []byte(regex.ReplaceAllString(string(data), "$2")), nil } From 2b66b615dfb9e9773229ff9f7a9966c45f3485c7 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Thu, 30 May 2024 11:51:39 +0200 Subject: [PATCH 09/22] Add kujira-version options, support "older" kujira versions --- cmd/init.go | 4 +++- pond/chain/chain.go | 22 +++++++++++++++++++--- pond/init.go | 6 +++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/cmd/init.go b/cmd/init.go index 40f8d27..74ec2af 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -21,6 +21,7 @@ var ( NoContracts bool ApiUrl string RpcUrl string + KujiraVersion string ) // initCmd represents the init command @@ -63,7 +64,7 @@ var initCmd = &cobra.Command{ pond, _ := pond.NewPond(LogLevel) pond.Init( - "docker", Namespace, ListenAddress, ApiUrl, RpcUrl, + "docker", Namespace, ListenAddress, ApiUrl, RpcUrl, KujiraVersion, Chains, Contracts, Nodes, options, ) }, @@ -78,6 +79,7 @@ func init() { initCmd.PersistentFlags().StringVar(&ListenAddress, "listen", "127.0.0.1", "Set listen address") initCmd.PersistentFlags().StringVar(&ApiUrl, "api-url", "https://rest.cosmos.directory/kujira", "Set API URL") initCmd.PersistentFlags().StringVar(&RpcUrl, "rpc-url", "https://rpc.cosmos.directory/kujira", "Set RPC URL") + initCmd.PersistentFlags().StringVar(&KujiraVersion, "kujira-version", "", "Set Kujira version") initCmd.PersistentFlags().BoolVar(&NoContracts, "no-contracts", false, "Don't deploy contracts on first start") chains, err := templates.GetChains() diff --git a/pond/chain/chain.go b/pond/chain/chain.go index 257518c..db43761 100644 --- a/pond/chain/chain.go +++ b/pond/chain/chain.go @@ -11,6 +11,7 @@ import ( "pond/pond/chain/feeder" "pond/pond/chain/node" + "pond/pond/globals" "pond/utils" "github.com/rs/zerolog" @@ -158,7 +159,9 @@ func (c *Chain) UpdateGenesis(overrides map[string]string) error { "app_state/gov/params/voting_period": "120s", }, "kujira": { - "app_state/mint/minter/inflation": "0.0", + "app_state/mint/minter/inflation": "0.0", + }, + "kujira-99f7924-1": { "app_state/oracle/params/required_denoms": []string{"BTC", "ETH"}, "consensus/params/abci/vote_extensions_enable_height": "1", }, @@ -179,7 +182,12 @@ func (c *Chain) UpdateGenesis(overrides map[string]string) error { return c.error(err) } - for _, key := range []string{"_default", node.Type} { + version, found := globals.Versions[node.Type] + if !found { + return fmt.Errorf("version not found") + } + keys := []string{"_default", node.Type, node.Type + "-" + version} + for _, key := range keys { values, found := config[key] if !found { continue @@ -217,6 +225,9 @@ func (c *Chain) GetHeight() (int64, error) { SyncInfo struct { LatestBlockHeight string `json:"latest_block_height"` } `json:"sync_info"` + SyncInfoOld struct { + LatestBlockHeight string `json:"latest_block_height"` + } `json:"SyncInfo"` } var status Status @@ -231,7 +242,12 @@ func (c *Chain) GetHeight() (int64, error) { return -1, c.error(err) } - height, err := strconv.ParseInt(status.SyncInfo.LatestBlockHeight, 10, 64) + strHeight := status.SyncInfoOld.LatestBlockHeight + if strHeight == "" { + strHeight = status.SyncInfo.LatestBlockHeight + } + + height, err := strconv.ParseInt(strHeight, 10, 64) if err != nil { return -1, c.error(err) } diff --git a/pond/init.go b/pond/init.go index 16a69d6..cc82900 100644 --- a/pond/init.go +++ b/pond/init.go @@ -14,7 +14,7 @@ import ( ) func (p *Pond) Init( - command, namespace, address, api, rpc string, + command, namespace, address, api, rpc, version string, chains, plans []string, nodes uint, options map[string]string, @@ -57,6 +57,10 @@ func (p *Pond) Init( Address: address, } + if version != "" { + p.config.Versions["kujira"] = version + } + types := map[string]int{ "kujira": 1, } From a7a19ae737f0a3925126631a6a45fb1025ff00e1 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Sun, 2 Jun 2024 11:39:43 +0200 Subject: [PATCH 10/22] Add registry Load, update codes on update & inport --- pond/deployer/deployer.go | 34 ++++++++++++++++++++++++---------- pond/registry.go | 14 ++++++++++++-- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 31e3d61..a33f7d3 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -113,28 +113,36 @@ func NewDeployer( accounts: accounts, } - data, err := os.ReadFile(home + "/registry.json") + err := deployer.LoadRegistry() if err != nil { return deployer, err } + return deployer, nil +} + +func (d *Deployer) LoadRegistry() error { + data, err := os.ReadFile(d.home + "/registry.json") + if err != nil { + return err + } + var registry map[string]Code err = json.Unmarshal(data, ®istry) if err != nil { - logger.Err(err) - return deployer, err + return d.error(err) } - deployer.registry = map[string]Code{} + d.registry = map[string]Code{} for name, code := range registry { - deployer.registry[name] = Code{ + d.registry[name] = Code{ Source: code.Source, Checksum: strings.ToUpper(code.Checksum), } } - return deployer, nil + return nil } func (d *Deployer) Deploy(filenames []string) error { @@ -217,10 +225,10 @@ func (d *Deployer) DeployWasmFile(filename string) error { return err } - err = d.UpdateDeployedCodes() - if err != nil { - return err - } + // err = d.UpdateDeployedCodes() + // if err != nil { + // return err + // } name := filepath.Base(filename) @@ -1116,7 +1124,13 @@ func (d *Deployer) GetDeployedCodes() ([]Code, error) { codes := []Code{} names := map[string]string{} + err := d.LoadRegistry() + if err != nil { + return nil, err + } + for name, code := range d.registry { + fmt.Println(name) names[code.Checksum] = name } diff --git a/pond/registry.go b/pond/registry.go index 19f62c3..e9fd649 100644 --- a/pond/registry.go +++ b/pond/registry.go @@ -177,7 +177,12 @@ func (p *Pond) ListRegistry() error { } func (p *Pond) UpdateRegistry(name string, args map[string]string) error { - return p.registry.Update(name, args) + err := p.registry.Update(name, args) + if err != nil { + return err + } + + return p.UpdateCodes() } func (p *Pond) ExportRegistry(filename string) error { @@ -185,5 +190,10 @@ func (p *Pond) ExportRegistry(filename string) error { } func (p *Pond) ImportRegistry(filename string) error { - return p.registry.Import(filename) + err := p.registry.Import(filename) + if err != nil { + return err + } + + return p.UpdateCodes() } From 7a78995727efbebb50181124fce88c4285fae2b1 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Sun, 2 Jun 2024 12:35:22 +0200 Subject: [PATCH 11/22] Replace deployer registry with *Registry --- pond/deployer/deployer.go | 125 ++++++------------------ pond/info.go | 4 +- pond/pond.go | 15 +-- pond/registry.go | 172 -------------------------------- pond/registry/registry.go | 201 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 243 insertions(+), 274 deletions(-) create mode 100644 pond/registry/registry.go diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index a33f7d3..634ee11 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -18,6 +18,7 @@ import ( "sync" "pond/pond/chain/node" + "pond/pond/registry" "pond/utils" "github.com/rs/zerolog" @@ -34,7 +35,7 @@ type Deployer struct { codes map[string]string plan Plan address string - registry map[string]Code + registry *registry.Registry apiUrl string home string accounts []string // test accounts for minting assets @@ -92,6 +93,7 @@ func NewDeployer( node node.Node, apiUrl string, accounts []string, + registry *registry.Registry, ) (Deployer, error) { logger.Debug().Msg("create deployer") @@ -111,40 +113,12 @@ func NewDeployer( apiUrl: apiUrl, home: home, accounts: accounts, - } - - err := deployer.LoadRegistry() - if err != nil { - return deployer, err + registry: registry, } return deployer, nil } -func (d *Deployer) LoadRegistry() error { - data, err := os.ReadFile(d.home + "/registry.json") - if err != nil { - return err - } - - var registry map[string]Code - err = json.Unmarshal(data, ®istry) - if err != nil { - return d.error(err) - } - - d.registry = map[string]Code{} - - for name, code := range registry { - d.registry[name] = Code{ - Source: code.Source, - Checksum: strings.ToUpper(code.Checksum), - } - } - - return nil -} - func (d *Deployer) Deploy(filenames []string) error { err := d.UpdateDeployedCodes() if err != nil { @@ -220,19 +194,21 @@ func (d *Deployer) DeployWasmFile(filename string) error { return nil } - err = d.DeployCode(data) + err = d.registry.Set(filepath.Base(filename), registry.Code{ + Checksum: utils.Sha256(data), + Source: "file://" + filename, + Code: data, + }) if err != nil { return err } - // err = d.UpdateDeployedCodes() - // if err != nil { - // return err - // } - - name := filepath.Base(filename) + err = d.DeployCode(data) + if err != nil { + return err + } - return d.UpdateRegistry(name, "file://"+filename, data) + return nil } func (d *Deployer) DeployCode(data []byte) error { @@ -515,7 +491,7 @@ func (d *Deployer) BuildAddress(hash, salt string) (string, error) { return address, nil } -func (d *Deployer) CreateCodeMsgs(codes []Code) ([]json.RawMessage, error) { +func (d *Deployer) CreateCodeMsgs(codes []registry.Code) ([]json.RawMessage, error) { d.logger.Debug().Msg("create code msgs") msgs := make([]json.RawMessage, len(codes)) @@ -633,10 +609,8 @@ func (d *Deployer) CreateContractMsgs( msgs := []json.RawMessage{} for _, contract := range contracts { - code, found := d.registry[contract.Code] - if !found { - err := fmt.Errorf("code not found in registry") - d.logger.Err(err).Str("name", contract.Code).Msg("") + code, err := d.registry.Get(contract.Code) + if err != nil { return nil, err } @@ -799,7 +773,7 @@ func (d *Deployer) UpdateDeployedCodes() error { d.codes[code.DataHash] = code.CodeId } - for name, code := range d.registry { + for name, code := range d.registry.Codes() { codeId, found := d.codes[code.Checksum] if !found { continue @@ -854,32 +828,6 @@ func (d *Deployer) UpdateDeployedContracts() error { return nil } -func (d *Deployer) UpdateRegistry(name, source string, code []byte) error { - _, found := d.registry[name] - if found { - d.logger.Debug().Str("name", name).Msg("code already registered") - return nil - } - - d.registry[name] = Code{ - Checksum: utils.Sha256(code), - Source: source, - Code: code, - } - - data, err := json.Marshal(d.registry) - if err != nil { - return d.error(err) - } - - err = os.WriteFile(d.home+"/registry.json", data, 0o644) - if err != nil { - return d.error(err) - } - - return nil -} - func (d *Deployer) SignAndSend(msgs []json.RawMessage) error { data, err := json.Marshal(msgs) if err != nil { @@ -951,7 +899,7 @@ func (d *Deployer) SignAndSend(msgs []json.RawMessage) error { return nil } -func (d *Deployer) GetCode(code Code) ([]byte, error) { +func (d *Deployer) GetCode(code registry.Code) ([]byte, error) { parts, err := url.Parse(code.Source) if err != nil { return nil, d.error(err) @@ -1004,20 +952,18 @@ func (d *Deployer) GetCode(code Code) ([]byte, error) { return data, nil } -func (d *Deployer) GetMissingCodes() ([]Code, error) { +func (d *Deployer) GetMissingCodes() ([]registry.Code, error) { d.logger.Debug().Msg("get missing codes") - missing := map[string]Code{} + missing := map[string]registry.Code{} for _, contracts := range d.plan.Contracts { for _, contract := range contracts { - code, found := d.registry[contract.Code] - if !found { - err := fmt.Errorf("code not found in registry") - d.logger.Err(err).Str("code", contract.Code) + code, err := d.registry.Get(contract.Code) + if err != nil { return nil, err } - _, found = d.codes[code.Checksum] + _, found := d.codes[code.Checksum] if found { // already deployed continue @@ -1034,11 +980,11 @@ func (d *Deployer) GetMissingCodes() ([]Code, error) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - codes := []Code{} + codes := []registry.Code{} for _, code := range missing { wg.Add(1) - go func(code Code) { + go func(code registry.Code) { defer wg.Done() select { @@ -1120,16 +1066,11 @@ func (d *Deployer) GetDenomsFromCreator(address string) ([]string, error) { return response.Denoms, nil } -func (d *Deployer) GetDeployedCodes() ([]Code, error) { - codes := []Code{} +func (d *Deployer) GetDeployedCodes() ([]registry.Code, error) { + codes := []registry.Code{} names := map[string]string{} - err := d.LoadRegistry() - if err != nil { - return nil, err - } - - for name, code := range d.registry { + for name, code := range d.registry.Codes() { fmt.Println(name) names[code.Checksum] = name } @@ -1143,7 +1084,7 @@ func (d *Deployer) GetDeployedCodes() ([]Code, error) { Msg("code not registered") } - codes = append(codes, Code{ + codes = append(codes, registry.Code{ Checksum: checksum, Name: name, Id: id, @@ -1157,10 +1098,8 @@ func (d *Deployer) GetDeployedContracts() ([]Contract, error) { contracts := []Contract{} for _, contract := range d.Contracts { - code, found := d.registry[contract.Code] - if !found { - err := fmt.Errorf("contract not registered") - d.logger.Err(err).Str("name", contract.Code).Msg("") + code, err := d.registry.Get(contract.Code) + if err != nil { return nil, err } diff --git a/pond/info.go b/pond/info.go index 6f42ece..1c294a5 100644 --- a/pond/info.go +++ b/pond/info.go @@ -7,7 +7,7 @@ import ( "sort" "pond/pond/chain/node" - "pond/pond/deployer" + "pond/pond/registry" ) type Account struct { @@ -24,7 +24,7 @@ type Contract struct { type Info struct { Validators map[string][]node.Node `json:"validators"` Accounts map[string]Account `json:"accounts"` - Codes []deployer.Code `json:"codes"` + Codes []registry.Code `json:"codes"` Contracts []Contract `json:"contracts"` } diff --git a/pond/pond.go b/pond/pond.go index 84b8bc8..7d1d4bd 100644 --- a/pond/pond.go +++ b/pond/pond.go @@ -11,6 +11,7 @@ import ( "pond/pond/chain" "pond/pond/chain/node" "pond/pond/deployer" + "pond/pond/registry" "pond/pond/relayer" "pond/pond/templates" "pond/utils" @@ -27,7 +28,7 @@ type Pond struct { relayer relayer.Relayer deployer deployer.Deployer proxy Proxy - registry Registry + registry *registry.Registry } func NewPond(logLevel string) (Pond, error) { @@ -108,6 +109,11 @@ func (p *Pond) init() error { return nil } + p.registry, err = registry.NewRegistry(p.logger, p.home+"/registry.json") + if err != nil { + return err + } + accounts := []string{} for name, account := range p.info.Accounts { if strings.HasPrefix(name, "test") || name == "deployer" { @@ -116,7 +122,7 @@ func (p *Pond) init() error { } p.deployer, err = deployer.NewDeployer( - p.logger, p.home, nodes[0], p.config.ApiUrl, accounts, + p.logger, p.home, nodes[0], p.config.ApiUrl, accounts, p.registry, ) if err != nil { return p.error(err) @@ -127,11 +133,6 @@ func (p *Pond) init() error { return err } - p.registry, err = NewRegistry(p.logger, p.home+"/registry.json") - if err != nil { - return err - } - if len(p.config.Chains) == 1 { return nil } diff --git a/pond/registry.go b/pond/registry.go index e9fd649..1d1367e 100644 --- a/pond/registry.go +++ b/pond/registry.go @@ -1,177 +1,5 @@ package pond -import ( - "encoding/json" - "fmt" - "net/url" - "os" - "sort" - "strings" - - "pond/pond/deployer" - "pond/utils" - - "github.com/rs/zerolog" -) - -type Registry struct { - logger zerolog.Logger - path string - Data map[string]deployer.Code -} - -func NewRegistry(logger zerolog.Logger, path string) (Registry, error) { - registry := Registry{ - logger: logger, - path: path, - } - - err := registry.Load(path) - if err != nil { - logger.Err(err) - return registry, err - } - - return registry, nil -} - -func (r *Registry) error(err error) error { - r.logger.Err(err).Msg("") - return err -} - -func (r *Registry) Load(filename string) error { - r.logger.Debug().Str("file", filename).Msg("load registry") - - data, err := os.ReadFile(filename) - if err != nil { - return r.error(err) - } - - var items map[string]deployer.Code - err = json.Unmarshal(data, &items) - if err != nil { - return r.error(err) - } - - r.Data = map[string]deployer.Code{} - for name, item := range items { - r.Data[name] = deployer.Code{ - Source: item.Source, - Checksum: strings.ToUpper(item.Checksum), - } - } - - return nil -} - -func (r *Registry) Import(filename string) error { - r.Load(filename) - return r.Save() -} - -func (r *Registry) Save() error { - data, err := json.Marshal(r.Data) - if err != nil { - return r.error(err) - } - - err = os.WriteFile(r.path, data, 0o644) - if err != nil { - return r.error(err) - } - - return nil -} - -func (r *Registry) Export(filename string) error { - data, err := json.Marshal(r.Data) - if err != nil { - return r.error(err) - } - - err = os.WriteFile(filename, data, 0o644) - if err != nil { - return r.error(err) - } - - return nil -} - -func (r *Registry) List() error { - padding := 0 - keys := []string{} - - for key := range r.Data { - keys = append(keys, key) - length := len(key) - if length > padding { - padding = length - } - } - - sort.Strings(keys) - - for _, key := range keys { - code := r.Data[key] - checksum := "................." - if len(code.Checksum) > 57 { - checksum = code.Checksum[:8] + "…" + code.Checksum[56:] - } - - fmt.Printf("%s %-*s %s\n", checksum, padding, key, code.Source) - } - - return nil -} - -func (r *Registry) Update(name string, args map[string]string) error { - r.logger.Debug().Msg("update registry") - - item, found := r.Data[name] - if !found { - err := fmt.Errorf("code not registered") - r.logger.Err(err).Str("name", name).Msg("") - return err - } - - newName, found := args["name"] - if found { - delete(r.Data, name) - name = newName - } - - newSource, found := args["source"] - if found { - parts, err := url.Parse(newSource) - if err != nil { - return r.error(err) - } - - switch parts.Scheme { - case "file": - data, err := os.ReadFile(parts.Path) - if err != nil { - return r.error(err) - } - - item.Checksum = utils.Sha256(data) - case "kaiyo-1": - break - default: - err := fmt.Errorf("scheme not supported") - r.logger.Err(err).Str("scheme", parts.Scheme).Msg("") - return err - } - - item.Source = newSource - } - - r.Data[name] = item - - return r.Save() -} - func (p *Pond) ListRegistry() error { return p.registry.List() } diff --git a/pond/registry/registry.go b/pond/registry/registry.go new file mode 100644 index 0000000..c6cad4e --- /dev/null +++ b/pond/registry/registry.go @@ -0,0 +1,201 @@ +package registry + +import ( + "encoding/json" + "fmt" + "net/url" + "os" + "sort" + "strings" + + "pond/utils" + + "github.com/rs/zerolog" +) + +type Code struct { + Id string `json:"id"` + Name string `json:"name"` + Code []byte `json:"-"` + Source string `json:"source,omitempty"` + Checksum string `json:"checksum"` +} + +type Registry struct { + logger zerolog.Logger + path string + Data map[string]Code +} + +func NewRegistry(logger zerolog.Logger, path string) (*Registry, error) { + registry := Registry{ + logger: logger, + path: path, + } + + err := registry.Load(path) + if err != nil { + logger.Err(err) + return nil, err + } + + return ®istry, nil +} + +func (r *Registry) error(err error) error { + r.logger.Err(err).Msg("") + return err +} + +func (r *Registry) Load(filename string) error { + r.logger.Debug().Str("file", filename).Msg("load registry") + + data, err := os.ReadFile(filename) + if err != nil { + return r.error(err) + } + + var items map[string]Code + err = json.Unmarshal(data, &items) + if err != nil { + return r.error(err) + } + + r.Data = map[string]Code{} + for name, item := range items { + r.Data[name] = Code{ + Source: item.Source, + Checksum: strings.ToUpper(item.Checksum), + } + } + + return nil +} + +func (r *Registry) Import(filename string) error { + r.Load(filename) + return r.Save() +} + +func (r *Registry) Save() error { + data, err := json.Marshal(r.Data) + if err != nil { + return r.error(err) + } + + err = os.WriteFile(r.path, data, 0o644) + if err != nil { + return r.error(err) + } + + return nil +} + +func (r *Registry) Export(filename string) error { + data, err := json.Marshal(r.Data) + if err != nil { + return r.error(err) + } + + err = os.WriteFile(filename, data, 0o644) + if err != nil { + return r.error(err) + } + + return nil +} + +func (r *Registry) List() error { + padding := 0 + keys := []string{} + + for key := range r.Data { + keys = append(keys, key) + length := len(key) + if length > padding { + padding = length + } + } + + sort.Strings(keys) + + for _, key := range keys { + code := r.Data[key] + checksum := "................." + if len(code.Checksum) > 57 { + checksum = code.Checksum[:8] + "…" + code.Checksum[56:] + } + + fmt.Printf("%s %-*s %s\n", checksum, padding, key, code.Source) + } + + return nil +} + +func (r *Registry) Update(name string, args map[string]string) error { + r.logger.Debug().Msg("update registry") + + item, found := r.Data[name] + if !found { + err := fmt.Errorf("code not registered") + r.logger.Err(err).Str("name", name).Msg("") + return err + } + + newName, found := args["name"] + if found { + delete(r.Data, name) + name = newName + } + + newSource, found := args["source"] + if found { + parts, err := url.Parse(newSource) + if err != nil { + return r.error(err) + } + + switch parts.Scheme { + case "file": + data, err := os.ReadFile(parts.Path) + if err != nil { + return r.error(err) + } + + item.Checksum = utils.Sha256(data) + case "kaiyo-1": + break + default: + err := fmt.Errorf("scheme not supported") + r.logger.Err(err).Str("scheme", parts.Scheme).Msg("") + return err + } + + item.Source = newSource + } + + r.Data[name] = item + + return r.Save() +} + +func (r *Registry) Get(name string) (Code, error) { + code, found := r.Data[name] + if !found { + err := fmt.Errorf("code not found") + r.logger.Err(err). + Str("name", name). + Msg("") + return Code{}, err + } + return code, nil +} + +func (r *Registry) Codes() map[string]Code { + return r.Data +} + +func (r *Registry) Set(name string, code Code) error { + r.Data[name] = code + return r.Save() +} From 0603d616dc91712361d5fe58ec364fd14e0a93b3 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Sun, 2 Jun 2024 12:36:25 +0200 Subject: [PATCH 12/22] Remove debug output --- pond/deployer/deployer.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 634ee11..29466c3 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -1071,7 +1071,6 @@ func (d *Deployer) GetDeployedCodes() ([]registry.Code, error) { names := map[string]string{} for name, code := range d.registry.Codes() { - fmt.Println(name) names[code.Checksum] = name } From a72bfd8b05fcb1aca4081cd12009d4b78a6ef613 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Sun, 2 Jun 2024 17:47:34 +0200 Subject: [PATCH 13/22] Add codes section to plan files for easier deployment --- pond/deployer/deployer.go | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 29466c3..8be8f38 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -42,9 +42,10 @@ type Deployer struct { } type Plan struct { - Denoms []Denom `yaml:"denoms"` - Contracts [][]Contract `yaml:"contracts"` - Names []string // holds plan file names, used only for logging + Denoms []Denom `yaml:"denoms"` + Codes map[string]string `yaml:"codes"` + Contracts [][]Contract `yaml:"contracts"` + Names []string // holds plan file names, used only for logging } type CodeMsg struct { @@ -103,6 +104,7 @@ func NewDeployer( plan: Plan{ Denoms: []Denom{}, Contracts: [][]Contract{}, + Codes: map[string]string{}, }, codes: map[string]string{}, Denoms: map[string]Denom{}, @@ -194,7 +196,9 @@ func (d *Deployer) DeployWasmFile(filename string) error { return nil } - err = d.registry.Set(filepath.Base(filename), registry.Code{ + name := strings.Replace(filepath.Base(filename), ".", "_", -1) + + err = d.registry.Set(name, registry.Code{ Checksum: utils.Sha256(data), Source: "file://" + filename, Code: data, @@ -455,6 +459,14 @@ func (d *Deployer) LoadPlan(data []byte, name string) error { d.plan.Denoms = append(d.plan.Denoms, denom) } + // loop is needed to override already set + for code, source := range plan.Codes { + if !strings.HasPrefix(source, "file://") { + continue + } + d.plan.Codes[code] = source + } + d.plan.Contracts = append(d.plan.Contracts, plan.Contracts...) names := make([]string, len(d.plan.Contracts)) @@ -956,6 +968,24 @@ func (d *Deployer) GetMissingCodes() ([]registry.Code, error) { d.logger.Debug().Msg("get missing codes") missing := map[string]registry.Code{} + // update registry first + for name, source := range d.plan.Codes { + code, err := d.registry.Get(name) + if err != nil { + code = registry.Code{} + } + + data, err := os.ReadFile(strings.Replace(source, "file://", "", -1)) + if err != nil { + return nil, err + } + + code.Checksum = utils.Sha256(data) + code.Source = source + + d.registry.Set(name, code) + } + for _, contracts := range d.plan.Contracts { for _, contract := range contracts { code, err := d.registry.Get(contract.Code) From f5b9364843cb376e904bb2f4d267a0cbae664594 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Sun, 2 Jun 2024 22:47:56 +0200 Subject: [PATCH 14/22] Hide codes without name, most likely replaces by a new version --- pond/info.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pond/info.go b/pond/info.go index 1c294a5..39a16f4 100644 --- a/pond/info.go +++ b/pond/info.go @@ -161,6 +161,9 @@ func (i *Info) ListCodes() error { fmt.Printf("%*s checksum name\n", padding, "id") for _, code := range i.Codes { + if code.Name == "" { + continue + } checksum := code.Checksum[:8] + "…" + code.Checksum[56:] lines = append(lines, fmt.Sprintf( From a1023a4a0993c517c39b0d1f2f5dd915ea6b2fc6 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Mon, 3 Jun 2024 12:14:24 +0200 Subject: [PATCH 15/22] Fix error with unknown code from plan file --- go.mod | 2 +- pond/deployer/deployer.go | 5 +++-- pond/registry/registry.go | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index f6df6fa..5bafd36 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module pond -go 1.21.3 +go 1.21 require ( github.com/rs/zerolog v1.32.0 diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 8be8f38..2af4d29 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -969,9 +969,10 @@ func (d *Deployer) GetMissingCodes() ([]registry.Code, error) { missing := map[string]registry.Code{} // update registry first + // using registry.Codes() to not cause error message at this point for name, source := range d.plan.Codes { - code, err := d.registry.Get(name) - if err != nil { + code, found := d.registry.Codes()[name] + if !found { code = registry.Code{} } diff --git a/pond/registry/registry.go b/pond/registry/registry.go index c6cad4e..0a8f5df 100644 --- a/pond/registry/registry.go +++ b/pond/registry/registry.go @@ -182,11 +182,11 @@ func (r *Registry) Update(name string, args map[string]string) error { func (r *Registry) Get(name string) (Code, error) { code, found := r.Data[name] if !found { - err := fmt.Errorf("code not found") - r.logger.Err(err). + msg := "code not found" + r.logger.Error(). Str("name", name). - Msg("") - return Code{}, err + Msg(msg) + return Code{}, fmt.Errorf(msg) } return code, nil } From dc76bfc6b8688ee35b8549b1332c1be1786d2b50 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:49:44 +0200 Subject: [PATCH 16/22] Add Codes and CodeIds --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7313137..0d93d2e 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,8 @@ Default plan files shipped with pond can be found in `$HOME/.pond/planfiles`. ```json { "denom": "{{ .Denoms.USDC.Path }}", - "address": "{{ .Contracts.my_contract.Address }}" + "address": "{{ .Contracts.my_contract.Address }}", + "code_id": "{{ .CodeIds.my_contract | int }}" } ``` @@ -328,6 +329,17 @@ The above example will create the `POND` token as `factory/kujira1k3g54c2sc7g9mg It stores the path of all three denoms, which can be accessed in subsequent contract instantiations of that deployment via `{{ .Denoms.POND.Address }}` for example. +#### Codes + +If you are working on contracts that change a lot during the development, updating the registry all the might become a tedious task. Therefore you can specify your sources directly in the plan file and Pond deploys them and updates the registry accordingly. + +```json +{ + "codes": + "my_project": "file:///path/to/my_project/artifacts/my_project-aarch64.wasm" +} +``` + #### Contracts Pond instantiates all contracts from the `deployer` account, which also is set as the owner by default. From e5bd2114c51586e701d6d506f94cc738d417b2e9 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:14:08 +0200 Subject: [PATCH 17/22] Update images --- pond/globals/versions.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pond/globals/versions.go b/pond/globals/versions.go index 9357f4d..daa53e6 100644 --- a/pond/globals/versions.go +++ b/pond/globals/versions.go @@ -1,10 +1,10 @@ package globals var Versions = map[string]string{ - "kujira": "99f7924-1", - "cosmoshub": "v16.0.0-1", - "terra2": "v2.11.1-3", - "feeder": "api-only-1", - "relayer": "v2.5.2-1", - "proxy": "v1.0.0-1", + "kujira": "99f7924-2", + "cosmoshub": "v16.0.0-2", + "terra2": "v2.11.1-4", + "feeder": "api-only-2", + "relayer": "v2.5.2-2", + "proxy": "v1.0.0-2", } From abd3f81b4e6323ee28eb070dd26bf43b444a377a Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 5 Jun 2024 15:57:06 +0200 Subject: [PATCH 18/22] Update readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d93d2e..918a16f 100644 --- a/README.md +++ b/README.md @@ -289,10 +289,12 @@ Default plan files shipped with pond can be found in `$HOME/.pond/planfiles`. { "denom": "{{ .Denoms.USDC.Path }}", "address": "{{ .Contracts.my_contract.Address }}", - "code_id": "{{ .CodeIds.my_contract | int }}" + "code_id": "{{ .CodeIds.my_contract }} | int" } ``` +Note: To be able to use the resulting code id as an integer value, you need to add `| int` after the template string. Otherwise the code id is provided as a string. + All deployments are done from the `deployer` account: `kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse` ### Syntax From 55b51b2d40cee67537df8f321e4212b9cf156454 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 5 Jun 2024 16:16:35 +0200 Subject: [PATCH 19/22] Remove default owner argument --- README.md | 2 +- pond/deployer/deployer.go | 5 ----- pond/templates/plan/kujira.json | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 918a16f..db4589c 100644 --- a/README.md +++ b/README.md @@ -344,7 +344,7 @@ If you are working on contracts that change a lot during the development, updati #### Contracts -Pond instantiates all contracts from the `deployer` account, which also is set as the owner by default. +Pond instantiates all contracts from the `deployer` account. To speed up the deployments, Pond handles contracts in batches which combine all instantiations into a single transaction: diff --git a/pond/deployer/deployer.go b/pond/deployer/deployer.go index 2af4d29..106e926 100644 --- a/pond/deployer/deployer.go +++ b/pond/deployer/deployer.go @@ -633,11 +633,6 @@ func (d *Deployer) CreateContractMsgs( return nil, err } - _, found = contract.Msg["owner"] - if !found { - contract.Msg["owner"] = []byte(`"` + d.address + `"`) - } - hash := sha256.New() hash.Write([]byte(contract.Label)) saltBase64 := base64.StdEncoding.EncodeToString(hash.Sum(nil)) diff --git a/pond/templates/plan/kujira.json b/pond/templates/plan/kujira.json index 376ce08..b4adb7f 100644 --- a/pond/templates/plan/kujira.json +++ b/pond/templates/plan/kujira.json @@ -28,6 +28,7 @@ "label": "USK Controller", "funds": "10000000ukuji", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "denom": "uusk" }, "creates": [ @@ -45,6 +46,7 @@ "label": "Ghost Vault USK", "funds": "20000000ukuji", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "denom": "{{ .Denoms.USK.Path }}", "oracle": { "static": "1" @@ -100,6 +102,7 @@ "code": "kujira_fin", "label": "Fin KUJI-USK", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "denoms": [ { "native": "{{ .Denoms.KUJI.Path }}" @@ -121,6 +124,7 @@ "code": "kujira_fin", "label": "Fin stETH-ETH", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "denoms": [ { "native": "{{ .Denoms.stETH.Path }}" @@ -142,6 +146,7 @@ "code": "kujira_fin", "label": "Fin ETH-USK", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "denoms": [ { "native": "{{ .Denoms.ETH.Path }}" @@ -163,6 +168,7 @@ "code": "kujira_fin", "label": "Fin USDC-USK", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "denoms": [ { "native": "{{ .Denoms.USDC.Path }}" @@ -184,6 +190,7 @@ "code": "kujira_orca", "label": "Orca ETH-USK", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "bid_denom": "{{ .Denoms.USK.Path }}", "collateral_denom": "{{ .Denoms.ETH.Path }}", "bid_threshold": "10000000000", @@ -200,6 +207,7 @@ "code": "kujira_bow_staking", "label": "Bow Staking", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "incentive_fee": { "amount": "1000000", "denom": "{{ .Denoms.USK.Path }}" @@ -215,6 +223,7 @@ "label": "Bow KUJI-USK", "funds": "10000000ukuji", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "fin_contract": "{{ .Contracts.kujira_fin_kuji_usk.Address }}", "intervals": [ "0.001", @@ -244,6 +253,7 @@ "label": "Bow stETH-ETH", "funds": "10000000ukuji", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "fin_contract": "{{ .Contracts.kujira_fin_steth_eth.Address }}", "adapter": { "oracle": [ @@ -281,6 +291,7 @@ "label": "Bow ETH-USK", "funds": "10000000ukuji", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "fin_contract": "{{ .Contracts.kujira_fin_eth_usk.Address }}", "intervals": [ "0.02", @@ -308,6 +319,7 @@ "label": "Bow USDC-USK", "funds": "10000000ukuji", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "fin_contract": "{{ .Contracts.kujira_fin_usdc_usk.Address }}", "strategy": { "target_price": "1", @@ -335,6 +347,7 @@ "code": "kujira_stable_market", "label": "USK Market ETH", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "stable_denom": "{{ .Denoms.USK.Path }}", "stable_denom_admin": "{{ .Contracts.kujira_stable_mint_usk.Address }}", "collateral_denom": "{{ .Denoms.ETH.Path }}", @@ -365,6 +378,7 @@ "code": "kujira_orca", "label": "Orca USK-KUJI", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "bid_denom": "{{ .Denoms.USK.Path }}", "collateral_denom": "{{ .Denoms.KUJI.Path }}", "bid_threshold": "10000000000", @@ -383,6 +397,7 @@ "code": "kujira_ghost_market", "label": "Ghost Market USK-KUJI", "msg": { + "owner": "kujira1k3g54c2sc7g9mgzuzaukm9pvuzcjqy92nk9wse", "vault_addr": "{{ .Contracts.kujira_ghost_vault_usk.Address }}", "orca_addr": "{{ .Contracts.kujira_orca_usk_kuji.Address }}", "collateral_denom": "{{ .Denoms.KUJI.Path }}", From 5783b8802e3c82ff6c512d01d64712196d0f66ae Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 5 Jun 2024 18:03:27 +0200 Subject: [PATCH 20/22] Wait for init node startup, genesis file creation --- pond/chain/chain.go | 35 +++++++++++++++++++++++++++++++++++ pond/chain/init.go | 2 ++ pond/chain/node/node.go | 13 +++++++++++++ 3 files changed, 50 insertions(+) diff --git a/pond/chain/chain.go b/pond/chain/chain.go index db43761..6b8dfc4 100644 --- a/pond/chain/chain.go +++ b/pond/chain/chain.go @@ -6,6 +6,7 @@ import ( "os" "path/filepath" "strconv" + "strings" "sync" "time" @@ -379,3 +380,37 @@ func (c *Chain) SubmitProposal(data []byte, option string) error { return nil } + +func (c *Chain) WaitForNode(name string) error { + c.logger.Debug().Str("node", name).Msg("wait for node") + + command := []string{c.Command, "ps", "-qf", "name=" + name} + c.logger.Debug().Msg(strings.Join(command, " ")) + + var ( + output []byte + err error + ) + + retries := 10 + for i := 0; i < retries; i++ { + output, err = utils.RunO(c.logger, command) + if err != nil { + return err + } + + if len(output) > 0 { + break + } + + time.Sleep(time.Millisecond * 200) + } + + if len(output) == 0 { + msg := "node not running" + c.logger.Error().Str("node", name).Msg(msg) + return fmt.Errorf(msg) + } + + return nil +} diff --git a/pond/chain/init.go b/pond/chain/init.go index ea67ab8..f0d3c9a 100644 --- a/pond/chain/init.go +++ b/pond/chain/init.go @@ -61,6 +61,8 @@ func (c *Chain) Init(namespace string, options map[string]string) error { return } + c.WaitForNode(c.Nodes[i].Moniker) + err = c.Nodes[i].Init(namespace, amount) if err != nil { wg.Done() diff --git a/pond/chain/node/node.go b/pond/chain/node/node.go index 7f37e7c..fdbb406 100644 --- a/pond/chain/node/node.go +++ b/pond/chain/node/node.go @@ -143,6 +143,19 @@ func (n *Node) Init(namespace string, amount int) error { return err } + retries := 10 + for i := 0; i < retries; i++ { + _, err = os.Stat(fmt.Sprintf("%s/config/genesis.json", n.Home)) + if err == nil { + break + } + time.Sleep(time.Millisecond * 200) + } + + if err != nil { + return err + } + err = n.AddKey("validator", n.Mnemonic) if err != nil { n.logger.Err(err) From ca4902050667df6145e84b773ed50821c09c254b Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 5 Jun 2024 18:22:59 +0200 Subject: [PATCH 21/22] Wait for genesis account --- pond/chain/node/node.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/pond/chain/node/node.go b/pond/chain/node/node.go index fdbb406..60aa93e 100644 --- a/pond/chain/node/node.go +++ b/pond/chain/node/node.go @@ -143,15 +143,14 @@ func (n *Node) Init(namespace string, amount int) error { return err } - retries := 10 - for i := 0; i < retries; i++ { + for i := 0; i < 10; i++ { _, err = os.Stat(fmt.Sprintf("%s/config/genesis.json", n.Home)) if err == nil { break } + n.logger.Info().Msg("wait genesis.json") time.Sleep(time.Millisecond * 200) } - if err != nil { return err } @@ -174,6 +173,20 @@ func (n *Node) Init(namespace string, amount int) error { return err } + for i := 0; i < 5; i++ { + data, err := os.ReadFile(fmt.Sprintf("%s/config/genesis.json", n.Home)) + if err != nil { + return err + } + + if strings.Contains(string(data), address) { + break + } + + n.logger.Info().Msg("wait for genesis account") + time.Sleep(time.Millisecond * 500) + } + err = n.CreateGentx(amount / 2) if err != nil { return err From 222fed0f6c2622bf046dab09ca0abdd5d369ac72 Mon Sep 17 00:00:00 2001 From: Starsquid <108214377+starsquidnodes@users.noreply.github.com> Date: Wed, 5 Jun 2024 18:29:19 +0200 Subject: [PATCH 22/22] Hide debug output --- pond/chain/node/node.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pond/chain/node/node.go b/pond/chain/node/node.go index 60aa93e..988c026 100644 --- a/pond/chain/node/node.go +++ b/pond/chain/node/node.go @@ -148,7 +148,7 @@ func (n *Node) Init(namespace string, amount int) error { if err == nil { break } - n.logger.Info().Msg("wait genesis.json") + n.logger.Debug().Msg("wait genesis.json") time.Sleep(time.Millisecond * 200) } if err != nil { @@ -173,6 +173,10 @@ func (n *Node) Init(namespace string, amount int) error { return err } + // updating the genesis file takes a little bit, so sleep 100ms + // to ensure the address is found and prevent sleeping once for 500ms + time.Sleep(time.Millisecond * 100) + for i := 0; i < 5; i++ { data, err := os.ReadFile(fmt.Sprintf("%s/config/genesis.json", n.Home)) if err != nil { @@ -183,7 +187,7 @@ func (n *Node) Init(namespace string, amount int) error { break } - n.logger.Info().Msg("wait for genesis account") + n.logger.Debug().Msg("wait for genesis account") time.Sleep(time.Millisecond * 500) }