-
Notifications
You must be signed in to change notification settings - Fork 12
/
increase_bridgefee.go
78 lines (66 loc) · 2.11 KB
/
increase_bridgefee.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
package crosschain
import (
"errors"
"fmt"
"math/big"
sdkmath "cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/vm"
fxtypes "github.com/functionx/fx-core/v6/types"
"github.com/functionx/fx-core/v6/x/evm/types"
)
// IncreaseBridgeFee add bridge fee to unbatched tx
//
//gocyclo:ignore
func (c *Contract) IncreaseBridgeFee(ctx sdk.Context, evm *vm.EVM, contract *vm.Contract, readonly bool) ([]byte, error) {
if readonly {
return nil, errors.New("increase bridge fee method not readonly")
}
// args
var args IncreaseBridgeFeeArgs
err := types.ParseMethodArgs(IncreaseBridgeFeeMethod, &args, contract.Input[4:])
if err != nil {
return nil, err
}
if c.router == nil {
return nil, errors.New("cross chain router empty")
}
fxTarget := fxtypes.ParseFxTarget(args.Chain)
route, has := c.router.GetRoute(fxTarget.GetTarget())
if !has {
return nil, fmt.Errorf("chain not support: %s", args.Chain)
}
value := contract.Value()
sender := contract.Caller()
crossChainDenom := ""
if value.Cmp(big.NewInt(0)) == 1 && args.Token.String() == fxtypes.EmptyEvmAddress {
if args.Fee.Cmp(value) != 0 {
return nil, errors.New("add bridge fee not equal msg.value")
}
crossChainDenom, err = c.handlerOriginToken(ctx, evm, sender, args.Fee)
if err != nil {
return nil, err
}
} else {
crossChainDenom, err = c.handlerERC20Token(ctx, evm, args.Token, sender, args.Fee)
if err != nil {
return nil, err
}
}
// convert token to bridge fee token
feeCoin := sdk.NewCoin(crossChainDenom, sdkmath.NewIntFromBigInt(args.Fee))
addBridgeFee, err := c.erc20Keeper.ConvertDenomToTarget(ctx, sender.Bytes(), feeCoin, fxTarget)
if err != nil {
return nil, err
}
if err := route.PrecompileIncreaseBridgeFee(ctx, args.TxID.Uint64(), sender.Bytes(), addBridgeFee); err != nil {
return nil, err
}
// add event log
if err := c.AddLog(evm, IncreaseBridgeFeeEvent, []common.Hash{sender.Hash(), args.Token.Hash()},
args.Chain, args.TxID, args.Fee); err != nil {
return nil, err
}
return IncreaseBridgeFeeMethod.Outputs.Pack(true)
}