frostfs-node/pkg/innerring/processors/neofs/process_assets.go
Stanislav Bogatyrev b7b5079934 Add Inner Ring code
2020-07-24 17:07:37 +03:00

104 lines
3.1 KiB
Go

package neofs
import (
"github.com/nspcc-dev/neo-go/pkg/util"
"github.com/nspcc-dev/neofs-node/pkg/innerring/invoke"
neofsEvent "github.com/nspcc-dev/neofs-node/pkg/morph/event/neofs"
"go.uber.org/zap"
)
const (
// txLogPrefix used for balance transfer comments in balance contract.
txLogPrefix = "mainnet:"
// lockAccountLifeTime defines amount of epochs when lock account is valid.
lockAccountLifetime uint64 = 20
)
var (
// fedReserveAddr is a special account in balance contract.
fedReserveAddr = []byte{0x0F, 0xED}
)
// Process deposit event by invoking balance contract and sending native
// gas in morph chain.
func (np *Processor) processDeposit(deposit *neofsEvent.Deposit) {
if !np.activeState.IsActive() {
np.log.Info("passive mode, ignore deposit")
return
}
// send transferX to balance contract
err := invoke.TransferBalanceX(np.morphClient, np.balanceContract,
&invoke.TransferXParams{
Sender: fedReserveAddr,
Receiver: deposit.To().BytesBE(),
Amount: deposit.Amount() * 1_0000_0000, // from Fixed8 to Fixed16
Comment: append([]byte(txLogPrefix), deposit.ID()...),
})
if err != nil {
np.log.Error("can't transfer assets to balance contract", zap.Error(err))
}
// fixme: send gas when ^ tx accepted
// fixme: do not send gas to the same user twice per epoch
err = np.morphClient.TransferGas(deposit.To(), util.Fixed8FromInt64(2))
if err != nil {
np.log.Error("can't transfer native gas to receiver", zap.Error(err))
}
}
// Process withdraw event by locking assets in balance account.
func (np *Processor) processWithdraw(withdraw *neofsEvent.Withdraw) {
if !np.activeState.IsActive() {
np.log.Info("passive mode, ignore withdraw")
return
}
if len(withdraw.ID()) < util.Uint160Size {
np.log.Error("tx id size is less than script hash size")
return
}
// create lock account
// todo: check collision there, consider reversed script hash
lock, err := util.Uint160DecodeBytesBE(withdraw.ID()[:util.Uint160Size])
if err != nil {
np.log.Error("can't create lock account", zap.Error(err))
return
}
curEpoch := np.epochState.EpochCounter()
err = invoke.LockAsset(np.morphClient, np.balanceContract,
&invoke.LockParams{
ID: withdraw.ID(),
User: withdraw.User(),
LockAccount: lock,
Amount: withdraw.Amount() * 1_0000_0000, // todo: from Fixed8 to Fixed16
Until: curEpoch + lockAccountLifetime,
})
if err != nil {
np.log.Error("can't lock assets for withdraw", zap.Error(err))
}
}
// Process cheque event by transferring assets from lock account back to
// reserve account.
func (np *Processor) processCheque(cheque *neofsEvent.Cheque) {
if !np.activeState.IsActive() {
np.log.Info("passive mode, ignore cheque")
return
}
err := invoke.TransferBalanceX(np.morphClient, np.balanceContract,
&invoke.TransferXParams{
Sender: cheque.LockAccount().BytesBE(),
Receiver: fedReserveAddr,
Amount: cheque.Amount() * 1_0000_0000, // from Fixed8 to Fixed16
Comment: append([]byte(txLogPrefix), cheque.ID()...),
})
if err != nil {
np.log.Error("can't transfer assets to fed contract", zap.Error(err))
}
}