mirror of
https://github.com/luxfi/proto.git
synced 2026-10-30 15:21:09 +00:00
Adds .hanzo/workflows/cicd.yml calling the canonical pipeline and drops the GitHub-hosted workflows it replaces. Lands here because this is where the repo is written — git.hanzo.ai is upstream and github.com is its push mirror, so the same change made on github.com never reaches the runner fleet.
726 lines
24 KiB
Go
726 lines
24 KiB
Go
// Copyright (C) 2019-2026, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package txs
|
|
|
|
// Marshal is the one encoder for a P-chain unsigned tx: a plain struct in, the
|
|
// chain's self-delimiting zap buffer out. Build order is load-bearing — every
|
|
// child list and tail is written first, the object last, because a zap object
|
|
// can only point backwards into what is already laid down.
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/luxfi/ids"
|
|
"github.com/luxfi/proto/p/security"
|
|
"github.com/luxfi/zap"
|
|
)
|
|
|
|
// errNilUnsigned names an empty tx body, which has no wire form.
|
|
var errNilUnsigned = errors.New("txs: nil unsigned tx")
|
|
|
|
// Marshal encodes an unsigned tx as the chain's wire bytes.
|
|
func Marshal(u UnsignedTx) ([]byte, error) {
|
|
if u == nil {
|
|
return nil, errNilUnsigned
|
|
}
|
|
m := &marshaler{}
|
|
if err := u.Visit(m); err != nil {
|
|
return nil, err
|
|
}
|
|
return m.buf, nil
|
|
}
|
|
|
|
type marshaler struct {
|
|
buf []byte
|
|
}
|
|
|
|
// ---- security (4 fixed fields, shared by CreateNetwork and ConvertNetwork) ----
|
|
|
|
func setSecurity(ob zap.ObjectBuilder, offRestake, offAdmission, offManager, offThreshold int, m security.Mode) {
|
|
var restake uint8
|
|
if m.RestakeParent {
|
|
restake = 1
|
|
}
|
|
ob.SetUint8(offRestake, restake)
|
|
ob.SetUint8(offAdmission, uint8(m.Admission))
|
|
ob.SetUint8(offManager, uint8(m.Manager))
|
|
ob.SetUint64(offThreshold, m.Threshold)
|
|
}
|
|
|
|
func readSecurity(o zap.Object, offRestake, offAdmission, offManager, offThreshold int) security.Mode {
|
|
return security.Mode{
|
|
RestakeParent: o.Uint8(offRestake) != 0,
|
|
Admission: security.Admission(o.Uint8(offAdmission)),
|
|
Manager: security.Manager(o.Uint8(offManager)),
|
|
Threshold: o.Uint64(offThreshold),
|
|
}
|
|
}
|
|
|
|
// ---- network validator list (fixed stride 192) ----
|
|
|
|
const (
|
|
nvWeight = 0
|
|
nvBalance = 8
|
|
nvSignerPub = 16
|
|
nvSignerPoP = 64
|
|
nvNodeIDStart = 160
|
|
nvNodeIDLen = 164
|
|
nvRemThreshold = 168
|
|
nvRemAddrStart = 172
|
|
nvRemAddrCount = 176
|
|
nvDeacThreshold = 180
|
|
nvDeacAddrStart = 184
|
|
nvDeacAddrCount = 188
|
|
nvStride = 192
|
|
)
|
|
|
|
func writeNetworkValidators(b *zap.Builder, vdrs []*NetworkValidator) (listOff, listCount int, nodeIDs []byte, addrs []ids.ShortID) {
|
|
if len(vdrs) == 0 {
|
|
return 0, 0, nil, nil
|
|
}
|
|
lb := b.StartList(nvStride)
|
|
for _, v := range vdrs {
|
|
var e [nvStride]byte
|
|
putU64(e[nvWeight:], v.Weight)
|
|
putU64(e[nvBalance:], v.Balance)
|
|
copy(e[nvSignerPub:], v.Signer.PublicKey[:])
|
|
copy(e[nvSignerPoP:], v.Signer.ProofOfPossession[:])
|
|
putU32(e[nvNodeIDStart:], uint32(len(nodeIDs)))
|
|
putU32(e[nvNodeIDLen:], uint32(len(v.NodeID)))
|
|
nodeIDs = append(nodeIDs, v.NodeID...)
|
|
putU32(e[nvRemThreshold:], v.RemainingBalanceOwner.Threshold)
|
|
putU32(e[nvRemAddrStart:], uint32(len(addrs)))
|
|
putU32(e[nvRemAddrCount:], uint32(len(v.RemainingBalanceOwner.Addresses)))
|
|
addrs = append(addrs, v.RemainingBalanceOwner.Addresses...)
|
|
putU32(e[nvDeacThreshold:], v.DeactivationOwner.Threshold)
|
|
putU32(e[nvDeacAddrStart:], uint32(len(addrs)))
|
|
putU32(e[nvDeacAddrCount:], uint32(len(v.DeactivationOwner.Addresses)))
|
|
addrs = append(addrs, v.DeactivationOwner.Addresses...)
|
|
lb.AddBytes(e[:])
|
|
}
|
|
listOff, _ = lb.Finish()
|
|
listCount = len(vdrs) // AddBytes counts bytes, not elements
|
|
return listOff, listCount, nodeIDs, addrs
|
|
}
|
|
|
|
func writeAddrPool(b *zap.Builder, addrs []ids.ShortID) (off, count int) {
|
|
if len(addrs) == 0 {
|
|
return 0, 0
|
|
}
|
|
lb := b.StartList(addrStride)
|
|
for _, a := range addrs {
|
|
lb.AddBytes(a[:])
|
|
}
|
|
off, _ = lb.Finish()
|
|
return off, len(addrs)
|
|
}
|
|
|
|
// ---- proposal txs (no spending envelope) ----
|
|
|
|
const offAdvanceTimeTime = 1 // u64, after kind@0
|
|
|
|
func (m *marshaler) AdvanceTimeTx(tx *AdvanceTimeTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 16 + 9)
|
|
ob := b.StartObject(9)
|
|
ob.SetUint8(offKind, uint8(kindAdvanceTime))
|
|
ob.SetUint64(offAdvanceTimeTime, tx.Time)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const offRewardTxID = 1 // 32B, after kind@0
|
|
|
|
func (m *marshaler) RewardValidatorTx(tx *RewardValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 16 + 33)
|
|
ob := b.StartObject(33)
|
|
ob.SetUint8(offKind, uint8(kindRewardValidator))
|
|
setID(ob, offRewardTxID, tx.TxID)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
// ---- spending txs ----
|
|
|
|
func (m *marshaler) BaseTx(tx *BaseTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 256 + spendSize)
|
|
p, err := writeSpending(b, &tx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(spendSize)
|
|
setEnvelope(ob, kindBase, &tx.BaseTx, p)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offImportSourceChain = spendSize // 77
|
|
offImportInputs = 109
|
|
offImportSigIndices = 117
|
|
sizeImport = 125
|
|
)
|
|
|
|
func (m *marshaler) ImportTx(tx *ImportTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeImport)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
listOff, listCount, sigOff, sigCount, err := writeExtraIns(b, tx.ImportedInputs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeImport)
|
|
setEnvelope(ob, kindImport, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offImportSourceChain, tx.SourceChain)
|
|
ob.SetList(offImportInputs, listOff, listCount)
|
|
ob.SetList(offImportSigIndices, sigOff, sigCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offExportDestChain = spendSize // 77
|
|
offExportOutputs = 109
|
|
offExportAddrs = 117
|
|
sizeExport = 125
|
|
)
|
|
|
|
func (m *marshaler) ExportTx(tx *ExportTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeExport)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
listOff, listCount, addrOff, addrCount, err := writeExtraOuts(b, tx.ExportedOutputs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeExport)
|
|
setEnvelope(ob, kindExport, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offExportDestChain, tx.DestinationChain)
|
|
ob.SetList(offExportOutputs, listOff, listCount)
|
|
ob.SetList(offExportAddrs, addrOff, addrCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offCNParent = spendSize // 32B
|
|
offCNOwnerThreshold = spendSize + 32 // u32
|
|
offCNOwnerLocktime = spendSize + 36 // u64
|
|
offCNOwnerAddrPtr = spendSize + 44 // 8B
|
|
offCNRestakeParent = spendSize + 52 // u8
|
|
offCNAdmission = spendSize + 53 // u8
|
|
offCNManager = spendSize + 54 // u8
|
|
offCNThreshold = spendSize + 55 // u64
|
|
offCNValidators = spendSize + 63 // 8B list
|
|
offCNValNodeIDPool = spendSize + 71 // 8B bytes
|
|
offCNValAddrPool = spendSize + 79 // 8B list
|
|
offCNManagerChainID = spendSize + 87 // 32B
|
|
offCNManagerAddress = spendSize + 119 // 8B bytes
|
|
sizeCreateNetwork = spendSize + 127
|
|
)
|
|
|
|
func (m *marshaler) CreateNetworkTx(tx *CreateNetworkTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 1024 + sizeCreateNetwork + len(tx.Validators)*nvStride)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
oThreshold, oLocktime, oAddrOff, oAddrCount, err := writeOwner(b, tx.Owner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
vdrOff, vdrCount, nodeIDPool, addrPool := writeNetworkValidators(b, tx.Validators)
|
|
valAddrOff, valAddrCount := writeAddrPool(b, addrPool)
|
|
|
|
ob := b.StartObject(sizeCreateNetwork)
|
|
setEnvelope(ob, kindCreateNetwork, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offCNParent, tx.Parent)
|
|
setOwner(ob, offCNOwnerThreshold, offCNOwnerLocktime, offCNOwnerAddrPtr, oThreshold, oLocktime, oAddrOff, oAddrCount)
|
|
setSecurity(ob, offCNRestakeParent, offCNAdmission, offCNManager, offCNThreshold, tx.Security)
|
|
ob.SetList(offCNValidators, vdrOff, vdrCount)
|
|
ob.SetBytes(offCNValNodeIDPool, nodeIDPool)
|
|
ob.SetList(offCNValAddrPool, valAddrOff, valAddrCount)
|
|
setID(ob, offCNManagerChainID, tx.ManagerChainID)
|
|
ob.SetBytes(offCNManagerAddress, tx.ManagerAddress)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offCreateChainID = spendSize // 77
|
|
offCreateChainVMID = 109
|
|
offCreateChainName = 141
|
|
offCreateChainFxIDs = 149
|
|
offCreateChainGenesis = 157
|
|
offCreateChainAuth = 165
|
|
sizeCreateChain = 173
|
|
)
|
|
|
|
func (m *marshaler) CreateChainTx(tx *CreateChainTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeCreateChain + len(tx.GenesisData))
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fxOff, fxCount := writeIDList(b, tx.FxIDs)
|
|
authOff, authCount, err := writeAuth(b, tx.ChainAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeCreateChain)
|
|
setEnvelope(ob, kindCreateChain, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offCreateChainID, tx.ValidateNetworkID)
|
|
setID(ob, offCreateChainVMID, tx.VMID)
|
|
ob.SetText(offCreateChainName, tx.BlockchainName)
|
|
ob.SetList(offCreateChainFxIDs, fxOff, fxCount)
|
|
ob.SetBytes(offCreateChainGenesis, tx.GenesisData)
|
|
ob.SetList(offCreateChainAuth, authOff, authCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offTransferChain = spendSize // 77
|
|
offTransferChainAuth = 109
|
|
offTransferOwnerThreshold = 117
|
|
offTransferOwnerLocktime = 121
|
|
offTransferOwnerAddrs = 129
|
|
sizeTransferChainOwnership = 137
|
|
)
|
|
|
|
func (m *marshaler) TransferChainOwnershipTx(tx *TransferChainOwnershipTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeTransferChainOwnership)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
authOff, authCount, err := writeAuth(b, tx.ChainAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
threshold, locktime, addrOff, addrCount, err := writeOwner(b, tx.Owner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeTransferChainOwnership)
|
|
setEnvelope(ob, kindTransferChainOwnership, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offTransferChain, tx.Chain)
|
|
ob.SetList(offTransferChainAuth, authOff, authCount)
|
|
setOwner(ob, offTransferOwnerThreshold, offTransferOwnerLocktime, offTransferOwnerAddrs, threshold, locktime, addrOff, addrCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offRemoveNodeID = spendSize // 20B
|
|
offRemoveChain = 97 // 32B
|
|
offRemoveChainAuth = 129 // list ptr (8B)
|
|
sizeRemove = 137
|
|
)
|
|
|
|
func (m *marshaler) RemoveChainValidatorTx(tx *RemoveChainValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 256 + sizeRemove)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
authOff, authCount, err := writeAuth(b, tx.ChainAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeRemove)
|
|
setEnvelope(ob, kindRemoveChainValidator, &tx.BaseTx.BaseTx, p)
|
|
setNodeID(ob, offRemoveNodeID, tx.NodeID)
|
|
setID(ob, offRemoveChain, tx.Chain)
|
|
ob.SetList(offRemoveChainAuth, authOff, authCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offTransformChain = spendSize // 77
|
|
offTransformAssetID = 109
|
|
offTransformInitialSupply = 141
|
|
offTransformMaximumSupply = 149
|
|
offTransformMinConsumptionRate = 157
|
|
offTransformMaxConsumptionRate = 165
|
|
offTransformMinValidatorStake = 173
|
|
offTransformMaxValidatorStake = 181
|
|
offTransformMinStakeDuration = 189
|
|
offTransformMaxStakeDuration = 193
|
|
offTransformMinDelegationFee = 197
|
|
offTransformMinDelegatorStake = 201
|
|
offTransformMaxValidatorWeightFactor = 209
|
|
offTransformUptimeRequirement = 210
|
|
offTransformChainAuth = 214
|
|
sizeTransformChain = 222
|
|
)
|
|
|
|
func (m *marshaler) TransformChainTx(tx *TransformChainTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeTransformChain)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
authOff, authCount, err := writeAuth(b, tx.ChainAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeTransformChain)
|
|
setEnvelope(ob, kindTransformChain, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offTransformChain, tx.Chain)
|
|
setID(ob, offTransformAssetID, tx.AssetID)
|
|
ob.SetUint64(offTransformInitialSupply, tx.InitialSupply)
|
|
ob.SetUint64(offTransformMaximumSupply, tx.MaximumSupply)
|
|
ob.SetUint64(offTransformMinConsumptionRate, tx.MinConsumptionRate)
|
|
ob.SetUint64(offTransformMaxConsumptionRate, tx.MaxConsumptionRate)
|
|
ob.SetUint64(offTransformMinValidatorStake, tx.MinValidatorStake)
|
|
ob.SetUint64(offTransformMaxValidatorStake, tx.MaxValidatorStake)
|
|
ob.SetUint32(offTransformMinStakeDuration, tx.MinStakeDuration)
|
|
ob.SetUint32(offTransformMaxStakeDuration, tx.MaxStakeDuration)
|
|
ob.SetUint32(offTransformMinDelegationFee, tx.MinDelegationFee)
|
|
ob.SetUint64(offTransformMinDelegatorStake, tx.MinDelegatorStake)
|
|
ob.SetUint8(offTransformMaxValidatorWeightFactor, tx.MaxValidatorWeightFactor)
|
|
ob.SetUint32(offTransformUptimeRequirement, tx.UptimeRequirement)
|
|
ob.SetList(offTransformChainAuth, authOff, authCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offAVValidator = spendSize // 77
|
|
offAVStakeOuts = offAVValidator + validatorSize // 121
|
|
offAVStakeAddrs = offAVStakeOuts + 8 // 129
|
|
offAVRewardsThreshold = offAVStakeAddrs + 8 // 137
|
|
offAVRewardsLocktime = offAVRewardsThreshold + 4 // 141
|
|
offAVRewardsAddrs = offAVRewardsLocktime + 8 // 149
|
|
offAVDelegationShares = offAVRewardsAddrs + 8 // 157
|
|
addValidatorSize = offAVDelegationShares + 4 // 161
|
|
)
|
|
|
|
func (m *marshaler) AddValidatorTx(tx *AddValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 1024 + addValidatorSize)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
stakeListOff, stakeListCount, stakeAddrOff, stakeAddrCount, err := writeExtraOuts(b, tx.StakeOuts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ownerThreshold, ownerLocktime, ownerAddrOff, ownerAddrCount, err := writeOwner(b, tx.RewardsOwner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(addValidatorSize)
|
|
setEnvelope(ob, kindAddValidator, &tx.BaseTx.BaseTx, p)
|
|
setValidator(ob, offAVValidator, tx.Validator)
|
|
ob.SetList(offAVStakeOuts, stakeListOff, stakeListCount)
|
|
ob.SetList(offAVStakeAddrs, stakeAddrOff, stakeAddrCount)
|
|
setOwner(ob, offAVRewardsThreshold, offAVRewardsLocktime, offAVRewardsAddrs, ownerThreshold, ownerLocktime, ownerAddrOff, ownerAddrCount)
|
|
ob.SetUint32(offAVDelegationShares, tx.DelegationShares)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offACVValidator = spendSize // 77
|
|
offACVChain = offACVValidator + validatorSize // 121
|
|
offACVChainAuth = offACVChain + 32 // 153
|
|
addChainValidatorSize = offACVChainAuth + 8 // 161
|
|
)
|
|
|
|
func (m *marshaler) AddChainValidatorTx(tx *AddChainValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 1024 + addChainValidatorSize)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
authOff, authCount, err := writeAuth(b, tx.ChainAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(addChainValidatorSize)
|
|
setEnvelope(ob, kindAddChainValidator, &tx.BaseTx.BaseTx, p)
|
|
setValidator(ob, offACVValidator, tx.ChainValidator.Validator)
|
|
setID(ob, offACVChain, tx.ChainValidator.Chain)
|
|
ob.SetList(offACVChainAuth, authOff, authCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offADValidator = spendSize // 77
|
|
offADStakeOuts = offADValidator + validatorSize // 121
|
|
offADStakeAddrs = offADStakeOuts + 8 // 129
|
|
offADRewardsThreshold = offADStakeAddrs + 8 // 137
|
|
offADRewardsLocktime = offADRewardsThreshold + 4 // 141
|
|
offADRewardsAddrs = offADRewardsLocktime + 8 // 149
|
|
addDelegatorSize = offADRewardsAddrs + 8 // 157
|
|
)
|
|
|
|
func (m *marshaler) AddDelegatorTx(tx *AddDelegatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 1024 + addDelegatorSize)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
stakeListOff, stakeListCount, stakeAddrOff, stakeAddrCount, err := writeExtraOuts(b, tx.StakeOuts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ownerThreshold, ownerLocktime, ownerAddrOff, ownerAddrCount, err := writeOwner(b, tx.DelegationRewardsOwner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(addDelegatorSize)
|
|
setEnvelope(ob, kindAddDelegator, &tx.BaseTx.BaseTx, p)
|
|
setValidator(ob, offADValidator, tx.Validator)
|
|
ob.SetList(offADStakeOuts, stakeListOff, stakeListCount)
|
|
ob.SetList(offADStakeAddrs, stakeAddrOff, stakeAddrCount)
|
|
setOwner(ob, offADRewardsThreshold, offADRewardsLocktime, offADRewardsAddrs, ownerThreshold, ownerLocktime, ownerAddrOff, ownerAddrCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offAPVValidator = spendSize // 77
|
|
offAPVChain = offAPVValidator + validatorSize // 121
|
|
offAPVSigner = offAPVChain + 32 // 153
|
|
offAPVStakeOuts = offAPVSigner + signerSize // 298
|
|
offAPVStakeAddrs = offAPVStakeOuts + 8 // 306
|
|
offAPVValRewardsThreshold = offAPVStakeAddrs + 8 // 314
|
|
offAPVValRewardsLocktime = offAPVValRewardsThreshold + 4 // 318
|
|
offAPVValRewardsAddrs = offAPVValRewardsLocktime + 8 // 326
|
|
offAPVDelRewardsThreshold = offAPVValRewardsAddrs + 8 // 334
|
|
offAPVDelRewardsLocktime = offAPVDelRewardsThreshold + 4 // 338
|
|
offAPVDelRewardsAddrs = offAPVDelRewardsLocktime + 8 // 346
|
|
offAPVDelegationShares = offAPVDelRewardsAddrs + 8 // 354
|
|
addPermissionlessValidatorSize = offAPVDelegationShares + 4 // 358
|
|
)
|
|
|
|
func (m *marshaler) AddPermissionlessValidatorTx(tx *AddPermissionlessValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 1024 + addPermissionlessValidatorSize)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
stakeListOff, stakeListCount, stakeAddrOff, stakeAddrCount, err := writeExtraOuts(b, tx.StakeOuts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
valThreshold, valLocktime, valAddrOff, valAddrCount, err := writeOwner(b, tx.ValidatorRewardsOwner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
delThreshold, delLocktime, delAddrOff, delAddrCount, err := writeOwner(b, tx.DelegatorRewardsOwner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(addPermissionlessValidatorSize)
|
|
setEnvelope(ob, kindAddPermissionlessValidator, &tx.BaseTx.BaseTx, p)
|
|
setValidator(ob, offAPVValidator, tx.Validator)
|
|
setID(ob, offAPVChain, tx.Chain)
|
|
if err := setSigner(ob, offAPVSigner, tx.Signer); err != nil {
|
|
return err
|
|
}
|
|
ob.SetList(offAPVStakeOuts, stakeListOff, stakeListCount)
|
|
ob.SetList(offAPVStakeAddrs, stakeAddrOff, stakeAddrCount)
|
|
setOwner(ob, offAPVValRewardsThreshold, offAPVValRewardsLocktime, offAPVValRewardsAddrs, valThreshold, valLocktime, valAddrOff, valAddrCount)
|
|
setOwner(ob, offAPVDelRewardsThreshold, offAPVDelRewardsLocktime, offAPVDelRewardsAddrs, delThreshold, delLocktime, delAddrOff, delAddrCount)
|
|
ob.SetUint32(offAPVDelegationShares, tx.DelegationShares)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offAPDValidator = spendSize // 77
|
|
offAPDChain = offAPDValidator + validatorSize // 121
|
|
offAPDStakeOuts = offAPDChain + 32 // 153
|
|
offAPDStakeAddrs = offAPDStakeOuts + 8 // 161
|
|
offAPDRewardsThreshold = offAPDStakeAddrs + 8 // 169
|
|
offAPDRewardsLocktime = offAPDRewardsThreshold + 4 // 173
|
|
offAPDRewardsAddrs = offAPDRewardsLocktime + 8 // 181
|
|
addPermissionlessDelegatorSize = offAPDRewardsAddrs + 8 // 189
|
|
)
|
|
|
|
func (m *marshaler) AddPermissionlessDelegatorTx(tx *AddPermissionlessDelegatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 1024 + addPermissionlessDelegatorSize)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
stakeListOff, stakeListCount, stakeAddrOff, stakeAddrCount, err := writeExtraOuts(b, tx.StakeOuts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ownerThreshold, ownerLocktime, ownerAddrOff, ownerAddrCount, err := writeOwner(b, tx.DelegationRewardsOwner)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(addPermissionlessDelegatorSize)
|
|
setEnvelope(ob, kindAddPermissionlessDelegator, &tx.BaseTx.BaseTx, p)
|
|
setValidator(ob, offAPDValidator, tx.Validator)
|
|
setID(ob, offAPDChain, tx.Chain)
|
|
ob.SetList(offAPDStakeOuts, stakeListOff, stakeListCount)
|
|
ob.SetList(offAPDStakeAddrs, stakeAddrOff, stakeAddrCount)
|
|
setOwner(ob, offAPDRewardsThreshold, offAPDRewardsLocktime, offAPDRewardsAddrs, ownerThreshold, ownerLocktime, ownerAddrOff, ownerAddrCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offRegisterBalance = spendSize // 77
|
|
offRegisterPoP = 85
|
|
offRegisterMessage = 181
|
|
sizeRegisterL1Validator = 189
|
|
)
|
|
|
|
func (m *marshaler) RegisterL1ValidatorTx(tx *RegisterL1ValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeRegisterL1Validator + len(tx.Message))
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeRegisterL1Validator)
|
|
setEnvelope(ob, kindRegisterL1Validator, &tx.BaseTx.BaseTx, p)
|
|
ob.SetUint64(offRegisterBalance, tx.Balance)
|
|
ob.SetBytesFixed(offRegisterPoP, tx.ProofOfPossession[:])
|
|
ob.SetBytes(offRegisterMessage, tx.Message)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offSetWeightMessage = spendSize // bytes ptr (8B)
|
|
sizeSetWeight = 85
|
|
)
|
|
|
|
func (m *marshaler) SetL1ValidatorWeightTx(tx *SetL1ValidatorWeightTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 256 + sizeSetWeight + len(tx.Message))
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeSetWeight)
|
|
setEnvelope(ob, kindSetL1ValidatorWeight, &tx.BaseTx.BaseTx, p)
|
|
ob.SetBytes(offSetWeightMessage, tx.Message)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offIncreaseValidationID = spendSize // 32B
|
|
offIncreaseBalance = 109 // u64
|
|
sizeIncrease = 117
|
|
)
|
|
|
|
func (m *marshaler) IncreaseL1ValidatorBalanceTx(tx *IncreaseL1ValidatorBalanceTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 256 + sizeIncrease)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeIncrease)
|
|
setEnvelope(ob, kindIncreaseL1ValidatorBalance, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offIncreaseValidationID, tx.ValidationID)
|
|
ob.SetUint64(offIncreaseBalance, tx.Balance)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offDisableValidationID = spendSize // 32B
|
|
offDisableAuth = 109 // list ptr (8B)
|
|
sizeDisable = 117
|
|
)
|
|
|
|
func (m *marshaler) DisableL1ValidatorTx(tx *DisableL1ValidatorTx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 256 + sizeDisable)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
authOff, authCount, err := writeAuth(b, tx.DisableAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeDisable)
|
|
setEnvelope(ob, kindDisableL1Validator, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offDisableValidationID, tx.ValidationID)
|
|
ob.SetList(offDisableAuth, authOff, authCount)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
offCVNetwork = spendSize // 32B
|
|
offCVParent = spendSize + 32 // 32B
|
|
offCVManagerChainID = spendSize + 64 // 32B
|
|
offCVManagerAddress = spendSize + 96 // bytes ptr (8B)
|
|
offCVValidators = spendSize + 104 // list ptr (8B)
|
|
offCVValNodeIDPool = spendSize + 112 // bytes ptr (8B)
|
|
offCVValAddrPool = spendSize + 120 // list ptr (8B)
|
|
offCVAuthPtr = spendSize + 128 // sig-idx list ptr (8B)
|
|
offCVRestakeParent = spendSize + 136 // u8
|
|
offCVAdmission = spendSize + 137 // u8
|
|
offCVManager = spendSize + 138 // u8
|
|
offCVThreshold = spendSize + 139 // u64
|
|
sizeConvertNetwork = spendSize + 147
|
|
)
|
|
|
|
func (m *marshaler) ConvertNetworkToL1Tx(tx *ConvertNetworkToL1Tx) error {
|
|
b := zap.NewBuilder(zap.HeaderSize + 512 + sizeConvertNetwork + len(tx.Validators)*nvStride)
|
|
p, err := writeSpending(b, &tx.BaseTx.BaseTx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
vdrOff, vdrCount, nodeIDPool, addrPool := writeNetworkValidators(b, tx.Validators)
|
|
valAddrOff, valAddrCount := writeAddrPool(b, addrPool)
|
|
authOff, authCount, err := writeAuth(b, tx.ChainAuth)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ob := b.StartObject(sizeConvertNetwork)
|
|
setEnvelope(ob, kindConvertNetwork, &tx.BaseTx.BaseTx, p)
|
|
setID(ob, offCVNetwork, tx.Chain)
|
|
setID(ob, offCVParent, tx.Parent)
|
|
setID(ob, offCVManagerChainID, tx.ManagerChainID)
|
|
ob.SetBytes(offCVManagerAddress, tx.Address)
|
|
ob.SetList(offCVValidators, vdrOff, vdrCount)
|
|
ob.SetBytes(offCVValNodeIDPool, nodeIDPool)
|
|
ob.SetList(offCVValAddrPool, valAddrOff, valAddrCount)
|
|
ob.SetList(offCVAuthPtr, authOff, authCount)
|
|
setSecurity(ob, offCVRestakeParent, offCVAdmission, offCVManager, offCVThreshold, tx.Security)
|
|
ob.FinishAsRoot()
|
|
m.buf = b.Finish()
|
|
return nil
|
|
}
|
|
|
|
// errUnknownKind names a discriminator the wire does not define.
|
|
func errUnknownKind(k kind) error { return fmt.Errorf("zap: unknown tx kind %d", k) }
|