Trait ibc_test_framework::prelude::ChainHandle
source · [−]pub trait ChainHandle: 'static + Clone + Send + Sync + Serialize + Debug {
Show 48 methods
fn new(chain_id: ChainId, sender: Sender<ChainRequest>) -> Self;
fn id(&self) -> ChainId;
fn shutdown(&self) -> Result<(), Error>;
fn health_check(&self) -> Result<HealthCheck, Error>;
fn subscribe(
&self
) -> Result<Receiver<Arc<Result<EventBatch, Error>>>, Error>;
fn send_messages_and_wait_commit(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<IbcEvent, Global>, Error>;
fn send_messages_and_wait_check_tx(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<Response, Global>, Error>;
fn get_signer(&self) -> Result<Signer, Error>;
fn config(&self) -> Result<ChainConfig, Error>;
fn get_key(&self) -> Result<KeyEntry, Error>;
fn add_key(&self, key_name: String, key: KeyEntry) -> Result<(), Error>;
fn ibc_version(&self) -> Result<Option<Version>, Error>;
fn query_balance(&self) -> Result<Balance, Error>;
fn query_application_status(&self) -> Result<ChainStatus, Error>;
fn query_clients(
&self,
request: QueryClientStatesRequest
) -> Result<Vec<IdentifiedAnyClientState, Global>, Error>;
fn query_client_state(
&self,
request: QueryClientStateRequest
) -> Result<AnyClientState, Error>;
fn query_client_connections(
&self,
request: QueryClientConnectionsRequest
) -> Result<Vec<ConnectionId, Global>, Error>;
fn query_consensus_states(
&self,
request: QueryConsensusStatesRequest
) -> Result<Vec<AnyConsensusStateWithHeight, Global>, Error>;
fn query_consensus_state(
&self,
request: QueryConsensusStateRequest
) -> Result<AnyConsensusState, Error>;
fn query_upgraded_client_state(
&self,
request: QueryUpgradedClientStateRequest
) -> Result<(AnyClientState, MerkleProof), Error>;
fn query_upgraded_consensus_state(
&self,
request: QueryUpgradedConsensusStateRequest
) -> Result<(AnyConsensusState, MerkleProof), Error>;
fn query_commitment_prefix(&self) -> Result<CommitmentPrefix, Error>;
fn query_compatible_versions(&self) -> Result<Vec<Version, Global>, Error>;
fn query_connection(
&self,
request: QueryConnectionRequest
) -> Result<ConnectionEnd, Error>;
fn query_connections(
&self,
request: QueryConnectionsRequest
) -> Result<Vec<IdentifiedConnectionEnd, Global>, Error>;
fn query_connection_channels(
&self,
request: QueryConnectionChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>;
fn query_next_sequence_receive(
&self,
request: QueryNextSequenceReceiveRequest
) -> Result<Sequence, Error>;
fn query_channels(
&self,
request: QueryChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>;
fn query_channel(
&self,
request: QueryChannelRequest
) -> Result<ChannelEnd, Error>;
fn query_channel_client_state(
&self,
request: QueryChannelClientStateRequest
) -> Result<Option<IdentifiedAnyClientState>, Error>;
fn proven_client_state(
&self,
client_id: &ClientId,
height: Height
) -> Result<(AnyClientState, MerkleProof), Error>;
fn proven_connection(
&self,
connection_id: &ConnectionId,
height: Height
) -> Result<(ConnectionEnd, MerkleProof), Error>;
fn proven_client_consensus(
&self,
client_id: &ClientId,
consensus_height: Height,
height: Height
) -> Result<(AnyConsensusState, MerkleProof), Error>;
fn build_header(
&self,
trusted_height: Height,
target_height: Height,
client_state: AnyClientState
) -> Result<(AnyHeader, Vec<AnyHeader, Global>), Error>;
fn build_client_state(
&self,
height: Height,
settings: ClientSettings
) -> Result<AnyClientState, Error>;
fn build_consensus_state(
&self,
trusted: Height,
target: Height,
client_state: AnyClientState
) -> Result<AnyConsensusState, Error>;
fn check_misbehaviour(
&self,
update: UpdateClient,
client_state: AnyClientState
) -> Result<Option<MisbehaviourEvidence>, Error>;
fn build_connection_proofs_and_client_state(
&self,
message_type: ConnectionMsgType,
connection_id: &ConnectionId,
client_id: &ClientId,
height: Height
) -> Result<(Option<AnyClientState>, Proofs), Error>;
fn build_channel_proofs(
&self,
port_id: &PortId,
channel_id: &ChannelId,
height: Height
) -> Result<Proofs, Error>;
fn build_packet_proofs(
&self,
packet_type: PacketMsgType,
port_id: &PortId,
channel_id: &ChannelId,
sequence: Sequence,
height: Height
) -> Result<(Vec<u8, Global>, Proofs), Error>;
fn query_packet_commitments(
&self,
request: QueryPacketCommitmentsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>;
fn query_unreceived_packets(
&self,
request: QueryUnreceivedPacketsRequest
) -> Result<Vec<Sequence, Global>, Error>;
fn query_packet_acknowledgements(
&self,
request: QueryPacketAcknowledgementsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>;
fn query_unreceived_acknowledgement(
&self,
request: QueryUnreceivedAcksRequest
) -> Result<Vec<Sequence, Global>, Error>;
fn query_txs(
&self,
request: QueryTxRequest
) -> Result<Vec<IbcEvent, Global>, Error>;
fn query_blocks(
&self,
request: QueryBlockRequest
) -> Result<(Vec<IbcEvent, Global>, Vec<IbcEvent, Global>), Error>;
fn query_host_consensus_state(
&self,
request: QueryHostConsensusStateRequest
) -> Result<AnyConsensusState, Error>;
fn query_latest_height(&self) -> Result<Height, Error> { ... }
}Required Methods
fn new(chain_id: ChainId, sender: Sender<ChainRequest>) -> Self
fn health_check(&self) -> Result<HealthCheck, Error>
fn health_check(&self) -> Result<HealthCheck, Error>
Perform a health check
Subscribe to the events emitted by the chain.
fn send_messages_and_wait_commit(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<IbcEvent, Global>, Error>
fn send_messages_and_wait_commit(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<IbcEvent, Global>, Error>
Send the given msgs to the chain, packaged as one or more transactions,
and return the list of events emitted by the chain after the transaction was committed.
fn send_messages_and_wait_check_tx(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<Response, Global>, Error>
fn send_messages_and_wait_check_tx(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<Response, Global>, Error>
Submit messages asynchronously. Does not block waiting on the chain to produce the resulting events. Instead of events, this method returns a set of transaction hashes.
fn get_signer(&self) -> Result<Signer, Error>
fn config(&self) -> Result<ChainConfig, Error>
Return the version of the IBC protocol that this chain is running, if known.
fn query_balance(&self) -> Result<Balance, Error>
fn query_balance(&self) -> Result<Balance, Error>
Query the balance of the current account for the denom used to pay tx fees.
fn query_application_status(&self) -> Result<ChainStatus, Error>
fn query_clients(
&self,
request: QueryClientStatesRequest
) -> Result<Vec<IdentifiedAnyClientState, Global>, Error>
fn query_client_state(
&self,
request: QueryClientStateRequest
) -> Result<AnyClientState, Error>
fn query_client_connections(
&self,
request: QueryClientConnectionsRequest
) -> Result<Vec<ConnectionId, Global>, Error>
fn query_consensus_states(
&self,
request: QueryConsensusStatesRequest
) -> Result<Vec<AnyConsensusStateWithHeight, Global>, Error>
fn query_consensus_state(
&self,
request: QueryConsensusStateRequest
) -> Result<AnyConsensusState, Error>
fn query_upgraded_client_state(
&self,
request: QueryUpgradedClientStateRequest
) -> Result<(AnyClientState, MerkleProof), Error>
fn query_upgraded_consensus_state(
&self,
request: QueryUpgradedConsensusStateRequest
) -> Result<(AnyConsensusState, MerkleProof), Error>
fn query_commitment_prefix(&self) -> Result<CommitmentPrefix, Error>
fn query_connection(
&self,
request: QueryConnectionRequest
) -> Result<ConnectionEnd, Error>
fn query_connections(
&self,
request: QueryConnectionsRequest
) -> Result<Vec<IdentifiedConnectionEnd, Global>, Error>
fn query_connection_channels(
&self,
request: QueryConnectionChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>
fn query_next_sequence_receive(
&self,
request: QueryNextSequenceReceiveRequest
) -> Result<Sequence, Error>
fn query_channels(
&self,
request: QueryChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>
fn query_channel(
&self,
request: QueryChannelRequest
) -> Result<ChannelEnd, Error>
fn query_channel_client_state(
&self,
request: QueryChannelClientStateRequest
) -> Result<Option<IdentifiedAnyClientState>, Error>
fn proven_client_state(
&self,
client_id: &ClientId,
height: Height
) -> Result<(AnyClientState, MerkleProof), Error>
fn proven_connection(
&self,
connection_id: &ConnectionId,
height: Height
) -> Result<(ConnectionEnd, MerkleProof), Error>
fn proven_client_consensus(
&self,
client_id: &ClientId,
consensus_height: Height,
height: Height
) -> Result<(AnyConsensusState, MerkleProof), Error>
fn build_header(
&self,
trusted_height: Height,
target_height: Height,
client_state: AnyClientState
) -> Result<(AnyHeader, Vec<AnyHeader, Global>), Error>
fn build_client_state(
&self,
height: Height,
settings: ClientSettings
) -> Result<AnyClientState, Error>
fn build_client_state(
&self,
height: Height,
settings: ClientSettings
) -> Result<AnyClientState, Error>
Constructs a client state at the given height
fn build_consensus_state(
&self,
trusted: Height,
target: Height,
client_state: AnyClientState
) -> Result<AnyConsensusState, Error>
fn build_consensus_state(
&self,
trusted: Height,
target: Height,
client_state: AnyClientState
) -> Result<AnyConsensusState, Error>
Constructs a consensus state at the given height
fn check_misbehaviour(
&self,
update: UpdateClient,
client_state: AnyClientState
) -> Result<Option<MisbehaviourEvidence>, Error>
fn build_connection_proofs_and_client_state(
&self,
message_type: ConnectionMsgType,
connection_id: &ConnectionId,
client_id: &ClientId,
height: Height
) -> Result<(Option<AnyClientState>, Proofs), Error>
fn build_channel_proofs(
&self,
port_id: &PortId,
channel_id: &ChannelId,
height: Height
) -> Result<Proofs, Error>
fn build_packet_proofs(
&self,
packet_type: PacketMsgType,
port_id: &PortId,
channel_id: &ChannelId,
sequence: Sequence,
height: Height
) -> Result<(Vec<u8, Global>, Proofs), Error>
fn query_packet_commitments(
&self,
request: QueryPacketCommitmentsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>
fn query_unreceived_packets(
&self,
request: QueryUnreceivedPacketsRequest
) -> Result<Vec<Sequence, Global>, Error>
fn query_packet_acknowledgements(
&self,
request: QueryPacketAcknowledgementsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>
fn query_unreceived_acknowledgement(
&self,
request: QueryUnreceivedAcksRequest
) -> Result<Vec<Sequence, Global>, Error>
fn query_blocks(
&self,
request: QueryBlockRequest
) -> Result<(Vec<IbcEvent, Global>, Vec<IbcEvent, Global>), Error>
fn query_host_consensus_state(
&self,
request: QueryHostConsensusStateRequest
) -> Result<AnyConsensusState, Error>
Provided Methods
fn query_latest_height(&self) -> Result<Height, Error>
Implementations on Foreign Types
sourceimpl<Handle> ChainHandle for CountingChainHandle<Handle> where
Handle: ChainHandle,
impl<Handle> ChainHandle for CountingChainHandle<Handle> where
Handle: ChainHandle,
sourcefn build_client_state(
&self,
height: Height,
options: ClientSettings
) -> Result<AnyClientState, Error>
fn build_client_state(
&self,
height: Height,
options: ClientSettings
) -> Result<AnyClientState, Error>
Constructs a client state at the given height
sourcefn build_consensus_state(
&self,
trusted: Height,
target: Height,
client_state: AnyClientState
) -> Result<AnyConsensusState, Error>
fn build_consensus_state(
&self,
trusted: Height,
target: Height,
client_state: AnyClientState
) -> Result<AnyConsensusState, Error>
Constructs a consensus state at the given height
fn new(
chain_id: ChainId,
sender: Sender<ChainRequest>
) -> CountingChainHandle<Handle>
fn id(&self) -> ChainId
fn shutdown(&self) -> Result<(), Error>
fn health_check(&self) -> Result<HealthCheck, Error>
fn subscribe(&self) -> Result<Receiver<Arc<Result<EventBatch, Error>>>, Error>
fn send_messages_and_wait_commit(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<IbcEvent, Global>, Error>
fn send_messages_and_wait_check_tx(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<Response, Global>, Error>
fn get_signer(&self) -> Result<Signer, Error>
fn config(&self) -> Result<ChainConfig, Error>
fn get_key(&self) -> Result<KeyEntry, Error>
fn add_key(&self, key_name: String, key: KeyEntry) -> Result<(), Error>
fn ibc_version(&self) -> Result<Option<Version>, Error>
fn query_balance(&self) -> Result<Balance, Error>
fn query_application_status(&self) -> Result<ChainStatus, Error>
fn query_latest_height(&self) -> Result<Height, Error>
fn query_clients(
&self,
request: QueryClientStatesRequest
) -> Result<Vec<IdentifiedAnyClientState, Global>, Error>
fn query_client_state(
&self,
request: QueryClientStateRequest
) -> Result<AnyClientState, Error>
fn query_client_connections(
&self,
request: QueryClientConnectionsRequest
) -> Result<Vec<ConnectionId, Global>, Error>
fn query_consensus_states(
&self,
request: QueryConsensusStatesRequest
) -> Result<Vec<AnyConsensusStateWithHeight, Global>, Error>
fn query_consensus_state(
&self,
request: QueryConsensusStateRequest
) -> Result<AnyConsensusState, Error>
fn query_upgraded_client_state(
&self,
request: QueryUpgradedClientStateRequest
) -> Result<(AnyClientState, MerkleProof), Error>
fn query_upgraded_consensus_state(
&self,
request: QueryUpgradedConsensusStateRequest
) -> Result<(AnyConsensusState, MerkleProof), Error>
fn query_commitment_prefix(&self) -> Result<CommitmentPrefix, Error>
fn query_compatible_versions(&self) -> Result<Vec<Version, Global>, Error>
fn query_connection(
&self,
request: QueryConnectionRequest
) -> Result<ConnectionEnd, Error>
fn query_connections(
&self,
request: QueryConnectionsRequest
) -> Result<Vec<IdentifiedConnectionEnd, Global>, Error>
fn query_connection_channels(
&self,
request: QueryConnectionChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>
fn query_next_sequence_receive(
&self,
request: QueryNextSequenceReceiveRequest
) -> Result<Sequence, Error>
fn query_channels(
&self,
request: QueryChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>
fn query_channel(
&self,
request: QueryChannelRequest
) -> Result<ChannelEnd, Error>
fn query_channel_client_state(
&self,
request: QueryChannelClientStateRequest
) -> Result<Option<IdentifiedAnyClientState>, Error>
fn proven_client_state(
&self,
client_id: &ClientId,
height: Height
) -> Result<(AnyClientState, MerkleProof), Error>
fn proven_connection(
&self,
connection_id: &ConnectionId,
height: Height
) -> Result<(ConnectionEnd, MerkleProof), Error>
fn proven_client_consensus(
&self,
client_id: &ClientId,
consensus_height: Height,
height: Height
) -> Result<(AnyConsensusState, MerkleProof), Error>
fn build_header(
&self,
trusted_height: Height,
target_height: Height,
client_state: AnyClientState
) -> Result<(AnyHeader, Vec<AnyHeader, Global>), Error>
fn check_misbehaviour(
&self,
update: UpdateClient,
client_state: AnyClientState
) -> Result<Option<MisbehaviourEvidence>, Error>
fn build_connection_proofs_and_client_state(
&self,
message_type: ConnectionMsgType,
connection_id: &ConnectionId,
client_id: &ClientId,
height: Height
) -> Result<(Option<AnyClientState>, Proofs), Error>
fn build_channel_proofs(
&self,
port_id: &PortId,
channel_id: &ChannelId,
height: Height
) -> Result<Proofs, Error>
fn build_packet_proofs(
&self,
packet_type: PacketMsgType,
port_id: &PortId,
channel_id: &ChannelId,
sequence: Sequence,
height: Height
) -> Result<(Vec<u8, Global>, Proofs), Error>
fn query_packet_commitments(
&self,
request: QueryPacketCommitmentsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>
fn query_unreceived_packets(
&self,
request: QueryUnreceivedPacketsRequest
) -> Result<Vec<Sequence, Global>, Error>
fn query_packet_acknowledgements(
&self,
request: QueryPacketAcknowledgementsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>
fn query_unreceived_acknowledgement(
&self,
request: QueryUnreceivedAcksRequest
) -> Result<Vec<Sequence, Global>, Error>
fn query_txs(
&self,
request: QueryTxRequest
) -> Result<Vec<IbcEvent, Global>, Error>
fn query_blocks(
&self,
request: QueryBlockRequest
) -> Result<(Vec<IbcEvent, Global>, Vec<IbcEvent, Global>), Error>
fn query_host_consensus_state(
&self,
request: QueryHostConsensusStateRequest
) -> Result<AnyConsensusState, Error>
sourceimpl ChainHandle for BaseChainHandle
impl ChainHandle for BaseChainHandle
fn new(chain_id: ChainId, sender: Sender<ChainRequest>) -> BaseChainHandle
fn id(&self) -> ChainId
fn health_check(&self) -> Result<HealthCheck, Error>
fn shutdown(&self) -> Result<(), Error>
fn subscribe(&self) -> Result<Receiver<Arc<Result<EventBatch, Error>>>, Error>
fn send_messages_and_wait_commit(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<IbcEvent, Global>, Error>
fn send_messages_and_wait_check_tx(
&self,
tracked_msgs: TrackedMsgs
) -> Result<Vec<Response, Global>, Error>
fn get_signer(&self) -> Result<Signer, Error>
fn config(&self) -> Result<ChainConfig, Error>
fn get_key(&self) -> Result<KeyEntry, Error>
fn add_key(&self, key_name: String, key: KeyEntry) -> Result<(), Error>
fn ibc_version(&self) -> Result<Option<Version>, Error>
fn query_balance(&self) -> Result<Balance, Error>
fn query_application_status(&self) -> Result<ChainStatus, Error>
fn query_clients(
&self,
request: QueryClientStatesRequest
) -> Result<Vec<IdentifiedAnyClientState, Global>, Error>
fn query_client_state(
&self,
request: QueryClientStateRequest
) -> Result<AnyClientState, Error>
fn query_client_connections(
&self,
request: QueryClientConnectionsRequest
) -> Result<Vec<ConnectionId, Global>, Error>
fn query_consensus_states(
&self,
request: QueryConsensusStatesRequest
) -> Result<Vec<AnyConsensusStateWithHeight, Global>, Error>
fn query_consensus_state(
&self,
request: QueryConsensusStateRequest
) -> Result<AnyConsensusState, Error>
fn query_upgraded_client_state(
&self,
request: QueryUpgradedClientStateRequest
) -> Result<(AnyClientState, MerkleProof), Error>
fn query_upgraded_consensus_state(
&self,
request: QueryUpgradedConsensusStateRequest
) -> Result<(AnyConsensusState, MerkleProof), Error>
fn query_commitment_prefix(&self) -> Result<CommitmentPrefix, Error>
fn query_compatible_versions(&self) -> Result<Vec<Version, Global>, Error>
fn query_connection(
&self,
request: QueryConnectionRequest
) -> Result<ConnectionEnd, Error>
fn query_connections(
&self,
request: QueryConnectionsRequest
) -> Result<Vec<IdentifiedConnectionEnd, Global>, Error>
fn query_connection_channels(
&self,
request: QueryConnectionChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>
fn query_next_sequence_receive(
&self,
request: QueryNextSequenceReceiveRequest
) -> Result<Sequence, Error>
fn query_channels(
&self,
request: QueryChannelsRequest
) -> Result<Vec<IdentifiedChannelEnd, Global>, Error>
fn query_channel(
&self,
request: QueryChannelRequest
) -> Result<ChannelEnd, Error>
fn query_channel_client_state(
&self,
request: QueryChannelClientStateRequest
) -> Result<Option<IdentifiedAnyClientState>, Error>
fn proven_client_state(
&self,
client_id: &ClientId,
height: Height
) -> Result<(AnyClientState, MerkleProof), Error>
fn proven_connection(
&self,
connection_id: &ConnectionId,
height: Height
) -> Result<(ConnectionEnd, MerkleProof), Error>
fn proven_client_consensus(
&self,
client_id: &ClientId,
consensus_height: Height,
height: Height
) -> Result<(AnyConsensusState, MerkleProof), Error>
fn build_header(
&self,
trusted_height: Height,
target_height: Height,
client_state: AnyClientState
) -> Result<(AnyHeader, Vec<AnyHeader, Global>), Error>
fn build_client_state(
&self,
height: Height,
settings: ClientSettings
) -> Result<AnyClientState, Error>
fn build_consensus_state(
&self,
trusted: Height,
target: Height,
client_state: AnyClientState
) -> Result<AnyConsensusState, Error>
fn check_misbehaviour(
&self,
update_event: UpdateClient,
client_state: AnyClientState
) -> Result<Option<MisbehaviourEvidence>, Error>
fn build_connection_proofs_and_client_state(
&self,
message_type: ConnectionMsgType,
connection_id: &ConnectionId,
client_id: &ClientId,
height: Height
) -> Result<(Option<AnyClientState>, Proofs), Error>
fn build_channel_proofs(
&self,
port_id: &PortId,
channel_id: &ChannelId,
height: Height
) -> Result<Proofs, Error>
fn build_packet_proofs(
&self,
packet_type: PacketMsgType,
port_id: &PortId,
channel_id: &ChannelId,
sequence: Sequence,
height: Height
) -> Result<(Vec<u8, Global>, Proofs), Error>
fn query_packet_commitments(
&self,
request: QueryPacketCommitmentsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>
fn query_unreceived_packets(
&self,
request: QueryUnreceivedPacketsRequest
) -> Result<Vec<Sequence, Global>, Error>
fn query_packet_acknowledgements(
&self,
request: QueryPacketAcknowledgementsRequest
) -> Result<(Vec<Sequence, Global>, Height), Error>
fn query_unreceived_acknowledgement(
&self,
request: QueryUnreceivedAcksRequest
) -> Result<Vec<Sequence, Global>, Error>
fn query_txs(
&self,
request: QueryTxRequest
) -> Result<Vec<IbcEvent, Global>, Error>
fn query_blocks(
&self,
request: QueryBlockRequest
) -> Result<(Vec<IbcEvent, Global>, Vec<IbcEvent, Global>), Error>
fn query_host_consensus_state(
&self,
request: QueryHostConsensusStateRequest
) -> Result<AnyConsensusState, Error>
Implementors
impl<Tag, Handle> ChainHandle for MonoTagged<Tag, Handle> where
Tag: Send + Sync + 'static,
Handle: ChainHandle,
Implement ChainHandle for any existential type Handle: ChainHandle.
This allows us to tag values for chains that are tagged by position
in N-ary chains.