--- /dev/null
+package api
+
+import (
+ "context"
+ "strings"
+
+ "github.com/vapor/consensus"
+ "github.com/vapor/encoding/json"
+ "github.com/vapor/errors"
+ "github.com/vapor/protocol/bc/types"
+)
+
+// action error
+var (
+ ErrBadActionType = errors.New("bad action type")
+ ErrBadAction = errors.New("bad action object")
+ ErrBadActionConstruction = errors.New("bad action construction")
+)
+
+// BuildRequest is main struct when building transactions
+type BuildRequest struct {
+ Tx *types.TxData `json:"base_transaction"`
+ Actions []map[string]interface{} `json:"actions"`
+ TTL json.Duration `json:"ttl"`
+ TimeRange uint64 `json:"time_range"`
+}
+
+func (a *API) completeMissingIDs(ctx context.Context, br *BuildRequest) error {
+ for i, m := range br.Actions {
+ if err := a.completeMissingAssetID(m, i); err != nil {
+ return err
+ }
+ if err := a.completeMissingAccountID(m, i, ctx); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (a *API) completeMissingAssetID(m map[string]interface{}, index int) error {
+ id, _ := m["asset_id"].(string)
+ alias, _ := m["asset_alias"].(string)
+ if id == "" && alias != "" {
+ alias = strings.ToUpper(alias)
+ switch alias {
+ case consensus.BTMAlias:
+ m["asset_id"] = consensus.BTMAssetID.String()
+ default:
+ asset, err := a.wallet.AssetReg.FindByAlias(alias)
+ if err != nil {
+ return errors.WithDetailf(err, "invalid asset alias %s on action %d", alias, index)
+ }
+ m["asset_id"] = asset.AssetID.String()
+ }
+ }
+ return nil
+}
+
+func (a *API) completeMissingAccountID(m map[string]interface{}, index int, ctx context.Context) error {
+ id, _ := m["account_id"].(string)
+ alias, _ := m["account_alias"].(string)
+ if id == "" && alias != "" {
+ acc, err := a.wallet.AccountMgr.FindByAlias(alias)
+ if err != nil {
+ return errors.WithDetailf(err, "invalid account alias %s on action %d", alias, index)
+ }
+ m["account_id"] = acc.ID
+ }
+ return nil
+}