log "github.com/sirupsen/logrus"
"github.com/vapor/consensus"
+ "github.com/vapor/consensus/segwit"
"github.com/vapor/errors"
"github.com/vapor/federation/common"
"github.com/vapor/federation/config"
"github.com/vapor/federation/service"
"github.com/vapor/protocol/bc"
"github.com/vapor/protocol/bc/types"
+ "github.com/vapor/wallet"
)
type sidechainKeeper struct {
}
func (s *sidechainKeeper) getCrossChainReqs(crossTransactionID uint64, tx *types.Tx, statusFail bool) ([]*orm.CrossTransactionReq, error) {
+ var fromAddress string
+ inputCP := tx.Inputs[0].ControlProgram()
+ switch {
+ case segwit.IsP2WPKHScript(inputCP):
+ if pubHash, err := segwit.GetHashFromStandardProg(inputCP); err == nil {
+ fromAddress = wallet.BuildP2PKHAddress(pubHash, &consensus.VaporNetParams)
+ }
+ case segwit.IsP2WSHScript(inputCP):
+ if scriptHash, err := segwit.GetHashFromStandardProg(inputCP); err == nil {
+ fromAddress = wallet.BuildP2SHAddress(scriptHash, &consensus.VaporNetParams)
+ }
+ }
+
reqs := []*orm.CrossTransactionReq{}
for i, rawOutput := range tx.Outputs {
// check valid withdrawal
return nil, err
}
+ var toAddress string
+ outputCP := rawOutput.ControlProgram()
+ switch {
+ case segwit.IsP2WPKHScript(outputCP):
+ if pubHash, err := segwit.GetHashFromStandardProg(outputCP); err == nil {
+ toAddress = wallet.BuildP2PKHAddress(pubHash, &consensus.MainNetParams)
+ }
+ case segwit.IsP2WSHScript(outputCP):
+ if scriptHash, err := segwit.GetHashFromStandardProg(outputCP); err == nil {
+ toAddress = wallet.BuildP2SHAddress(scriptHash, &consensus.MainNetParams)
+ }
+ }
+
req := &orm.CrossTransactionReq{
CrossTransactionID: crossTransactionID,
SourcePos: uint64(i),
AssetID: asset.ID,
AssetAmount: rawOutput.OutputCommitment().AssetAmount.Amount,
Script: hex.EncodeToString(rawOutput.ControlProgram()),
+ FromAddress: fromAddress,
+ ToAddress: toAddress,
}
reqs = append(reqs, req)
}