bux

package module
v0.8.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 13, 2023 License: Apache-2.0 Imports: 66 Imported by: 2

README

BUX

Bitcoin UTXO & xPub Management Engine

Release Build Status Report codecov Mergify Status Go
Gitpod Ready-to-Code standard-readme compliant Makefile Included Sponsor Donate


Table of Contents


About

TLDR;

Application developers should focus on their applications and should not be bogged down with managing UTXOs or XPubs. Developers should be able to use an open-source, easy to install solution to rapidly build full-featured Bitcoin applications.



DISCLAIMER

BUX is still considered "ALPHA" and should not be used in production until a major v1.0.0 is released.



BUX: Out-of-the-box Features:
Project Assumptions: MVP
  • No private keys are used, only the xPub (or access key) is given to bux
  • (BYOX) Bring your own xPub
  • Signing a transaction is outside this application (IE: bux-server or bux-client)
  • All transactions need to be submitted to the bux service to effectively track utxo states
  • Database can be backed up, but not regenerated from chain
    • Certain data is not on chain, plus re-scanning an xPub is expensive and not easily possible with 3rd party limitations

Installation

bux requires a supported release of Go.

go get -u github.com/BuxOrg/bux

Documentation

View the generated documentation

GoDoc


Repository Features

This repository was created using MrZ's go-template

Built-in Features
Package Dependencies
Library Deployment

Releases are automatically created when you create a new git tag!

If you want to manually make releases, please install GoReleaser:

goreleaser for easy binary or library deployment to GitHub and can be installed:

  • using make: make install-releaser
  • using brew: brew install goreleaser

The .goreleaser.yml file is used to configure goreleaser.


Automatic releases via GitHub Actions from creating a new tag:

make tag version=1.2.3

Manual Releases (optional)

Use make release-snap to create a snapshot version of the release, and finally make release to ship to production (manually).


Makefile Commands

View all makefile commands

make help

List of all current commands:

all                           Runs multiple commands
clean                         Remove previous builds and any cached data
clean-mods                    Remove all the Go mod cache
coverage                      Shows the test coverage
diff                          Show the git diff
generate                      Runs the go generate command in the base of the repo
godocs                        Sync the latest tag with GoDocs
help                          Show this help message
install                       Install the application
install-all-contributors      Installs all contributors locally
install-go                    Install the application (Using Native Go)
install-releaser              Install the GoReleaser application
lint                          Run the golangci-lint application (install if not found)
release                       Full production release (creates release in GitHub)
release                       Runs common.release then runs godocs
release-snap                  Test the full release (build binaries)
release-test                  Full production test release (everything except deploy)
replace-version               Replaces the version in HTML/JS (pre-deploy)
tag                           Generate a new tag and push (tag version=0.0.0)
tag-remove                    Remove a tag if found (tag-remove version=0.0.0)
tag-update                    Update an existing tag to current commit (tag-update version=0.0.0)
test                          Runs lint and ALL tests
test-all-db                   Runs all tests including embedded database tests
test-all-db-ci                Runs all tests including embedded database tests (CI)
test-ci                       Runs all tests via CI (exports coverage)
test-ci-no-race               Runs all tests via CI (no race) (exports coverage)
test-ci-short                 Runs unit tests via CI (exports coverage)
test-no-lint                  Runs just tests
test-short                    Runs vet, lint and tests (excludes integration tests)
test-unit                     Runs tests and outputs coverage
uninstall                     Uninstall the application (and remove files)
update-contributors           Regenerates the contributors html/list
update-linter                 Update the golangci-lint package (macOS only)
vet                           Run the Go vet application

Examples & Tests

All unit tests and examples run via GitHub Actions and uses Go version 1.19.x. View the configuration file.


Run all unit tests (excluding database tests)

make test

Run database integration tests

make test-all-db

Run tests (excluding integration tests)

make test-short

Benchmarks

Run the Go benchmarks:

make bench

Code Standards

Read more about this Go project's code standards.


Usage

Checkout all the examples!


Contributing

View the contributing guidelines and follow the code of conduct.


How can I help?

All kinds of contributions are welcome 🙌! The most basic way to show your support is to star 🌟 the project, or to raise issues 💬. You can also support this project by becoming a sponsor on GitHub 👏 or by making a bitcoin donation to ensure this journey continues indefinitely! 🚀

Stars


Contributors ✨

Thank you to these wonderful people (emoji key):


Mr. Z

🚇 💻 🚧 💼

Siggi

🚇 💻 🛡️

Dylan

🚇 💻

Satchmo

📝 🖋 🎨

This project follows the all-contributors specification.


License

License

Documentation

Overview

Package bux is the Bitcoin UTXO & xPub Management Engine

If you have any suggestions or comments, please feel free to open an issue on this GitHub repository!

By BuxOrg (https://github.com/BuxOrg)

Index

Constants

View Source
const (
	// AuthHeader is the header to use for authentication (raw xPub)
	AuthHeader = "bux-auth-xpub"

	// AuthAccessKey is the header to use for access key authentication (access public key)
	AuthAccessKey = "bux-auth-key"

	// AuthSignature is the given signature (body + timestamp)
	AuthSignature = "bux-auth-signature"

	// AuthHeaderHash hash of the body coming from the request
	AuthHeaderHash = "bux-auth-hash"

	// AuthHeaderNonce random nonce for the request
	AuthHeaderNonce = "bux-auth-nonce"

	// AuthHeaderTime the time of the request, only valid for 30 seconds
	AuthHeaderTime = "bux-auth-time"

	// AuthSignatureTTL is the max TTL for a signature to be valid
	AuthSignatureTTL = 20 * time.Second
)
View Source
const (
	CronJobNameDraftTransactionCleanUp  = "draft_transaction_clean_up"
	CronJobNameIncomingTransaction      = "incoming_transaction_process"
	CronJobNameSyncTransactionBroadcast = "sync_transaction_broadcast"
	CronJobNameSyncTransactionSync      = "sync_transaction_sync"
)
View Source
const (
	// ResolutionTypeBasic is for the "deprecated" way to resolve an address from a Paymail
	ResolutionTypeBasic = "basic_resolution"

	// ResolutionTypeP2P is the current way to resolve a Paymail (prior to P4)
	ResolutionTypeP2P = "p2p"
)

Types of resolution methods

View Source
const (
	// MetadataField is the field name used for metadata (params)
	MetadataField = "metadata"
)
View Source
const (
	// ReferenceIDField is used for Paymail
	ReferenceIDField = "reference_id"
)
View Source
const ValueTypeString = "string"

ValueTypeString is the value type "string"

Variables

AllModelNames is a list of all models

BaseModels is the list of models for loading the engine and AutoMigration (defaults)

View Source
var ErrAccessKeyRevoked = errors.New("access key has been revoked")

ErrAccessKeyRevoked is when the access key has been revoked

View Source
var ErrAuhHashMismatch = errors.New("auth hash and body hash do not match")

ErrAuhHashMismatch is when the auth hash does not match the body hash

View Source
var ErrAuthAccessKeyNotFound = errors.New("auth access key could not be found")

ErrAuthAccessKeyNotFound is when the auth access key could not be found in the database

View Source
var ErrCannotConvertToIDs = errors.New("cannot convert value to type IDs")

ErrCannotConvertToIDs is the error when the conversion fails from interface into type IDs

View Source
var ErrChangeStrategyNotImplemented = errors.New("change strategy nominations not implemented yet")

ErrChangeStrategyNotImplemented is a temporary error until the feature is supported

View Source
var ErrDatastoreRequired = errors.New("datastore is required")

ErrDatastoreRequired is when a datastore function is called without a datastore present

View Source
var ErrDraftIDMismatch = errors.New("transaction draft id does not match utxo draft reservation id")

ErrDraftIDMismatch is when the reference ID does not match the reservation id

View Source
var ErrDraftNotFound = errors.New("corresponding draft transaction not found")

ErrDraftNotFound is when the requested draft transaction was not found

View Source
var ErrDuplicateUTXOs = errors.New("duplicate utxos found")

ErrDuplicateUTXOs is when a transaction is created using the same utxo more than once

View Source
var ErrInvalidLockingScript = errors.New("invalid locking script")

ErrInvalidLockingScript is when a locking script cannot be decoded

View Source
var ErrInvalidOpReturnOutput = errors.New("invalid op_return output")

ErrInvalidOpReturnOutput is when a locking script is not a valid op_return

View Source
var ErrInvalidScriptOutput = errors.New("invalid script output")

ErrInvalidScriptOutput is when a locking script is not a valid bitcoin script

View Source
var ErrInvalidTransactionID = errors.New("invalid transaction id")

ErrInvalidTransactionID is when a transaction id cannot be decoded

View Source
var ErrMissingAccessKey = errors.New("missing access key")

ErrMissingAccessKey is when the access key is missing

View Source
var ErrMissingAddressResolutionURL = errors.New("missing address resolution url from capabilities")

ErrMissingAddressResolutionURL is when the paymail resolution url is missing from capabilities

View Source
var ErrMissingAuthHeader = errors.New("missing authentication header")

ErrMissingAuthHeader is when the authentication header is missing from the request

View Source
var ErrMissingBlockHeaderHash = errors.New("block header hash is empty or id is missing")

ErrMissingBlockHeaderHash is when the hash is missing or invalid and creates an empty id

View Source
var ErrMissingBody = errors.New("missing body")

ErrMissingBody is when the body is missing

View Source
var ErrMissingClient = errors.New("client is missing from model, cannot save")

ErrMissingClient missing client from model

View Source
var ErrMissingDestination = errors.New("destination could not be found")

ErrMissingDestination is an error when a destination could not be found

View Source
var ErrMissingFieldHash = errors.New("missing required field: hash")

ErrMissingFieldHash is an error when missing the hex field of a transaction

View Source
var ErrMissingFieldHex = errors.New("missing required field: hex")

ErrMissingFieldHex is an error when missing the hex field of a transaction

View Source
var ErrMissingFieldID = errors.New("missing required field: id")

ErrMissingFieldID is an error when missing the id field

View Source
var ErrMissingFieldSatoshis = errors.New("missing required field: satoshis")

ErrMissingFieldSatoshis is when the field is required but missing

View Source
var ErrMissingFieldScriptPubKey = errors.New("missing required field: script_pub_key")

ErrMissingFieldScriptPubKey is when the field is required but missing

View Source
var ErrMissingFieldTransactionID = errors.New("missing required field: transaction_id")

ErrMissingFieldTransactionID is when the field is required but missing

View Source
var ErrMissingFieldXpubID = errors.New("missing required field: xpub_id")

ErrMissingFieldXpubID is when the field is required but missing

View Source
var ErrMissingLockingScript = errors.New("could not find locking script")

ErrMissingLockingScript is when the field is required but missing

View Source
var ErrMissingPaymail = errors.New("missing paymail")

ErrMissingPaymail missing paymail

View Source
var ErrMissingPaymailAddress = errors.New("missing alias in paymail")

ErrMissingPaymailAddress missing alias in paymail

View Source
var ErrMissingPaymailDomain = errors.New("missing domain in paymail")

ErrMissingPaymailDomain missing domain in paymail

View Source
var ErrMissingPaymailExternalXPub = errors.New("missing external xPub in paymail")

ErrMissingPaymailExternalXPub missing external xPub in paymail

View Source
var ErrMissingPaymailID = errors.New("missing id in paymail")

ErrMissingPaymailID missing id in paymail

View Source
var ErrMissingPaymailXPubID = errors.New("missing xpub_id in paymail")

ErrMissingPaymailXPubID missing xpub_id in paymail

View Source
var ErrMissingRequiredXpub = errors.New("xpub was not found but was expected")

ErrMissingRequiredXpub is when the xpub should exist but was not found

View Source
var ErrMissingSignature = errors.New("signature missing")

ErrMissingSignature is when the signature is missing from the request

View Source
var ErrMissingTransaction = errors.New("transaction could not be found")

ErrMissingTransaction is an error when a transaction could not be found

View Source
var ErrMissingTransactionOutputs = errors.New("draft transaction configuration has no outputs")

ErrMissingTransactionOutputs is when the draft transaction has not outputs

View Source
var ErrMissingTxHex = errors.New("transaction hex is empty or id is missing")

ErrMissingTxHex is when the hex is missing or invalid and creates an empty id

View Source
var ErrMissingUTXOsSpendable = errors.New("no utxos found using spendable")

ErrMissingUTXOsSpendable is when there are no utxos found from the "spendable utxos"

View Source
var ErrMissingUtxo = errors.New("utxo could not be found")

ErrMissingUtxo is an error when a given utxo could not be found

View Source
var ErrMissingXPriv = errors.New("missing xPriv key")

ErrMissingXPriv is when the xPriv is missing

View Source
var ErrMissingXpub = errors.New("could not find xpub")

ErrMissingXpub is when the field is required but missing

View Source
var ErrNoMatchingOutputs = errors.New("transaction outputs do not match any known destinations")

ErrNoMatchingOutputs is when the transaction does not match any known destinations

View Source
var ErrNotAdminKey = errors.New("xpub provided is not an admin key")

ErrNotAdminKey is when the xpub being used is not considered an admin key

View Source
var ErrNotEnoughUtxos = errors.New("could not select enough outputs to satisfy transaction")

ErrNotEnoughUtxos is when a draft transaction cannot be created because of lack of utxos

View Source
var ErrOutputValueNotRecognized = errors.New("output value is unrecognized")

ErrOutputValueNotRecognized is when there is an invalid output value given, or missing value

View Source
var ErrOutputValueTooHigh = errors.New("output value is too high")

ErrOutputValueTooHigh is when the satoshis output is too high on a transaction

View Source
var ErrOutputValueTooLow = errors.New("output value is too low")

ErrOutputValueTooLow is when the satoshis output is too low on a transaction

View Source
var ErrPaymailAddressIsInvalid = errors.New("paymail address is invalid")

ErrPaymailAddressIsInvalid is when the paymail address is NOT alias@domain.com

View Source
var ErrResolutionFailed = errors.New("failed to return a resolution for paymail address")

ErrResolutionFailed is when the paymail resolution failed unexpectedly

View Source
var ErrSignatureExpired = errors.New("signature has expired")

ErrSignatureExpired is when the signature TTL expired

View Source
var ErrSignatureInvalid = errors.New("signature invalid")

ErrSignatureInvalid is when the signature failed to be valid

View Source
var ErrTaskManagerNotLoaded = errors.New("taskmanager must be loaded")

ErrTaskManagerNotLoaded is when the taskmanager was not loaded

View Source
var ErrTransactionFeeInvalid = errors.New("transaction fee is invalid")

ErrTransactionFeeInvalid is when the fee on the transaction is not the difference between inputs and outputs

View Source
var ErrTransactionNotParsed = errors.New("transaction is not parsed")

ErrTransactionNotParsed is when the transaction is not parsed but was expected

View Source
var ErrUnknownAccessKey = errors.New("unknown access key")

ErrUnknownAccessKey is when the access key is unknown or not found

View Source
var ErrUnknownLockingScript = errors.New("could not recognize locking script")

ErrUnknownLockingScript is when the field is unknown

View Source
var ErrUnsupportedDestinationType = errors.New("unsupported destination type")

ErrUnsupportedDestinationType is a destination type that is not currently supported

View Source
var ErrUtxoAlreadySpent = errors.New("utxo has already been spent")

ErrUtxoAlreadySpent is when the utxo is already spent, but is trying to be used

View Source
var ErrUtxoNotReserved = errors.New("transaction utxo has not been reserved for spending")

ErrUtxoNotReserved is when the utxo is not reserved, but a transaction tries to spend it

View Source
var ErrXpubIDMisMatch = errors.New("xpub_id mismatch")

ErrXpubIDMisMatch is when the xPubID does not match

Functions

func BuxClientHandler added in v0.8.0

func BuxClientHandler(handler func(ctx context.Context, client *Client) error) taskmanager.CronJobHandler

utility function - converts a handler with the *Client target to a generic taskmanager.CronJobHandler

func CreateSignature

func CreateSignature(xPriv *bip32.ExtendedKey, bodyString string) (string, error)

CreateSignature will create a signature for the given key & body contents

func DisplayModels

func DisplayModels(models interface{}) interface{}

DisplayModels process the (slice) of model(s) for display

func Get

func Get(
	ctx context.Context,
	model ModelInterface,
	conditions map[string]interface{},
	_ bool,
	timeout time.Duration,
	forceWriteDB bool,
) error

Get will retrieve a model from the Cachestore or Datastore using the provided conditions

use bypassCache to skip checking the Cachestore for the record

func GetXpubFromRequest

func GetXpubFromRequest(req *http.Request) (string, bool)

GetXpubFromRequest gets the stored xPub from the request if found

func GetXpubHashFromRequest

func GetXpubHashFromRequest(req *http.Request) (string, bool)

GetXpubHashFromRequest gets the stored xPub hash from the request if found

func GetXpubIDFromRequest added in v0.2.14

func GetXpubIDFromRequest(req *http.Request) (string, bool)

GetXpubIDFromRequest gets the stored xPubID from the request if found

func IsAdminRequest added in v0.2.14

func IsAdminRequest(req *http.Request) (bool, bool)

IsAdminRequest gets the stored xPub from the request if found

func MarshalIDs

func MarshalIDs(i IDs) graphql.Marshaler

MarshalIDs will unmarshal the custom type

func MarshalMetadata

func MarshalMetadata(m Metadata) graphql.Marshaler

MarshalMetadata will marshal the custom type

func Save

func Save(ctx context.Context, model ModelInterface) (err error)

Save will save the model(s) into the Datastore

func SetSignature

func SetSignature(header *http.Header, xPriv *bip32.ExtendedKey, bodyString string) error

SetSignature will set the signature on the header for the request

func SetSignatureFromAccessKey added in v0.2.14

func SetSignatureFromAccessKey(header *http.Header, privateKeyHex, bodyString string) error

SetSignatureFromAccessKey will set the signature on the header for the request from an access key

func ToBeef added in v0.7.0

func ToBeef(ctx context.Context, tx *Transaction, store TransactionGetter) (string, error)

ToBeef generates BEEF Hex for transaction

Types

type AccessKey

type AccessKey struct {
	// Base model
	Model `bson:",inline"`

	// Model specific fields
	ID        string               `json:"id" toml:"id" yaml:"id" gorm:"<-:create;type:char(64);primaryKey;comment:This is the unique access key id" bson:"_id"`
	XpubID    string               `` /* 129-byte string literal not displayed */
	RevokedAt customTypes.NullTime `json:"revoked_at" toml:"revoked_at" yaml:"revoked_at" gorm:"<-;comment:When the key was revoked" bson:"revoked_at,omitempty"`

	// Private fields
	Key string `json:"key" gorm:"-" bson:"-"` // Used on "CREATE", shown to the user "once" only
}

AccessKey is an object representing an access key model

An AccessKey is a private key with a corresponding public key The public key is hashed and saved in this model for retrieval. When a request is made with an access key, the public key is sent in the headers, together with a signature (like normally done with xPriv signing)

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*AccessKey) BeforeCreating

func (m *AccessKey) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*AccessKey) GetID

func (m *AccessKey) GetID() string

GetID will get the ID

func (*AccessKey) GetModelName

func (m *AccessKey) GetModelName() string

GetModelName will get the name of the current model

func (*AccessKey) GetModelTableName

func (m *AccessKey) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*AccessKey) Migrate

func (m *AccessKey) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*AccessKey) Save

func (m *AccessKey) Save(ctx context.Context) error

Save will save the model into the Datastore

type AccessKeyService added in v0.2.14

type AccessKeyService interface {
	GetAccessKey(ctx context.Context, xPubID, pubAccessKey string) (*AccessKey, error)
	GetAccessKeys(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*AccessKey, error)
	GetAccessKeysCount(ctx context.Context, metadata *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
	GetAccessKeysByXPubID(ctx context.Context, xPubID string, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*AccessKey, error)
	GetAccessKeysByXPubIDCount(ctx context.Context, xPubID string, metadata *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
	NewAccessKey(ctx context.Context, rawXpubKey string, opts ...ModelOps) (*AccessKey, error)
	RevokeAccessKey(ctx context.Context, rawXpubKey, id string, opts ...ModelOps) (*AccessKey, error)
}

AccessKeyService is the access key actions

type AdminService added in v0.2.25

type AdminService interface {
	GetStats(ctx context.Context, opts ...ModelOps) (*AdminStats, error)
	GetPaymailAddresses(ctx context.Context, metadataConditions *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*PaymailAddress, error)
	GetPaymailAddressesCount(ctx context.Context, metadataConditions *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
	GetXPubs(ctx context.Context, metadataConditions *Metadata,
		conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*Xpub, error)
	GetXPubsCount(ctx context.Context, metadataConditions *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
}

AdminService is the bux admin service interface comprised of all services available for admins

type AdminStats added in v0.2.18

type AdminStats struct {
	Balance            int64                  `json:"balance"`
	Destinations       int64                  `json:"destinations"`
	PaymailAddresses   int64                  `json:"paymail_addresses"`
	Transactions       int64                  `json:"transactions"`
	TransactionsPerDay map[string]interface{} `json:"transactions_per_day"`
	Utxos              int64                  `json:"utxos"`
	UtxosPerType       map[string]interface{} `json:"utxos_per_type"`
	XPubs              int64                  `json:"xpubs"`
}

AdminStats are statistics about the bux server

type AuthPayload

type AuthPayload struct {
	AuthHash     string `json:"auth_hash"`
	AuthNonce    string `json:"auth_nonce"`
	AuthTime     int64  `json:"auth_time"`
	BodyContents string `json:"body_contents"`
	Signature    string `json:"signature"`
	// contains filtered or unexported fields
}

AuthPayload is the authentication payload for checking or creating a signature

type BUMP added in v0.6.0

type BUMP struct {
	BlockHeight uint64       `json:"blockHeight,string"`
	Path        [][]BUMPLeaf `json:"path"`
	// contains filtered or unexported fields
}

BUMP represents BUMP (BSV Unified Merkle Path) format

func CalculateMergedBUMP added in v0.6.0

func CalculateMergedBUMP(bumps []BUMP) (*BUMP, error)

CalculateMergedBUMP calculates Merged BUMP from a slice of BUMPs

func MerkleProofToBUMP added in v0.7.0

func MerkleProofToBUMP(merkleProof *bc.MerkleProof, blockHeight uint64) BUMP

MerkleProofToBUMP transforms Merkle Proof to BUMP

func (*BUMP) Hex added in v0.6.0

func (bump *BUMP) Hex() string

Hex returns BUMP in hex format

func (*BUMP) Scan added in v0.6.0

func (bump *BUMP) Scan(value interface{}) error

Scan scan value into Json, implements sql.Scanner interface

func (BUMP) Value added in v0.6.0

func (bump BUMP) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type BUMPLeaf added in v0.6.0

type BUMPLeaf struct {
	Offset    uint64 `json:"offset,string"`
	Hash      string `json:"hash,omitempty"`
	TxID      bool   `json:"txid,omitempty"`
	Duplicate bool   `json:"duplicate,omitempty"`
}

BUMPLeaf represents each BUMP path element

type BUMPs added in v0.6.0

type BUMPs []*BUMP

BUMPs represents a slice of BUMPs - BSV Unified Merkle Paths

func (*BUMPs) Bytes added in v0.6.0

func (bumps *BUMPs) Bytes() []byte

Bytes returns BUMPs bytes

func (*BUMPs) Scan added in v0.6.0

func (bumps *BUMPs) Scan(value interface{}) error

Scan scan value into Json, implements sql.Scanner interface

func (BUMPs) Value added in v0.6.0

func (bumps BUMPs) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type BlockHeader added in v0.2.14

type BlockHeader struct {
	// Base model
	Model `bson:",inline"`

	// Model specific fields
	ID                string               `json:"id" toml:"id" yaml:"id" gorm:"<-:create;type:char(64);primaryKey;comment:This is the block hash" bson:"_id"`
	Height            uint32               `json:"height" toml:"height" yaml:"height" gorm:"<-create;uniqueIndex;comment:This is the block height" bson:"height"`
	Time              uint32               `json:"time" toml:"time" yaml:"time" gorm:"<-create;index;comment:This is the time the block was mined" bson:"time"`
	Nonce             uint32               `json:"nonce" toml:"nonce" yaml:"nonce" gorm:"<-create;comment:This is the nonce" bson:"nonce"`
	Version           uint32               `json:"version" toml:"version" yaml:"version" gorm:"<-create;comment:This is the version" bson:"version"`
	HashPreviousBlock string               `` /* 191-byte string literal not displayed */
	HashMerkleRoot    string               `` /* 169-byte string literal not displayed */
	Bits              string               `json:"bits" toml:"bits" yaml:"bits" gorm:"<-:create;comment:This is the block difficulty" bson:"bits"`
	Synced            customTypes.NullTime `` /* 158-byte string literal not displayed */
}

BlockHeader is an object representing the BitCoin block header

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*BlockHeader) AfterCreated added in v0.2.14

func (m *BlockHeader) AfterCreated(_ context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*BlockHeader) BeforeCreating added in v0.2.14

func (m *BlockHeader) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*BlockHeader) Display added in v0.2.14

func (m *BlockHeader) Display() interface{}

Display filter the model for display

func (*BlockHeader) GetHash added in v0.2.14

func (m *BlockHeader) GetHash() string

GetHash will get the hash of the block header

func (*BlockHeader) GetID added in v0.2.14

func (m *BlockHeader) GetID() string

GetID will return the id of the field (hash)

func (*BlockHeader) GetModelName added in v0.2.14

func (m *BlockHeader) GetModelName() string

GetModelName will get the name of the current model

func (*BlockHeader) GetModelTableName added in v0.2.14

func (m *BlockHeader) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*BlockHeader) Migrate added in v0.2.14

func (m *BlockHeader) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*BlockHeader) Save added in v0.2.14

func (m *BlockHeader) Save(ctx context.Context) (err error)

Save will save the model into the Datastore

type BlockHeaderService added in v0.2.14

type BlockHeaderService interface {
	GetBlockHeaderByHeight(ctx context.Context, height uint32) (*BlockHeader, error)
	GetBlockHeaders(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*BlockHeader, error)
	GetBlockHeadersCount(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		opts ...ModelOps) (int64, error)
	GetLastBlockHeader(ctx context.Context) (*BlockHeader, error)
	GetUnsyncedBlockHeaders(ctx context.Context) ([]*BlockHeader, error)
	RecordBlockHeader(ctx context.Context, hash string, height uint32, bh bc.BlockHeader,
		opts ...ModelOps) (*BlockHeader, error)
}

BlockHeaderService is the block header actions

type ChangeStrategy

type ChangeStrategy string

ChangeStrategy strategy to use for change

const (
	// ChangeStrategyDefault is a strategy that divides the satoshis among the change destinations
	ChangeStrategyDefault ChangeStrategy = "default"

	// ChangeStrategyRandom is a strategy randomizing the output of satoshis among the change destinations
	ChangeStrategyRandom ChangeStrategy = "random"

	// ChangeStrategyNominations is a strategy using coin nominations for the outputs (10, 25, 50, 100, 250 etc.)
	ChangeStrategyNominations ChangeStrategy = "nominations"
)

Types of change destination strategies

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client is the bux client & options

func (*Client) AddModels

func (c *Client) AddModels(ctx context.Context, autoMigrate bool, models ...interface{}) error

AddModels will add additional models to the client

func (*Client) AuthenticateRequest

func (c *Client) AuthenticateRequest(ctx context.Context, req *http.Request, adminXPubs []string,
	adminRequired, requireSigning, signingDisabled bool) (*http.Request, error)

AuthenticateRequest will parse the incoming request for the associated authentication header, and it will check the Key/Signature

Sets req.Context(xpub) and req.Context(xpub_hash)

func (*Client) Cachestore

func (c *Client) Cachestore() cachestore.ClientInterface

Cachestore will return the Cachestore IF: exists and is enabled

func (*Client) Chainstate

func (c *Client) Chainstate() chainstate.ClientInterface

Chainstate will return the Chainstate service IF: exists and is enabled

func (*Client) Close

func (c *Client) Close(ctx context.Context) error

Close will safely close any open connections (cache, datastore, etc.)

func (*Client) Cluster added in v0.4.6

func (c *Client) Cluster() cluster.ClientInterface

Cluster will return the cluster coordinator client

func (*Client) Datastore

func (c *Client) Datastore() datastore.ClientInterface

Datastore will return the Datastore if it exists

func (*Client) Debug

func (c *Client) Debug(on bool)

Debug will toggle the debug mode (for all resources)

func (*Client) DefaultModelOptions

func (c *Client) DefaultModelOptions(opts ...ModelOps) []ModelOps

DefaultModelOptions will set any default model options (from Client options->model)

func (*Client) DefaultSyncConfig added in v0.2.14

func (c *Client) DefaultSyncConfig() *SyncConfig

DefaultSyncConfig will return the default sync config from the client defaults (for chainstate)

func (*Client) DeletePaymailAddress added in v0.2.14

func (c *Client) DeletePaymailAddress(ctx context.Context, address string, opts ...ModelOps) error

DeletePaymailAddress will delete a paymail address

func (*Client) EnableNewRelic

func (c *Client) EnableNewRelic()

EnableNewRelic will enable NewRelic tracing

func (*Client) GetAccessKey added in v0.2.14

func (c *Client) GetAccessKey(ctx context.Context, xPubID, id string) (*AccessKey, error)

GetAccessKey will get an existing access key from the Datastore

func (*Client) GetAccessKeys added in v0.2.14

func (c *Client) GetAccessKeys(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*AccessKey, error)

GetAccessKeys will get all the access keys from the Datastore

func (*Client) GetAccessKeysByXPubID added in v0.2.18

func (c *Client) GetAccessKeysByXPubID(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*AccessKey, error)

GetAccessKeysByXPubID will get all existing access keys from the Datastore

metadataConditions is the metadata to match to the access keys being returned

func (*Client) GetAccessKeysByXPubIDCount added in v0.2.18

func (c *Client) GetAccessKeysByXPubIDCount(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetAccessKeysByXPubIDCount will get a count of all existing access keys from the Datastore

func (*Client) GetAccessKeysCount added in v0.2.18

func (c *Client) GetAccessKeysCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetAccessKeysCount will get a count of all the access keys from the Datastore

func (*Client) GetBlockHeaderByHeight added in v0.2.14

func (c *Client) GetBlockHeaderByHeight(ctx context.Context, height uint32) (*BlockHeader, error)

GetBlockHeaderByHeight get the block header by height

func (*Client) GetBlockHeaders added in v0.2.18

func (c *Client) GetBlockHeaders(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*BlockHeader, error)

GetBlockHeaders will get all the block headers from the Datastore

func (*Client) GetBlockHeadersCount added in v0.2.18

func (c *Client) GetBlockHeadersCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetBlockHeadersCount will get a count of all the block headers from the Datastore

func (*Client) GetDestinationByAddress

func (c *Client) GetDestinationByAddress(ctx context.Context, xPubID, address string) (*Destination, error)

GetDestinationByAddress will get a destination for an address

func (*Client) GetDestinationByID added in v0.2.14

func (c *Client) GetDestinationByID(ctx context.Context, xPubID, id string) (*Destination, error)

GetDestinationByID will get a destination by id

func (*Client) GetDestinationByLockingScript

func (c *Client) GetDestinationByLockingScript(ctx context.Context, xPubID, lockingScript string) (*Destination, error)

GetDestinationByLockingScript will get a destination for a locking script

func (*Client) GetDestinations

func (c *Client) GetDestinations(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*Destination, error)

GetDestinations will get all the destinations from the Datastore

func (*Client) GetDestinationsByXpubID added in v0.2.18

func (c *Client) GetDestinationsByXpubID(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams) ([]*Destination, error)

GetDestinationsByXpubID will get destinations based on an xPub

metadataConditions are the search criteria used to find destinations

func (*Client) GetDestinationsByXpubIDCount added in v0.2.18

func (c *Client) GetDestinationsByXpubIDCount(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{}) (int64, error)

GetDestinationsByXpubIDCount will get a count of all destinations based on an xPub

func (*Client) GetDestinationsCount added in v0.2.18

func (c *Client) GetDestinationsCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetDestinationsCount will get a count of all the destinations from the Datastore

func (*Client) GetDraftTransactionByID added in v0.4.4

func (c *Client) GetDraftTransactionByID(ctx context.Context, id string, opts ...ModelOps) (*DraftTransaction, error)

GetDraftTransactionByID will get a draft transaction from the Datastore

func (*Client) GetDraftTransactions added in v0.2.18

func (c *Client) GetDraftTransactions(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*DraftTransaction, error)

GetDraftTransactions will get all the draft transactions from the Datastore

func (*Client) GetDraftTransactionsCount added in v0.2.18

func (c *Client) GetDraftTransactionsCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetDraftTransactionsCount will get a count of all the draft transactions from the Datastore

func (*Client) GetLastBlockHeader added in v0.2.14

func (c *Client) GetLastBlockHeader(ctx context.Context) (*BlockHeader, error)

GetLastBlockHeader get last block header

func (*Client) GetModelNames added in v0.2.25

func (c *Client) GetModelNames() []string

GetModelNames will return the model names that have been loaded

func (*Client) GetOrStartTxn

func (c *Client) GetOrStartTxn(ctx context.Context, name string) context.Context

GetOrStartTxn will check for an existing NewRelic transaction, if not found, it will make a new transaction

func (*Client) GetPaymailAddress added in v0.2.14

func (c *Client) GetPaymailAddress(ctx context.Context, address string, opts ...ModelOps) (*PaymailAddress, error)

GetPaymailAddress will get a paymail address model

func (*Client) GetPaymailAddresses added in v0.2.14

func (c *Client) GetPaymailAddresses(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*PaymailAddress, error)

GetPaymailAddresses will get all the paymail addresses from the Datastore

func (*Client) GetPaymailAddressesByXPubID added in v0.2.14

func (c *Client) GetPaymailAddressesByXPubID(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams) ([]*PaymailAddress, error)

GetPaymailAddressesByXPubID will get all the paymail addresses for an xPubID from the Datastore

func (*Client) GetPaymailAddressesCount added in v0.2.18

func (c *Client) GetPaymailAddressesCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetPaymailAddressesCount will get a count of all the paymail addresses from the Datastore

func (*Client) GetPaymailConfig added in v0.2.14

func (c *Client) GetPaymailConfig() *PaymailServerOptions

GetPaymailConfig will return the Paymail server config if it exists

func (*Client) GetStats added in v0.2.18

func (c *Client) GetStats(ctx context.Context, opts ...ModelOps) (*AdminStats, error)

GetStats will get stats for the BUX Console (admin)

func (*Client) GetTransaction

func (c *Client) GetTransaction(ctx context.Context, xPubID, txID string) (*Transaction, error)

GetTransaction will get a transaction from the Datastore

ctx is the context testTxID is the transaction ID

func (*Client) GetTransactionByHex added in v0.4.7

func (c *Client) GetTransactionByHex(ctx context.Context, hex string) (*Transaction, error)

GetTransactionByHex will get a transaction from the Datastore by its full hex string uses GetTransaction

func (*Client) GetTransactionByID added in v0.4.7

func (c *Client) GetTransactionByID(ctx context.Context, txID string) (*Transaction, error)

GetTransactionByID will get a transaction from the Datastore by tx ID uses GetTransaction

func (*Client) GetTransactions

func (c *Client) GetTransactions(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps,
) ([]*Transaction, error)

GetTransactions will get all the transactions from the Datastore

func (*Client) GetTransactionsAggregate added in v0.2.19

func (c *Client) GetTransactionsAggregate(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, aggregateColumn string, opts ...ModelOps,
) (map[string]interface{}, error)

GetTransactionsAggregate will get a count of all transactions per aggregate column from the Datastore

func (*Client) GetTransactionsByIDs added in v0.7.0

func (c *Client) GetTransactionsByIDs(ctx context.Context, txIDs []string) ([]*Transaction, error)

func (*Client) GetTransactionsByXpubID added in v0.2.18

func (c *Client) GetTransactionsByXpubID(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams,
) ([]*Transaction, error)

GetTransactionsByXpubID will get all transactions for a given xpub from the Datastore

ctx is the context rawXpubKey is the raw xPub key metadataConditions is added to the request for searching conditions is added the request for searching

func (*Client) GetTransactionsByXpubIDCount added in v0.2.18

func (c *Client) GetTransactionsByXpubIDCount(ctx context.Context, xPubID string, metadataConditions *Metadata,
	conditions *map[string]interface{},
) (int64, error)

GetTransactionsByXpubIDCount will get the count of all transactions matching the search criteria

func (*Client) GetTransactionsCount added in v0.2.18

func (c *Client) GetTransactionsCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps,
) (int64, error)

GetTransactionsCount will get a count of all the transactions from the Datastore

func (*Client) GetUnsyncedBlockHeaders added in v0.2.14

func (c *Client) GetUnsyncedBlockHeaders(ctx context.Context) ([]*BlockHeader, error)

GetUnsyncedBlockHeaders get all unsynced block headers

func (*Client) GetUtxo

func (c *Client) GetUtxo(ctx context.Context, xPubKey, txID string, outputIndex uint32) (*Utxo, error)

GetUtxo will get a single utxo based on an xPub, the tx ID and the outputIndex

func (*Client) GetUtxoByTransactionID added in v0.4.4

func (c *Client) GetUtxoByTransactionID(ctx context.Context, txID string, outputIndex uint32) (*Utxo, error)

GetUtxoByTransactionID will get a single utxo based on the tx ID and the outputIndex

func (*Client) GetUtxos

func (c *Client) GetUtxos(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps,
) ([]*Utxo, error)

GetUtxos will get all the utxos from the Datastore

func (*Client) GetUtxosByXpubID added in v0.2.18

func (c *Client) GetUtxosByXpubID(ctx context.Context, xPubID string, metadata *Metadata, conditions *map[string]interface{},
	queryParams *datastore.QueryParams,
) ([]*Utxo, error)

GetUtxosByXpubID will get utxos based on an xPub

func (*Client) GetUtxosCount added in v0.2.18

func (c *Client) GetUtxosCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps,
) (int64, error)

GetUtxosCount will get a count of all the utxos from the Datastore

func (*Client) GetXPubs added in v0.2.18

func (c *Client) GetXPubs(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, queryParams *datastore.QueryParams, opts ...ModelOps) ([]*Xpub, error)

GetXPubs gets all xpubs matching the conditions

func (*Client) GetXPubsCount added in v0.2.18

func (c *Client) GetXPubsCount(ctx context.Context, metadataConditions *Metadata,
	conditions *map[string]interface{}, opts ...ModelOps) (int64, error)

GetXPubsCount gets a count of all xpubs matching the conditions

func (*Client) GetXpub

func (c *Client) GetXpub(ctx context.Context, xPubKey string) (*Xpub, error)

GetXpub will get an existing xPub from the Datastore

xPubKey is the raw public xPub

func (*Client) GetXpubByID

func (c *Client) GetXpubByID(ctx context.Context, xPubID string) (*Xpub, error)

GetXpubByID will get an existing xPub from the Datastore

xPubID is the hash of the xPub

func (*Client) HTTPClient added in v0.2.14

func (c *Client) HTTPClient() HTTPInterface

HTTPClient will return the http interface to use in the client

func (*Client) ImportBlockHeadersFromURL added in v0.2.14

func (c *Client) ImportBlockHeadersFromURL() string

ImportBlockHeadersFromURL will the URL where to import block headers from

func (*Client) IsDebug

func (c *Client) IsDebug() bool

IsDebug will return the debug flag (bool)

func (*Client) IsEncryptionKeySet added in v0.2.25

func (c *Client) IsEncryptionKeySet() bool

IsEncryptionKeySet will return the flag (bool) if the encryption key has been set

func (*Client) IsITCEnabled

func (c *Client) IsITCEnabled() bool

IsITCEnabled will return the flag (bool)

func (*Client) IsIUCEnabled added in v0.1.1

func (c *Client) IsIUCEnabled() bool

IsIUCEnabled will return the flag (bool)

func (*Client) IsMempoolMonitoringEnabled added in v0.2.14

func (c *Client) IsMempoolMonitoringEnabled() bool

IsMempoolMonitoringEnabled will return whether mempool monitoring is on

func (*Client) IsMigrationEnabled added in v0.2.27

func (c *Client) IsMigrationEnabled() bool

IsMigrationEnabled will return the flag (bool)

func (*Client) IsNewRelicEnabled

func (c *Client) IsNewRelicEnabled() bool

IsNewRelicEnabled will return the flag (bool)

func (*Client) Logger

func (c *Client) Logger() *zerolog.Logger

Logger will return the Logger if it exists

func (*Client) NewAccessKey

func (c *Client) NewAccessKey(ctx context.Context, rawXpubKey string, opts ...ModelOps) (*AccessKey, error)

NewAccessKey will create a new access key for the given xpub

opts are options and can include "metadata"

func (*Client) NewDestination

func (c *Client) NewDestination(ctx context.Context, xPubKey string, chain uint32,
	destinationType string, monitor bool, opts ...ModelOps) (*Destination, error)

NewDestination will get a new destination for an existing xPub

xPubKey is the raw public xPub

func (*Client) NewDestinationForLockingScript

func (c *Client) NewDestinationForLockingScript(ctx context.Context, xPubID, lockingScript string,
	monitor bool, opts ...ModelOps) (*Destination, error)

NewDestinationForLockingScript will create a new destination based on a locking script

func (*Client) NewPaymailAddress added in v0.2.14

func (c *Client) NewPaymailAddress(ctx context.Context, xPubKey, address, publicName, avatar string,
	opts ...ModelOps) (*PaymailAddress, error)

NewPaymailAddress will create a new paymail address

func (*Client) NewTransaction

func (c *Client) NewTransaction(ctx context.Context, rawXpubKey string, config *TransactionConfig,
	opts ...ModelOps,
) (*DraftTransaction, error)

NewTransaction will create a new draft transaction and return it

ctx is the context rawXpubKey is the raw xPub key config is the TransactionConfig metadata is added to the model opts are additional model options to be applied

func (*Client) NewXpub

func (c *Client) NewXpub(ctx context.Context, xPubKey string, opts ...ModelOps) (*Xpub, error)

NewXpub will parse the xPub and save it into the Datastore

xPubKey is the raw public xPub opts are options and can include "metadata"

func (*Client) Notifications added in v0.2.14

func (c *Client) Notifications() notifications.ClientInterface

Notifications will return the Notifications if it exists

func (*Client) PaymailClient

func (c *Client) PaymailClient() paymail.ClientInterface

PaymailClient will return the Paymail if it exists

func (*Client) RecordBlockHeader added in v0.2.14

func (c *Client) RecordBlockHeader(ctx context.Context, hash string, height uint32, bh bc.BlockHeader,
	opts ...ModelOps) (*BlockHeader, error)

RecordBlockHeader will save a block header into the Datastore

hash is the hash of the block header bh is the block header data opts are model options and can include "metadata"

func (*Client) RecordRawTransaction added in v0.2.31

func (c *Client) RecordRawTransaction(ctx context.Context, txHex string,
	opts ...ModelOps,
) (*Transaction, error)

RecordRawTransaction will parse the transaction and save it into the Datastore directly, without any checks or broadcast but bux will ask network for information if transaction was mined The transaction is treat as external incoming transaction - transaction without a draft Only use this function when you know what you are doing!

txHex is the raw transaction hex opts are model options and can include "metadata"

func (*Client) RecordTransaction

func (c *Client) RecordTransaction(ctx context.Context, xPubKey, txHex, draftID string, opts ...ModelOps) (*Transaction, error)

RecordTransaction will parse the transaction and save it into the Datastore

Internal (known) transactions: there is a corresponding `draft_transaction` via `draft_id` External (known) transactions: there are output(s) related to the destination `reference_id`, tx is valid (mempool/on-chain) External (unknown) transactions: no reference id but some output(s) match known outputs, tx is valid (mempool/on-chain) Unknown transactions: no matching outputs, tx will be disregarded

xPubKey is the raw public xPub txHex is the raw transaction hex draftID is the unique draft id from a previously started New() transaction (draft_transaction.ID) opts are model options and can include "metadata"

func (*Client) RevertTransaction added in v0.4.4

func (c *Client) RevertTransaction(ctx context.Context, id string) error

RevertTransaction will revert a transaction created in the Bux database, but only if it has not yet been synced on-chain and the utxos have not been spent. All utxos that are reverted will be marked as deleted (and spent)

func (*Client) RevokeAccessKey

func (c *Client) RevokeAccessKey(ctx context.Context, rawXpubKey, id string, opts ...ModelOps) (*AccessKey, error)

RevokeAccessKey will revoke an access key by its id

opts are options and can include "metadata"

func (*Client) SetNotificationsClient added in v0.2.14

func (c *Client) SetNotificationsClient(client notifications.ClientInterface)

SetNotificationsClient will overwrite the notification's client with the given client

func (*Client) Taskmanager

func (c *Client) Taskmanager() taskmanager.ClientInterface

Taskmanager will return the Taskmanager if it exists

func (*Client) UnReserveUtxos added in v0.5.12

func (c *Client) UnReserveUtxos(ctx context.Context, xPubID, draftID string) error

UnReserveUtxos remove the reservation on the utxos for the given draft ID

func (*Client) UpdateDestinationMetadataByAddress added in v0.2.14

func (c *Client) UpdateDestinationMetadataByAddress(ctx context.Context, xPubID, address string,
	metadata Metadata) (*Destination, error)

UpdateDestinationMetadataByAddress will update the metadata in an existing destination by address

func (*Client) UpdateDestinationMetadataByID added in v0.2.14

func (c *Client) UpdateDestinationMetadataByID(ctx context.Context, xPubID, id string,
	metadata Metadata) (*Destination, error)

UpdateDestinationMetadataByID will update the metadata in an existing destination by id

func (*Client) UpdateDestinationMetadataByLockingScript added in v0.2.14

func (c *Client) UpdateDestinationMetadataByLockingScript(ctx context.Context, xPubID,
	lockingScript string, metadata Metadata) (*Destination, error)

UpdateDestinationMetadataByLockingScript will update the metadata in an existing destination by locking script

func (*Client) UpdatePaymailAddress added in v0.2.14

func (c *Client) UpdatePaymailAddress(ctx context.Context, address, publicName, avatar string,
	opts ...ModelOps) (*PaymailAddress, error)

UpdatePaymailAddress will update optional fields of the paymail address

func (*Client) UpdatePaymailAddressMetadata added in v0.2.14

func (c *Client) UpdatePaymailAddressMetadata(ctx context.Context, address string,
	metadata Metadata, opts ...ModelOps) (*PaymailAddress, error)

UpdatePaymailAddressMetadata will update the metadata in an existing paymail address

func (*Client) UpdateTransactionMetadata added in v0.2.14

func (c *Client) UpdateTransactionMetadata(ctx context.Context, xPubID, id string,
	metadata Metadata,
) (*Transaction, error)

UpdateTransactionMetadata will update the metadata in an existing transaction

func (*Client) UpdateXpubMetadata added in v0.2.14

func (c *Client) UpdateXpubMetadata(ctx context.Context, xPubID string, metadata Metadata) (*Xpub, error)

UpdateXpubMetadata will update the metadata in an existing xPub

xPubID is the hash of the xP

func (*Client) UserAgent

func (c *Client) UserAgent() string

UserAgent will return the user agent

func (*Client) Version

func (c *Client) Version() string

Version will return the version

type ClientInterface

type ClientInterface interface {
	AccessKeyService
	AdminService
	BlockHeaderService
	ClientService
	DestinationService
	DraftTransactionService
	ModelService
	PaymailService
	TransactionService
	UTXOService
	XPubService
	AuthenticateRequest(ctx context.Context, req *http.Request, adminXPubs []string,
		adminRequired, requireSigning, signingDisabled bool) (*http.Request, error)
	Close(ctx context.Context) error
	Debug(on bool)
	DefaultSyncConfig() *SyncConfig
	EnableNewRelic()
	GetOrStartTxn(ctx context.Context, name string) context.Context
	ImportBlockHeadersFromURL() string
	IsDebug() bool
	IsEncryptionKeySet() bool
	IsITCEnabled() bool
	IsIUCEnabled() bool
	IsMigrationEnabled() bool
	IsNewRelicEnabled() bool
	SetNotificationsClient(notifications.ClientInterface)
	UserAgent() string
	Version() string
}

ClientInterface is the client (bux engine) interface comprised of all services/actions

func NewClient

func NewClient(ctx context.Context, opts ...ClientOps) (ClientInterface, error)

NewClient creates a new client for all bux functionality

If no options are given, it will use the defaultClientOptions() ctx may contain a NewRelic txn (or one will be created)

type ClientOps

type ClientOps func(c *clientOptions)

ClientOps allow functional options to be supplied that overwrite default client options.

func WithArc added in v0.5.8

func WithArc() ClientOps

WithArc will specify Arc as an API for minercraft client

func WithAutoMigrate

func WithAutoMigrate(migrateModels ...interface{}) ClientOps

WithAutoMigrate will enable auto migrate database mode (given models)

Pointers of structs (IE: &models.Xpub{})

func WithBroadcastClient added in v0.5.12

func WithBroadcastClient(broadcastClient broadcast.Client) ClientOps

WithBroadcastClient will set broadcast client

func WithBroadcastClientAPIs added in v0.5.12

func WithBroadcastClientAPIs(apis []broadcastclient.ArcClientConfig) ClientOps

WithBroadcastClientAPIs will set broadcast client APIs

func WithBroadcastMiners added in v0.2.14

func WithBroadcastMiners(miners []*chainstate.Miner) ClientOps

WithBroadcastMiners will set a list of miners for broadcasting

func WithChainstateOptions added in v0.2.14

func WithChainstateOptions(broadcasting, broadcastInstant, paymailP2P, syncOnChain bool) ClientOps

WithChainstateOptions will set chainstate defaults

func WithClusterClient added in v0.4.6

func WithClusterClient(clusterClient cluster.ClientInterface) ClientOps

WithClusterClient will set the cluster options on the client

func WithClusterKeyPrefix added in v0.4.6

func WithClusterKeyPrefix(prefix string) ClientOps

WithClusterKeyPrefix will set the cluster key prefix to use for all keys in the cluster coordinator

func WithClusterRedis added in v0.4.6

func WithClusterRedis(redisOptions *redis.Options) ClientOps

WithClusterRedis will set the cluster coordinator to use redis

func WithCronService added in v0.2.14

func WithCronService(cronService taskmanager.CronService) ClientOps

WithCronService will set the custom cron service provider

func WithCustomCachestore

func WithCustomCachestore(cacheStore cachestore.ClientInterface) ClientOps

WithCustomCachestore will set the cachestore

func WithCustomChainstate

func WithCustomChainstate(chainState chainstate.ClientInterface) ClientOps

WithCustomChainstate will set the chainstate

func WithCustomCronJobs added in v0.8.0

func WithCustomCronJobs(modifier func(cronJobs taskmanager.CronJobs) taskmanager.CronJobs) ClientOps

func WithCustomDatastore

func WithCustomDatastore(dataStore datastore.ClientInterface) ClientOps

WithCustomDatastore will set the datastore

func WithCustomNotifications added in v0.2.14

func WithCustomNotifications(customNotifications notifications.ClientInterface) ClientOps

WithCustomNotifications will set a custom notifications interface

func WithCustomTaskManager

func WithCustomTaskManager(taskManager taskmanager.ClientInterface) ClientOps

WithCustomTaskManager will set the taskmanager

func WithDebugging

func WithDebugging() ClientOps

WithDebugging will set debugging in any applicable configuration

func WithEncryption added in v0.2.14

func WithEncryption(key string) ClientOps

WithEncryption will set the encryption key and encrypt values using this key

func WithExcludedProviders added in v0.2.21

func WithExcludedProviders(providers []string) ClientOps

WithExcludedProviders will set a list of excluded providers

func WithFreeCache added in v0.2.14

func WithFreeCache() ClientOps

WithFreeCache will set the cache client for both Read & Write clients

func WithFreeCacheConnection added in v0.2.14

func WithFreeCacheConnection(client *freecache.Cache) ClientOps

WithFreeCacheConnection will set the cache client to an active FreeCache connection

func WithHTTPClient added in v0.2.14

func WithHTTPClient(httpClient HTTPInterface) ClientOps

WithHTTPClient will set the custom http interface

func WithITCDisabled

func WithITCDisabled() ClientOps

WithITCDisabled will disable (ITC) incoming transaction checking

func WithIUCDisabled added in v0.1.1

func WithIUCDisabled() ClientOps

WithIUCDisabled will disable checking the input utxos

func WithImportBlockHeaders added in v0.2.14

func WithImportBlockHeaders(importBlockHeadersURL string) ClientOps

WithImportBlockHeaders will import block headers on startup

func WithLogger

func WithLogger(customLogger *zerolog.Logger) ClientOps

WithLogger will set the custom logger interface

func WithMAPI added in v0.5.8

func WithMAPI() ClientOps

WithMAPI will specify Arc as an API for minercraft client

func WithMigrationDisabled added in v0.2.24

func WithMigrationDisabled() ClientOps

WithMigrationDisabled will disable all migrations from running in the Datastore

func WithMinercraft added in v0.5.5

func WithMinercraft(minercraft minercraft.ClientInterface) ClientOps

WithMinercraft will set custom minercraft client

func WithMinercraftAPIs added in v0.5.8

func WithMinercraftAPIs(miners []*minercraft.MinerAPIs) ClientOps

WithMinercraftAPIs set custom MinerAPIs for minercraft

func WithMinercraftFeeQuotes added in v0.5.8

func WithMinercraftFeeQuotes() ClientOps

WithMinercraftFeeQuotes will set usage of minercraft's fee quotes instead of default fees

func WithModels

func WithModels(models ...interface{}) ClientOps

WithModels will add additional models (will NOT migrate using datastore)

Pointers of structs (IE: &models.Xpub{})

func WithMongoConnection

func WithMongoConnection(database *mongo.Database, tablePrefix string) ClientOps

WithMongoConnection will set the Datastore to an existing connection for MongoDB

func WithMongoDB

func WithMongoDB(config *datastore.MongoDBConfig) ClientOps

WithMongoDB will set the Datastore to use MongoDB

func WithMonitoring added in v0.2.14

func WithMonitoring(ctx context.Context, monitorOptions *chainstate.MonitorOptions) ClientOps

WithMonitoring will create a new monitorConfig interface with the given options

func WithMonitoringInterface added in v0.2.14

func WithMonitoringInterface(monitor chainstate.MonitorService) ClientOps

WithMonitoringInterface will set the interface to use for monitoring the blockchain

func WithNewRelic

func WithNewRelic(app *newrelic.Application) ClientOps

WithNewRelic will set the NewRelic application client

func WithNotifications added in v0.2.14

func WithNotifications(webhookEndpoint string) ClientOps

WithNotifications will set the notifications config

func WithPaymailBeefSupport added in v0.5.13

func WithPaymailBeefSupport(pulseURL, pulseAuthToken string) ClientOps

WithPaymailBeefSupport will enable Paymail BEEF format support (as a server) and create a Pulse client for Merkle Roots verification.

func WithPaymailClient

func WithPaymailClient(client paymail.ClientInterface) ClientOps

WithPaymailClient will set a custom paymail client

func WithPaymailServerConfig added in v0.2.14

func WithPaymailServerConfig(config *server.Configuration, defaultFromPaymail, defaultNote string) ClientOps

WithPaymailServerConfig will set the custom server configuration for Paymail

This will allow overriding the Configuration.actions (paymail service provider)

func WithPaymailSupport added in v0.2.14

func WithPaymailSupport(domains []string, defaultFromPaymail, defaultNote string,
	domainValidation, senderValidation bool,
) ClientOps

WithPaymailSupport will set the configuration for Paymail support (as a server)

func WithQueryMiners added in v0.2.14

func WithQueryMiners(miners []*chainstate.Miner) ClientOps

WithQueryMiners will set a list of miners for querying transactions

func WithRedis

func WithRedis(config *cachestore.RedisConfig) ClientOps

WithRedis will set the redis cache client for both Read & Write clients

This will load new redis connections using the given parameters

func WithRedisConnection

func WithRedisConnection(activeClient *cache.Client) ClientOps

WithRedisConnection will set the cache client to an active redis connection

func WithSQL

func WithSQL(engine datastore.Engine, config *datastore.SQLConfig) ClientOps

WithSQL will set the datastore to use the SQL config

func WithSQLConfigs added in v0.2.14

func WithSQLConfigs(engine datastore.Engine, configs []*datastore.SQLConfig) ClientOps

WithSQLConfigs will load multiple connections (replica & master)

func WithSQLConnection

func WithSQLConnection(engine datastore.Engine, sqlDB *sql.DB, tablePrefix string) ClientOps

WithSQLConnection will set the Datastore to an existing connection for MySQL or PostgreSQL

func WithSQLite

func WithSQLite(config *datastore.SQLiteConfig) ClientOps

WithSQLite will set the Datastore to use SQLite

func WithTaskQ

func WithTaskQ(config *taskq.QueueOptions, factory taskmanager.Factory) ClientOps

WithTaskQ will set the task manager to use TaskQ & in-memory

func WithTaskQUsingRedis

func WithTaskQUsingRedis(config *taskq.QueueOptions, redisOptions *redis.Options) ClientOps

WithTaskQUsingRedis will set the task manager to use TaskQ & Redis

func WithUserAgent

func WithUserAgent(userAgent string) ClientOps

WithUserAgent will overwrite the default useragent

type ClientService added in v0.2.25

type ClientService interface {
	Cachestore() cachestore.ClientInterface
	Cluster() cluster.ClientInterface
	Chainstate() chainstate.ClientInterface
	Datastore() datastore.ClientInterface
	HTTPClient() HTTPInterface
	Logger() *zerolog.Logger
	Notifications() notifications.ClientInterface
	PaymailClient() paymail.ClientInterface
	Taskmanager() taskmanager.ClientInterface
}

ClientService is the client related services

type Destination

type Destination struct {
	// Base model
	Model `bson:",inline"`

	// Model specific fields
	ID            string               `` /* 129-byte string literal not displayed */
	XpubID        string               `` /* 129-byte string literal not displayed */
	LockingScript string               `` /* 159-byte string literal not displayed */
	Type          string               `json:"type" toml:"type" yaml:"type" gorm:"<-:create;type:text;comment:Type of output" bson:"type"`
	Chain         uint32               `` /* 153-byte string literal not displayed */
	Num           uint32               `` /* 145-byte string literal not displayed */
	Address       string               `` /* 135-byte string literal not displayed */
	DraftID       string               `` /* 167-byte string literal not displayed */
	Monitor       customTypes.NullTime `` /* 167-byte string literal not displayed */
}

Destination is an object representing a BitCoin destination (address, script, etc)

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*Destination) AfterCreated added in v0.2.14

func (m *Destination) AfterCreated(ctx context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*Destination) AfterDeleted added in v0.2.14

func (m *Destination) AfterDeleted(ctx context.Context) error

AfterDeleted will fire after the model is deleted in the Datastore

func (*Destination) AfterUpdated added in v0.2.14

func (m *Destination) AfterUpdated(ctx context.Context) error

AfterUpdated will fire after the model is updated in the Datastore

func (*Destination) BeforeCreating

func (m *Destination) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*Destination) GetID

func (m *Destination) GetID() string

GetID will get the model ID

func (*Destination) GetModelName

func (m *Destination) GetModelName() string

GetModelName will get the name of the current model

func (*Destination) GetModelTableName

func (m *Destination) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*Destination) Migrate

func (m *Destination) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*Destination) Save

func (m *Destination) Save(ctx context.Context) (err error)

Save will save the model into the Datastore

type DestinationService

type DestinationService interface {
	GetDestinationByID(ctx context.Context, xPubID, id string) (*Destination, error)
	GetDestinationByAddress(ctx context.Context, xPubID, address string) (*Destination, error)
	GetDestinationByLockingScript(ctx context.Context, xPubID, lockingScript string) (*Destination, error)
	GetDestinations(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*Destination, error)
	GetDestinationsCount(ctx context.Context, metadata *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
	GetDestinationsByXpubID(ctx context.Context, xPubID string, usingMetadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams) ([]*Destination, error)
	GetDestinationsByXpubIDCount(ctx context.Context, xPubID string, usingMetadata *Metadata,
		conditions *map[string]interface{}) (int64, error)
	NewDestination(ctx context.Context, xPubKey string, chain uint32, destinationType string, monitor bool,
		opts ...ModelOps) (*Destination, error)
	NewDestinationForLockingScript(ctx context.Context, xPubID, lockingScript string, monitor bool,
		opts ...ModelOps) (*Destination, error)
	UpdateDestinationMetadataByID(ctx context.Context, xPubID, id string, metadata Metadata) (*Destination, error)
	UpdateDestinationMetadataByLockingScript(ctx context.Context, xPubID,
		lockingScript string, metadata Metadata) (*Destination, error)
	UpdateDestinationMetadataByAddress(ctx context.Context, xPubID, address string,
		metadata Metadata) (*Destination, error)
}

DestinationService is the destination actions

type DraftStatus

type DraftStatus string

DraftStatus draft transaction status

const (
	// DraftStatusDraft is when the transaction is a draft
	DraftStatusDraft DraftStatus = statusDraft

	// DraftStatusCanceled is when the draft is canceled
	DraftStatusCanceled DraftStatus = statusCanceled

	// DraftStatusExpired is when the draft has expired
	DraftStatusExpired DraftStatus = statusExpired

	// DraftStatusComplete is when the draft transaction is complete
	DraftStatusComplete DraftStatus = statusComplete
)

func (*DraftStatus) Scan

func (t *DraftStatus) Scan(value interface{}) error

Scan will scan the value into Struct, implements sql.Scanner interface

func (DraftStatus) Value

func (t DraftStatus) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type DraftTransaction

type DraftTransaction struct {
	// Base model
	Model `bson:",inline"`

	// Standard transaction model base fields
	TransactionBase `bson:",inline"`

	// Model specific fields
	XpubID        string            `` /* 129-byte string literal not displayed */
	ExpiresAt     time.Time         `json:"expires_at" toml:"expires_at" yaml:"expires_at" gorm:"<-:create;comment:Time when the draft expires" bson:"expires_at"`
	Configuration TransactionConfig `` /* 152-byte string literal not displayed */
	Status        DraftStatus       `` /* 128-byte string literal not displayed */
	FinalTxID     string            `` /* 157-byte string literal not displayed */
}

DraftTransaction is an object representing the draft BitCoin transaction prior to the final transaction

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*DraftTransaction) AfterUpdated

func (m *DraftTransaction) AfterUpdated(ctx context.Context) error

AfterUpdated will fire after a successful update into the Datastore

func (*DraftTransaction) BeforeCreating

func (m *DraftTransaction) BeforeCreating(ctx context.Context) (err error)

BeforeCreating will fire before the model is being inserted into the Datastore

func (*DraftTransaction) GetID

func (m *DraftTransaction) GetID() string

GetID will get the model ID

func (*DraftTransaction) GetModelName

func (m *DraftTransaction) GetModelName() string

GetModelName will get the name of the current model

func (*DraftTransaction) GetModelTableName

func (m *DraftTransaction) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*DraftTransaction) Migrate

func (m *DraftTransaction) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*DraftTransaction) Save

func (m *DraftTransaction) Save(ctx context.Context) (err error)

Save will save the model into the Datastore

func (*DraftTransaction) SignInputs added in v0.2.14

func (m *DraftTransaction) SignInputs(xPriv *bip32.ExtendedKey) (signedHex string, err error)

SignInputs will sign all the inputs using the given xPriv key

func (*DraftTransaction) SignInputsWithKey added in v0.2.14

func (m *DraftTransaction) SignInputsWithKey(xPrivKey string) (signedHex string, err error)

SignInputsWithKey will sign all the inputs using a key (string) (helper method)

type DraftTransactionService added in v0.2.18

type DraftTransactionService interface {
	GetDraftTransactions(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*DraftTransaction, error)
	GetDraftTransactionsCount(ctx context.Context, metadata *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
}

DraftTransactionService is the draft transactions actions

type HTTPInterface added in v0.2.14

type HTTPInterface interface {
	Do(req *http.Request) (*http.Response, error)
}

HTTPInterface is the HTTP client interface

type IDs

type IDs []string

IDs are string ids saved as an array

func UnmarshalIDs

func UnmarshalIDs(v interface{}) (IDs, error)

UnmarshalIDs will marshal the custom type

func (IDs) GormDBDataType

func (IDs) GormDBDataType(db *gorm.DB, _ *schema.Field) string

GormDBDataType the gorm data type for metadata

func (IDs) GormDataType

func (i IDs) GormDataType() string

GormDataType type in gorm

func (*IDs) Scan

func (i *IDs) Scan(value interface{}) error

Scan scan value into JSON, implements sql.Scanner interface

func (IDs) Value

func (i IDs) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type IncomingTransaction

type IncomingTransaction struct {
	// Base model
	Model `bson:",inline"`

	// Standard transaction model base fields
	TransactionBase `bson:",inline"`

	// Model specific fields
	Status        SyncStatus `` /* 145-byte string literal not displayed */
	StatusMessage string     `` /* 159-byte string literal not displayed */
}

IncomingTransaction is an object representing the incoming (external) transaction (for pre-processing)

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*IncomingTransaction) AfterCreated

func (m *IncomingTransaction) AfterCreated(_ context.Context) error

AfterCreated will fire after the model is created

func (*IncomingTransaction) BeforeCreating

func (m *IncomingTransaction) BeforeCreating(ctx context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*IncomingTransaction) GetID

func (m *IncomingTransaction) GetID() string

GetID will get the ID

func (*IncomingTransaction) GetModelName

func (m *IncomingTransaction) GetModelName() string

GetModelName will get the name of the current model

func (*IncomingTransaction) GetModelTableName

func (m *IncomingTransaction) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*IncomingTransaction) Migrate

func (m *IncomingTransaction) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*IncomingTransaction) Save

Save will save the model into the Datastore

type MapProtocol

type MapProtocol struct {
	App  string                 `json:"app,omitempty"`  // Application name
	Keys map[string]interface{} `json:"keys,omitempty"` // Keys to set
	Type string                 `json:"type,omitempty"` // Type of action
}

MapProtocol is a specific MAP protocol interface for an op_return

type Metadata

type Metadata map[string]interface{}

Metadata is an object representing the metadata about the related record (standard across all tables)

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func UnmarshalMetadata

func UnmarshalMetadata(v interface{}) (Metadata, error)

UnmarshalMetadata will unmarshal the custom type

func (Metadata) GormDBDataType

func (Metadata) GormDBDataType(db *gorm.DB, _ *schema.Field) string

GormDBDataType the gorm data type for metadata

func (Metadata) GormDataType

func (m Metadata) GormDataType() string

GormDataType type in gorm

func (*Metadata) MarshalBSONValue

func (m *Metadata) MarshalBSONValue() (bsontype.Type, []byte, error)

MarshalBSONValue method is called by bson.Marshal in Mongo for type = Metadata

func (*Metadata) Scan

func (m *Metadata) Scan(value interface{}) error

Scan scan value into Json, implements sql.Scanner interface

func (*Metadata) UnmarshalBSONValue

func (m *Metadata) UnmarshalBSONValue(t bsontype.Type, data []byte) error

UnmarshalBSONValue method is called by bson.Unmarshal in Mongo for type = Metadata

func (Metadata) Value

func (m Metadata) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type MockTransactionStore added in v0.7.0

type MockTransactionStore struct {
	Transactions map[string]*Transaction
}

func NewMockTransactionStore added in v0.7.0

func NewMockTransactionStore() *MockTransactionStore

func (*MockTransactionStore) AddToStore added in v0.7.0

func (m *MockTransactionStore) AddToStore(tx *Transaction)

func (*MockTransactionStore) GetTransactionsByIDs added in v0.7.0

func (m *MockTransactionStore) GetTransactionsByIDs(ctx context.Context, txIDs []string) ([]*Transaction, error)

type Model

type Model struct {
	CreatedAt time.Time `` /* 134-byte string literal not displayed */
	UpdatedAt time.Time `` /* 138-byte string literal not displayed */
	Metadata  Metadata  `gorm:"type:json;comment:The JSON metadata for the record" json:"metadata,omitempty" bson:"metadata,omitempty"`

	// https://gorm.io/docs/indexes.html
	// DeletedAt gorm.DeletedAt `json:"deleted_at" toml:"deleted_at" yaml:"deleted_at" (@mrz: this was the original type)
	DeletedAt customTypes.NullTime `` /* 144-byte string literal not displayed */
	// contains filtered or unexported fields
}

Model is the generic model field(s) and interface(s)

gorm: https://gorm.io/docs/models.html

func NewBaseModel

func NewBaseModel(name ModelName, opts ...ModelOps) (m *Model)

NewBaseModel create an empty base model

func (*Model) AfterCreated

func (m *Model) AfterCreated(_ context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*Model) AfterDeleted

func (m *Model) AfterDeleted(_ context.Context) error

AfterDeleted will fire after a successful delete in the Datastore

func (*Model) AfterUpdated

func (m *Model) AfterUpdated(_ context.Context) error

AfterUpdated will fire after a successful update into the Datastore

func (*Model) BeforeUpdating

func (m *Model) BeforeUpdating(_ context.Context) error

BeforeUpdating will fire before updating a model in the Datastore

func (*Model) ChildModels

func (m *Model) ChildModels() []ModelInterface

ChildModels will return any child models

func (*Model) Client

func (m *Model) Client() ClientInterface

Client will return the current client

func (*Model) Display

func (m *Model) Display() interface{}

Display filter the model for display

func (*Model) GetID added in v0.2.14

func (m *Model) GetID() string

GetID will get the model id, if overwritten in the actual model

func (*Model) GetOptions

func (m *Model) GetOptions(isNewRecord bool) (opts []ModelOps)

GetOptions will get the options that are set on that model

func (*Model) IsNew

func (m *Model) IsNew() bool

IsNew returns true if the model is (or was) a new record

func (*Model) Name

func (m *Model) Name() string

Name will get the collection name (model)

func (*Model) New

func (m *Model) New()

New will set the record to new

func (*Model) NotNew

func (m *Model) NotNew()

NotNew sets newRecord to false

func (*Model) RawXpub

func (m *Model) RawXpub() string

RawXpub returns the rawXpubKey

func (*Model) SetOptions

func (m *Model) SetOptions(opts ...ModelOps)

SetOptions will set the options on the model

func (*Model) SetRecordTime

func (m *Model) SetRecordTime(created bool)

SetRecordTime will set the record timestamps (created is true for a new record)

func (*Model) UpdateMetadata added in v0.2.14

func (m *Model) UpdateMetadata(metadata Metadata)

UpdateMetadata will update the metadata on the model any key set to nil will be removed, other keys updated or added

type ModelInterface

type ModelInterface interface {
	AfterCreated(ctx context.Context) (err error)
	AfterDeleted(ctx context.Context) (err error)
	AfterUpdated(ctx context.Context) (err error)
	BeforeCreating(ctx context.Context) (err error)
	BeforeUpdating(ctx context.Context) (err error)
	ChildModels() []ModelInterface
	Client() ClientInterface
	Display() interface{}
	GetID() string
	GetModelName() string
	GetModelTableName() string
	GetOptions(isNewRecord bool) (opts []ModelOps)
	IsNew() bool
	Migrate(client datastore.ClientInterface) error
	Name() string
	New()
	NotNew()
	RawXpub() string
	Save(ctx context.Context) (err error)
	SetOptions(opts ...ModelOps)
	SetRecordTime(bool)
	UpdateMetadata(metadata Metadata)
}

ModelInterface is the interface that all models share

type ModelName

type ModelName string

ModelName is the model name type

const (
	ModelAccessKey           ModelName = "access_key"
	ModelBlockHeader         ModelName = "block_header"
	ModelDestination         ModelName = "destination"
	ModelDraftTransaction    ModelName = "draft_transaction"
	ModelIncomingTransaction ModelName = "incoming_transaction"
	ModelMetadata            ModelName = "metadata"
	ModelNameEmpty           ModelName = "empty"
	ModelPaymailAddress      ModelName = "paymail_address"
	ModelSyncTransaction     ModelName = "sync_transaction"
	ModelTransaction         ModelName = "transaction"
	ModelUtxo                ModelName = "utxo"
	ModelXPub                ModelName = "xpub"
)

All the base models

func (ModelName) IsEmpty

func (n ModelName) IsEmpty() bool

IsEmpty tests if the model name is empty

func (ModelName) String

func (n ModelName) String() string

String is the string version of the name

type ModelOps

type ModelOps func(m *Model)

ModelOps allow functional options to be supplied that overwrite default model options

func New

func New() ModelOps

New set this model to a new record

func WithClient

func WithClient(client ClientInterface) ModelOps

WithClient will set the Client on the model

func WithEncryptionKey added in v0.2.14

func WithEncryptionKey(encryptionKey string) ModelOps

WithEncryptionKey will set the encryption key on the model (if needed)

func WithMetadata

func WithMetadata(key string, value interface{}) ModelOps

WithMetadata will add the metadata record to the model

func WithMetadataFromJSON added in v0.4.18

func WithMetadataFromJSON(jsonData []byte) ModelOps

WithMetadataFromJSON will add the metadata record to the model

func WithMetadatas

func WithMetadatas(metadata map[string]interface{}) ModelOps

WithMetadatas will add multiple metadata records to the model

func WithPageSize added in v0.2.14

func WithPageSize(pageSize int) ModelOps

WithPageSize will set the pageSize to use on the model in queries

func WithXPub

func WithXPub(rawXpubKey string) ModelOps

WithXPub will set the xPub key on the model

type ModelService added in v0.2.25

type ModelService interface {
	AddModels(ctx context.Context, autoMigrate bool, models ...interface{}) error
	DefaultModelOptions(opts ...ModelOps) []ModelOps
	GetModelNames() []string
}

ModelService is the "model" related services

type MonitorEventHandler added in v0.2.14

type MonitorEventHandler struct {
	// contains filtered or unexported fields
}

MonitorEventHandler for handling transaction events from a monitor

func NewMonitorHandler added in v0.2.14

func NewMonitorHandler(ctx context.Context, buxClient ClientInterface, monitor chainstate.MonitorService) MonitorEventHandler

NewMonitorHandler create a new monitor handler

func (*MonitorEventHandler) OnConnect added in v0.2.14

func (h *MonitorEventHandler) OnConnect(client *centrifuge.Client, e centrifuge.ConnectEvent)

OnConnect event when connected

func (*MonitorEventHandler) OnDisconnect added in v0.2.14

func (h *MonitorEventHandler) OnDisconnect(_ *centrifuge.Client, _ centrifuge.DisconnectEvent)

OnDisconnect when disconnected

func (*MonitorEventHandler) OnError added in v0.2.14

func (h *MonitorEventHandler) OnError(_ *centrifuge.Client, e centrifuge.ErrorEvent)

OnError on error event

func (*MonitorEventHandler) OnJoin added in v0.2.14

func (h *MonitorEventHandler) OnJoin(_ *centrifuge.Subscription, e centrifuge.JoinEvent)

OnJoin event when joining a server

func (*MonitorEventHandler) OnLeave added in v0.2.14

func (h *MonitorEventHandler) OnLeave(_ *centrifuge.Subscription, e centrifuge.LeaveEvent)

OnLeave event when leaving a server

func (*MonitorEventHandler) OnMessage added in v0.2.14

func (h *MonitorEventHandler) OnMessage(_ *centrifuge.Client, e centrifuge.MessageEvent)

OnMessage on new message event

func (*MonitorEventHandler) OnPublish added in v0.2.14

func (h *MonitorEventHandler) OnPublish(subscription *centrifuge.Subscription, e centrifuge.PublishEvent)

OnPublish on publish event

func (*MonitorEventHandler) OnServerJoin added in v0.2.14

func (h *MonitorEventHandler) OnServerJoin(_ *centrifuge.Client, e centrifuge.ServerJoinEvent)

OnServerJoin event when joining a server

func (*MonitorEventHandler) OnServerLeave added in v0.2.14

func (h *MonitorEventHandler) OnServerLeave(_ *centrifuge.Client, e centrifuge.ServerLeaveEvent)

OnServerLeave event when leaving a server

func (*MonitorEventHandler) OnServerPublish added in v0.2.14

func (h *MonitorEventHandler) OnServerPublish(c *centrifuge.Client, e centrifuge.ServerPublishEvent)

OnServerPublish on server publish event

func (*MonitorEventHandler) OnServerSubscribe added in v0.2.14

func (h *MonitorEventHandler) OnServerSubscribe(_ *centrifuge.Client, e centrifuge.ServerSubscribeEvent)

OnServerSubscribe on server subscribe event

func (*MonitorEventHandler) OnServerUnsubscribe added in v0.2.14

func (h *MonitorEventHandler) OnServerUnsubscribe(_ *centrifuge.Client, e centrifuge.ServerUnsubscribeEvent)

OnServerUnsubscribe on the unsubscribe event

func (*MonitorEventHandler) OnSubscribeError added in v0.2.14

func (h *MonitorEventHandler) OnSubscribeError(_ *centrifuge.Subscription, e centrifuge.SubscribeErrorEvent)

OnSubscribeError is for an error

func (*MonitorEventHandler) OnSubscribeSuccess added in v0.2.14

func (h *MonitorEventHandler) OnSubscribeSuccess(_ *centrifuge.Subscription, e centrifuge.SubscribeSuccessEvent)

OnSubscribeSuccess on subscribe success

func (*MonitorEventHandler) OnUnsubscribe added in v0.2.14

func (h *MonitorEventHandler) OnUnsubscribe(_ *centrifuge.Subscription, e centrifuge.UnsubscribeEvent)

OnUnsubscribe will unsubscribe

func (*MonitorEventHandler) ProcessBlockHeaders added in v0.2.14

func (h *MonitorEventHandler) ProcessBlockHeaders(ctx context.Context, client *centrifuge.Client) error

ProcessBlockHeaders processes all missing block headers

func (*MonitorEventHandler) ProcessBlocks added in v0.2.14

func (h *MonitorEventHandler) ProcessBlocks(ctx context.Context, client *centrifuge.Client, blockChannel chan bool) error

ProcessBlocks processes all transactions in blocks that have not yet been synced

func (*MonitorEventHandler) RecordBlockHeader added in v0.2.14

func (h *MonitorEventHandler) RecordBlockHeader(_ context.Context, _ bc.BlockHeader) error

RecordBlockHeader records a block header into bux

func (*MonitorEventHandler) RecordTransaction added in v0.2.14

func (h *MonitorEventHandler) RecordTransaction(ctx context.Context, txHex string) error

RecordTransaction records a transaction into bux

func (*MonitorEventHandler) SetMonitor added in v0.2.14

func (h *MonitorEventHandler) SetMonitor(monitor *chainstate.Monitor)

SetMonitor sets the monitor for the given handler

type OpReturn

type OpReturn struct {
	Hex         string       `json:"hex,omitempty"`          // Full hex
	HexParts    []string     `json:"hex_parts,omitempty"`    // Hex into parts
	Map         *MapProtocol `json:"map,omitempty"`          // MAP protocol
	StringParts []string     `json:"string_parts,omitempty"` // String parts
}

OpReturn is the op_return definition for the output

type ParamRequestKey added in v0.2.14

type ParamRequestKey string

ParamRequestKey for context key

const (
	// ParamXPubKey the request parameter for the xpub string
	ParamXPubKey ParamRequestKey = "xpub"

	// ParamXPubHashKey the request parameter for the xpub ID
	ParamXPubHashKey ParamRequestKey = "xpub_hash"

	// ParamAdminRequest the request parameter whether this is an admin request
	ParamAdminRequest ParamRequestKey = "auth_admin"

	// ParamAuthSigned the request parameter that says whether the request was signed
	ParamAuthSigned ParamRequestKey = "auth_signed"
)

type PaymailAddress added in v0.2.14

type PaymailAddress struct {
	// Base model
	Model `bson:",inline"`

	// Model specific fields
	ID string `` // Unique identifier
	/* 127-byte string literal not displayed */
	XpubID string `` // Related xPub ID
	/* 129-byte string literal not displayed */
	Alias      string `json:"alias" toml:"alias" yaml:"alias" gorm:"<-;type:varchar(64);comment:This is alias@" bson:"alias"`           // Alias part of the paymail
	Domain     string `json:"domain" toml:"domain" yaml:"domain" gorm:"<-;type:varchar(255);comment:This is @domain.com" bson:"domain"` // Domain of the paymail
	PublicName string ``                                                                                                                // Full username
	/* 160-byte string literal not displayed */
	Avatar          string `json:"avatar" toml:"avatar" yaml:"avatar" gorm:"<-;type:text;comment:This is avatar url" bson:"avatar"` // This is the url of the user (public profile)
	ExternalXpubKey string ``                                                                                                       // PublicKey hex encoded
	/* 204-byte string literal not displayed */
	// contains filtered or unexported fields
}

PaymailAddress is an "external model example" - this model is not part of the standard models loaded and runtime

This model must be included at runtime via WithAutoMigrate() etc...

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*PaymailAddress) AfterCreated added in v0.2.23

func (m *PaymailAddress) AfterCreated(_ context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*PaymailAddress) BeforeCreating added in v0.2.14

func (m *PaymailAddress) BeforeCreating(_ context.Context) (err error)

BeforeCreating is called before the model is saved to the DB

func (*PaymailAddress) GetExternalXpub added in v0.2.14

func (m *PaymailAddress) GetExternalXpub() (*bip32.ExtendedKey, error)

GetExternalXpub will get the external xPub

func (*PaymailAddress) GetID added in v0.2.14

func (m *PaymailAddress) GetID() string

GetID will get the ID

func (*PaymailAddress) GetIdentityXpub added in v0.2.14

func (m *PaymailAddress) GetIdentityXpub() (*bip32.ExtendedKey, error)

GetIdentityXpub will get the identity related to the xPub

func (*PaymailAddress) GetModelName added in v0.2.14

func (m *PaymailAddress) GetModelName() string

GetModelName returns the model name

func (*PaymailAddress) GetModelTableName added in v0.2.14

func (m *PaymailAddress) GetModelTableName() string

GetModelTableName returns the model db table name

func (*PaymailAddress) Migrate added in v0.2.14

func (m *PaymailAddress) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*PaymailAddress) Save added in v0.2.14

func (m *PaymailAddress) Save(ctx context.Context) (err error)

Save the model

type PaymailDefaultServiceProvider added in v0.2.14

type PaymailDefaultServiceProvider struct {
	// contains filtered or unexported fields
}

PaymailDefaultServiceProvider is an interface for overriding the paymail actions in go-paymail/server

This is an example and the default functionality for all the basic Paymail actions

func (*PaymailDefaultServiceProvider) CreateAddressResolutionResponse added in v0.2.14

func (p *PaymailDefaultServiceProvider) CreateAddressResolutionResponse(
	ctx context.Context,
	alias, domain string,
	_ bool,
	requestMetadata *server.RequestMetadata,
) (*paymail.ResolutionPayload, error)

CreateAddressResolutionResponse will create the address resolution response

func (*PaymailDefaultServiceProvider) CreateP2PDestinationResponse added in v0.2.14

func (p *PaymailDefaultServiceProvider) CreateP2PDestinationResponse(
	ctx context.Context,
	alias, domain string,
	satoshis uint64,
	requestMetadata *server.RequestMetadata,
) (*paymail.PaymentDestinationPayload, error)

CreateP2PDestinationResponse will create a p2p destination response

func (*PaymailDefaultServiceProvider) GetPaymailByAlias added in v0.2.14

func (p *PaymailDefaultServiceProvider) GetPaymailByAlias(
	ctx context.Context,
	alias, domain string,
	requestMetadata *server.RequestMetadata,
) (*paymail.AddressInformation, error)

GetPaymailByAlias will get a paymail address and information by alias

func (*PaymailDefaultServiceProvider) RecordTransaction added in v0.2.14

func (p *PaymailDefaultServiceProvider) RecordTransaction(ctx context.Context,
	p2pTx *paymail.P2PTransaction, requestMetadata *server.RequestMetadata) (*paymail.P2PTransactionPayload, error)

RecordTransaction will record the transaction TODO: rename to HandleReceivedP2pTransaction

func (*PaymailDefaultServiceProvider) VerifyMerkleRoots added in v0.5.17

func (p *PaymailDefaultServiceProvider) VerifyMerkleRoots(
	ctx context.Context,
	merkleRoots []*spv.MerkleRootConfirmationRequestItem,
) error

VerifyMerkleRoots will verify the merkle roots by checking them in external header service - Pulse

type PaymailP4

type PaymailP4 struct {
	Alias           string               `json:"alias" toml:"alias" yaml:"alias" bson:"alias,omitempty"`                                                       // Alias of the paymail {alias}@domain.com
	Domain          string               `json:"domain" toml:"domain" yaml:"domain" bson:"domain,omitempty"`                                                   // Domain of the paymail alias@{domain.com}
	FromPaymail     string               `json:"from_paymail,omitempty" toml:"from_paymail" yaml:"from_paymail" bson:"from_paymail,omitempty"`                 // From paymail address: alias@domain.com
	Note            string               `json:"note,omitempty" toml:"note" yaml:"note" bson:"note,omitempty"`                                                 // Friendly readable note to the paymail receiver
	PubKey          string               `json:"pub_key,omitempty" toml:"pub_key" yaml:"pub_key" bson:"pub_key,omitempty"`                                     // Used for validating the signature
	ReceiveEndpoint string               `json:"receive_endpoint,omitempty" toml:"receive_endpoint" yaml:"receive_endpoint" bson:"receive_endpoint,omitempty"` // P2P endpoint when notifying
	ReferenceID     string               `json:"reference_id,omitempty" toml:"reference_id" yaml:"reference_id" bson:"reference_id,omitempty"`                 // Reference ID saved from P2P request
	ResolutionType  string               `json:"resolution_type" toml:"resolution_type" yaml:"resolution_type" bson:"resolution_type,omitempty"`               // Type of address resolution (basic vs p2p)
	Format          PaymailPayloadFormat `json:"format,omitempty" toml:"format" yaml:"format" bson:"format,omitempty"`                                         // Use beef format for the transaction
}

PaymailP4 paymail configuration for the p2p payments on this output

type PaymailPayloadFormat added in v0.5.13

type PaymailPayloadFormat uint32

PaymailPayloadFormat is the format of the paymail payload

const (
	BasicPaymailPayloadFormat PaymailPayloadFormat = iota
	BeefPaymailPayloadFormat
)

Types of Paymail payload formats

func (PaymailPayloadFormat) String added in v0.5.13

func (format PaymailPayloadFormat) String() string

type PaymailServerOptions added in v0.2.14

type PaymailServerOptions struct {
	*server.Configuration // Server configuration if Paymail is enabled

	DefaultFromPaymail string // IE: from@domain.com
	DefaultNote        string // IE: some note for address resolution
	// contains filtered or unexported fields
}

PaymailServerOptions is the options for the Paymail server

type PaymailService added in v0.2.14

type PaymailService interface {
	DeletePaymailAddress(ctx context.Context, address string, opts ...ModelOps) error
	GetPaymailConfig() *PaymailServerOptions
	GetPaymailAddress(ctx context.Context, address string, opts ...ModelOps) (*PaymailAddress, error)
	GetPaymailAddressesByXPubID(ctx context.Context, xPubID string, metadataConditions *Metadata,
		conditions *map[string]interface{}, queryParams *datastore.QueryParams) ([]*PaymailAddress, error)
	NewPaymailAddress(ctx context.Context, key, address, publicName,
		avatar string, opts ...ModelOps) (*PaymailAddress, error)
	UpdatePaymailAddress(ctx context.Context, address, publicName,
		avatar string, opts ...ModelOps) (*PaymailAddress, error)
	UpdatePaymailAddressMetadata(ctx context.Context, address string,
		metadata Metadata, opts ...ModelOps) (*PaymailAddress, error)
}

PaymailService is the paymail actions & services

type ScriptOutput

type ScriptOutput struct {
	Address    string `json:"address,omitempty"`  // Hex encoded locking script
	Satoshis   uint64 `json:"satoshis,omitempty"` // Number of satoshis for that output
	Script     string `json:"script"`             // Hex encoded locking script
	ScriptType string `json:"script_type"`        // The type of output
}

ScriptOutput is the actual script record (could be several for one output record)

type SyncConfig

type SyncConfig struct {
	Broadcast        bool `json:"broadcast" toml:"broadcast" yaml:"broadcast"`                         // Transaction should be broadcasted
	BroadcastInstant bool `json:"broadcast_instant" toml:"broadcast_instant" yaml:"broadcast_instant"` // Transaction should be broadcasted instantly (ASAP)
	PaymailP2P       bool `json:"paymail_p2p" toml:"paymail_p2p" yaml:"paymail_p2p"`                   // Transaction will be sent to all related paymail providers if P2P is detected
	SyncOnChain      bool `json:"sync_on_chain" toml:"sync_on_chain" yaml:"sync_on_chain"`             // Transaction should be checked that it's on-chain

}

SyncConfig is the configuration used for syncing a transaction (on-chain)

func (*SyncConfig) Scan

func (t *SyncConfig) Scan(value interface{}) error

Scan will scan the value into Struct, implements sql.Scanner interface

func (SyncConfig) Value

func (t SyncConfig) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type SyncResult added in v0.2.15

type SyncResult struct {
	Action        string    `json:"action"`             // type: broadcast, sync etc
	ExecutedAt    time.Time `json:"executed_at"`        // Time it was executed
	Provider      string    `json:"provider,omitempty"` // Provider used for attempt(s)
	StatusMessage string    `json:"status_message"`     // Success or failure message
}

SyncResult is the complete attempt/result to sync (multiple providers and strategies)

type SyncResults

type SyncResults struct {
	LastMessage string        `json:"last_message"` // Last message (success or failure)
	Results     []*SyncResult `json:"results"`      // Each result of a sync task
}

SyncResults is the results from all sync attempts (broadcast or sync)

func (*SyncResults) Scan

func (t *SyncResults) Scan(value interface{}) error

Scan will scan the value into Struct, implements sql.Scanner interface

func (SyncResults) Value

func (t SyncResults) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type SyncStatus

type SyncStatus string

SyncStatus sync status

const (
	// SyncStatusPending is when the sync is pending (blocked by other constraints)
	SyncStatusPending SyncStatus = statusPending

	// SyncStatusReady is when the sync is ready (waiting for workers)
	SyncStatusReady SyncStatus = statusReady

	// SyncStatusProcessing is when the sync is processing (worker is running task)
	SyncStatusProcessing SyncStatus = statusProcessing

	// SyncStatusCanceled is when the sync is canceled
	SyncStatusCanceled SyncStatus = statusCanceled

	// SyncStatusSkipped is when the sync is skipped
	SyncStatusSkipped SyncStatus = statusSkipped

	// SyncStatusError is when the sync has an error
	SyncStatusError SyncStatus = statusError

	// SyncStatusComplete is when the sync is complete
	SyncStatusComplete SyncStatus = statusComplete
)

func (*SyncStatus) Scan

func (t *SyncStatus) Scan(value interface{}) error

Scan will scan the value into Struct, implements sql.Scanner interface

func (SyncStatus) String

func (t SyncStatus) String() string

String is the string version of the status

func (SyncStatus) Value

func (t SyncStatus) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type SyncTransaction

type SyncTransaction struct {
	// Base model
	Model `bson:",inline"`

	// Model specific fields
	ID              string               `json:"id" toml:"id" yaml:"id" gorm:"<-:create;type:char(64);primaryKey;comment:This is the unique transaction id" bson:"_id"`
	Configuration   SyncConfig           `` /* 152-byte string literal not displayed */
	LastAttempt     customTypes.NullTime `` /* 140-byte string literal not displayed */
	Results         SyncResults          `json:"results" toml:"results" yaml:"results" gorm:"<-;type:text;comment:This is the results struct in JSON" bson:"results"`
	BroadcastStatus SyncStatus           `` /* 172-byte string literal not displayed */
	P2PStatus       SyncStatus           `` /* 177-byte string literal not displayed */
	SyncStatus      SyncStatus           `` /* 156-byte string literal not displayed */
	// contains filtered or unexported fields
}

SyncTransaction is an object representing the chain-state sync configuration and results for a given transaction

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func GetSyncTransactionByID added in v0.4.4

func GetSyncTransactionByID(ctx context.Context, id string, opts ...ModelOps) (*SyncTransaction, error)

GetSyncTransactionByID will get a sync transaction

func (*SyncTransaction) AfterCreated added in v0.2.23

func (m *SyncTransaction) AfterCreated(_ context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*SyncTransaction) BeforeCreating

func (m *SyncTransaction) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*SyncTransaction) BeforeUpdating added in v0.6.0

func (m *SyncTransaction) BeforeUpdating(_ context.Context) error

BeforeUpdating will fire before the model is being updated

func (*SyncTransaction) GetID

func (m *SyncTransaction) GetID() string

GetID will get the ID

func (*SyncTransaction) GetModelName

func (m *SyncTransaction) GetModelName() string

GetModelName will get the name of the current model

func (*SyncTransaction) GetModelTableName

func (m *SyncTransaction) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*SyncTransaction) Migrate

func (m *SyncTransaction) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*SyncTransaction) Save

func (m *SyncTransaction) Save(ctx context.Context) error

Save will save the model into the Datastore

type Transaction

type Transaction struct {
	// Base model
	Model `bson:",inline"`

	// Standard transaction model base fields
	TransactionBase `bson:",inline"`

	// Model specific fields
	XpubInIDs       IDs             `json:"xpub_in_ids,omitempty" toml:"xpub_in_ids" yaml:"xpub_in_ids" gorm:"<-;type:json" bson:"xpub_in_ids,omitempty"`
	XpubOutIDs      IDs             `json:"xpub_out_ids,omitempty" toml:"xpub_out_ids" yaml:"xpub_out_ids" gorm:"<-;type:json" bson:"xpub_out_ids,omitempty"`
	BlockHash       string          `` /* 170-byte string literal not displayed */
	BlockHeight     uint64          `` /* 176-byte string literal not displayed */
	Fee             uint64          `json:"fee" toml:"fee" yaml:"fee" gorm:"<-create;type:bigint" bson:"fee,omitempty"`
	NumberOfInputs  uint32          `json:"number_of_inputs" toml:"number_of_inputs" yaml:"number_of_inputs" gorm:"<-;type:int" bson:"number_of_inputs,omitempty"`
	NumberOfOutputs uint32          `` /* 128-byte string literal not displayed */
	DraftID         string          `` /* 149-byte string literal not displayed */
	TotalValue      uint64          `json:"total_value" toml:"total_value" yaml:"total_value" gorm:"<-create;type:bigint" bson:"total_value,omitempty"`
	XpubMetadata    XpubMetadata    `json:"-" toml:"xpub_metadata" gorm:"<-;type:json;xpub_id specific metadata" bson:"xpub_metadata,omitempty"`
	XpubOutputValue XpubOutputValue `json:"-" toml:"xpub_output_value" gorm:"<-;type:json;xpub_id specific value" bson:"xpub_output_value,omitempty"`
	BUMP            BUMP            `json:"bump" toml:"bump" yaml:"bump" gorm:"<-;type:text;comment:BSV Unified Merkle Path (BUMP) Format" bson:"bump,omitempty"`

	// Virtual Fields
	OutputValue int64                `json:"output_value" toml:"-" yaml:"-" gorm:"-" bson:"-,omitempty"`
	Status      SyncStatus           `json:"status" toml:"-" yaml:"-" gorm:"-" bson:"-"`
	Direction   TransactionDirection `json:"direction" toml:"-" yaml:"-" gorm:"-" bson:"-"`

	XPubID string `gorm:"-" bson:"-"` // XPub of the user registering this transaction
	// contains filtered or unexported fields
}

Transaction is an object representing the BitCoin transaction

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*Transaction) AfterCreated

func (m *Transaction) AfterCreated(ctx context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*Transaction) AfterDeleted added in v0.2.14

func (m *Transaction) AfterDeleted(_ context.Context) error

AfterDeleted will fire after the model is deleted in the Datastore

func (*Transaction) AfterUpdated added in v0.2.14

func (m *Transaction) AfterUpdated(_ context.Context) error

AfterUpdated will fire after the model is updated in the Datastore

func (*Transaction) BeforeCreating

func (m *Transaction) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*Transaction) ChildModels

func (m *Transaction) ChildModels() (childModels []ModelInterface)

ChildModels will get any related sub models

func (*Transaction) Display

func (m *Transaction) Display() interface{}

Display filter the model for display

func (*Transaction) GetID

func (m *Transaction) GetID() string

GetID will get the ID

func (*Transaction) GetModelName

func (m *Transaction) GetModelName() string

GetModelName will get the name of the current model

func (*Transaction) GetModelTableName

func (m *Transaction) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*Transaction) IsXpubAssociated

func (m *Transaction) IsXpubAssociated(rawXpubKey string) bool

IsXpubAssociated will check if this key is associated to this transaction

func (*Transaction) IsXpubIDAssociated added in v0.2.14

func (m *Transaction) IsXpubIDAssociated(xPubID string) bool

IsXpubIDAssociated will check if an xPub ID is associated

func (*Transaction) Migrate

func (m *Transaction) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*Transaction) Save

func (m *Transaction) Save(ctx context.Context) (err error)

Save will save the model into the Datastore

func (*Transaction) UpdateTransactionMetadata added in v0.2.14

func (m *Transaction) UpdateTransactionMetadata(xPubID string, metadata Metadata) error

UpdateTransactionMetadata will update the transaction metadata by xPubID

type TransactionBase

type TransactionBase struct {
	ID  string `` /* 142-byte string literal not displayed */
	Hex string `json:"hex" toml:"hex" yaml:"hex" gorm:"<-:create;type:text;comment:This is the raw transaction hex" bson:"hex"`
	// contains filtered or unexported fields
}

TransactionBase is the same fields share between multiple transaction models

type TransactionConfig

type TransactionConfig struct {
	ChangeDestinations         []*Destination       `json:"change_destinations" toml:"change_destinations" yaml:"change_destinations" bson:"change_destinations"`
	ChangeDestinationsStrategy ChangeStrategy       `` /* 143-byte string literal not displayed */
	ChangeMinimumSatoshis      uint64               `json:"change_minimum_satoshis" toml:"change_minimum_satoshis" yaml:"change_minimum_satoshis" bson:"change_minimum_satoshis"`
	ChangeNumberOfDestinations int                  ``                                                                                            /* 147-byte string literal not displayed */
	ChangeSatoshis             uint64               `json:"change_satoshis" toml:"change_satoshis" yaml:"change_satoshis" bson:"change_satoshis"` // The satoshis used for change
	ExpiresIn                  time.Duration        `json:"expires_in" toml:"expires_in" yaml:"expires_in" bson:"expires_in"`                     // The expiration time for the draft and utxos
	Fee                        uint64               `json:"fee" toml:"fee" yaml:"fee" bson:"fee"`                                                 // The fee used for the transaction (auto generated)
	FeeUnit                    *utils.FeeUnit       `json:"fee_unit" toml:"fee_unit" yaml:"fee_unit" bson:"fee_unit"`                             // Fee unit to use (overrides chainstate if set)
	FromUtxos                  []*UtxoPointer       `json:"from_utxos" toml:"from_utxos" yaml:"from_utxos" bson:"from_utxos"`                     // Use these specific utxos for the transaction
	IncludeUtxos               []*UtxoPointer       `json:"include_utxos" toml:"include_utxos" yaml:"include_utxos" bson:"include_utxos"`         // Include these utxos for the transaction, among others necessary if more is needed for fees
	Inputs                     []*TransactionInput  `json:"inputs" toml:"inputs" yaml:"inputs" bson:"inputs"`                                     // All transaction inputs
	Outputs                    []*TransactionOutput `json:"outputs" toml:"outputs" yaml:"outputs" bson:"outputs"`                                 // All transaction outputs
	SendAllTo                  *TransactionOutput   `json:"send_all_to,omitempty" toml:"send_all_to" yaml:"send_all_to" bson:"send_all_to"`       // Send ALL utxos to the output
	Sync                       *SyncConfig          `json:"sync" toml:"sync" yaml:"sync" bson:"sync"`                                             // Sync config for broadcasting and on-chain sync

}

TransactionConfig is the configuration used to start a transaction

func (*TransactionConfig) Scan

func (t *TransactionConfig) Scan(value interface{}) error

Scan will scan the value into Struct, implements sql.Scanner interface

func (TransactionConfig) Value

func (t TransactionConfig) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type TransactionDirection

type TransactionDirection string

TransactionDirection String describing the direction of the transaction (in / out)

const (
	// TransactionDirectionIn The transaction is coming in to the wallet of the xpub
	TransactionDirectionIn TransactionDirection = "incoming"

	// TransactionDirectionOut The transaction is going out of to the wallet of the xpub
	TransactionDirectionOut TransactionDirection = "outgoing"

	// TransactionDirectionReconcile The transaction is an internal reconciliation transaction
	TransactionDirectionReconcile TransactionDirection = "reconcile"
)

type TransactionGetter added in v0.7.0

type TransactionGetter interface {
	GetTransactionsByIDs(ctx context.Context, txIDs []string) ([]*Transaction, error)
}

type TransactionInput

type TransactionInput struct {
	Utxo
	Destination Destination `json:"destination" toml:"destination" yaml:"destination" bson:"destination"`
}

TransactionInput is an input on the transaction config

type TransactionOutput

type TransactionOutput struct {
	OpReturn     *OpReturn       `json:"op_return,omitempty" toml:"op_return" yaml:"op_return" bson:"op_return,omitempty"`                     // Add op_return data as an output
	PaymailP4    *PaymailP4      `json:"paymail_p4,omitempty" toml:"paymail_p4" yaml:"paymail_p4" bson:"paymail_p4,omitempty"`                 // Additional information for P4 or Paymail
	Satoshis     uint64          `json:"satoshis" toml:"satoshis" yaml:"satoshis" bson:"satoshis"`                                             // Set the specific satoshis to send (when applicable)
	Script       string          `json:"script,omitempty" toml:"script" yaml:"script" bson:"script,omitempty"`                                 // custom (non-standard) script output
	Scripts      []*ScriptOutput `json:"scripts" toml:"scripts" yaml:"scripts" bson:"scripts"`                                                 // Add script outputs
	To           string          `json:"to,omitempty" toml:"to" yaml:"to" bson:"to,omitempty"`                                                 // To address, paymail, handle
	UseForChange bool            `json:"use_for_change,omitempty" toml:"use_for_change" yaml:"use_for_change" bson:"use_for_change,omitempty"` // if set, no change destinations will be created, but all outputs flagged will get the change
}

TransactionOutput is an output on the transaction config

type TransactionService

type TransactionService interface {
	GetTransaction(ctx context.Context, xPubID, txID string) (*Transaction, error)
	GetTransactionByID(ctx context.Context, txID string) (*Transaction, error)
	GetTransactionsByIDs(ctx context.Context, txIDs []string) ([]*Transaction, error)
	GetTransactionByHex(ctx context.Context, hex string) (*Transaction, error)
	GetTransactions(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*Transaction, error)
	GetTransactionsCount(ctx context.Context, metadata *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
	GetTransactionsByXpubID(ctx context.Context, xPubID string, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams) ([]*Transaction, error)
	GetTransactionsByXpubIDCount(ctx context.Context, xPubID string, metadata *Metadata,
		conditions *map[string]interface{}) (int64, error)
	NewTransaction(ctx context.Context, rawXpubKey string, config *TransactionConfig,
		opts ...ModelOps) (*DraftTransaction, error)
	RecordTransaction(ctx context.Context, xPubKey, txHex, draftID string,
		opts ...ModelOps) (*Transaction, error)
	RecordRawTransaction(ctx context.Context, txHex string, opts ...ModelOps) (*Transaction, error)
	UpdateTransactionMetadata(ctx context.Context, xPubID, id string, metadata Metadata) (*Transaction, error)
	RevertTransaction(ctx context.Context, id string) error
}

TransactionService is the transaction actions

type UTXOService

type UTXOService interface {
	GetUtxo(ctx context.Context, xPubKey, txID string, outputIndex uint32) (*Utxo, error)
	GetUtxoByTransactionID(ctx context.Context, txID string, outputIndex uint32) (*Utxo, error)
	GetUtxos(ctx context.Context, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams, opts ...ModelOps) ([]*Utxo, error)
	GetUtxosCount(ctx context.Context, metadata *Metadata,
		conditions *map[string]interface{}, opts ...ModelOps) (int64, error)
	GetUtxosByXpubID(ctx context.Context, xPubID string, metadata *Metadata, conditions *map[string]interface{},
		queryParams *datastore.QueryParams) ([]*Utxo, error)
	UnReserveUtxos(ctx context.Context, xPubID, draftID string) error
}

UTXOService is the utxo actions

type Utxo

type Utxo struct {
	// Base model
	Model `bson:",inline"`

	// Standard utxo model base fields
	UtxoPointer `bson:",inline"`

	// Model specific fields
	ID           string                 `` /* 135-byte string literal not displayed */
	XpubID       string                 `` /* 129-byte string literal not displayed */
	Satoshis     uint64                 `` /* 143-byte string literal not displayed */
	ScriptPubKey string                 `` /* 149-byte string literal not displayed */
	Type         string                 `json:"type" toml:"type" yaml:"type" gorm:"<-:create;type:varchar(32);comment:Type of output" bson:"type"`
	DraftID      customTypes.NullString `` /* 148-byte string literal not displayed */
	ReservedAt   customTypes.NullTime   `json:"reserved_at" toml:"reserved_at" yaml:"reserved_at" gorm:"<-;comment:When it was reserved" bson:"reserved_at,omitempty"`
	SpendingTxID customTypes.NullString `` /* 172-byte string literal not displayed */

	// Virtual field holding the original transaction the utxo originated from
	// This is needed when signing a new transaction that spends the utxo
	Transaction *Transaction `json:"transaction,omitempty" toml:"-" yaml:"-" gorm:"-" bson:"-"`
}

Utxo is an object representing a BitCoin unspent transaction

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*Utxo) BeforeCreating

func (m *Utxo) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*Utxo) GenerateID

func (m *Utxo) GenerateID() string

GenerateID will generate the id of the UTXO record based on the format: <txid>|<output_index>

func (*Utxo) GetID

func (m *Utxo) GetID() string

GetID will get the ID

func (*Utxo) GetModelName

func (m *Utxo) GetModelName() string

GetModelName will get the name of the current model

func (*Utxo) GetModelTableName

func (m *Utxo) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*Utxo) Migrate

func (m *Utxo) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*Utxo) Save

func (m *Utxo) Save(ctx context.Context) (err error)

Save will save the model into the Datastore

type UtxoPointer

type UtxoPointer struct {
	TransactionID string `` /* 174-byte string literal not displayed */
	OutputIndex   uint32 `` /* 165-byte string literal not displayed */
}

UtxoPointer is the actual pointer (index) for the UTXO

type XPubService

type XPubService interface {
	GetXpub(ctx context.Context, xPubKey string) (*Xpub, error)
	GetXpubByID(ctx context.Context, xPubID string) (*Xpub, error)
	NewXpub(ctx context.Context, xPubKey string, opts ...ModelOps) (*Xpub, error)
	UpdateXpubMetadata(ctx context.Context, xPubID string, metadata Metadata) (*Xpub, error)
}

XPubService is the xPub actions

type Xpub

type Xpub struct {
	// Base model
	Model `bson:",inline"`

	// Model specific fields
	ID              string `json:"id" toml:"id" yaml:"id" gorm:"<-:create;type:char(64);primaryKey;comment:This is the sha256(xpub) hash" bson:"_id"`
	CurrentBalance  uint64 `` /* 149-byte string literal not displayed */
	NextInternalNum uint32 `` /* 181-byte string literal not displayed */
	NextExternalNum uint32 `` /* 181-byte string literal not displayed */
	// contains filtered or unexported fields
}

Xpub is an object representing an HD-Key or extended public key (xPub for short)

Gorm related models & indexes: https://gorm.io/docs/models.html - https://gorm.io/docs/indexes.html

func (*Xpub) AfterCreated

func (m *Xpub) AfterCreated(ctx context.Context) error

AfterCreated will fire after the model is created in the Datastore

func (*Xpub) AfterUpdated

func (m *Xpub) AfterUpdated(ctx context.Context) error

AfterUpdated will fire after a successful update into the Datastore

func (*Xpub) BeforeCreating

func (m *Xpub) BeforeCreating(_ context.Context) error

BeforeCreating will fire before the model is being inserted into the Datastore

func (*Xpub) ChildModels

func (m *Xpub) ChildModels() (childModels []ModelInterface)

ChildModels will get any related sub models

func (*Xpub) GetID

func (m *Xpub) GetID() string

GetID will get the ID

func (*Xpub) GetModelName

func (m *Xpub) GetModelName() string

GetModelName will get the name of the current model

func (*Xpub) GetModelTableName

func (m *Xpub) GetModelTableName() string

GetModelTableName will get the db table name of the current model

func (*Xpub) Migrate

func (m *Xpub) Migrate(client datastore.ClientInterface) error

Migrate model specific migration on startup

func (*Xpub) RemovePrivateData added in v0.2.14

func (m *Xpub) RemovePrivateData()

RemovePrivateData unset all fields that are sensitive

func (*Xpub) Save

func (m *Xpub) Save(ctx context.Context) error

Save will save the model into the Datastore

type XpubMetadata

type XpubMetadata map[string]Metadata

XpubMetadata XpubId specific metadata

func (XpubMetadata) GormDBDataType

func (XpubMetadata) GormDBDataType(db *gorm.DB, _ *schema.Field) string

GormDBDataType the gorm data type for metadata

func (*XpubMetadata) MarshalBSONValue

func (x *XpubMetadata) MarshalBSONValue() (bsontype.Type, []byte, error)

MarshalBSONValue method is called by bson.Marshal in Mongo for type = XpubMetadata

func (*XpubMetadata) Scan

func (x *XpubMetadata) Scan(value interface{}) error

Scan scan value into Json, implements sql.Scanner interface

func (*XpubMetadata) UnmarshalBSONValue

func (x *XpubMetadata) UnmarshalBSONValue(t bsontype.Type, data []byte) error

UnmarshalBSONValue method is called by bson.Unmarshal in Mongo for type = XpubMetadata

func (XpubMetadata) Value

func (x XpubMetadata) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

type XpubOutputValue

type XpubOutputValue map[string]int64

XpubOutputValue Xpub specific output value of the transaction

func (XpubOutputValue) GormDBDataType

func (XpubOutputValue) GormDBDataType(db *gorm.DB, _ *schema.Field) string

GormDBDataType the gorm data type for metadata

func (*XpubOutputValue) Scan

func (x *XpubOutputValue) Scan(value interface{}) error

Scan scan value into Json, implements sql.Scanner interface

func (XpubOutputValue) Value

func (x XpubOutputValue) Value() (driver.Value, error)

Value return json value, implement driver.Valuer interface

Directories

Path Synopsis
Package chainstate is the on-chain data service abstraction layer
Package chainstate is the on-chain data service abstraction layer
filters
Package filters is used for various known TX filters and format detection
Package filters is used for various known TX filters and format detection
Package cluster is for clustering bux engine(s) or servers to work together for chainstate monitoring and other tasks
Package cluster is for clustering bux engine(s) or servers to work together for chainstate monitoring and other tasks
examples
Package notifications is a basic internal notifications module
Package notifications is a basic internal notifications module
Package taskmanager is the task/job management service layer for concurrent and asynchronous tasks
Package taskmanager is the task/job management service layer for concurrent and asynchronous tasks
Package tester is a generic testing package with helpful methods for all packages
Package tester is a generic testing package with helpful methods for all packages
Package utils is used for generic methods and values that are used across all packages
Package utils is used for generic methods and values that are used across all packages

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL