  We implement extraction of Coq programs to functional languages based on
MetaCoq's certified erasure. We extend the MetaCoq erasure output language with
typing information and use it as an intermediate representation, which we call
$\lambda^T_\square$. We complement the extraction functionality with a full
pipeline that includes several standard transformations (eta-expansion,
inlining, etc) implemented in a proof-generating manner along with a verified
optimisation pass removing unused arguments. We prove the pass correct wrt. a
conventional call-by-value operational semantics of functional languages. From
the optimised $\lambda^T_\square$ representation, we obtain code in two
functional smart contract languages (Liquidity and CameLIGO), the functional
language Elm, and a subset of the multi-paradigm language for systems
programming Rust. Rust is currently gaining popularity as a language for smart
contracts, and we demonstrate how our extraction can be used to extract smart
contract code for the Concordium network. The development is done in the
context of the ConCert framework that enables smart contract verification. We
contribute with two verified real-world smart contracts (boardroom voting and
escrow), which we use, among other examples, to exemplify the applicability of
the pipeline. In addition, we develop a verified web application and extract it
to fully functional Elm code. In total, this gives us a way to write
dependently typed programs in Coq, verify, and then extract them to several
target languages while retaining a small trusted computing base of only MetaCoq
and the pretty-printers into these languages.
