mtg

package
v0.0.6 Latest Latest
Warning

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

Go to latest
Published: Nov 30, 2021 License: Apache-2.0 Imports: 17 Imported by: 0

README

MTG

This module can bootstrap a MTG application very effortlessly, it's as simple as a few lines of code.

func (rw *RefundWorker) ProcessOutput(ctx context.Context, out *mtg.Output) {
	receivers := []string{out.Sender}
	traceId := mixin.UniqueConversationID(out.UTXOID, "refund")
	err := rw.grp.BuildTransaction(ctx, out.AssetID, receivers, 1, out.Amount.String(), "refund", traceId)
	if err != nil {
		panic(err)
	}
}

group, _ := mtg.BuildGroup(ctx, db, conf)
rw := NewRefundrWorker(ctx, group, conf)
group.AddWorker(rw)
group.Run(ctx)

The group will call every workers added, and the worker just needs to implement the ProcessOutput interface. The code above is a very simple worker that refunds all the payments received.

Documentation

Index

Constants

View Source
const (
	ActionStateInitial = 10
	ActionStateDone    = 11
)
View Source
const (
	CollectibleMetaTokenId  = "2f8aa18a-3cb8-31d5-95bc-5a4f2e25dc2f"
	CollectibleMixinAssetId = "1700941284a95f31b25ec8c546008f208f88eee4419ccdcdbe6e3195e60128ca"
)
View Source
const (
	IterationActionAdd    = 11
	IterationActionRemove = 12
)
View Source
const (
	OutputStateUnspent = 10
	OutputStateSigned  = 11
	OutputStateSpent   = 12
)
View Source
const (
	TransactionStateInitial  = 10
	TransactionStateSigning  = 11
	TransactionStateSigned   = 12
	TransactionStateSnapshot = 13
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Action

type Action struct {
	UTXOID    string
	CreatedAt time.Time
	State     int
}

type CollectibleOutput

type CollectibleOutput struct {
	Type               string      `json:"type"`
	UserId             string      `json:"user_id"`
	OutputId           string      `json:"output_id"`
	TokenId            string      `json:"token_id"`
	TransactionHash    crypto.Hash `json:"transaction_hash"`
	OutputIndex        int         `json:"output_index"`
	Amount             string      `json:"amount"`
	SendersThreshold   int64       `json:"senders_threshold"`
	Senders            []string    `json:"senders"`
	ReceiversThreshold int64       `json:"receivers_threshold"`
	Receivers          []string    `json:"receivers"`
	Memo               string      `json:"memo"`
	CreatedAt          time.Time   `json:"created_at"`
	UpdatedAt          time.Time   `json:"updated_at"`
	SignedBy           string      `json:"signed_by"`
	SignedTx           string      `json:"signed_tx"`

	JsonState string `json:"state" msgpack:"-"`
	State     int    `json:"-"`
}

func (*CollectibleOutput) StateName

func (out *CollectibleOutput) StateName() string

type CollectibleTransaction

type CollectibleTransaction struct {
	TraceId   string
	State     int
	Receivers []string
	Threshold int
	Amount    string
	NFO       []byte
	Raw       []byte
	Hash      crypto.Hash
	UpdatedAt time.Time
}

type Configuration

type Configuration struct {
	App struct {
		ClientId   string `toml:"client-id"`
		SessionId  string `toml:"session-id"`
		PrivateKey string `toml:"private-key"`
		PinToken   string `toml:"pin-token"`
		PIN        string `toml:"pin"`
	} `toml:"app"`
	Genesis struct {
		Members   []string `toml:"members"`
		Threshold int      `toml:"threshold"`
		Timestamp int64    `toml:"timestamp"`
	} `toml:"genesis"`
}

func Setup

func Setup(path string) (*Configuration, error)

type Group

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

func BuildGroup

func BuildGroup(ctx context.Context, store Store, conf *Configuration) (*Group, error)

func (*Group) AddNode

func (grp *Group) AddNode(id string, threshold int, timestamp time.Time) error

func (*Group) AddWorker

func (grp *Group) AddWorker(wkr Worker)

func (*Group) BuildCollectibleMintTransaction

func (grp *Group) BuildCollectibleMintTransaction(ctx context.Context, receiver string, nfo []byte) error

func (*Group) BuildTransaction

func (grp *Group) BuildTransaction(ctx context.Context, assetId string, receivers []string, threshold int, amount, memo string, traceId, groupId string) error

the app should decide a unique trace id so that the MTG will not double spend

func (*Group) CreateCollectibleRequest

func (grp *Group) CreateCollectibleRequest(ctx context.Context, action, raw string) (*cr, error)

func (*Group) GenesisId added in v0.0.5

func (grp *Group) GenesisId() string

func (*Group) GetMembers

func (grp *Group) GetMembers() []string

func (*Group) GetThreshold

func (grp *Group) GetThreshold() int

func (*Group) ListActiveNodes

func (grp *Group) ListActiveNodes() ([]string, int, time.Time, error)

func (*Group) ReadCollectibleOutputs

func (grp *Group) ReadCollectibleOutputs(ctx context.Context, members []string, threshold uint8, offset time.Time, limit int) ([]*CollectibleOutput, error)

func (*Group) RemoveNode

func (grp *Group) RemoveNode(id string, threshold int, timestamp time.Time) error

func (*Group) Run

func (grp *Group) Run(ctx context.Context)

func (*Group) SetOutputGrouper added in v0.0.6

func (grp *Group) SetOutputGrouper(per func(out *Output) string)

func (*Group) SignCollectible

func (grp *Group) SignCollectible(ctx context.Context, reqID, pin string) (*cr, error)

type Iteration

type Iteration struct {
	Action    int
	NodeId    string
	Threshold int
	CreatedAt time.Time
}

a node joins or leaves the group with an iteration this is for the evolution mechanism of MTG TODO not implemented yet

type Output

type Output struct {
	GroupId         string
	UserID          string
	UTXOID          string
	AssetID         string
	TransactionHash crypto.Hash
	OutputIndex     int
	Sender          string
	Amount          decimal.Decimal
	Threshold       uint8
	Members         []string
	Memo            string
	State           int
	CreatedAt       time.Time
	UpdatedAt       time.Time
	SignedBy        string
	SignedTx        string
}

func NewOutputFromMultisig

func NewOutputFromMultisig(utxo *mixin.MultisigUTXO) *Output

func (*Output) StateName

func (out *Output) StateName() string

type Store

type Store interface {
	WriteProperty(key, val []byte) error
	ReadProperty(key []byte) ([]byte, error)

	WriteIteration(ir *Iteration) error
	ListIterations() ([]*Iteration, error)

	WriteOutput(utxo *Output, traceId string) error
	WriteOutputs(utxos []*Output, traceId string) error

	ListOutputsForTransaction(traceId string) ([]*Output, error)
	ListOutputsForAsset(groupId string, state, assetId string, limit int) ([]*Output, error)

	WriteAction(act *Action) error
	ListActions(limit int) ([]*Output, error)

	WriteTransaction(tx *Transaction) error
	ReadTransactionByTraceId(traceId string) (*Transaction, error)
	ReadTransactionByHash(hash crypto.Hash) (*Transaction, error)
	ListTransactions(state int, limit int) ([]*Transaction, error)

	WriteCollectibleOutput(utxo *CollectibleOutput, traceId string) error
	WriteCollectibleOutputs(utxos []*CollectibleOutput, traceId string) error
	ListCollectibleOutputsForTransaction(traceId string) ([]*CollectibleOutput, error)
	ListCollectibleOutputsForToken(state, tokenId string, limit int) ([]*CollectibleOutput, error)

	WriteCollectibleAction(act *Action) error
	ListCollectibleActions(limit int) ([]*CollectibleOutput, error)

	WriteCollectibleTransaction(traceId string, tx *CollectibleTransaction) error
	ReadCollectibleTransaction(traceId string) (*CollectibleTransaction, error)
	ReadCollectibleTransactionByHash(hash crypto.Hash) (*CollectibleTransaction, error)
	ListCollectibleTransactions(state int, limit int) ([]*CollectibleTransaction, error)
}

type Transaction

type Transaction struct {
	GroupId   string
	TraceId   string
	State     int
	AssetId   string
	Receivers []string
	Threshold int
	Amount    string
	Memo      string
	Raw       []byte
	Hash      crypto.Hash
	UpdatedAt time.Time
}

type Worker

type Worker interface {
	ProcessOutput(context.Context, *Output)
	ProcessCollectibleOutput(context.Context, *CollectibleOutput)
}

Jump to

Keyboard shortcuts

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