Skip to content
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
45 changes: 45 additions & 0 deletions common/changeset/token_approve.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package changeset

import (
"fmt"
"math/big"

"github.com/ethereum/go-ethereum/common"

cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
"github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/erc20"
)

// ApproveToken approves routerAddress to pull up to amount of token from the deployer on chain src.
func ApproveToken(env cldf.Environment, src uint64, tokenAddress common.Address, routerAddress common.Address, amount *big.Int) error {
evmChains := env.BlockChains.EVMChains()
ch, ok := evmChains[src]
if !ok {
return fmt.Errorf("evm chain %d not found in environment", src)
}

if ch.Client == nil {
return fmt.Errorf("evm chain %d has no RPC client", src)
}

if ch.DeployerKey == nil {
return fmt.Errorf("evm chain %d has no deployer key", src)
}

token, err := erc20.NewERC20(tokenAddress, ch.Client)
if err != nil {
return err
}

tx, err := token.Approve(ch.DeployerKey, routerAddress, amount)
if err != nil {
return err
}

_, err = ch.Confirm(tx)
if err != nil {
return err
}

return nil
}
65 changes: 65 additions & 0 deletions common/changeset/token_approve_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package changeset

import (
"math/big"
"testing"

"github.com/ethereum/go-ethereum/common"
chainselectors "github.com/smartcontractkit/chain-selectors"
"github.com/stretchr/testify/require"

"github.com/smartcontractkit/chainlink-deployments-framework/engine/test/environment"
"github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/erc20"
"github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/link_token"
)

func TestApproveToken_success_simulatedEVM(t *testing.T) {
t.Parallel()

selector := chainselectors.TEST_90000001.Selector
env, err := environment.New(t.Context(),
environment.WithEVMSimulated(t, []uint64{selector}),
)
require.NoError(t, err)

chain := env.BlockChains.EVMChains()[selector]

_, tx, lt, err := link_token.DeployLinkToken(chain.DeployerKey, chain.Client)
require.NoError(t, err)
_, err = chain.Confirm(tx)
require.NoError(t, err)

tx, err = lt.GrantMintAndBurnRoles(chain.DeployerKey, chain.DeployerKey.From)
require.NoError(t, err)
_, err = chain.Confirm(tx)
require.NoError(t, err)

tx, err = lt.Mint(chain.DeployerKey, chain.DeployerKey.From, big.NewInt(1_000_000))
require.NoError(t, err)
_, err = chain.Confirm(tx)
require.NoError(t, err)

spender := common.HexToAddress("0x00000000000000000000000000000000000000Ab")
amount := big.NewInt(12345)

require.NoError(t, ApproveToken(*env, selector, lt.Address(), spender, amount))

token, err := erc20.NewERC20(lt.Address(), chain.Client)
require.NoError(t, err)
got, err := token.Allowance(nil, chain.DeployerKey.From, spender)
require.NoError(t, err)
require.Zero(t, got.Cmp(amount))
}

func TestApproveToken_unknownChainSelector(t *testing.T) {
t.Parallel()

selector := chainselectors.TEST_90000001.Selector
env, err := environment.New(t.Context(),
environment.WithEVMSimulated(t, []uint64{selector}),
)
require.NoError(t, err)

err = ApproveToken(*env, selector+999_999_999, common.Address{}, common.Address{}, big.NewInt(1))
require.ErrorContains(t, err, "not found in environment")
}
Loading