engine

package module
v0.32.0 Latest Latest
Warning

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

Go to latest
Published: Mar 4, 2024 License: MIT Imports: 57 Imported by: 0

README

SPV Wallet Engine

Release Build Status Report codecov Mergify Status

Go Gitpod Ready-to-Code standard-readme compliant Makefile Included

Bitcoin UTXO & xPub Management Engine

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

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



SPV Wallet Engine: Out-of-the-box Features:
Project Assumptions: MVP
  • No private keys are used, only the xPub (or access key) is given to SPV Wallet Engine
  • (BYOX) Bring your own xPub
  • Signing a transaction is outside this application (IE: spv-wallet or spv-wallet-client)
  • All transactions need to be submitted to the SPV Wallet 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

spv-wallet/engine requires a supported release of Go.

go get -u github.com/bitcoin-sv/spv-wallet/engine

Documentation

View the generated documentation

GoDoc


Repository Features

This repository was created using MrZ's go-template

Built-in Features
Package Dependencies

Usage

Examples & Tests

Checkout all the examples!

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

func main() {
	client, err := engine.NewClient(
		context.Background(), // Set context
	)
	if err != nil {
		log.Fatalln("error: " + err.Error())
	}

	defer func() {
		_ = client.Close(context.Background())
	}()

	log.Println("client loaded!", client.UserAgent())
}

Checkout all the examples!


Contributing

All kinds of contributions are welcome!
To get started, take a look at code standards.
View the contributing guidelines and follow the code of conduct.


License

License

Documentation

Overview

Package engine 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 bitcoin-sv (https://github.com/bitcoin-sv)

Index

Constants

View Source
const (
	CronJobNameDraftTransactionCleanUp  = "draft_transaction_clean_up"
	CronJobNameSyncTransactionBroadcast = "sync_transaction_broadcast"
	CronJobNameSyncTransactionSync      = "sync_transaction_sync"
	CronJobNameCalculateMetrics         = "calculate_metrics"
)

Cron job names to be used in WithCronCustomPeriod

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"
)

Variables

AllModelNames is a list of all models

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

View Source
var ErrAccessKeyNotFound = errors.New("access key not found")

ErrAccessKeyNotFound is when the access key not found

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 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 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 ErrPaymailNotFound = errors.New("paymail could not be found")

ErrPaymailNotFound is when paymaail could not be found

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 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 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 Save

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

Save will save the model(s) into the Datastore

func ToBeef

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

ToBeef generates BEEF Hex for transaction

func ToEfHex

func ToEfHex(ctx context.Context, tx *Transaction, store TransactionGetter) (efHex string, ok bool)

ToEfHex generates Extended Format hex of 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

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

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 SPV Wallet Engine admin service interface comprised of all services available for admins

type AdminStats

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 SPV Wallet server

type BUMP

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

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

CalculateMergedBUMP calculates Merged BUMP from a slice of BUMPs

func (*BUMP) Hex

func (bump *BUMP) Hex() string

Hex returns BUMP in hex format

func (*BUMP) Scan

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

Scan scan value into Json, implements sql.Scanner interface

func (BUMP) Value

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

Value return json value, implement driver.Valuer interface

type BUMPLeaf

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

type BUMPs []*BUMP

BUMPs represents a slice of BUMPs - BSV Unified Merkle Paths

func (*BUMPs) Bytes

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

Bytes returns BUMPs bytes

func (*BUMPs) Scan

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

Scan scan value into Json, implements sql.Scanner interface

func (BUMPs) Value

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

Value return json value, implement driver.Valuer interface

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 SPV Wallet Engine 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) AuthenticateAccessKey

func (c *Client) AuthenticateAccessKey(ctx context.Context, pubAccessKey string) (*AccessKey, error)

AuthenticateAccessKey check if access key exists

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

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

func (c *Client) DefaultSyncConfig() *SyncConfig

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

func (*Client) DeletePaymailAddress

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

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

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

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

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

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) GetDestinationByAddress

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

GetDestinationByAddress will get a destination for an address

func (*Client) GetDestinationByID

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

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

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

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

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

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

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) GetModelNames

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

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

GetPaymailAddress will get a paymail address model

func (*Client) GetPaymailAddresses

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

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

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

func (c *Client) GetPaymailConfig() *PaymailServerOptions

GetPaymailConfig will return the Paymail server config if it exists

func (*Client) GetStats

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

GetStats will get stats for the SPV Wallet Console (admin)

func (*Client) GetTransaction

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

GetTransaction will get a transaction by its ID from the Datastore

func (*Client) GetTransactionByHex

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) 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) GetTransactionsByIDs

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

GetTransactionsByIDs returns array of transactions by their IDs from the Datastore

func (*Client) GetTransactionsByXpubID

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

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

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) 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

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

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

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

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

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

func (c *Client) HTTPClient() HTTPInterface

HTTPClient will return the http interface to use in the client

func (*Client) IsDebug

func (c *Client) IsDebug() bool

IsDebug will return the debug flag (bool)

func (*Client) IsEncryptionKeySet

func (c *Client) IsEncryptionKeySet() bool

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

func (*Client) IsIUCEnabled

func (c *Client) IsIUCEnabled() bool

IsIUCEnabled will return the flag (bool)

func (*Client) IsMigrationEnabled

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) Metrics

func (c *Client) Metrics() (metrics *metrics.Metrics, enabled bool)

Metrics will return the metrics client (if it's enabled)

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, 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,
	opts ...ModelOps,
) (*Destination, error)

NewDestinationForLockingScript will create a new destination based on a locking script

func (*Client) NewPaymailAddress

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

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) RecordRawTransaction

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 SPV Wallet Engine 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 outgoing transaction and save it into the Datastore 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

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

RevertTransaction will revert a transaction created in the SPV Wallet Engine 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

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.TaskEngine

Taskmanager will return the Taskmanager if it exists

func (*Client) UnReserveUtxos

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

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

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

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

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

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) UpdateTransaction

func (c *Client) UpdateTransaction(ctx context.Context, callbackResp *broadcast.SubmittedTx) error

UpdateTransaction will update the broadcast callback transaction info, like: block height, block hash, status, bump.

func (*Client) UpdateTransactionMetadata

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

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
	ClientService
	DestinationService
	DraftTransactionService
	ModelService
	PaymailService
	TransactionService
	UTXOService
	XPubService
	AuthenticateAccessKey(ctx context.Context, pubAccessKey string) (*AccessKey, error)
	Close(ctx context.Context) error
	Debug(on bool)
	DefaultSyncConfig() *SyncConfig
	EnableNewRelic()
	GetOrStartTxn(ctx context.Context, name string) context.Context
	IsDebug() bool
	IsEncryptionKeySet() bool
	IsIUCEnabled() bool
	IsMigrationEnabled() bool
	IsNewRelicEnabled() bool
	SetNotificationsClient(notifications.ClientInterface)
	UserAgent() string
	Version() string
	Metrics() (metrics *metrics.Metrics, enabled bool)
}

ClientInterface is the client (spv wallet 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 SPV Wallet Engine 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 WithAutoMigrate

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

WithAutoMigrate will enable auto migrate database mode (given models)

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

func WithBroadcastClient

func WithBroadcastClient(broadcastClient broadcast.Client) ClientOps

WithBroadcastClient will set broadcast client

func WithCallback

func WithCallback(callbackURL string, callbackToken string) ClientOps

WithCallback set callback settings

func WithChainstateOptions

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

WithChainstateOptions will set chainstate defaults

func WithClusterClient

func WithClusterClient(clusterClient cluster.ClientInterface) ClientOps

WithClusterClient will set the cluster options on the client

func WithClusterKeyPrefix

func WithClusterKeyPrefix(prefix string) ClientOps

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

func WithClusterRedis

func WithClusterRedis(redisOptions *redis.Options) ClientOps

WithClusterRedis will set the cluster coordinator to use redis

func WithCronCustomPeriod

func WithCronCustomPeriod(cronJobName string, period time.Duration) ClientOps

WithCronCustomPeriod will set the custom cron jobs period which will override the default

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 WithCustomDatastore

func WithCustomDatastore(dataStore datastore.ClientInterface) ClientOps

WithCustomDatastore will set the datastore

func WithCustomNotifications

func WithCustomNotifications(customNotifications notifications.ClientInterface) ClientOps

WithCustomNotifications will set a custom notifications interface

func WithDebugging

func WithDebugging() ClientOps

WithDebugging will set debugging in any applicable configuration

func WithEncryption

func WithEncryption(key string) ClientOps

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

func WithExcludedProviders

func WithExcludedProviders(providers []string) ClientOps

WithExcludedProviders will set a list of excluded providers

func WithFeeQuotes

func WithFeeQuotes(enabled bool) ClientOps

WithFeeQuotes will find the lowest fee instead of using the fee set by the WithFeeUnit function

func WithFeeUnit

func WithFeeUnit(feeUnit *utils.FeeUnit) ClientOps

WithFeeUnit will set the fee unit to use for broadcasting

func WithFreeCache

func WithFreeCache() ClientOps

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

func WithFreeCacheConnection

func WithFreeCacheConnection(client *freecache.Cache) ClientOps

WithFreeCacheConnection will set the cache client to an active FreeCache connection

func WithHTTPClient

func WithHTTPClient(httpClient HTTPInterface) ClientOps

WithHTTPClient will set the custom http interface

func WithIUCDisabled

func WithIUCDisabled() ClientOps

WithIUCDisabled will disable checking the input utxos

func WithLogger

func WithLogger(customLogger *zerolog.Logger) ClientOps

WithLogger will set the custom logger interface

func WithMAPI

func WithMAPI() ClientOps

WithMAPI will specify Arc as an API for minercraft client

func WithMetrics

func WithMetrics(collector metrics.Collector) ClientOps

WithMetrics will set the metrics with a collector interface

func WithMigrationDisabled

func WithMigrationDisabled() ClientOps

WithMigrationDisabled will disable all migrations from running in the Datastore

func WithMinercraft

func WithMinercraft(minercraft minercraft.ClientInterface) ClientOps

WithMinercraft will set custom minercraft client

func WithMinercraftAPIs

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

WithMinercraftAPIs set custom MinerAPIs for minercraft

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 WithNewRelic

func WithNewRelic(app *newrelic.Application) ClientOps

WithNewRelic will set the NewRelic application client

func WithNotifications

func WithNotifications(webhookEndpoint string) ClientOps

WithNotifications will set the notifications config

func WithPaymailBeefSupport

func WithPaymailBeefSupport(blockHeadersServiceURL, blockHeadersServiceAuthToken string) ClientOps

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

func WithPaymailClient

func WithPaymailClient(client paymail.ClientInterface) ClientOps

WithPaymailClient will set a custom paymail client

func WithPaymailServerConfig

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

WithPaymailServerConfig will set the custom server configuration for Paymail

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

func WithPaymailSupport

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

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

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

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 WithTaskqConfig

func WithTaskqConfig(config *taskq.QueueOptions) ClientOps

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

func WithUserAgent

func WithUserAgent(userAgent string) ClientOps

WithUserAgent will overwrite the default useragent

type ClientService

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.TaskEngine
}

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 */
}

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

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

AfterCreated will fire after the model is created in the Datastore

func (*Destination) AfterDeleted

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

AfterDeleted will fire after the model is deleted in the Datastore

func (*Destination) AfterUpdated

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,
		opts ...ModelOps) (*Destination, error)
	NewDestinationForLockingScript(ctx context.Context, xPubID, lockingScript string,
		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

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

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

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

type DraftTransactionService

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

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 (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 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 (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

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

func NewMockTransactionStore

func NewMockTransactionStore() *MockTransactionStore

func (*MockTransactionStore) AddToStore

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

func (*MockTransactionStore) GetTransactionsByIDs

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

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

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"
	ModelDestination      ModelName = "destination"
	ModelDraftTransaction ModelName = "draft_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

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

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

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

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 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 PaymailAddress

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

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

AfterCreated will fire after the model is created in the Datastore

func (*PaymailAddress) BeforeCreating

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

BeforeCreating is called before the model is saved to the DB

func (*PaymailAddress) GetExternalXpub

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

GetExternalXpub will get the external xPub

func (*PaymailAddress) GetID

func (m *PaymailAddress) GetID() string

GetID will get the ID

func (*PaymailAddress) GetIdentityXpub

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

GetIdentityXpub will get the identity related to the xPub

func (*PaymailAddress) GetModelName

func (m *PaymailAddress) GetModelName() string

GetModelName returns the model name

func (*PaymailAddress) GetModelTableName

func (m *PaymailAddress) GetModelTableName() string

GetModelTableName returns the model db table name

func (*PaymailAddress) Migrate

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

Migrate model specific migration on startup

func (*PaymailAddress) Save

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

Save the model

type PaymailDefaultServiceProvider

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

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

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

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

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

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

VerifyMerkleRoots will verify the merkle roots by checking them in external header service - Block Headers Service

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

type PaymailPayloadFormat uint32

PaymailPayloadFormat is the format of the paymail payload

const (
	BasicPaymailPayloadFormat PaymailPayloadFormat = iota
	BeefPaymailPayloadFormat
)

Types of Paymail payload formats

func (PaymailPayloadFormat) String

func (format PaymailPayloadFormat) String() string

type PaymailServerOptions

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

	DefaultFromPaymail string // IE: from@domain.com
	// contains filtered or unexported fields
}

PaymailServerOptions is the options for the Paymail server

type PaymailService

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

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

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

GetSyncTransactionByID will get a sync transaction

func GetSyncTransactionByTxID

func GetSyncTransactionByTxID(ctx context.Context, txID string, opts ...ModelOps) (*SyncTransaction, error)

GetSyncTransactionByTxID will get a sync transaction by it's transaction id.

func (*SyncTransaction) AfterCreated

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

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"`
	TxStatus        string          `` /* 141-byte string literal not displayed */

	// 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

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

AfterDeleted will fire after the model is deleted in the Datastore

func (*Transaction) AfterUpdated

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

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

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

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

TransactionGetter interface for getting transactions by their IDs

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)
	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)
	UpdateTransaction(ctx context.Context, txInfo *broadcast.SubmittedTx) 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

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 SPV Wallet Engine(s) or servers to work together for chainstate monitoring and other tasks
Package cluster is for clustering SPV Wallet Engine(s) or servers to work together for chainstate monitoring and other tasks
examples
Package metrics provides a way to track metrics in the application.
Package metrics provides a way to track metrics in the application.
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 with cron scheduling.
Package taskmanager is the task/job management service layer for concurrent and asynchronous tasks with cron scheduling.
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