Documentation ¶
Overview ¶
Package cash defines a simple implementation of sending coins between multi-signature wallets.
There is no logic in the coins (tokens), except that the balance of any coin may not go below zero. Thus, this implementation is referred to as cash. Simple and safe.
In the future, there should be more implementations that support sending and issuing tokens with much more logic inside.
Index ¶
- Constants
- Variables
- func Add(cng Coinage, c coin.Coin) error
- func AsCoins(obj orm.Object) coin.Coins
- func Concat(cng Coinage, coins coin.Coins) error
- func NewWallet(key weave.Address) orm.Object
- func RegisterQuery(qr weave.QueryRouter)
- func RegisterRoutes(r weave.Registry, auth x.Authenticator, control Controller)
- func Subtract(cng Coinage, c coin.Coin) error
- func ValidateWalletBucket(bucket WalletBucket)
- func WalletWith(key weave.Address, coins ...*coin.Coin) (orm.Object, error)
- func XCoins(c Coinage) coin.Coins
- type Balancer
- type BaseController
- func (c BaseController) Balance(store weave.KVStore, src weave.Address) (coin.Coins, error)
- func (c BaseController) CoinMint(store weave.KVStore, dest weave.Address, amount coin.Coin) error
- func (c BaseController) MoveCoins(store weave.KVStore, src weave.Address, dest weave.Address, amount coin.Coin) error
- type Bucket
- type CoinMinter
- type CoinMover
- type Coinage
- type Controller
- type DynamicFeeDecorator
- type FeeDecorator
- type FeeInfo
- func (f *FeeInfo) DefaultPayer(addr []byte) *FeeInfo
- func (*FeeInfo) Descriptor() ([]byte, []int)
- func (m *FeeInfo) GetFees() *coin.Coin
- func (m *FeeInfo) GetPayer() []byte
- func (m *FeeInfo) Marshal() (dAtA []byte, err error)
- func (m *FeeInfo) MarshalTo(dAtA []byte) (int, error)
- func (*FeeInfo) ProtoMessage()
- func (m *FeeInfo) Reset()
- func (m *FeeInfo) Size() (n int)
- func (m *FeeInfo) String() string
- func (m *FeeInfo) Unmarshal(dAtA []byte) error
- func (f *FeeInfo) Validate() error
- func (m *FeeInfo) XXX_DiscardUnknown()
- func (m *FeeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (m *FeeInfo) XXX_Merge(src proto.Message)
- func (m *FeeInfo) XXX_Size() int
- func (m *FeeInfo) XXX_Unmarshal(b []byte) error
- type FeeTx
- type GenesisAccount
- type Initializer
- type SendHandler
- type SendMsg
- func (s *SendMsg) DefaultSource(addr []byte) *SendMsg
- func (*SendMsg) Descriptor() ([]byte, []int)
- func (m *SendMsg) GetAmount() *coin.Coin
- func (m *SendMsg) GetDest() []byte
- func (m *SendMsg) GetMemo() string
- func (m *SendMsg) GetRef() []byte
- func (m *SendMsg) GetSrc() []byte
- func (m *SendMsg) Marshal() (dAtA []byte, err error)
- func (m *SendMsg) MarshalTo(dAtA []byte) (int, error)
- func (SendMsg) Path() string
- func (*SendMsg) ProtoMessage()
- func (m *SendMsg) Reset()
- func (m *SendMsg) Size() (n int)
- func (m *SendMsg) String() string
- func (m *SendMsg) Unmarshal(dAtA []byte) error
- func (s *SendMsg) Validate() error
- func (m *SendMsg) XXX_DiscardUnknown()
- func (m *SendMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (m *SendMsg) XXX_Merge(src proto.Message)
- func (m *SendMsg) XXX_Size() int
- func (m *SendMsg) XXX_Unmarshal(b []byte) error
- type Set
- func (s *Set) Copy() orm.CloneableData
- func (*Set) Descriptor() ([]byte, []int)
- func (m *Set) GetCoins() []*coin.Coin
- func (m *Set) Marshal() (dAtA []byte, err error)
- func (m *Set) MarshalTo(dAtA []byte) (int, error)
- func (*Set) ProtoMessage()
- func (m *Set) Reset()
- func (s *Set) SetCoins(coins []*coin.Coin)
- func (m *Set) Size() (n int)
- func (m *Set) String() string
- func (m *Set) Unmarshal(dAtA []byte) error
- func (s *Set) Validate() error
- func (m *Set) XXX_DiscardUnknown()
- func (m *Set) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (m *Set) XXX_Merge(src proto.Message)
- func (m *Set) XXX_Size() int
- func (m *Set) XXX_Unmarshal(b []byte) error
- type WalletBucket
Constants ¶
const ( GconfCollectorAddress = "cash:collector_address" GconfMinimalFee = "cash:minimal_fee" )
const BucketName = "cash"
BucketName is where we store the balances
Variables ¶
var ( ErrInvalidLengthCodec = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowCodec = fmt.Errorf("proto: integer overflow") )
Functions ¶
func Concat ¶
Concat combines the coins to make sure they are sorted and rounded off, with no duplicates or 0 values.
func NewWallet ¶
NewWallet creates an empty wallet with this address serves as an object for the bucket
func RegisterQuery ¶
func RegisterQuery(qr weave.QueryRouter)
RegisterQuery will register this bucket as "/wallets"
func RegisterRoutes ¶
func RegisterRoutes(r weave.Registry, auth x.Authenticator, control Controller)
RegisterRoutes will instantiate and register all handlers in this package
func ValidateWalletBucket ¶
func ValidateWalletBucket(bucket WalletBucket)
ValidateWalletBucket makes sure that it supports AsCoinage objects, unfortunately this check is done runtime....
panics on error (meant as a sanity check in init)
func WalletWith ¶
WalletWith creates an wallet with a balance
Types ¶
type Balancer ¶ added in v0.12.0
type Balancer interface { // Balance returns the amount of funds stored under given account address. Balance(weave.KVStore, weave.Address) (coin.Coins, error) }
Balancer is an interface to query the amount of coins.
type BaseController ¶
type BaseController struct {
// contains filtered or unexported fields
}
BaseController implements Controller interface, using WalletBucket as the storage engine. Wallet must return something that supports AsSet.
func NewController ¶
func NewController(bucket WalletBucket) BaseController
NewController returns a base controller implementation.
func (BaseController) Balance ¶ added in v0.12.0
Balance returns the amount of funds stored under given account address.
type CoinMinter ¶ added in v0.12.0
type CoinMinter interface { // CoinMint increase the number of funds on given accouunt by a // specified amount. CoinMint(weave.KVStore, weave.Address, coin.Coin) error }
CoinMinter is an interface to create new coins.
type CoinMover ¶ added in v0.12.0
type CoinMover interface { // Moving coins must happen from the source to the destination address. // Zero or negative values must result in an error. MoveCoins(store weave.KVStore, src weave.Address, dest weave.Address, amount coin.Coin) error }
CoinsMover is an interface for moving coins between accounts.
type Coinage ¶
Coinage is any model that allows getting and setting coins, Below functions work on these models (oh, how I long for default implementations for interface, like rust traits)
type Controller ¶
Controller is the functionality needed by cash.Handler and cash.Decorator. BaseController should work plenty fine, but you can add other logic if so desired
type DynamicFeeDecorator ¶ added in v0.12.0
type DynamicFeeDecorator struct {
// contains filtered or unexported fields
}
func NewDynamicFeeDecorator ¶ added in v0.12.0
func NewDynamicFeeDecorator(auth x.Authenticator, ctrl Controller) DynamicFeeDecorator
NewDynamicFeeDecorator returns a DynamicFeeDecorator with the given minimum fee, and all collected fees going to a default address.
type FeeDecorator ¶
type FeeDecorator struct {
// contains filtered or unexported fields
}
func NewFeeDecorator ¶
func NewFeeDecorator(auth x.Authenticator, ctrl CoinMover) FeeDecorator
NewFeeDecorator returns a FeeDecorator with the given minimum fee, and all collected fees going to a default address.
type FeeInfo ¶
type FeeInfo struct { Payer []byte `protobuf:"bytes,1,opt,name=payer,proto3" json:"payer,omitempty"` Fees *coin.Coin `protobuf:"bytes,2,opt,name=fees,proto3" json:"fees,omitempty"` }
FeeInfo records who pays what fees to have this message processed
func (*FeeInfo) DefaultPayer ¶
DefaultPayer makes sure there is a payer. If it was already set, returns f. If none was set, returns a new FeeInfo, with the New address set
func (*FeeInfo) Descriptor ¶
func (*FeeInfo) ProtoMessage ¶
func (*FeeInfo) ProtoMessage()
func (*FeeInfo) Validate ¶
Validate makes sure that this is sensible. Note that fee must be present, even if 0
func (*FeeInfo) XXX_DiscardUnknown ¶ added in v0.12.0
func (m *FeeInfo) XXX_DiscardUnknown()
func (*FeeInfo) XXX_Marshal ¶ added in v0.12.0
func (*FeeInfo) XXX_Unmarshal ¶ added in v0.12.0
type FeeTx ¶
type FeeTx interface {
GetFees() *FeeInfo
}
FeeTx exposes information about the fees that should be paid
type GenesisAccount ¶
GenesisAccount is used to parse the json from genesis file use weave.Address, so address in hex, not base64
type Initializer ¶
type Initializer struct{}
Initializer fulfils the InitStater interface to load data from the genesis file
func (Initializer) FromGenesis ¶
FromGenesis will parse initial account info from genesis and save it to the database
type SendHandler ¶
type SendHandler struct {
// contains filtered or unexported fields
}
SendHandler will handle sending coins
func NewSendHandler ¶
func NewSendHandler(auth x.Authenticator, control Controller) SendHandler
NewSendHandler creates a handler for SendMsg
type SendMsg ¶
type SendMsg struct { Src []byte `protobuf:"bytes,1,opt,name=src,proto3" json:"src,omitempty"` Dest []byte `protobuf:"bytes,2,opt,name=dest,proto3" json:"dest,omitempty"` Amount *coin.Coin `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount,omitempty"` // max length 128 character Memo string `protobuf:"bytes,4,opt,name=memo,proto3" json:"memo,omitempty"` // max length 64 bytes Ref []byte `protobuf:"bytes,5,opt,name=ref,proto3" json:"ref,omitempty"` }
SendMsg is a request to move these coins from the given source to the given destination address. memo is an optional human-readable message ref is optional binary data, that can refer to another eg. tx hash
func (*SendMsg) DefaultSource ¶
DefaultSource makes sure there is a payer. If it was already set, returns s. If none was set, returns a new SendMsg with the source set
func (*SendMsg) Descriptor ¶
func (*SendMsg) ProtoMessage ¶
func (*SendMsg) ProtoMessage()
func (*SendMsg) XXX_DiscardUnknown ¶ added in v0.12.0
func (m *SendMsg) XXX_DiscardUnknown()
func (*SendMsg) XXX_Marshal ¶ added in v0.12.0
func (*SendMsg) XXX_Unmarshal ¶ added in v0.12.0
type Set ¶
type Set struct {
Coins []*coin.Coin `protobuf:"bytes,1,rep,name=coins,proto3" json:"coins,omitempty"`
}
Set may contain Coin of many different currencies. It handles adding and subtracting sets of currencies.
func (*Set) Descriptor ¶
func (*Set) ProtoMessage ¶
func (*Set) ProtoMessage()
func (*Set) XXX_DiscardUnknown ¶ added in v0.12.0
func (m *Set) XXX_DiscardUnknown()
func (*Set) XXX_Marshal ¶ added in v0.12.0
func (*Set) XXX_Unmarshal ¶ added in v0.12.0
type WalletBucket ¶
type WalletBucket interface { GetOrCreate(db weave.KVStore, key weave.Address) (orm.Object, error) Get(db weave.ReadOnlyKVStore, key []byte) (orm.Object, error) Save(db weave.KVStore, obj orm.Object) error }
WalletBucket is what we expect to be able to do with wallets The object it returns must support AsSet (only checked runtime :()