#include "cc/eval.h" #include "crosschain.h" #include "notarisationdb.h" #include "notaries_STAKED.h" extern const char *notaries_STAKED[][2]; extern const int num_notaries_STAKED; int GetSymbolAuthority(const char* symbol) { if (strncmp(symbol, "TXSCL", 5) == 0) return CROSSCHAIN_TXSCL; if ( (strncmp(symbol, "STKD", 4) == 0) || (strncmp(symbol, "STAKED", 6) == 0) ) return CROSSCHAIN_STAKED; return CROSSCHAIN_KOMODO; } bool CheckTxAuthority(const CTransaction &tx, CrosschainAuthority auth) { EvalRef eval; if (tx.vin.size() < auth.requiredSigs) return false; uint8_t seen[64] = {0}; BOOST_FOREACH(const CTxIn &txIn, tx.vin) { // Get notary pubkey CTransaction tx; uint256 hashBlock; if (!eval->GetTxUnconfirmed(txIn.prevout.hash, tx, hashBlock)) return false; if (tx.vout.size() < txIn.prevout.n) return false; CScript spk = tx.vout[txIn.prevout.n].scriptPubKey; if (spk.size() != 35) return false; const unsigned char *pk = spk.data(); if (pk++[0] != 33) return false; if (pk[33] != OP_CHECKSIG) return false; // Check it's a notary for (int i=0; i