type crossOutAction struct {
bc.AssetAmount
- Address string `json:"address"`
+ Address string `json:"address"`
+ Program json.HexBytes `json:"control_program"`
}
func (a *crossOutAction) Build(ctx context.Context, b *TemplateBuilder) error {
return MissingFieldsError(missing...)
}
- address, err := common.DecodeAddress(a.Address, consensus.BytomMainNetParams(&consensus.ActiveNetParams))
- if err != nil {
- return err
- }
-
- redeemContract := address.ScriptAddress()
- program := []byte{}
- switch address.(type) {
- case *common.AddressWitnessPubKeyHash:
- program, err = vmutil.P2WPKHProgram(redeemContract)
- case *common.AddressWitnessScriptHash:
- program, err = vmutil.P2WSHProgram(redeemContract)
- default:
- return errors.New("unsupport address type")
- }
- if err != nil {
- return err
+ program := a.Program
+ if a.Address != "" {
+ address, err := common.DecodeAddress(a.Address, consensus.BytomMainNetParams(&consensus.ActiveNetParams))
+ if err != nil {
+ return err
+ }
+
+ redeemContract := address.ScriptAddress()
+ switch address.(type) {
+ case *common.AddressWitnessPubKeyHash:
+ program, err = vmutil.P2WPKHProgram(redeemContract)
+ case *common.AddressWitnessScriptHash:
+ program, err = vmutil.P2WSHProgram(redeemContract)
+ default:
+ return errors.New("unsupport address type")
+ }
+ if err != nil {
+ return err
+ }
}
out := types.NewCrossChainOutput(*a.AssetId, a.Amount, program)