github.com/aergoio/aergo@v1.3.1/cmd/brick/exec/sendCoin.go (about)

     1  package exec
     2  
     3  import (
     4  	"fmt"
     5  	"math/big"
     6  	"strings"
     7  
     8  	"github.com/aergoio/aergo/cmd/brick/context"
     9  	"github.com/aergoio/aergo/contract"
    10  )
    11  
    12  func init() {
    13  	registerExec(&sendCoin{})
    14  }
    15  
    16  type sendCoin struct{}
    17  
    18  func (c *sendCoin) Command() string {
    19  	return "send"
    20  }
    21  
    22  func (c *sendCoin) Syntax() string {
    23  	return fmt.Sprintf("%s %s %s", context.AccountSymbol,
    24  		context.AccountSymbol, context.AmountSymbol)
    25  }
    26  
    27  func (c *sendCoin) Usage() string {
    28  	return "send <sender_name> <receiver_name> <amount>"
    29  }
    30  
    31  func (c *sendCoin) Describe() string {
    32  	return "send aergo from sender to receiver"
    33  }
    34  
    35  func (c *sendCoin) Validate(args string) error {
    36  
    37  	// is chain is loaded?
    38  	if context.Get() == nil {
    39  		return fmt.Errorf("load chain first")
    40  	}
    41  
    42  	_, _, _, err := c.parse(args)
    43  
    44  	return err
    45  }
    46  
    47  func (c *sendCoin) parse(args string) (string, string, *big.Int, error) {
    48  	splitArgs := context.SplitSpaceAndAccent(args, false)
    49  	if len(splitArgs) < 3 {
    50  		return "", "", nil, fmt.Errorf("need 3 arguments. usage: %s", c.Usage())
    51  	}
    52  
    53  	amount, success := new(big.Int).SetString(splitArgs[2].Text, 10)
    54  	if success == false {
    55  		return "", "", nil, fmt.Errorf("fail to parse number %s", splitArgs[1].Text)
    56  	}
    57  
    58  	return splitArgs[0].Text,
    59  		splitArgs[1].Text,
    60  		amount,
    61  		nil
    62  }
    63  
    64  func (c *sendCoin) Run(args string) (string, error) {
    65  	senderName, receiverName, amount, _ := c.parse(args)
    66  
    67  	// assuming target is contract
    68  	err := context.Get().ConnectBlock(
    69  		contract.NewLuaTxCallBig(senderName, receiverName, amount, ""),
    70  	)
    71  
    72  	if err != nil && strings.HasPrefix(err.Error(), "cannot find contract") {
    73  		// retry to normal address
    74  		err := context.Get().ConnectBlock(
    75  			contract.NewLuaTxSendBig(senderName, receiverName, amount),
    76  		)
    77  		if err != nil {
    78  			return "", err
    79  		}
    80  	} else if err != nil {
    81  		return "", err
    82  	}
    83  
    84  	Index(context.AccountSymbol, receiverName)
    85  
    86  	return "send aergo successfully", nil
    87  
    88  }