The wallet code uses `Optional::emplace()`, which was only added in boost 1.56, see https://github.com/boostorg/optional/commit/2e583aaf30964afd66c1284aa71d0d8b42fa440d

So for 0.21.0 there are two options:
* Work around `emplace` and keep the minimum boost version below 1.56
* Require boost 1.56


```
wallet/rpcwallet.cpp: In function ‘UniValue listsinceblock(const JSONRPCRequest&)’:
wallet/rpcwallet.cpp:1560:16: error: ‘Optional<int>’ has no member named ‘emplace’
         height.emplace();
                ^
wallet/rpcwallet.cpp:1561:19: error: ‘Optional<int>’ has no member named ‘emplace’
         altheight.emplace();
                   ^
"                                                         types: nonstandard, pubkey, pubkeyhash, scripthash, multisig, nulldata, witness_v0_keyhash,\n"
                            "witness_v0_scripthash, witness_unknown."},
                        {RPCResult::Type::STR_HEX, "hex",  true, "The redeemscript for the p2sh address."},
                        {RPCResult::Type::ARR, "pubkeys",  true, "Array of pubkeys associated with the known redeemscript (only if script is multisig).",
                        {
                            {RPCResult::Type::STR, "pubkey", ""},
                        }},
                        {RPCResult::Type::NUM, "sigsrequired",  true, "The number of signatures required to spend multisig output (only if script is multisig)."},
                        {RPCResult::Type::STR_HEX, "pubkey",  true, "The hex value of the raw public key for single-key addresses (possibly embedded in P2SH or P2WSH)."},
                        {RPCResult::Type::OBJ, "embedded",  true, "Information about the address embedded in P2SH or P2WSH, if relevant and known.",
                        {
                            {RPCResult::Type::ELISION, "", "Includes all\n"
            "                                                         getaddressinfo output fields for the embedded address, excluding metadata (timestamp, hdkeypath,\n"
                            "hdseedid) and relation to the wallet (ismine, iswatchonly)."},
                        }},
                        {RPCResult::Type::BOOL, "iscompressed",  true, "If the pubkey is compressed."},
                        {RPCResult::Type::STR, "label", "DEPRECATED. The label associated with the address. Defaults to \"\". Replaced by the labels array below."},
                        {RPCResult::Type::NUM_TIME, "timestamp",  true, "The creation time of the key, if available, expressed in " + UNIX_EPOCH_TIME + "."},
                        {RPCResult::Type::STR, "hdkeypath",  true, "The HD keypath, if the key is HD and available."},
                        {RPCResult::Type::STR_HEX, "hdseedid",  true, "The Hash160 of the HD seed."},
                        {RPCResult::Type::STR_HEX, "hdmasterfingerprint",  true, "The fingerprint of the master key."},
                        {RPCResult::Type::ARR, "labels", "Array of labels associated with the address. Currently limited to one label but returned\n"
                            "as an array to keep the API stable if multiple labels are enabled in the future.",
                        {
                            {RPCResult::Type::STR, "label name", "The label name. Defaults to \"\"."},
                            {RPCResult::Type::OBJ, "", "label data, DEPRECATED, will be removed in 0.21. To re-enable, launch bitcoind with `-deprecatedrpc=labelspurpose`",
                            {
                                {RPCResult::Type::STR, "name", "The label name. Defaults to \"\"."},
                                {RPCResult::Type::STR, "purpose", "The purpose of the associated address (send or receive)."},
                            }},