да, контракт может вызывать другой контракт, конечно. код самого контракта не нужен. нужен только интерфейс: имена методов, их аргументы и возвращаемые переменные)
можно и без интерфейса вообще. хэшировать имена функций, добавлять заэнокденные аргументы к хэшу, отправлять получившийся хекс на вызов другого контракта и декодить результат))