Skip to content

kaiax/gasless: fix gasless initialization, add gasless info api #297

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions kaiax/gasless/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
var (
AllowedTokensFlag = &cli.StringSliceFlag{
Name: "gasless.allowed-tokens",
Usage: "allow token addresses for gasless module, default is all",
Usage: "allow token addresses for gasless module, allow all tokens if all",
Value: cli.NewStringSlice("all"),
Aliases: []string{"genesis.module.gasless.allowed-tokens"},
}
Expand All @@ -43,12 +43,15 @@ type GaslessConfig struct {
}

func GetGaslessConfig(ctx *cli.Context) *GaslessConfig {
allowedTokens := []common.Address{}
allowedTokens := []common.Address(nil)
for _, addr := range ctx.StringSlice(AllowedTokensFlag.Name) {
if addr == "all" {
allowedTokens = nil
break
}
if allowedTokens == nil {
allowedTokens = []common.Address{}
}
allowedTokens = append(allowedTokens, common.HexToAddress(addr))
}
return &GaslessConfig{
Expand Down
19 changes: 19 additions & 0 deletions kaiax/gasless/impl/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"fmt"

"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
"github.com/kaiachain/kaia/common/hexutil"
"github.com/kaiachain/kaia/networks/rpc"
"github.com/kaiachain/kaia/rlp"
Expand Down Expand Up @@ -144,3 +145,21 @@ func (s *GaslessAPI) IsGaslessTx(ctx context.Context, rawTxs []hexutil.Bytes) *G
Reason: fmt.Sprintf("expected 1 or 2 transactions, got %d", len(txs)),
}
}

type GaslessInfoResult struct {
IsDisabled bool `json:"isDisabled"`
SwapRouter common.Address `json:"swapRouter"`
AllowedTokens []common.Address `json:"allowedTokens"`
}

func (s *GaslessAPI) GaslessInfo() *GaslessInfoResult {
at := []common.Address{}
for addr := range s.b.allowedTokens {
at = append(at, addr)
}
return &GaslessInfoResult{
IsDisabled: s.b.IsDisabled(),
SwapRouter: s.b.swapRouter,
AllowedTokens: at,
}
}
13 changes: 6 additions & 7 deletions kaiax/gasless/impl/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"testing"

"github.com/kaiachain/kaia/accounts/abi/bind/backends"
"github.com/kaiachain/kaia/blockchain/state"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
"github.com/kaiachain/kaia/common/hexutil"
Expand Down Expand Up @@ -76,20 +75,20 @@ func TestGaslessAPI_isGaslessTx(t *testing.T) {
routerAddr := common.HexToAddress("0x1234")
differentTokenAddr := common.HexToAddress("0xdead1234dead1234dead1234dead1234dead1234")

// Create a simulated backend for testing
dbm := database.NewMemoryDBManager()
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(dbm, alloc, testChainConfig)

// Setup test stateDB with a proper database
stateDB, _ := state.New(common.Hash{}, state.NewDatabase(database.NewMemoryDBManager()), nil, nil)
stateDB, _ := backend.BlockChain().State()
stateDB.SetNonce(sender, 0) // For approve tx

// Create mock txpool
txpool := &testTxPool{
statedb: stateDB,
}

// Create a simulated backend for testing
dbm := database.NewMemoryDBManager()
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(dbm, alloc, testChainConfig)

// Create and initialize GaslessModule
gaslessModule := NewGaslessModule()
nodeKey, _ := crypto.GenerateKey()
Expand Down
3 changes: 1 addition & 2 deletions kaiax/gasless/impl/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"testing"

"github.com/kaiachain/kaia/accounts/abi/bind/backends"
"github.com/kaiachain/kaia/blockchain/state"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
"github.com/kaiachain/kaia/crypto"
Expand All @@ -36,9 +35,9 @@ func TestExtractTxBundles(t *testing.T) {

g := NewGaslessModule()
dbm := database.NewMemoryDBManager()
sdb, _ := state.New(common.Hash{}, state.NewDatabase(dbm), nil, nil)
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(dbm, alloc, testChainConfig)
sdb, _ := backend.BlockChain().State()
nodeKey, _ := crypto.GenerateKey()
err := g.Init(&InitOpts{
ChainConfig: testChainConfig,
Expand Down
2 changes: 1 addition & 1 deletion kaiax/gasless/impl/execution.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ import (
var _ kaiax.ExecutionModule = (*GaslessModule)(nil)

func (g *GaslessModule) PostInsertBlock(block *types.Block) error {
return g.updateAddresses(block.Number())
return g.updateAddresses(block.Header())
}
18 changes: 6 additions & 12 deletions kaiax/gasless/impl/getter.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package impl

import (
"bytes"
"context"
"fmt"
"math/big"
"strings"
Expand All @@ -29,7 +28,6 @@ import (
"github.com/kaiachain/kaia/blockchain/system"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
contracts "github.com/kaiachain/kaia/contracts/contracts/system_contracts/multicall"
"github.com/kaiachain/kaia/crypto"
"github.com/kaiachain/kaia/kaiax/builder"
"github.com/kaiachain/kaia/kaiax/gasless"
Expand Down Expand Up @@ -298,8 +296,8 @@ func (g *GaslessModule) GetLendTxGenerator(approveTxOrNil, swapTx *types.Transac
return builder.NewTxOrGenFromGen(gen, bundleHash)
}

func (g *GaslessModule) updateAddresses(blockNumber *big.Int) error {
swapRouter, tokens, err := getGaslessInfo(g.Chain, blockNumber)
func (g *GaslessModule) updateAddresses(header *types.Header) error {
swapRouter, tokens, err := getGaslessInfo(g.Chain, header)
// proceed even if there is something wrong with multicall contract
if err != nil {
g.swapRouter = common.Address{}
Expand Down Expand Up @@ -349,22 +347,18 @@ func repayAmount(approveTxOrNil, swapTx *types.Transaction) *big.Int {
return new(big.Int).Add(r1, lendAmount(approveTxOrNil, swapTx))
}

func getGaslessInfo(bc backends.BlockChainForCaller, blockNumber *big.Int) (common.Address, []common.Address, error) {
backend := backends.NewBlockchainContractBackend(bc, nil, nil)
code, err := backend.CodeAt(context.Background(), system.MultiCallAddr, blockNumber)
func getGaslessInfo(bc backends.BlockChainForCaller, header *types.Header) (common.Address, []common.Address, error) {
statedb, err := bc.StateAt(header.Root)
if err != nil {
return common.Address{}, nil, err
}
if code == nil {
return common.Address{}, nil, ErrGSRNotInstalled
}

caller, err := contracts.NewMultiCallContractCaller(system.MultiCallAddr, backend)
caller, err := system.NewMultiCallContractCaller(statedb, bc, header)
if err != nil {
return common.Address{}, nil, err
}

opts := &bind.CallOpts{BlockNumber: blockNumber}
opts := &bind.CallOpts{BlockNumber: header.Number}
info, err := caller.MultiCallGaslessInfo(opts)

return info.Gsr, info.Tokens, err
Expand Down
5 changes: 2 additions & 3 deletions kaiax/gasless/impl/getter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (

"github.com/kaiachain/kaia/accounts/abi/bind/backends"
"github.com/kaiachain/kaia/blockchain"
"github.com/kaiachain/kaia/blockchain/state"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
"github.com/kaiachain/kaia/crypto"
Expand Down Expand Up @@ -137,8 +136,8 @@ func TestIsExecutable(t *testing.T) {
db := database.NewMemoryDBManager()
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(db, alloc, testChainConfig)
sdb, _ := backend.BlockChain().State()
key, _ := crypto.GenerateKey()
sdb, _ := state.New(common.Hash{}, state.NewDatabase(database.NewMemoryDBManager()), nil, nil)
err := g.Init(&InitOpts{
ChainConfig: testChainConfig,
GaslessConfig: testGaslessConfig,
Expand Down Expand Up @@ -216,7 +215,7 @@ func TestGetLendTxGenerator(t *testing.T) {
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(db, alloc, testChainConfig)
nodekey, _ := crypto.GenerateKey()
sdb, _ := state.New(common.Hash{}, state.NewDatabase(database.NewMemoryDBManager()), nil, nil)
sdb, _ := backend.BlockChain().State()
sdb.SetBalance(crypto.PubkeyToAddress(nodekey.PublicKey), new(big.Int).SetUint64(params.KAIA))

testTxPoolConfig := blockchain.DefaultTxPoolConfig
Expand Down
2 changes: 1 addition & 1 deletion kaiax/gasless/impl/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (g *GaslessModule) Init(opts *InitOpts) error {
g.InitOpts = *opts
g.signer = types.LatestSignerForChainID(g.ChainConfig.ChainID)

return g.updateAddresses(g.Chain.CurrentBlock().Number())
return g.updateAddresses(g.Chain.CurrentBlock().Header())
}

func (g *GaslessModule) IsDisabled() bool {
Expand Down
7 changes: 3 additions & 4 deletions kaiax/gasless/impl/tx_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (

"github.com/kaiachain/kaia/accounts/abi/bind/backends"
"github.com/kaiachain/kaia/blockchain"
"github.com/kaiachain/kaia/blockchain/state"
"github.com/kaiachain/kaia/blockchain/types"
"github.com/kaiachain/kaia/common"
"github.com/kaiachain/kaia/common/hexutil"
Expand Down Expand Up @@ -81,9 +80,9 @@ func TestIsReady(t *testing.T) {
log.EnableLogForTest(log.LvlTrace, log.LvlTrace)

dbm := database.NewMemoryDBManager()
sdb, _ := state.New(common.Hash{}, state.NewDatabase(dbm), nil, nil)
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(dbm, alloc, testChainConfig)
sdb, _ := backend.BlockChain().State()
nodeKey, _ := crypto.GenerateKey()

privkey, _ := crypto.GenerateKey()
Expand Down Expand Up @@ -217,7 +216,7 @@ func TestPromoteGaslessTxsWithSingleSender(t *testing.T) {
dbm := database.NewMemoryDBManager()
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(dbm, alloc, testChainConfig)
sdb, _ := state.New(common.Hash{}, state.NewDatabase(dbm), nil, nil)
sdb, _ := backend.BlockChain().State()
nodeKey, _ := crypto.GenerateKey()

userKey, err := crypto.GenerateKey()
Expand Down Expand Up @@ -396,7 +395,7 @@ func TestPromoteGaslessTxsWithMultiSenders(t *testing.T) {
dbm := database.NewMemoryDBManager()
alloc := testAllocStorage()
backend := backends.NewSimulatedBackendWithDatabase(dbm, alloc, testChainConfig)
sdb, _ := state.New(common.Hash{}, state.NewDatabase(dbm), nil, nil)
sdb, _ := backend.BlockChain().State()
nodeKey, _ := crypto.GenerateKey()

key1, _ := crypto.GenerateKey()
Expand Down