2024-11-26 06:14:19 -06:00
|
|
|
// Copyright 2024 The go-ethereum Authors
|
|
|
|
// This file is part of the go-ethereum library.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2024-11-04 07:50:47 -06:00
|
|
|
package v2
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
2024-11-26 04:18:20 -06:00
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
2024-11-04 07:50:47 -06:00
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
2024-11-26 02:54:18 -06:00
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/testdata/v2/nested_libraries"
|
2024-11-04 07:50:47 -06:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
|
"github.com/ethereum/go-ethereum/crypto"
|
2024-11-26 04:18:20 -06:00
|
|
|
"github.com/ethereum/go-ethereum/eth/ethconfig"
|
2024-11-04 07:50:47 -06:00
|
|
|
"github.com/ethereum/go-ethereum/ethclient/simulated"
|
2024-11-26 04:18:20 -06:00
|
|
|
"github.com/ethereum/go-ethereum/node"
|
2024-11-04 07:50:47 -06:00
|
|
|
"github.com/ethereum/go-ethereum/params"
|
2024-11-26 04:18:20 -06:00
|
|
|
"io"
|
2024-11-04 07:50:47 -06:00
|
|
|
"math/big"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
|
|
|
|
|
|
|
// JSON returns a parsed ABI interface and error if it failed.
|
|
|
|
func JSON(reader io.Reader) (abi.ABI, error) {
|
|
|
|
dec := json.NewDecoder(reader)
|
|
|
|
|
|
|
|
var instance abi.ABI
|
|
|
|
if err := dec.Decode(&instance); err != nil {
|
|
|
|
return abi.ABI{}, err
|
|
|
|
}
|
|
|
|
return instance, nil
|
|
|
|
}
|
|
|
|
|
2024-11-26 04:51:29 -06:00
|
|
|
// test that deploying a contract with library dependencies works,
|
|
|
|
// verifying by calling the deployed contract.
|
2024-11-20 05:57:03 -06:00
|
|
|
func TestDeployment(t *testing.T) {
|
2024-11-24 06:35:16 -06:00
|
|
|
testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
|
|
|
|
backend := simulated.NewBackend(
|
|
|
|
types.GenesisAlloc{
|
|
|
|
testAddr: {Balance: big.NewInt(10000000000000000)},
|
|
|
|
},
|
|
|
|
func(nodeConf *node.Config, ethConf *ethconfig.Config) {
|
|
|
|
ethConf.Genesis.Difficulty = big.NewInt(0)
|
|
|
|
},
|
|
|
|
)
|
|
|
|
defer backend.Close()
|
|
|
|
|
2024-11-26 06:14:19 -06:00
|
|
|
_, err := JSON(strings.NewReader(nested_libraries.C1MetaData.ABI))
|
2024-11-24 06:35:16 -06:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
signer := types.LatestSigner(params.AllDevChainProtocolChanges)
|
|
|
|
opts := bind.TransactOpts{
|
|
|
|
From: testAddr,
|
|
|
|
Nonce: nil,
|
|
|
|
Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) {
|
|
|
|
signature, err := crypto.Sign(signer.Hash(tx).Bytes(), testKey)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
signedTx, err := tx.WithSignature(signer, signature)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
return signedTx, nil
|
|
|
|
},
|
|
|
|
Context: context.Background(),
|
|
|
|
}
|
|
|
|
// we should just be able to use the backend directly, instead of using
|
|
|
|
// this deprecated interface. However, the simulated backend no longer
|
|
|
|
// implements backends.SimulatedBackend...
|
|
|
|
bindBackend := backends.SimulatedBackend{
|
|
|
|
Backend: backend,
|
|
|
|
Client: backend.Client(),
|
|
|
|
}
|
2024-11-26 02:54:18 -06:00
|
|
|
ctrct, err := nested_libraries.NewC1()
|
2024-11-25 01:30:29 -06:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2024-11-26 02:54:18 -06:00
|
|
|
|
|
|
|
constructorInput, err := ctrct.PackConstructor(big.NewInt(42), big.NewInt(1))
|
2024-11-25 01:30:29 -06:00
|
|
|
if err != nil {
|
2024-11-26 06:31:58 -06:00
|
|
|
t.Fatalf("failed to pack constructor: %v", err)
|
2024-11-25 01:30:29 -06:00
|
|
|
}
|
2024-11-26 02:54:18 -06:00
|
|
|
deploymentParams := DeploymentParams{
|
|
|
|
Contracts: []ContractDeployParams{
|
|
|
|
{
|
2024-11-26 04:18:20 -06:00
|
|
|
Meta: nested_libraries.C1MetaData,
|
|
|
|
Input: constructorInput,
|
2024-11-26 02:54:18 -06:00
|
|
|
},
|
|
|
|
},
|
|
|
|
Libraries: nested_libraries.C1LibraryDeps,
|
|
|
|
Overrides: nil,
|
|
|
|
}
|
2024-11-26 04:22:28 -06:00
|
|
|
res, err := LinkAndDeploy(&opts, bindBackend, deploymentParams)
|
2024-11-24 06:35:16 -06:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %+v\n", err)
|
|
|
|
}
|
2024-11-24 09:32:11 -06:00
|
|
|
bindBackend.Commit()
|
2024-11-26 02:54:18 -06:00
|
|
|
|
2024-11-26 04:18:20 -06:00
|
|
|
if len(res.Addrs) != 5 {
|
|
|
|
t.Fatalf("deployment should have generated 5 addresses. got %d", len(res.Addrs))
|
|
|
|
}
|
2024-11-26 02:54:18 -06:00
|
|
|
for _, tx := range res.Txs {
|
2024-11-24 06:35:16 -06:00
|
|
|
_, err = bind.WaitDeployed(context.Background(), &bindBackend, tx)
|
|
|
|
if err != nil {
|
2024-11-26 02:54:18 -06:00
|
|
|
t.Fatalf("error deploying library: %+v", err)
|
2024-11-24 06:35:16 -06:00
|
|
|
}
|
|
|
|
}
|
2024-11-26 02:54:18 -06:00
|
|
|
c, err := nested_libraries.NewC1()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err is %v", err)
|
|
|
|
}
|
|
|
|
doInput, err := c.PackDo(big.NewInt(1))
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("pack function input err: %v\n", doInput)
|
|
|
|
}
|
|
|
|
|
|
|
|
cABI, err := nested_libraries.C1MetaData.GetAbi()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error getting abi object: %v", err)
|
|
|
|
}
|
|
|
|
contractAddr := res.Addrs[nested_libraries.C1MetaData.Pattern]
|
|
|
|
boundC := bind.NewBoundContract(contractAddr, *cABI, &bindBackend, &bindBackend, &bindBackend)
|
|
|
|
callOpts := &bind.CallOpts{
|
|
|
|
From: common.Address{},
|
|
|
|
Context: context.Background(),
|
|
|
|
}
|
|
|
|
callRes, err := boundC.CallRaw(callOpts, doInput)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err calling contract: %v", err)
|
|
|
|
}
|
2024-11-26 04:18:20 -06:00
|
|
|
internalCallCount, err := c.UnpackDo(callRes)
|
2024-11-26 02:54:18 -06:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err unpacking result: %v", err)
|
|
|
|
}
|
2024-11-26 04:18:20 -06:00
|
|
|
if internalCallCount.Uint64() != 6 {
|
|
|
|
t.Fatalf("expected internal call count of 6. got %d.", internalCallCount.Uint64())
|
|
|
|
}
|
2024-11-26 02:54:18 -06:00
|
|
|
}
|
|
|
|
|
2024-11-26 04:18:20 -06:00
|
|
|
/*
|
|
|
|
func TestDeploymentWithOverrides(t *testing.T) {
|
|
|
|
// more deployment test case ideas:
|
|
|
|
// 1) deploy libraries, then deploy contract first with libraries as overrides
|
|
|
|
// 2) deploy contract without library dependencies.
|
|
|
|
}
|
|
|
|
*/
|
2024-11-26 04:51:29 -06:00
|
|
|
|
2024-11-26 02:54:18 -06:00
|
|
|
func TestEvents(t *testing.T) {
|
|
|
|
// test watch/filter logs method on a contract that emits various kinds of events (struct-containing, etc.)
|
2024-11-20 05:57:03 -06:00
|
|
|
}
|