mirror of
https://github.com/kaspanet/kaspad.git
synced 2026-02-26 13:15:47 +00:00
Compare commits
4 Commits
v0.12.18-r
...
send-patch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af93d5fdfe | ||
|
|
89c932dec1 | ||
|
|
d233164852 | ||
|
|
484c17ebb1 |
12
.github/workflows/deploy.yaml
vendored
12
.github/workflows/deploy.yaml
vendored
@@ -1,7 +1,7 @@
|
||||
name: Build and upload assets
|
||||
on:
|
||||
release:
|
||||
types: [ published ]
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -9,7 +9,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
name: Building, ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Fix CRLF on Windows
|
||||
@@ -19,7 +19,6 @@ jobs:
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v2
|
||||
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
@@ -31,7 +30,7 @@ jobs:
|
||||
# `-tags netgo,osusergo` means use pure go replacements for "os/user" and "net"
|
||||
# `-s -w` strips the binary to produce smaller size binaries
|
||||
run: |
|
||||
go build -v -ldflags="-s -w -extldflags=-static" -tags netgo,osusergo -o ./bin/ . ./cmd/...
|
||||
go build -v -ldflags="-s -w -extldflags=-static" -tags netgo,osusergo -o ./bin/ ./cmd/...
|
||||
archive="bin/kaspad-${{ github.event.release.tag_name }}-linux.zip"
|
||||
asset_name="kaspad-${{ github.event.release.tag_name }}-linux.zip"
|
||||
zip -r "${archive}" ./bin/*
|
||||
@@ -42,7 +41,7 @@ jobs:
|
||||
if: runner.os == 'Windows'
|
||||
shell: bash
|
||||
run: |
|
||||
go build -v -ldflags="-s -w" -o bin/ . ./cmd/...
|
||||
go build -v -ldflags="-s -w" -o bin/ ./cmd/...
|
||||
archive="bin/kaspad-${{ github.event.release.tag_name }}-win64.zip"
|
||||
asset_name="kaspad-${{ github.event.release.tag_name }}-win64.zip"
|
||||
powershell "Compress-Archive bin/* \"${archive}\""
|
||||
@@ -52,14 +51,13 @@ jobs:
|
||||
- name: Build on MacOS
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
go build -v -ldflags="-s -w" -o ./bin/ . ./cmd/...
|
||||
go build -v -ldflags="-s -w" -o ./bin/ ./cmd/...
|
||||
archive="bin/kaspad-${{ github.event.release.tag_name }}-osx.zip"
|
||||
asset_name="kaspad-${{ github.event.release.tag_name }}-osx.zip"
|
||||
zip -r "${archive}" ./bin/*
|
||||
echo "archive=${archive}" >> $GITHUB_ENV
|
||||
echo "asset_name=${asset_name}" >> $GITHUB_ENV
|
||||
|
||||
|
||||
- name: Upload release asset
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@@ -37,7 +38,7 @@ func broadcast(conf *broadcastConfig) error {
|
||||
transactionsHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
|
||||
transactions, err := decodeTransactionsFromHex(transactionsHex)
|
||||
transactions, err := server.DecodeTransactionsFromHex(transactionsHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@@ -37,7 +38,7 @@ func broadcastReplacement(conf *broadcastConfig) error {
|
||||
transactionsHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
|
||||
transactions, err := decodeTransactionsFromHex(transactionsHex)
|
||||
transactions, err := server.DecodeTransactionsFromHex(transactionsHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
)
|
||||
|
||||
func bumpFeeUnsigned(conf *bumpFeeUnsignedConfig) error {
|
||||
@@ -51,7 +52,7 @@ func bumpFeeUnsigned(conf *bumpFeeUnsignedConfig) error {
|
||||
}
|
||||
|
||||
fmt.Fprintln(os.Stderr, "Created unsigned transaction")
|
||||
fmt.Println(encodeTransactionsToHex(response.Transactions))
|
||||
fmt.Println(server.EncodeTransactionsToHex(response.Transactions))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -360,13 +360,25 @@ func parseCommandLine() (subCommand string, config interface{}) {
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
config = bumpFeeConf
|
||||
case bumpFeeUnsignedSubCmd:
|
||||
combineNetworkFlags(&bumpFeeConf.NetworkFlags, &cfg.NetworkFlags)
|
||||
err := bumpFeeConf.ResolveNetwork(parser)
|
||||
|
||||
err = validateBumpFeeConfig(bumpFeeConf)
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
|
||||
config = bumpFeeConf
|
||||
case bumpFeeUnsignedSubCmd:
|
||||
combineNetworkFlags(&bumpFeeUnsignedConf.NetworkFlags, &cfg.NetworkFlags)
|
||||
err := bumpFeeUnsignedConf.ResolveNetwork(parser)
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
|
||||
err = validateBumpFeeUnsignedConfig(bumpFeeUnsignedConf)
|
||||
if err != nil {
|
||||
printErrorAndExit(err)
|
||||
}
|
||||
|
||||
config = bumpFeeUnsignedConf
|
||||
}
|
||||
|
||||
@@ -388,8 +400,8 @@ func validateCreateUnsignedTransactionConf(conf *createUnsignedTransactionConfig
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.MaxFeeRate > 0 && conf.FeeRate > 0 {
|
||||
return errors.New("at most one of '--max-fee-rate' or '--fee-rate' can be specified")
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -410,13 +422,52 @@ func validateSendConfig(conf *sendConfig) error {
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.MaxFeeRate > 0 && conf.FeeRate > 0 {
|
||||
return errors.New("at most one of '--max-fee-rate' or '--fee-rate' can be specified")
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateBumpFeeConfig(conf *bumpFeeConfig) error {
|
||||
if conf.MaxFeeRate < 0 {
|
||||
return errors.New("--max-fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.FeeRate < 0 {
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateBumpFeeUnsignedConfig(conf *bumpFeeUnsignedConfig) error {
|
||||
if conf.MaxFeeRate < 0 {
|
||||
return errors.New("--max-fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if conf.FeeRate < 0 {
|
||||
return errors.New("--fee-rate must be a positive number")
|
||||
}
|
||||
|
||||
if boolToUint8(conf.MaxFeeRate > 0)+boolToUint8(conf.FeeRate > 0)+boolToUint8(conf.MaxFee > 0) > 1 {
|
||||
return errors.New("at most one of '--max-fee-rate', '--fee-rate' or '--max-fee' can be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func boolToUint8(b bool) uint8 {
|
||||
if b {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func combineNetworkFlags(dst, src *config.NetworkFlags) {
|
||||
dst.Testnet = dst.Testnet || src.Testnet
|
||||
dst.Simnet = dst.Simnet || src.Simnet
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/client"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/utils"
|
||||
)
|
||||
|
||||
@@ -59,7 +60,7 @@ func createUnsignedTransaction(conf *createUnsignedTransactionConfig) error {
|
||||
}
|
||||
|
||||
fmt.Fprintln(os.Stderr, "Created unsigned transaction")
|
||||
fmt.Println(encodeTransactionsToHex(response.UnsignedTransactions))
|
||||
fmt.Println(server.EncodeTransactionsToHex(response.UnsignedTransactions))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func (s *server) Send(_ context.Context, request *pb.SendRequest) (*pb.SendResponse, error) {
|
||||
@@ -24,7 +25,7 @@ func (s *server) Send(_ context.Context, request *pb.SendRequest) (*pb.SendRespo
|
||||
|
||||
txIDs, err := s.broadcast(signedTransactions, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, errors.Wrapf(err, "error broadcasting transactions %s", EncodeTransactionsToHex(signedTransactions))
|
||||
}
|
||||
|
||||
return &pb.SendResponse{TxIDs: txIDs, SignedTransactions: signedTransactions}, nil
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
// paying to the original transaction's payee.
|
||||
func (s *server) maybeAutoCompoundTransaction(transaction *serialization.PartiallySignedTransaction, toAddress util.Address,
|
||||
changeAddress util.Address, changeWalletAddress *walletAddress, feeRate float64, maxFee uint64) ([][]byte, error) {
|
||||
|
||||
splitTransactions, err := s.maybeSplitAndMergeTransaction(transaction, toAddress, changeAddress, changeWalletAddress, feeRate, maxFee)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -104,9 +105,49 @@ func (s *server) mergeTransaction(
|
||||
s.keysFile.MinimumSignatures, payments, utxos)
|
||||
}
|
||||
|
||||
func (s *server) transactionFeeRate(psTx *serialization.PartiallySignedTransaction) (float64, error) {
|
||||
totalOuts := 0
|
||||
for _, output := range psTx.Tx.Outputs {
|
||||
totalOuts += int(output.Value)
|
||||
}
|
||||
|
||||
totalIns := 0
|
||||
for _, input := range psTx.PartiallySignedInputs {
|
||||
totalIns += int(input.PrevOutput.Value)
|
||||
}
|
||||
|
||||
if totalIns < totalOuts {
|
||||
return 0, errors.Errorf("Transaction don't have enough funds to pay for the outputs")
|
||||
}
|
||||
fee := totalIns - totalOuts
|
||||
mass, err := s.estimateComputeMassAfterSignatures(psTx)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return float64(fee) / float64(mass), nil
|
||||
}
|
||||
|
||||
func (s *server) checkTransactionFeeRate(psTx *serialization.PartiallySignedTransaction, maxFee uint64) error {
|
||||
feeRate, err := s.transactionFeeRate(psTx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if feeRate < 1 {
|
||||
return errors.Errorf("setting --max-fee to %d results in a fee rate of %f, which is below the minimum allowed fee rate of 1 sompi/gram", maxFee, feeRate)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *server) maybeSplitAndMergeTransaction(transaction *serialization.PartiallySignedTransaction, toAddress util.Address,
|
||||
changeAddress util.Address, changeWalletAddress *walletAddress, feeRate float64, maxFee uint64) ([]*serialization.PartiallySignedTransaction, error) {
|
||||
|
||||
err := s.checkTransactionFeeRate(transaction, maxFee)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
transactionMass, err := s.estimateComputeMassAfterSignatures(transaction)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -130,6 +171,11 @@ func (s *server) maybeSplitAndMergeTransaction(transaction *serialization.Partia
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = s.checkTransactionFeeRate(splitTransactions[i], maxFee)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if len(splitTransactions) > 1 {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package main
|
||||
package server
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
// We use a separator that is not in the hex alphabet, but which will not split selection with a double click
|
||||
const hexTransactionsSeparator = "_"
|
||||
|
||||
func encodeTransactionsToHex(transactions [][]byte) string {
|
||||
func EncodeTransactionsToHex(transactions [][]byte) string {
|
||||
transactionsInHex := make([]string, len(transactions))
|
||||
for i, transaction := range transactions {
|
||||
transactionsInHex[i] = hex.EncodeToString(transaction)
|
||||
@@ -17,7 +17,7 @@ func encodeTransactionsToHex(transactions [][]byte) string {
|
||||
return strings.Join(transactionsInHex, hexTransactionsSeparator)
|
||||
}
|
||||
|
||||
func decodeTransactionsFromHex(transactionsHex string) ([][]byte, error) {
|
||||
func DecodeTransactionsFromHex(transactionsHex string) ([][]byte, error) {
|
||||
splitTransactionsHexes := strings.Split(transactionsHex, hexTransactionsSeparator)
|
||||
transactions := make([][]byte, len(splitTransactionsHexes))
|
||||
|
||||
@@ -38,7 +38,7 @@ func parse(conf *parseConfig) error {
|
||||
transactionHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
|
||||
transactions, err := decodeTransactionsFromHex(transactionHex)
|
||||
transactions, err := server.DecodeTransactionsFromHex(transactionHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/server"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/keys"
|
||||
"github.com/kaspanet/kaspad/cmd/kaspawallet/libkaspawallet"
|
||||
"github.com/pkg/errors"
|
||||
@@ -40,7 +41,7 @@ func sign(conf *signConfig) error {
|
||||
}
|
||||
transactionsHex = strings.TrimSpace(string(transactionHexBytes))
|
||||
}
|
||||
partiallySignedTransactions, err := decodeTransactionsFromHex(transactionsHex)
|
||||
partiallySignedTransactions, err := server.DecodeTransactionsFromHex(transactionsHex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -72,6 +73,6 @@ func sign(conf *signConfig) error {
|
||||
fmt.Fprintln(os.Stderr, "Successfully signed transaction")
|
||||
}
|
||||
|
||||
fmt.Println(encodeTransactionsToHex(updatedPartiallySignedTransactions))
|
||||
fmt.Println(server.EncodeTransactionsToHex(updatedPartiallySignedTransactions))
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ const (
|
||||
// appBuild is defined as a variable so it can be overridden during the build
|
||||
// process with '-ldflags "-X github.com/kaspanet/kaspad/version.appBuild=foo"' if needed.
|
||||
// It MUST only contain characters from validCharacters.
|
||||
var appBuild string = "rc5"
|
||||
var appBuild string = "rc6"
|
||||
|
||||
var version = "" // string used for memoization of version
|
||||
|
||||
|
||||
Reference in New Issue
Block a user