Documentation ¶
Overview ¶
Package cash is a generated protocol buffer package. It is generated from these files: x/cash/codec.proto It has these top-level messages: Set SendMsg FeeInfo
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 x.Coin) error
- func AsCoins(obj orm.Object) x.Coins
- func Concat(cng Coinage, coins x.Coins) error
- func ErrEmptyAccount(addr weave.Address) error
- func ErrInsufficientFees(coin x.Coin) error
- func ErrInsufficientFunds() error
- func ErrInvalidAmount(reason string) error
- func ErrInvalidMemo(reason string) error
- func IsEmptyAccountErr(err error) bool
- func IsInsufficientFeesErr(err error) bool
- func IsInsufficientFundsErr(err error) bool
- func IsInvalidAmountErr(err error) bool
- func IsInvalidMemoErr(err error) bool
- 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 x.Coin) error
- func ValidateWalletBucket(bucket WalletBucket)
- func WalletWith(key weave.Address, coins ...*x.Coin) (orm.Object, error)
- func XCoins(c Coinage) x.Coins
- type BaseController
- type Bucket
- type Coinage
- type Controller
- type FeeDecorator
- type FeeInfo
- func (f *FeeInfo) DefaultPayer(addr []byte) *FeeInfo
- func (*FeeInfo) Descriptor() ([]byte, []int)
- func (m *FeeInfo) GetFees() *x.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
- 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() *x.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
- type Set
- func (s *Set) Copy() orm.CloneableData
- func (*Set) Descriptor() ([]byte, []int)
- func (m *Set) GetCoins() []*x.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 []*x.Coin)
- func (m *Set) Size() (n int)
- func (m *Set) String() string
- func (m *Set) Unmarshal(dAtA []byte) error
- func (s *Set) Validate() error
- type WalletBucket
Constants ¶
const ( GconfCollectorAddress = "cash:collector_address" GconfMinimalFee = "cash:minimal_fee" )
const ( CodeInsufficientFees uint32 = 32 CodeInsufficientFunds = 33 CodeInvalidAmount = 34 CodeInvalidMemo = 35 CodeEmptyAccount = 36 )
ABCI Response Codes x/coins reserves 30 ~ 39.
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 ErrEmptyAccount ¶
func ErrInsufficientFees ¶
func ErrInsufficientFunds ¶
func ErrInsufficientFunds() error
func ErrInvalidAmount ¶
func ErrInvalidMemo ¶
func IsEmptyAccountErr ¶
func IsInsufficientFeesErr ¶
func IsInsufficientFundsErr ¶
func IsInvalidAmountErr ¶
func IsInvalidMemoErr ¶
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 BaseController ¶
type BaseController struct {
// contains filtered or unexported fields
}
BaseController is a simple implementation of controller wallet must return something that supports AsSet
func NewController ¶
func NewController(bucket WalletBucket) BaseController
NewController returns a basic controller implementation
func (BaseController) IssueCoins ¶
IssueCoins attempts to add the given amount of coins to the destination address. Fails if it overflows the wallet.
Note the amount may also be negative: "the lord giveth and the lord taketh away"
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 ¶
type Controller interface { MoveCoins(store weave.KVStore, src weave.Address, dest weave.Address, amount x.Coin) error IssueCoins(store weave.KVStore, dest weave.Address, amount x.Coin) error }
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 FeeDecorator ¶
type FeeDecorator struct {
// contains filtered or unexported fields
}
FeeDecorator ensures that the fee can be deducted from the account. All deducted fees are send to the collector, which can be set to an address controlled by another extension ("smart contract"). Collector address is configured via gconf package.
Minimal fee is configured via gconf package. If minimal is zero, no fees required, but will speed processing. If a currency is set on minimal fee, then all fees must be paid in that currency
It uses auth to verify the sender
func NewFeeDecorator ¶
func NewFeeDecorator(auth x.Authenticator, control Controller) 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 *x.Coin `protobuf:"bytes,2,opt,name=fees" 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()
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 *x.Coin `protobuf:"bytes,3,opt,name=amount" 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()
type Set ¶
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()
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 :()