83 lines
2.5 KiB
Go
83 lines
2.5 KiB
Go
|
package integration
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"math/big"
|
||
|
"net/http"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/common"
|
||
|
"github.com/ethereum/go-ethereum/rpc"
|
||
|
"github.com/ethereum/go-ethereum/statediff/types"
|
||
|
)
|
||
|
|
||
|
type ContractDeployed struct {
|
||
|
Address common.Address `json:"address"`
|
||
|
TransactionHash common.Hash `json:"txHash"`
|
||
|
BlockNumber int64 `json:"blockNumber"`
|
||
|
BlockHash common.Hash `json:"blockHash"`
|
||
|
}
|
||
|
|
||
|
type ContractDestroyed struct {
|
||
|
BlockNumber int64 `json:"blockNumber"`
|
||
|
}
|
||
|
|
||
|
type Tx struct {
|
||
|
From string `json:"from"`
|
||
|
To string `json:"to"`
|
||
|
Value *big.Int `json:"value"`
|
||
|
TransactionHash string `json:"txHash"`
|
||
|
BlockNumber int64 `json:"blockNumber"`
|
||
|
BlockHash string `json:"blockHash"`
|
||
|
}
|
||
|
|
||
|
type StorageKey struct {
|
||
|
Key string `json:"key"`
|
||
|
}
|
||
|
|
||
|
type CountIncremented struct {
|
||
|
BlockNumber *big.Int `json:"blockNumber"`
|
||
|
}
|
||
|
|
||
|
const ContractServerUrl = "http://localhost:3000"
|
||
|
|
||
|
// Factory which creates endpoint functions
|
||
|
func MakeGetAndDecodeFunc[R any](format string) func(...interface{}) (*R, error) {
|
||
|
return func(params ...interface{}) (*R, error) {
|
||
|
params = append([]interface{}{ContractServerUrl}, params...)
|
||
|
url := fmt.Sprintf(format, params...)
|
||
|
res, err := http.Get(url)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer res.Body.Close()
|
||
|
|
||
|
if res.StatusCode != http.StatusOK {
|
||
|
return nil, fmt.Errorf("%s: %s", url, res.Status)
|
||
|
}
|
||
|
|
||
|
var data R
|
||
|
decoder := json.NewDecoder(res.Body)
|
||
|
return &data, decoder.Decode(&data)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
DeployContract = MakeGetAndDecodeFunc[ContractDeployed]("%s/v1/deployContract")
|
||
|
DestroyContract = MakeGetAndDecodeFunc[ContractDestroyed]("%s/v1/destroyContract?addr=%s")
|
||
|
DeploySLVContract = MakeGetAndDecodeFunc[ContractDeployed]("%s/v1/deploySLVContract")
|
||
|
DestroySLVContract = MakeGetAndDecodeFunc[ContractDestroyed]("%s/v1/destroySLVContract?addr=%s")
|
||
|
SendEth = MakeGetAndDecodeFunc[Tx]("%s/v1/sendEth?to=%s&value=%s")
|
||
|
GetStorageSlotKey = MakeGetAndDecodeFunc[StorageKey]("%s/v1/getStorageKey?contract=%s&label=%s")
|
||
|
IncrementCount = MakeGetAndDecodeFunc[CountIncremented]("%s/v1/incrementCount%s?addr=%s")
|
||
|
Create2Contract = MakeGetAndDecodeFunc[ContractDeployed]("%s/v1/create2Contract?contract=%s&salt=%s")
|
||
|
)
|
||
|
|
||
|
func ClearWatchedAddresses(gethRPCClient *rpc.Client) error {
|
||
|
gethMethod := "statediff_watchAddress"
|
||
|
args := []types.WatchAddressArg{}
|
||
|
|
||
|
// Clear watched addresses
|
||
|
return gethRPCClient.Call(nil, gethMethod, types.Clear, args)
|
||
|
}
|