105 lines
1.8 KiB
Go
105 lines
1.8 KiB
Go
package txs
|
|
|
|
import (
|
|
"github.com/tendermint/basecoin"
|
|
"github.com/tendermint/basecoin/errors"
|
|
"github.com/tendermint/go-wire/data"
|
|
)
|
|
|
|
const (
|
|
// for utils...
|
|
ByteRaw = 0x1
|
|
ByteMulti = 0x2
|
|
ByteChain = 0x3
|
|
|
|
// for signatures
|
|
ByteSig = 0x16
|
|
ByteMultiSig = 0x17
|
|
)
|
|
|
|
const (
|
|
// for utils...
|
|
TypeRaw = "raw"
|
|
TypeMulti = "multi"
|
|
TypeChain = "chain"
|
|
|
|
// for signatures
|
|
TypeSig = "sig"
|
|
TypeMultiSig = "multisig"
|
|
)
|
|
|
|
const (
|
|
rawMaxSize = 2000 * 1000
|
|
)
|
|
|
|
func init() {
|
|
basecoin.TxMapper.
|
|
RegisterImplementation(Raw{}, TypeRaw, ByteRaw).
|
|
RegisterImplementation(&MultiTx{}, TypeMulti, ByteMulti).
|
|
RegisterImplementation(&Chain{}, TypeChain, ByteChain)
|
|
}
|
|
|
|
// Raw just contains bytes that can be hex-ified
|
|
type Raw struct {
|
|
data.Bytes
|
|
}
|
|
|
|
func (r Raw) Wrap() basecoin.Tx {
|
|
return basecoin.Tx{r}
|
|
}
|
|
|
|
func (r Raw) ValidateBasic() error {
|
|
if len(r.Bytes) > rawMaxSize {
|
|
return errors.ErrTooLarge()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func NewRaw(d []byte) basecoin.Tx {
|
|
return Raw{data.Bytes(d)}.Wrap()
|
|
}
|
|
|
|
/**** MultiTx ******/
|
|
type MultiTx struct {
|
|
Txs []basecoin.Tx `json:"txs"`
|
|
}
|
|
|
|
func NewMultiTx(txs ...basecoin.Tx) basecoin.Tx {
|
|
return (&MultiTx{Txs: txs}).Wrap()
|
|
}
|
|
|
|
func (mt *MultiTx) Wrap() basecoin.Tx {
|
|
return basecoin.Tx{mt}
|
|
}
|
|
|
|
func (mt *MultiTx) ValidateBasic() error {
|
|
for _, t := range mt.Txs {
|
|
err := t.ValidateBasic()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/*** Chain ****/
|
|
|
|
// Chain locks this tx to one chain, wrap with this before signing
|
|
type Chain struct {
|
|
Tx basecoin.Tx `json:"tx"`
|
|
ChainID string `json:"chain_id"`
|
|
}
|
|
|
|
func NewChain(chainID string, tx basecoin.Tx) basecoin.Tx {
|
|
return (&Chain{Tx: tx, ChainID: chainID}).Wrap()
|
|
}
|
|
|
|
func (c *Chain) Wrap() basecoin.Tx {
|
|
return basecoin.Tx{c}
|
|
}
|
|
|
|
func (c *Chain) ValidateBasic() error {
|
|
// TODO: more checks? chainID?
|
|
return c.Tx.ValidateBasic()
|
|
}
|