func makeBtcUtxoWithkeys(utxos []bitcoin.Utxo, egn engine.Exchange) ([]bitcoin.UtxoWithkey, error) { utxoks := make([]bitcoin.UtxoWithkey, len(utxos)) for i, u := range utxos { key, err := egn.GetAddrPrivKey(bitcoin.Type, u.GetAddress()) if err != nil { return []bitcoin.UtxoWithkey{}, err } utxoks[i] = bitcoin.NewUtxoWithKey(u, key) } return utxoks, nil }
func createSkyWithdrawTx(egn engine.Exchange, amount uint64, toAddr string) (*SkyTxResult, error) { uxs, err := egn.ChooseUtxos(skycoin.Type, amount, ChooseUtxoTm) if err != nil { return nil, err } utxos := uxs.([]skycoin.Utxo) for _, u := range utxos { logger.Debug("using skycoin utxos:%s", u.GetHash()) } var success bool defer func() { if !success { go func() { egn.PutUtxos(skycoin.Type, utxos) }() } }() var totalAmounts uint64 var totalHours uint64 for _, u := range utxos { totalAmounts += u.GetCoins() totalHours += u.GetHours() } outAddrs := []skycoin.TxOut{} chgAmt := totalAmounts - amount chgHours := totalHours / 4 chgAddr := "" if chgAmt > 0 { // generate a change address chgAddr = egn.GetNewAddress(skycoin.Type) outAddrs = append(outAddrs, skycoin.MakeUtxoOutput(toAddr, amount, chgHours/2), skycoin.MakeUtxoOutput(chgAddr, chgAmt, chgHours/2)) } else { outAddrs = append(outAddrs, skycoin.MakeUtxoOutput(toAddr, amount, chgHours/2)) } keys := make([]cipher.SecKey, len(utxos)) for i, u := range utxos { k, err := egn.GetAddrPrivKey(skycoin.Type, u.GetAddress()) if err != nil { panic(err) } keys[i] = cipher.MustSecKeyFromHex(k) } logger.Debug("creating skycoin transaction...") tx := skycoin.NewTransaction(utxos, keys, outAddrs) if err := tx.Verify(); err != nil { return nil, err } success = true rlt := SkyTxResult{ Tx: tx, UsingUtxos: utxos[:], ChangeAddr: chgAddr, } return &rlt, nil }
func getAddrPrivKey(ee engine.Exchange, cp string) coin.GetPrivKey { return func(addr string) (string, error) { return ee.GetAddrPrivKey(cp, addr) } }