forked from AstraProtocol/astra
/
msg_server_fund.go
106 lines (84 loc) · 2.94 KB
/
msg_server_fund.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package keeper
import (
"context"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/dungtt-astra/astra/v3/x/channel/types"
)
func (k msgServer) Fund(goCtx context.Context, msg *types.MsgFund) (*types.MsgFundResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
// TODO: Handling the message
_, err := sdk.AccAddressFromBech32(msg.MultisigAddr)
if err != nil {
return nil, err
}
val, found := k.Keeper.GetChannel(ctx, msg.Channelid)
if !found {
return nil, fmt.Errorf("ChannelID %v is not existing", msg.Channelid)
}
if msg.MultisigAddr != val.MultisigAddr {
return nil, fmt.Errorf("Not matching multisig address!")
}
if msg.Creatoraddr != val.PartA && msg.Creatoraddr != val.PartB {
return nil, fmt.Errorf("Not matching any part in this channel!")
}
var partnerAddr, creatorAddr string
if msg.Creatoraddr == val.PartA {
partnerAddr = val.PartB
creatorAddr = val.PartA
} else {
partnerAddr = val.PartA
creatorAddr = val.PartB
}
multisigAddr, err := sdk.AccAddressFromBech32(val.MultisigAddr)
if err != nil {
return nil, err
}
cointoPartner := msg.CointoPartner
coinChannel := k.Keeper.bankKeeper.GetBalance(ctx, multisigAddr, cointoPartner.Denom)
ctx.Logger().Info("@@@@ balance of addr", val.MultisigAddr,
" balance:", coinChannel.Amount.Uint64(), " cointoPartner:", cointoPartner.Amount.Uint64())
// Send to LockTx (other) or HashTx (creator)
if cointoPartner.Amount.IsPositive() {
err = k.Keeper.bankKeeper.SendCoinsFromAccountToModule(ctx, multisigAddr, types.ModuleName, sdk.Coins{*cointoPartner})
if err != nil {
return nil, fmt.Errorf("@@@ SendCoinsFromAccountToModule failed balance of addr: %v, balance: %v", val.MultisigAddr, cointoPartner.Amount.Uint64())
}
}
indexStr := fmt.Sprintf("%s:%s", msg.Channelid, msg.Hashcode)
unlockBlock := msg.Numblock + uint64(ctx.BlockHeight())
commitment := types.Commitment{
Index: indexStr,
MultisigAddr: msg.MultisigAddr,
Creatoraddr: creatorAddr,
Partneraddr: partnerAddr,
Hashcode: msg.Hashcode,
Numblock: unlockBlock,
Cointocreator: nil,
Cointohtlc: cointoPartner,
Channelid: msg.Channelid,
}
k.Keeper.SetCommitment(ctx, commitment)
if creatorAddr != msg.Creatoraddr {
return nil, fmt.Errorf("not matching receiver address! expected: %v", creatorAddr)
}
// Send coin to creator of the funding commitment
to, err := sdk.AccAddressFromBech32(msg.Creatoraddr)
if err != nil {
return nil, err
}
coin_fundside := coinChannel.Sub(*cointoPartner)
if coin_fundside.Amount.IsPositive() {
err = k.bankKeeper.SendCoins(ctx, multisigAddr, to, sdk.Coins{sdk.Coin{coin_fundside.Denom, coin_fundside.Amount}})
if err != nil {
return nil, fmt.Errorf("SendCoins failed balance of addr %v, balance %v, amount %v",
val.MultisigAddr,
coinChannel.Amount.Uint64(),
coin_fundside.Amount.Uint64())
}
}
k.Keeper.RemoveChannel(ctx, msg.Channelid)
return &types.MsgFundResponse{
Id: indexStr,
}, nil
}