func (a *PeerAPI) AddFollowOnTx(ev *wire.Envelope) error {
	var err error
	return a.DB.Update(func(tx *bolt.Tx) error {
		fol := &wire.FollowOnTx{}
		err = proto.Unmarshal(ev.Payload, fol)
		if err != nil {
			return err
		}

		ch, err := access.GetChannel(tx, fol.ChannelId)
		if err != nil {
			return err
		}

		ch.AddFollowOnTx(ev)
		if err != nil {
			return err
		}

		access.SetChannel(tx, ch)
		if err != nil {
			return err
		}

		return nil
	})
}
func (a *PeerAPI) AddFullUpdateTx(ev *wire.Envelope) error {
	var err error
	err = a.DB.Update(func(tx *bolt.Tx) error {
		utx := &wire.UpdateTx{}
		err = proto.Unmarshal(ev.Payload, utx)
		if err != nil {
			return err
		}

		ch, err := access.GetChannel(tx, utx.ChannelId)
		if err != nil {
			return err
		}

		err = ch.AddFullUpdateTx(ev, utx)
		if err != nil {
			return err
		}

		access.SetChannel(tx, ch)
		if err != nil {
			return errors.New("database error")
		}

		return nil
	})
	if err != nil {
		return err
	}

	return nil
}
func (a *PeerAPI) AddClosingTx(ev *wire.Envelope) error {
	var err error
	return a.DB.Update(func(tx *bolt.Tx) error {
		ctx := &wire.ClosingTx{}
		err = proto.Unmarshal(ev.Payload, ctx)
		if err != nil {
			return err
		}

		ch, err := access.GetChannel(tx, ctx.ChannelId)
		if err != nil {
			return err
		}

		ch.AddClosingTx(ev)
		if err != nil {
			return err
		}

		access.SetChannel(tx, ch)
		if err != nil {
			return err
		}

		return nil
	})
}
func (a *PeerAPI) AddChannel(ev *wire.Envelope) error {
	var err error
	err = a.DB.Update(func(tx *bolt.Tx) error {

		otx := &wire.OpeningTx{}
		err = proto.Unmarshal(ev.Payload, otx)
		if err != nil {
			return err
		}

		_, nilErr := access.GetChannel(tx, otx.ChannelId)
		if nilErr == nil {
			return errors.New("channel already exists")
		}
		_, ok := nilErr.(*access.NilError)
		if !ok {
			return err
		}

		acct0, err := access.GetAccount(tx, otx.Pubkeys[0])
		if err != nil {
			return err
		}

		acct1, err := access.GetAccount(tx, otx.Pubkeys[1])
		if err != nil {
			return err
		}

		judge, err := access.GetJudge(tx, acct0.Judge.Pubkey)
		if err != nil {
			return err
		}

		ch, err := judge.AddChannel(ev, otx, acct0, acct1)

		access.SetChannel(tx, ch)
		if err != nil {
			return err
		}

		return nil
	})
	if err != nil {
		return err
	}

	return nil
}
// Gets a channel for a peer and sanitizes it to be sent to them.
func (a *PeerAPI) GetChannel(chId string) (*core.Channel, error) {
	var err error
	ch := &core.Channel{}
	err = a.DB.View(func(tx *bolt.Tx) error {
		ch, err = access.GetChannel(tx, chId)
		if err != nil {
			return err
		}

		return nil
	})
	if err != nil {
		return nil, err
	}

	ch.Sanitize()

	return ch, nil
}
func (a *CallerAPI) AcceptChannel(chID string) error {
	var err error
	return a.DB.Update(func(tx *bolt.Tx) error {
		ch := &core.Channel{}
		ch, err = access.GetChannel(tx, chID)
		if err != nil {
			return err
		}

		ch.Judge.AppendSignature(ch.OpeningTxEnvelope)
		ch.Phase = core.OPEN

		access.SetChannel(tx, ch)
		if err != nil {
			return err
		}

		return nil
	})
}
func (a *CallerAPI) CloseChannel(chID string, i int) error {
	var err error
	return a.DB.Update(func(tx *bolt.Tx) error {
		ch := &core.Channel{}
		ch, err = access.GetChannel(tx, chID)
		if err != nil {
			return err
		}

		err = ch.Close(i)
		if err != nil {
			return err
		}

		access.SetChannel(tx, ch)
		if err != nil {
			return err
		}

		return nil
	})
}