-
Notifications
You must be signed in to change notification settings - Fork 0
/
evm_of_prestaking.go
97 lines (81 loc) · 3.06 KB
/
evm_of_prestaking.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
package keeper
import (
"fmt"
sdk "github.com/ci123chain/ci123chain/pkg/abci/types"
"github.com/ci123chain/ci123chain/pkg/gravity/types"
"github.com/ci123chain/ci123chain/pkg/supply/meta"
"github.com/ci123chain/ci123chain/pkg/vm/evmtypes"
"github.com/ethereum/go-ethereum/common"
web3 "github.com/umbracle/go-web3"
"github.com/umbracle/go-web3/abi"
"math"
"math/big"
)
///supply/keeper/evm_of_prestaking.go
const DefaultGas = math.MaxUint64 / 2
// TransferFromModuleToEvmAccount transfers coins from a ModuleAccount to an AccAddress
func (k Keeper) TransferFromModuleToEvmAccount(ctx sdk.Context,
recipientAddr sdk.AccAddress, wlkContract string, amt *big.Int) error {
return k.SendCoinsFromModuleToEVMAccount(ctx, recipientAddr, types.ModuleName, sdk.HexToAddress(wlkContract), amt)
}
// Transfer721FromModuleToEvmAccount transfers coins from a ModuleAccount to an AccAddress
func (k Keeper) Transfer721FromModuleToEvmAccount(ctx sdk.Context,
recipientAddr sdk.AccAddress, wlkContract string, tokenId *big.Int) error {
return k.Send721CoinsFromModuleToEVMAccount(ctx, recipientAddr, types.ModuleName, sdk.HexToAddress(wlkContract), tokenId)
}
func (k Keeper) BuildParams(sender sdk.AccAddress, to *common.Address, payload []byte, gasLimit, nonce uint64) evmtypes.MsgEvmTx {
return evmtypes.MsgEvmTx{
From: sender,
Data: evmtypes.TxData{
Payload: payload,
Amount: big.NewInt(0),
Recipient: to,
GasLimit: gasLimit,
AccountNonce: nonce,
},
}
}
func (k Keeper) BurnEVMCoin(ctx sdk.Context, moduleName string, wlkContract, to sdk.AccAddress, amount *big.Int) error {
from := k.GetModuleAddress(moduleName)
abiIns, err := abi.NewABI(meta.DefaultTokenManagerABI)
if err != nil {
return err
}
m, ok := abiIns.Methods["burn"]
if !ok {
return fmt.Errorf("invalid method")
}
params := []interface{}{web3.HexToAddress(to.Address.String()), amount}
data, err := abi.Encode(params, m.Inputs)
data = append(m.ID(), data...)
ctx = ctx.WithIsRootMsg(true)
msg := k.BuildParams(from, &wlkContract.Address, data, DefaultGas, k.getNonce(ctx, from))
result, err := k.evmKeeper.EvmTxExec(ctx, msg)
k.Logger(ctx).Info("Burn action result", "value", result)
return err
}
func (k Keeper) Mint(ctx sdk.Context, contract, to sdk.AccAddress, moduleName string, amount *big.Int) error {
sender := k.GetModuleAddress(moduleName)
fmt.Println(sender.String())
abiIns, err := abi.NewABI(meta.DefaultTokenManagerABI)
if err != nil {
return err
}
m, ok := abiIns.Methods["mint"]
if !ok {
return fmt.Errorf("invalid method")
}
params := []interface{}{web3.HexToAddress(to.Address.String()), amount}
data, err := abi.Encode(params, m.Inputs)
data = append(m.ID(), data...)
ctx = ctx.WithIsRootMsg(true)
msg := k.BuildParams(sender, &contract.Address, data, DefaultGas, k.getNonce(ctx, sender))
_, err = k.evmKeeper.EvmTxExec(ctx, msg)
if err != nil {
k.Logger(ctx).Error("Mint action result", "error", err.Error())
}
return err
}
func (k Keeper) getNonce(ctx sdk.Context, address sdk.AccAddress) uint64 {
return k.ak.GetAccount(ctx, address).GetSequence()
}