Based on the answers to this other question, I understand that there isn't a standard programming language in which precompiles are written in.
The standard EVM precompiles are implemented in the programming language in which the client software is written in, e.g. for go-ethereum and revm.
But what about precompiles used in rollups and sidechains? I saw some projects with precompiles written in Yul, e.g. zkSync's bootloader, and other projects using Solidity directly, e.g. Hedera's HederaTokenService
.
If precompiles can indeed be written in Solidity/ Yul, how do node clients use these contracts in practice? Is the bytecode hardcoded into the client somewhere?
Or is it that both zkSync and Hedera provide a native implementation (e.g. in Rust) of their precompiles, but provide these Solidity/Yul as syntactic sugar for their users?