Can a contract send data on a different's contract IBC (#1056)

* add test contract send ibc not owned

* add test send ibc diff contract counterparty channel

* remove meaningless case
This commit is contained in:
GNaD13
2022-10-21 18:01:51 +07:00
committed by GitHub
parent 6d67d5b4f7
commit 7243617196

View File

@@ -356,6 +356,70 @@ func TestContractCanEmulateIBCTransferMessageWithTimeout(t *testing.T) {
assert.Equal(t, initialSenderBalance.String(), newSenderBalance.String())
}
func TestContractEmulateIBCTransferMessageOnDiffContractIBCChannel(t *testing.T) {
// scenario: given two chains, A and B
// with 2 contract A1 and A2 on chain A
// then the contract A2 try to send an ibc packet via IBC Channel that create by A1 and B
myContractA1 := &sendEmulatedIBCTransferContract{}
myContractA2 := &sendEmulatedIBCTransferContract{}
var (
chainAOpts = []wasmkeeper.Option{
wasmkeeper.WithWasmEngine(
wasmtesting.NewIBCContractMockWasmer(myContractA1),
),
wasmkeeper.WithWasmEngine(
wasmtesting.NewIBCContractMockWasmer(myContractA2),
),
}
coordinator = wasmibctesting.NewCoordinator(t, 2, chainAOpts)
chainA = coordinator.GetChain(wasmibctesting.GetChainID(0))
chainB = coordinator.GetChain(wasmibctesting.GetChainID(1))
)
coordinator.CommitBlock(chainA, chainB)
myContractAddr1 := chainA.SeedNewContractInstance()
myContractA1.contractAddr = myContractAddr1.String()
myContractAddr2 := chainA.SeedNewContractInstance()
myContractA2.contractAddr = myContractAddr2.String()
path := wasmibctesting.NewPath(chainA, chainB)
path.EndpointA.ChannelConfig = &ibctesting.ChannelConfig{
PortID: chainA.ContractInfo(myContractAddr1).IBCPortID,
Version: ibctransfertypes.Version,
Order: channeltypes.UNORDERED,
}
path.EndpointB.ChannelConfig = &ibctesting.ChannelConfig{
PortID: ibctransfertypes.PortID,
Version: ibctransfertypes.Version,
Order: channeltypes.UNORDERED,
}
coordinator.SetupConnections(path)
coordinator.CreateChannels(path)
// when contract is triggered to send the ibc package to chain B
timeout := uint64(chainB.LastHeader.Header.Time.Add(time.Hour).UnixNano()) // enough time to not timeout
receiverAddress := chainB.SenderAccount.GetAddress()
coinToSendToB := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
// start transfer from chainA - A2 to chainB via IBC channel
startMsg := &types.MsgExecuteContract{
Sender: chainA.SenderAccount.GetAddress().String(),
Contract: myContractAddr2.String(),
Msg: startTransfer{
ChannelID: path.EndpointA.ChannelID,
CoinsToSend: coinToSendToB,
ReceiverAddr: receiverAddress.String(),
Timeout: timeout,
}.GetBytes(),
Funds: sdk.NewCoins(coinToSendToB),
}
_, err := chainA.SendMsgsExpPass(false, startMsg)
require.Error(t, err)
}
func TestContractHandlesChannelClose(t *testing.T) {
// scenario: a contract is the sending side of an ics20 transfer but the packet was not received
// on the destination chain within the timeout boundaries