synapsecns/sanguine

View on GitHub
agents/testutil/harness.go

Summary

Maintainability
F
4 days
Test Coverage
package testutil

import (
    "context"
    "fmt"
    "github.com/synapsecns/sanguine/agents/contracts/test/attestationharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/basemessageharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/bondingmanagerharness"
    gasdataharness "github.com/synapsecns/sanguine/agents/contracts/test/gasdata"
    "github.com/synapsecns/sanguine/agents/contracts/test/lightmanagerharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/originharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/receiptharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/requestharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/snapshotharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/stateharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/tipsharness"

    "github.com/synapsecns/sanguine/agents/contracts/test/summitharness"

    "github.com/ethereum/go-ethereum/accounts/abi/bind"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/synapsecns/sanguine/agents/contracts/test/destinationharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/headerharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/messageharness"
    "github.com/synapsecns/sanguine/agents/contracts/test/pingpongclient"
    "github.com/synapsecns/sanguine/agents/contracts/test/testclient"
    "github.com/synapsecns/sanguine/agents/testutil/agentstestcontract"
    "github.com/synapsecns/sanguine/ethergo/backends"
    "github.com/synapsecns/sanguine/ethergo/contracts"
    "github.com/synapsecns/sanguine/ethergo/deployer"
)

// SynapseChainID is the chain ID for the synapse chain.
const SynapseChainID = 10

// MessageHarnessDeployer deploys the message harness for testing.
type MessageHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewMessageHarnessDeployer creates a message harness deployer.
func NewMessageHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return MessageHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, MessageHarnessType)}
}

// Deploy deploys the message harness deployer.
func (d MessageHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return d.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return messageharness.DeployMessageHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return messageharness.NewMessageHarnessRef(address, backend)
    })
}

// BaseMessageHarnessDeployer deploys the base message harness for testing.
type BaseMessageHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewBaseMessageHarnessDeployer creates a base message harness deployer.
func NewBaseMessageHarnessDeployer(regirstry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return BaseMessageHarnessDeployer{deployer.NewSimpleDeployer(regirstry, backend, BaseMessageHarnessType)}
}

// Deploy deploys the base message harness deployer.
func (d BaseMessageHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return d.DeploySimpleContract(ctx, func(transactOpts *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return basemessageharness.DeployBaseMessageHarness(transactOpts, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return basemessageharness.NewBaseMessageHarnessRef(address, backend)
    })
}

// ReceiptHarnessDeployer deploys the request harness for testing.
type ReceiptHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewReceiptHarnessDeployer creates a request harness deployer.
func NewReceiptHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return ReceiptHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, ReceiptHarnessType)}
}

// Deploy deploys the receipt harness deployer.
func (d ReceiptHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return d.DeploySimpleContract(ctx, func(transactOpts *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return receiptharness.DeployReceiptHarness(transactOpts, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return receiptharness.NewReceiptHarnessRef(address, backend)
    })
}

// RequestHarnessDeployer deploys the request harness for testing.
type RequestHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewRequestHarnessDeployer creates a request harness deployer.
func NewRequestHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return RequestHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, RequestHarnessType)}
}

// Deploy deploys the request harness deployer.
func (d RequestHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return d.DeploySimpleContract(ctx, func(transactOpts *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return requestharness.DeployRequestHarness(transactOpts, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return requestharness.NewRequestHarnessRef(address, backend)
    })
}

// LightManagerHarnessDeployer deploys the light agent manager for testing.
type LightManagerHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewLightManagerHarnessDeployer deploys a new light agent manager harness.
func NewLightManagerHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return LightManagerHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, LightManagerHarnessType)}
}

// Deploy deploys the light manager harness.
// nolint:dupl,dupword
func (o LightManagerHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    /*originHarnessContract := o.Registry().Get(ctx, OriginHarnessType)
    destinationHarnessContract := o.Registry().Get(ctx, DestinationHarnessType)
    originAddress := originHarnessContract.Address()
    destinationAddress := destinationHarnessContract.Address()*/
    return o.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        address, tx, rawHandle, err := lightmanagerharness.DeployLightManagerHarness(transactOps, backend, SynapseChainID)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not deploy %s: %w", o.ContractType().ContractName(), err)
        }
        o.Backend().WaitForConfirmation(ctx, tx)

        /*initializeOpts := o.Backend().GetTxContext(ctx, &transactOps.From)
        initializeTx, err := rawHandle.Initialize(initializeOpts.TransactOpts, originAddress, destinationAddress)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not initialize origin (%s) on %s: %w", transactOps.From, o.ContractType().ContractName(), err)
        }
        o.Backend().WaitForConfirmation(ctx, initializeTx)*/

        return address, tx, rawHandle, err
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return lightmanagerharness.NewLightManagerHarnessRef(address, backend)
    })
}

// Dependencies gets a list of dependencies used to deploy the light agent manager contract.
func (o LightManagerHarnessDeployer) Dependencies() []contracts.ContractType {
    return []contracts.ContractType{}
}

// BondingManagerHarnessDeployer deploys the bonding manager for testing.
type BondingManagerHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewBondingManagerHarnessDeployer deploys a new bonding agent manager harness.
func NewBondingManagerHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return BondingManagerHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, BondingManagerHarnessType)}
}

// Deploy deploys the light manager harness.
// nolint:dupl,dupword
func (o BondingManagerHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    /*originHarnessContract := o.Registry().Get(ctx, OriginHarnessType)
    destinationHarnessContract := o.Registry().Get(ctx, DestinationHarnessType)
    originAddress := originHarnessContract.Address()
    destinationAddress := destinationHarnessContract.Address()*/
    return o.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        address, tx, rawHandle, err := bondingmanagerharness.DeployBondingManagerHarness(transactOps, backend, SynapseChainID)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not deploy %s: %w", o.ContractType().ContractName(), err)
        }
        o.Backend().WaitForConfirmation(ctx, tx)

        /*initializeOpts := o.Backend().GetTxContext(ctx, &transactOps.From)
        initializeTx, err := rawHandle.Initialize(initializeOpts.TransactOpts, originAddress, destinationAddress)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not initialize origin (%s) on %s: %w", transactOps.From, o.ContractType().ContractName(), err)
        }
        o.Backend().WaitForConfirmation(ctx, initializeTx)*/

        return address, tx, rawHandle, err
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return bondingmanagerharness.NewBondingManagerHarnessRef(address, backend)
    })
}

// Dependencies gets a list of dependencies used to deploy the bonding manager contract.
func (o BondingManagerHarnessDeployer) Dependencies() []contracts.ContractType {
    return []contracts.ContractType{}
}

// OriginHarnessDeployer deploys the origin harness for testing.
type OriginHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewOriginHarnessDeployer deploys a new origin harness.
func NewOriginHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return OriginHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, OriginHarnessType)}
}

// Deploy deploys the origin harness.
// nolint:dupl
func (o OriginHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    var agentAddress common.Address
    var inboxAddress common.Address
    if o.Backend().GetChainID() == 10 {
        bondingManagerHarnessContract := o.Registry().Get(ctx, BondingManagerHarnessType)
        agentAddress = bondingManagerHarnessContract.Address()

        inboxContract := o.Registry().Get(ctx, InboxType)
        inboxAddress = inboxContract.Address()
    } else {
        lightManagerHarnessContract := o.Registry().Get(ctx, LightManagerHarnessType)
        agentAddress = lightManagerHarnessContract.Address()

        lightInboxContract := o.Registry().Get(ctx, LightInboxType)
        inboxAddress = lightInboxContract.Address()
    }
    gasOracleContract := o.Registry().Get(ctx, GasOracleType)
    gasOracleAddress := gasOracleContract.Address()
    return o.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        address, tx, rawHandle, err := originharness.DeployOriginHarness(transactOps, backend, SynapseChainID, agentAddress, inboxAddress, gasOracleAddress)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not deploy %s: %w", o.ContractType().ContractName(), err)
        }
        o.Backend().WaitForConfirmation(ctx, tx)

        initializeOpts := o.Backend().GetTxContext(ctx, &transactOps.From)
        initializeTx, err := rawHandle.Initialize(initializeOpts.TransactOpts)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not initialize origin (%s) on %s: %w", transactOps.From, o.ContractType().ContractName(), err)
        }
        o.Backend().WaitForConfirmation(ctx, initializeTx)

        return address, tx, rawHandle, err
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return originharness.NewOriginHarnessRef(address, backend)
    })
}

// Dependencies gets a list of dependencies used to deploy the origin contract.
func (o OriginHarnessDeployer) Dependencies() []contracts.ContractType {
    return []contracts.ContractType{}
}

// GasDataHarnessDeployer deploys the gasData harness.
type GasDataHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewGasDataHarnessDeployer creates a new deployer for the gasData harness.
func NewGasDataHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return GasDataHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, GasDataHarnessType)}
}

// Deploy deploys the gasData harness.
func (a GasDataHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return a.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return gasdataharness.DeployGasDataHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return gasdataharness.NewGasDataHarnessRef(address, backend)
    })
}

// StateHarnessDeployer deploys the state harness.
type StateHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewStateHarnessDeployer creates a new deployer for the state harness.
func NewStateHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return StateHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, StateHarnessType)}
}

// Deploy deploys the state harness.
func (a StateHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return a.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return stateharness.DeployStateHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return stateharness.NewStateHarnessRef(address, backend)
    })
}

// SnapshotHarnessDeployer deploys the snapshot harness.
type SnapshotHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewSnapshotHarnessDeployer creates a new deployer for the snapshot harness.
func NewSnapshotHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return SnapshotHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, SnapshotHarnessType)}
}

// Deploy deploys the snapshot harness.
func (a SnapshotHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return a.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return snapshotharness.DeploySnapshotHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return snapshotharness.NewSnapshotHarnessRef(address, backend)
    })
}

// AttestationHarnessDeployer deploys the attestation harness for testing.
type AttestationHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewAttestationHarnessDeployer creates a new deployer for the attestation harness.
func NewAttestationHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return AttestationHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, AttestationHarnessType)}
}

// Deploy deploys the attestation harness.
func (a AttestationHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return a.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return attestationharness.DeployAttestationHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return attestationharness.NewAttestationHarnessRef(address, backend)
    })
}

// TipsHarnessDeployer deploys the tip harness for tester.
type TipsHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewTipsHarnessDeployer creates a new deployer for the attestation harness.
func NewTipsHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return TipsHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, TipsHarnessType)}
}

// Deploy deploys the attestation harness.
func (a TipsHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return a.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return tipsharness.DeployTipsHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return tipsharness.NewTipsHarnessRef(address, backend)
    })
}

// DestinationHarnessDeployer deploys the destination harness.
type DestinationHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewDestinationHarnessDeployer creates a new deployer for the destination harness.
func NewDestinationHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return DestinationHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, DestinationHarnessType)}
}

// Deploy deploys the destination harness.
// nolint:dupl,dupword
func (d DestinationHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    var agentManagerAddress common.Address
    var inboxAddress common.Address
    if d.Backend().GetChainID() == 10 {
        bondingManagerHarnessContract := d.Registry().Get(ctx, BondingManagerHarnessType)
        agentManagerAddress = bondingManagerHarnessContract.Address()

        inboxContract := d.Registry().Get(ctx, InboxType)
        inboxAddress = inboxContract.Address()
    } else {
        lightManagerHarnessContract := d.Registry().Get(ctx, LightManagerHarnessType)
        agentManagerAddress = lightManagerHarnessContract.Address()

        lightInboxContract := d.Registry().Get(ctx, LightInboxType)
        inboxAddress = lightInboxContract.Address()
    }
    return d.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        address, tx, rawHandle, err := destinationharness.DeployDestinationHarness(transactOps, backend, SynapseChainID, agentManagerAddress, inboxAddress)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not deploy %s: %w", d.ContractType().ContractName(), err)
        }
        d.Backend().WaitForConfirmation(ctx, tx)

        /*initializeOpts := d.Backend().GetTxContext(ctx, &transactOps.From)
        initializeTx, err := rawHandle.Initialize(initializeOpts.TransactOpts)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not initialize destination (%s) on %s: %w", transactOps.From, d.ContractType().ContractName(), err)
        }
        d.Backend().WaitForConfirmation(ctx, initializeTx)*/

        return address, tx, rawHandle, err
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return destinationharness.NewDestinationHarnessRef(address, backend)
    })
}

// SummitHarnessDeployer deploys the summit harness.
type SummitHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewSummitHarnessDeployer creates a new deployer for the summit harness.
func NewSummitHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return SummitHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, SummitHarnessType)}
}

// Deploy deploys the summit harness.
// nolint:dupl
func (d SummitHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    bondingManagerHarnessContract := d.Registry().Get(ctx, BondingManagerHarnessType)
    bondingManagerAddress := bondingManagerHarnessContract.Address()
    inboxContract := d.Registry().Get(ctx, InboxType)
    inboxAddress := inboxContract.Address()
    return d.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        address, tx, rawHandle, err := summitharness.DeploySummitHarness(transactOps, backend, bondingManagerAddress, inboxAddress)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not deploy %s: %w", d.ContractType().ContractName(), err)
        }
        d.Backend().WaitForConfirmation(ctx, tx)

        initializeOpts := d.Backend().GetTxContext(ctx, &transactOps.From)
        initializeTx, err := rawHandle.Initialize(initializeOpts.TransactOpts)
        if err != nil {
            return common.Address{}, nil, nil, fmt.Errorf("could not initialize summit harness (%s) on %s: %w", transactOps.From, d.ContractType().ContractName(), err)
        }
        d.Backend().WaitForConfirmation(ctx, initializeTx)

        return address, tx, rawHandle, err
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return summitharness.NewSummitHarnessRef(address, backend)
    })
}

// HeaderHarnessDeployer deploys the header harness.
type HeaderHarnessDeployer struct {
    *deployer.BaseDeployer
}

// NewHeaderHarnessDeployer gets the header harness.
func NewHeaderHarnessDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return HeaderHarnessDeployer{deployer.NewSimpleDeployer(registry, backend, HeaderHarnessType)}
}

// Deploy deploys the header harness.
func (h HeaderHarnessDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return h.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return headerharness.DeployHeaderHarness(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return headerharness.NewHeaderHarnessRef(address, backend)
    })
}

// AgentsTestContractDeployer deploys the agents test contract.
type AgentsTestContractDeployer struct {
    *deployer.BaseDeployer
}

// NewAgentsTestContractDeployer gets the agents test contract.
func NewAgentsTestContractDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return AgentsTestContractDeployer{deployer.NewSimpleDeployer(registry, backend, AgentsTestContractType)}
}

// Deploy deploys the agents test contract.
func (h AgentsTestContractDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    return h.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return agentstestcontract.DeployAgentsTestContract(transactOps, backend)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return agentstestcontract.NewAgentsTestContractRef(address, backend)
    })
}

// TestClientDeployer deploys the test client.
type TestClientDeployer struct {
    *deployer.BaseDeployer
}

// NewTestClientDeployer gets the test client.
func NewTestClientDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return TestClientDeployer{deployer.NewSimpleDeployer(registry, backend, TestClientType)}
}

// Deploy deploys the test client.
func (h TestClientDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    originHarnessContract := h.Registry().Get(ctx, OriginHarnessType)
    destinationHarnessContract := h.Registry().Get(ctx, DestinationHarnessType)
    originAddress := originHarnessContract.Address()
    destinationAddress := destinationHarnessContract.Address()
    return h.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return testclient.DeployTestClient(transactOps, backend, originAddress, destinationAddress)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return testclient.NewTestClientRef(address, backend)
    })
}

// PingPongClientDeployer deploys the ping pong test client.
type PingPongClientDeployer struct {
    *deployer.BaseDeployer
}

// NewPingPongClientDeployer gets the ping pong test client.
func NewPingPongClientDeployer(registry deployer.GetOnlyContractRegistry, backend backends.SimulatedTestBackend) deployer.ContractDeployer {
    return PingPongClientDeployer{deployer.NewSimpleDeployer(registry, backend, PingPongClientType)}
}

// Deploy deploys the ping pong test client.
func (h PingPongClientDeployer) Deploy(ctx context.Context) (contracts.DeployedContract, error) {
    originHarnessContract := h.Registry().Get(ctx, OriginHarnessType)
    destinationHarnessContract := h.Registry().Get(ctx, DestinationHarnessType)
    originAddress := originHarnessContract.Address()
    destinationAddress := destinationHarnessContract.Address()
    return h.DeploySimpleContract(ctx, func(transactOps *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, interface{}, error) {
        return pingpongclient.DeployPingPongClient(transactOps, backend, originAddress, destinationAddress)
    }, func(address common.Address, backend bind.ContractBackend) (interface{}, error) {
        return pingpongclient.NewPingPongClientRef(address, backend)
    })
}