github.com/mavryk-network/mvgo@v1.19.9/internal/compose/alpha/clone.go (about)

     1  // Copyright (c) 2023 Blockwatch Data Inc.
     2  // Author: alex@blockwatch.cc, abdul@blockwatch.cc
     3  
     4  package alpha
     5  
     6  import (
     7  	"bytes"
     8  
     9  	"github.com/mavryk-network/mvgo/internal/compose"
    10  	"gopkg.in/yaml.v3"
    11  )
    12  
    13  func (e *Engine) Clone(ctx compose.Context, ops []compose.Op, cfg compose.CloneConfig) ([]byte, error) {
    14  	spec := Spec{
    15  		Version: VERSION,
    16  		Pipelines: []Pipeline{{
    17  			Name:  cfg.Name,
    18  			Tasks: make([]Task, 0, len(ops)),
    19  		}},
    20  	}
    21  
    22  	for _, op := range ops {
    23  		switch op.Type {
    24  		case "origination":
    25  			s := &Script{
    26  				Code: &Code{},
    27  				Storage: &Storage{
    28  					Args: op.Args,
    29  				},
    30  			}
    31  			switch cfg.Mode {
    32  			case compose.CloneModeFile:
    33  				s.Code.File = op.Url + "#code"
    34  				if s.Storage.Args == nil {
    35  					s.Storage.File = op.Url + "#storage"
    36  				}
    37  			case compose.CloneModeJson, compose.CloneModeBinary:
    38  				s.Code.Value = op.PackedCode
    39  				if s.Storage.Args == nil {
    40  					s.Storage.Value = op.PackedStorage
    41  				}
    42  			case compose.CloneModeUrl:
    43  				s.Code.Url = op.Url + "#code"
    44  				if s.Storage.Args == nil {
    45  					s.Storage.Url = op.Url + "#storage"
    46  				}
    47  			}
    48  			spec.Pipelines[0].Tasks = append(spec.Pipelines[0].Tasks, Task{
    49  				Type:   "deploy",
    50  				Alias:  cfg.Name,
    51  				Source: op.Sender,
    52  				Amount: uint64(op.Amount * 1_000_000),
    53  				Script: s,
    54  			})
    55  		case "transaction":
    56  			typ := "transfer"
    57  			var p *Params
    58  			if op.Params != nil {
    59  				typ = "call"
    60  				p = &Params{
    61  					Entrypoint: op.Params.Entrypoint,
    62  					Args:       op.Args,
    63  				}
    64  				if p.Args == nil {
    65  					switch cfg.Mode {
    66  					case compose.CloneModeFile:
    67  						p.File = op.Url
    68  					case compose.CloneModeJson, compose.CloneModeBinary:
    69  						p.Value = op.PackedParams
    70  					case compose.CloneModeUrl:
    71  						p.Url = op.Url
    72  					}
    73  				}
    74  			}
    75  			spec.Pipelines[0].Tasks = append(spec.Pipelines[0].Tasks, Task{
    76  				Type:        typ,
    77  				Source:      op.Sender,
    78  				Destination: "$" + cfg.Name,
    79  				Amount:      uint64(op.Amount * 1_000_000),
    80  				Params:      p,
    81  			})
    82  		}
    83  	}
    84  
    85  	buf := bytes.NewBuffer(nil)
    86  	enc := yaml.NewEncoder(buf)
    87  	enc.SetIndent(2)
    88  	err := enc.Encode(spec)
    89  	return buf.Bytes(), err
    90  }