Skip to content
This repository has been archived by the owner on Nov 16, 2022. It is now read-only.

Add unbonding and redelegation table #2169

Merged
merged 14 commits into from Jul 7, 2020
1 change: 1 addition & 0 deletions CHANGELOG_UNRELEASED.md
Expand Up @@ -14,6 +14,7 @@

### Emitter & Flusher

- (impv) [\#2169](https://github.com/bandprotocol/bandchain/pull/2169) Add unbonding and redelegation table.
- (impv) [\#2160](https://github.com/bandprotocol/bandchain/pull/2160) Add missing foreign key in report table.

### Scan
Expand Down
6 changes: 4 additions & 2 deletions chain/emitter/handler.go
Expand Up @@ -47,9 +47,9 @@ func (app *App) handleMsg(txHash []byte, msg sdk.Msg, log sdk.ABCIMessageLog, ex
case staking.MsgDelegate:
app.handleMsgDelegate(msg)
case staking.MsgUndelegate:
app.handleMsgUndelegate(msg)
app.handleMsgUndelegate(txHash, msg, evMap, extra)
case staking.MsgBeginRedelegate:
app.handleMsgBeginRedelegate(msg)
app.handleMsgBeginRedelegate(txHash, msg, evMap, extra)
case bank.MsgSend:
app.handleMsgSend(msg)
case bank.MsgMultiSend:
Expand All @@ -69,6 +69,8 @@ func (app *App) handleBeginBlockEndBlockEvent(event abci.Event) {
app.handleEventRequestExecute(evMap)
case slashing.EventTypeSlash:
app.handleEventSlash(evMap)
case EventTypeCompleteUnbonding:
app.handleEventTypeCompleteUnbonding(evMap)
default:
break
}
Expand Down
42 changes: 40 additions & 2 deletions chain/emitter/staking.go
@@ -1,8 +1,15 @@
package emitter

import (
"time"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/staking"
types "github.com/cosmos/cosmos-sdk/x/staking/types"
)

var (
EventTypeCompleteUnbonding = types.EventTypeCompleteUnbonding
)

func (app *App) emitSetValidator(addr sdk.ValAddress) {
Expand Down Expand Up @@ -80,13 +87,44 @@ func (app *App) handleMsgDelegate(msg staking.MsgDelegate) {
}

// handleMsgUndelegate implements emitter handler for MsgUndelegate
func (app *App) handleMsgUndelegate(msg staking.MsgUndelegate) {
func (app *App) handleMsgUndelegate(
txHash []byte, msg staking.MsgUndelegate, evMap EvMap, extra JsDict,
) {
app.emitUpdateValidatorAndDelegation(msg.ValidatorAddress, msg.DelegatorAddress)
app.emitUnbondingDelegation(msg, evMap)
}

func (app *App) emitUnbondingDelegation(msg staking.MsgUndelegate, evMap EvMap) {
completeTime, _ := time.Parse(time.RFC3339, evMap[types.EventTypeUnbond+"."+types.AttributeKeyCompletionTime][0])
app.Write("NEW_UNBONDING_DELEGATION", JsDict{
"delegator_address": msg.DelegatorAddress,
"operator_address": msg.ValidatorAddress,
"creation_height": app.DeliverContext.BlockHeight(),
"completion_time": completeTime.UnixNano(),
"amount": evMap[types.EventTypeUnbond+"."+sdk.AttributeKeyAmount][0],
})
}

// handleMsgBeginRedelegate implements emitter handler for MsgBeginRedelegate
func (app *App) handleMsgBeginRedelegate(msg staking.MsgBeginRedelegate) {
func (app *App) handleMsgBeginRedelegate(
txHash []byte, msg staking.MsgBeginRedelegate, evMap EvMap, extra JsDict,
) {
app.emitUpdateValidatorAndDelegation(msg.ValidatorSrcAddress, msg.DelegatorAddress)
app.emitUpdateValidatorAndDelegation(msg.ValidatorDstAddress, msg.DelegatorAddress)
app.emitUpdateRedelation(msg.ValidatorSrcAddress, msg.ValidatorDstAddress, msg.DelegatorAddress, evMap)
}

func (app *App) emitUpdateRedelation(operatorSrcAddress sdk.ValAddress, operatorDstAddress sdk.ValAddress, delegatorAddress sdk.AccAddress, evMap EvMap) {
completeTime, _ := time.Parse(time.RFC3339, evMap[types.EventTypeRedelegate+"."+types.AttributeKeyCompletionTime][0])
app.Write("NEW_REDELEGATION", JsDict{
"delegator_address": delegatorAddress.String(),
"operator_src_address": operatorSrcAddress.String(),
"operator_dst_address": operatorDstAddress.String(),
"completion_time": completeTime.UnixNano(),
"amount": evMap[types.EventTypeRedelegate+"."+sdk.AttributeKeyAmount][0],
})
}

func (app *App) handleEventTypeCompleteUnbonding(evMap EvMap) {
// TODO: update delegator account
}
22 changes: 21 additions & 1 deletion flusher/flusher/db.py
Expand Up @@ -190,7 +190,7 @@ def Column(*args, **kwargs):
Column("commission_max_change", sa.String),
Column("min_self_delegation", sa.String),
Column("jailed", sa.Boolean),
Column("tokens", sa.Integer),
Column("tokens", sa.DECIMAL),
Column("delegator_shares", sa.DECIMAL),
Column("current_reward", sa.DECIMAL),
Column("current_ratio", sa.DECIMAL),
Expand Down Expand Up @@ -222,3 +222,23 @@ def Column(*args, **kwargs):
Column("block_height", sa.Integer, sa.ForeignKey("blocks.height"), primary_key=True),
Column("voted", sa.Boolean),
)

unbonding_delegations = sa.Table(
"unbonding_delegations",
metadata,
Column("delegator_address", sa.String, sa.ForeignKey("accounts.address")),
Column("operator_address", sa.String, sa.ForeignKey("validators.operator_address")),
Column("creation_height", sa.Integer, sa.ForeignKey("blocks.height")),
Column("completion_time", CustomDateTime),
Column("amount", sa.DECIMAL),
)

redelegations = sa.Table(
"redelegations",
metadata,
Column("delegator_address", sa.String, sa.ForeignKey("accounts.address")),
Column("operator_src_address", sa.String, sa.ForeignKey("validators.operator_address")),
Column("operator_dst_address", sa.String, sa.ForeignKey("validators.operator_address")),
Column("completion_time", CustomDateTime),
Column("amount", sa.DECIMAL),
)
8 changes: 8 additions & 0 deletions flusher/flusher/handler.py
Expand Up @@ -16,6 +16,8 @@
validators,
delegations,
validator_votes,
unbonding_delegations,
redelegations,
)


Expand Down Expand Up @@ -99,3 +101,9 @@ def handle_remove_delegation(self, msg):

def handle_new_validator_vote(self, msg):
self.conn.execute(insert(validator_votes).values(**msg))

def handle_new_unbonding_delegation(self, msg):
self.conn.execute(insert(unbonding_delegations).values(**msg))

def handle_new_redelegation(self, msg):
self.conn.execute(insert(redelegations).values(**msg))