Skip to content

Commit

Permalink
Send dynamic fee transactions to a rootchain (#1795)
Browse files Browse the repository at this point in the history
* Create dynamic fee tx for checkpoint submission

* Update ethgo dependency

* Remove not needed sender set and set it if not set from the outside

* Set DynamicFeeTx type for the current checkpoint

* Set the chain id to transaction

* If transaction is not supported, downgrade to legacy tx and resend it

* Simplify checkpoint manager

* Use dynamic fee tx in exit command

* Upgrade ethgo dependency

* Use dynamic fee tx for (most of) the rootchain transactions

* Add comment to calcTxHash

* Minor update

* Each rootchain tx is dynamic fee tx

* Increase max priority fee and max fee per gas by 20%

* Fix compensation calculation

* Check whether error contains TxTypeNotSupported
  • Loading branch information
Stefan-Ethernal committed Aug 15, 2023
1 parent c860c52 commit 6862b7d
Show file tree
Hide file tree
Showing 27 changed files with 183 additions and 188 deletions.
20 changes: 6 additions & 14 deletions command/bridge/deposit/erc1155/deposit_erc1155.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,11 +261,8 @@ func createDepositTxn(sender ethgo.Address, receivers []ethgo.Address,

addr := ethgo.Address(types.StringToAddress(dp.PredicateAddr))

return &ethgo.Transaction{
From: sender,
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(sender, &addr, input,
nil, !dp.ChildChainMintable), nil
}

// createMintTxn encodes parameters for mint function on rootchain token contract
Expand All @@ -283,11 +280,8 @@ func createMintTxn(sender, receiver types.Address, amounts, tokenIDs []*big.Int)

addr := ethgo.Address(types.StringToAddress(dp.TokenAddr))

return &ethgo.Transaction{
From: ethgo.Address(sender),
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.Address(sender), &addr,
input, nil, !dp.ChildChainMintable), nil
}

// createApproveERC1155PredicateTxn sends approve transaction
Expand All @@ -306,8 +300,6 @@ func createApproveERC1155PredicateTxn(rootERC1155Predicate,

addr := ethgo.Address(rootERC1155Token)

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.ZeroAddress, &addr,
input, nil, !dp.ChildChainMintable), nil
}
13 changes: 6 additions & 7 deletions command/bridge/deposit/erc20/deposit_erc20.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func runCommand(cmd *cobra.Command, _ []string) {

// mint tokens to depositor, so he is able to send them
mintTxn, err := helper.CreateMintTxn(types.Address(depositorAddr),
types.StringToAddress(dp.TokenAddr), aggregateAmount)
types.StringToAddress(dp.TokenAddr), aggregateAmount, !dp.ChildChainMintable)
if err != nil {
outputter.SetError(fmt.Errorf("mint transaction creation failed: %w", err))

Expand All @@ -147,7 +147,9 @@ func runCommand(cmd *cobra.Command, _ []string) {
// approve erc20 predicate
approveTxn, err := helper.CreateApproveERC20Txn(aggregateAmount,
types.StringToAddress(dp.PredicateAddr),
types.StringToAddress(dp.TokenAddr))
types.StringToAddress(dp.TokenAddr),
!dp.ChildChainMintable,
)
if err != nil {
outputter.SetError(fmt.Errorf("failed to create root erc 20 approve transaction: %w", err))

Expand Down Expand Up @@ -277,9 +279,6 @@ func createDepositTxn(sender, receiver types.Address, amount *big.Int) (*ethgo.T

addr := ethgo.Address(types.StringToAddress(dp.PredicateAddr))

return &ethgo.Transaction{
From: ethgo.Address(sender),
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.Address(sender), &addr,
input, nil, !dp.ChildChainMintable), nil
}
19 changes: 5 additions & 14 deletions command/bridge/deposit/erc721/deposit_erc721.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,11 +234,7 @@ func createDepositTxn(sender ethgo.Address,

addr := ethgo.Address(types.StringToAddress(dp.PredicateAddr))

return &ethgo.Transaction{
From: sender,
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(sender, &addr, input, nil, !dp.ChildChainMintable), nil
}

// createMintTxn encodes parameters for mint function on rootchain token contract
Expand All @@ -254,11 +250,8 @@ func createMintTxn(sender, receiver types.Address) (*ethgo.Transaction, error) {

addr := ethgo.Address(types.StringToAddress(dp.TokenAddr))

return &ethgo.Transaction{
From: ethgo.Address(sender),
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.Address(sender), &addr,
input, nil, !dp.ChildChainMintable), nil
}

// createApproveERC721PredicateTxn sends approve transaction
Expand All @@ -275,8 +268,6 @@ func createApproveERC721PredicateTxn(rootERC721Predicate, rootERC721Token types.

addr := ethgo.Address(rootERC721Token)

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.ZeroAddress, &addr, input,
nil, !dp.ChildChainMintable), nil
}
8 changes: 2 additions & 6 deletions command/bridge/exit/exit.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,8 @@ func createExitTxn(sender ethgo.Address, proof types.Proof) (*ethgo.Transaction,
}

exitHelperAddr := ethgo.Address(types.StringToAddress(ep.exitHelperAddrRaw))
txn := &ethgo.Transaction{
From: sender,
To: &exitHelperAddr,
Input: input,
Gas: txrelayer.DefaultGasLimit,
}
txn := helper.CreateTransaction(sender, &exitHelperAddr, input, nil, true)
txn.Gas = txrelayer.DefaultGasLimit

return txn, exitEvent, err
}
Expand Down
7 changes: 3 additions & 4 deletions command/bridge/withdraw/erc1155/withdraw_erc1155.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

"github.com/0xPolygon/polygon-edge/command"
"github.com/0xPolygon/polygon-edge/command/bridge/common"
"github.com/0xPolygon/polygon-edge/command/rootchain/helper"
"github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi"
"github.com/0xPolygon/polygon-edge/contracts"
helperCommon "github.com/0xPolygon/polygon-edge/helper/common"
Expand Down Expand Up @@ -187,8 +188,6 @@ func createWithdrawTxn(receivers []ethgo.Address, amounts, TokenIDs []*big.Int)

addr := ethgo.Address(types.StringToAddress(wp.PredicateAddr))

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.ZeroAddress, &addr, input,
nil, wp.ChildChainMintable), nil
}
7 changes: 3 additions & 4 deletions command/bridge/withdraw/erc20/withdraw_erc20.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/0xPolygon/polygon-edge/command"
"github.com/0xPolygon/polygon-edge/command/bridge/common"
"github.com/0xPolygon/polygon-edge/command/rootchain/helper"
"github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi"
"github.com/0xPolygon/polygon-edge/contracts"
helperCommon "github.com/0xPolygon/polygon-edge/helper/common"
Expand Down Expand Up @@ -165,8 +166,6 @@ func createWithdrawTxn(receiver types.Address, amount *big.Int) (*ethgo.Transact

addr := ethgo.Address(types.StringToAddress(wp.PredicateAddr))

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.ZeroAddress, &addr, input,
nil, wp.ChildChainMintable), nil
}
7 changes: 3 additions & 4 deletions command/bridge/withdraw/erc721/withdraw_erc721.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/0xPolygon/polygon-edge/command"
"github.com/0xPolygon/polygon-edge/command/bridge/common"
"github.com/0xPolygon/polygon-edge/command/rootchain/helper"
"github.com/0xPolygon/polygon-edge/consensus/polybft/contractsapi"
"github.com/0xPolygon/polygon-edge/contracts"
helperCommon "github.com/0xPolygon/polygon-edge/helper/common"
Expand Down Expand Up @@ -165,8 +166,6 @@ func createWithdrawTxn(receivers []ethgo.Address, tokenIDs []*big.Int) (*ethgo.T

addr := ethgo.Address(types.StringToAddress(wp.PredicateAddr))

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return helper.CreateTransaction(ethgo.ZeroAddress, &addr, input,
nil, wp.ChildChainMintable), nil
}
7 changes: 2 additions & 5 deletions command/rootchain/deploy/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -411,8 +411,8 @@ func deployContracts(outputter command.OutputFormatter, client *jsonrpc.Client,

if params.isTestMode {
deployerAddr := deployerKey.Address()
txn := &ethgo.Transaction{To: &deployerAddr, Value: ethgo.Ether(1)}

txn := helper.CreateTransaction(ethgo.ZeroAddress, &deployerAddr, nil, ethgo.Ether(1), true)
if _, err = txRelayer.SendTransactionLocal(txn); err != nil {
return deploymentResultInfo{RootchainCfg: nil, SupernetID: 0, CommandResults: nil}, err
}
Expand Down Expand Up @@ -524,10 +524,7 @@ func deployContracts(outputter command.OutputFormatter, client *jsonrpc.Client,
case <-ctx.Done():
return ctx.Err()
default:
txn := &ethgo.Transaction{
To: nil, // contract deployment
Input: contract.artifact.Bytecode,
}
txn := helper.CreateTransaction(ethgo.ZeroAddress, nil, contract.artifact.Bytecode, nil, true)

receipt, err := txRelayer.SendTransaction(txn, deployerKey)
if err != nil {
Expand Down
7 changes: 2 additions & 5 deletions command/rootchain/fund/fund.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,7 @@ func runCommand(cmd *cobra.Command, _ []string) {
default:
validatorAddr := types.StringToAddress(params.addresses[i])
fundAddr := ethgo.Address(validatorAddr)
txn := &ethgo.Transaction{
To: &fundAddr,
Value: params.amountValues[i],
}
txn := helper.CreateTransaction(ethgo.ZeroAddress, &fundAddr, nil, params.amountValues[i], true)

var receipt *ethgo.Receipt

Expand All @@ -141,7 +138,7 @@ func runCommand(cmd *cobra.Command, _ []string) {

if params.mintStakeToken {
// mint tokens to validator, so he is able to send them
mintTxn, err := helper.CreateMintTxn(validatorAddr, stakeTokenAddr, params.amountValues[i])
mintTxn, err := helper.CreateMintTxn(validatorAddr, stakeTokenAddr, params.amountValues[i], true)
if err != nil {
return fmt.Errorf("failed to create mint native tokens transaction for validator '%s'. err: %w",
validatorAddr, err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,8 @@ func GetValidatorInfo(validatorAddr ethgo.Address, supernetManagerAddr, stakeMan
}

// CreateMintTxn encodes parameters for mint function on rootchain token contract
func CreateMintTxn(receiver, erc20TokenAddr types.Address, amount *big.Int) (*ethgo.Transaction, error) {
func CreateMintTxn(receiver, erc20TokenAddr types.Address,
amount *big.Int, rootchainTx bool) (*ethgo.Transaction, error) {
mintFn := &contractsapi.MintRootERC20Fn{
To: receiver,
Amount: amount,
Expand All @@ -227,17 +228,15 @@ func CreateMintTxn(receiver, erc20TokenAddr types.Address, amount *big.Int) (*et
}

addr := ethgo.Address(erc20TokenAddr)
txn := CreateTransaction(ethgo.ZeroAddress, &addr, input, nil, rootchainTx)

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return txn, nil
}

// CreateApproveERC20Txn sends approve transaction
// to ERC20 token for spender so that it is able to spend given tokens
func CreateApproveERC20Txn(amount *big.Int,
spender, erc20TokenAddr types.Address) (*ethgo.Transaction, error) {
spender, erc20TokenAddr types.Address, rootchainTx bool) (*ethgo.Transaction, error) {
approveFnParams := &contractsapi.ApproveRootERC20Fn{
Spender: spender,
Amount: amount,
Expand All @@ -250,19 +249,13 @@ func CreateApproveERC20Txn(amount *big.Int,

addr := ethgo.Address(erc20TokenAddr)

return &ethgo.Transaction{
To: &addr,
Input: input,
}, nil
return CreateTransaction(ethgo.ZeroAddress, &addr, input, nil, rootchainTx), nil
}

// SendTransaction sends provided transaction
func SendTransaction(txRelayer txrelayer.TxRelayer, addr ethgo.Address, input []byte, contractName string,
deployerKey ethgo.Key) (*ethgo.Receipt, error) {
txn := &ethgo.Transaction{
To: &addr,
Input: input,
}
txn := CreateTransaction(ethgo.ZeroAddress, &addr, input, nil, true)

receipt, err := txRelayer.SendTransaction(txn, deployerKey)
if err != nil {
Expand All @@ -276,3 +269,22 @@ func SendTransaction(txRelayer txrelayer.TxRelayer, addr ethgo.Address, input []

return receipt, nil
}

// CreateTransaction is a helper function that creates either dynamic fee or legacy transaction based on provided flag
func CreateTransaction(sender ethgo.Address, receiver *ethgo.Address,
input []byte, value *big.Int, isDynamicFee bool) *ethgo.Transaction {
txn := &ethgo.Transaction{
From: sender,
To: receiver,
Input: input,
Value: value,
}

if isDynamicFee {
txn.Type = ethgo.TransactionDynamicFee
} else {
txn.Type = ethgo.TransactionLegacy
}

return txn
}
5 changes: 1 addition & 4 deletions command/rootchain/registration/register_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,7 @@ func registerValidator(sender txrelayer.TxRelayer, account *wallet.Account,
}

supernetAddr := ethgo.Address(types.StringToAddress(params.supernetManagerAddress))
txn := &ethgo.Transaction{
Input: input,
To: &supernetAddr,
}
txn := rootHelper.CreateTransaction(ethgo.ZeroAddress, &supernetAddr, input, nil, true)

return sender.SendTransaction(txn, account.Ecdsa)
}
8 changes: 4 additions & 4 deletions command/rootchain/staking/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ func (sp *stakeParams) validateFlags() (err error) {
}

type stakeResult struct {
validatorAddress string `json:"validatorAddress"`
amount *big.Int `json:"amount"`
ValidatorAddress string `json:"validatorAddress"`
Amount *big.Int `json:"amount"`
}

func (sr stakeResult) GetOutput() string {
Expand All @@ -47,8 +47,8 @@ func (sr stakeResult) GetOutput() string {
buffer.WriteString("\n[VALIDATOR STAKE]\n")

vals := make([]string, 0, 2)
vals = append(vals, fmt.Sprintf("Validator Address|%s", sr.validatorAddress))
vals = append(vals, fmt.Sprintf("Amount Staked|%d", sr.amount))
vals = append(vals, fmt.Sprintf("Validator Address|%s", sr.ValidatorAddress))
vals = append(vals, fmt.Sprintf("Amount Staked|%d", sr.Amount))

buffer.WriteString(helper.FormatKV(vals))
buffer.WriteString("\n")
Expand Down
15 changes: 6 additions & 9 deletions command/rootchain/staking/stake.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func runCommand(cmd *cobra.Command, _ []string) error {
}

approveTxn, err := rootHelper.CreateApproveERC20Txn(params.amountValue,
types.StringToAddress(params.stakeManagerAddr), types.StringToAddress(params.stakeTokenAddr))
types.StringToAddress(params.stakeManagerAddr), types.StringToAddress(params.stakeTokenAddr), true)
if err != nil {
return err
}
Expand All @@ -128,11 +128,8 @@ func runCommand(cmd *cobra.Command, _ []string) error {
}

stakeManagerAddr := ethgo.Address(types.StringToAddress(params.stakeManagerAddr))
txn := &ethgo.Transaction{
From: validatorAccount.Ecdsa.Address(),
Input: encoded,
To: &stakeManagerAddr,
}

txn := rootHelper.CreateTransaction(validatorAccount.Ecdsa.Address(), &stakeManagerAddr, encoded, nil, true)

receipt, err = txRelayer.SendTransaction(txn, validatorAccount.Ecdsa)
if err != nil {
Expand All @@ -144,7 +141,7 @@ func runCommand(cmd *cobra.Command, _ []string) error {
}

result := &stakeResult{
validatorAddress: validatorAccount.Ecdsa.Address().String(),
ValidatorAddress: validatorAccount.Ecdsa.Address().String(),
}

var (
Expand All @@ -163,8 +160,8 @@ func runCommand(cmd *cobra.Command, _ []string) error {
continue
}

result.amount = stakeAddedEvent.Amount
result.validatorAddress = stakeAddedEvent.Validator.String()
result.Amount = stakeAddedEvent.Amount
result.ValidatorAddress = stakeAddedEvent.Validator.String()
foundLog = true

break
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ func runCommand(cmd *cobra.Command, _ []string) error {
if params.isTestMode {
// fund deployer so that he can deploy contracts
deployerAddr := deployerKey.Address()
txn := &ethgo.Transaction{To: &deployerAddr, Value: ethgo.Ether(1)}
txn := rootHelper.CreateTransaction(ethgo.ZeroAddress, &deployerAddr, nil, ethgo.Ether(1), true)

if _, err = txRelayer.SendTransactionLocal(txn); err != nil {
return fmt.Errorf("failed to send local transaction: %w", err)
Expand Down Expand Up @@ -247,10 +247,7 @@ func initializeStakeManager(cmdOutput command.OutputFormatter,

func deployContract(txRelayer txrelayer.TxRelayer, deployerKey ethgo.Key,
artifact *artifact.Artifact, contractName string) (types.Address, error) {
txn := &ethgo.Transaction{
To: nil, // contract deployment
Input: artifact.Bytecode,
}
txn := rootHelper.CreateTransaction(ethgo.ZeroAddress, nil, artifact.Bytecode, nil, true)

receipt, err := txRelayer.SendTransaction(txn, deployerKey)
if err != nil {
Expand Down
Loading

0 comments on commit 6862b7d

Please sign in to comment.