#include "zcash_script.h"
#include "script/interpreter.h"
#include "script/script_error.h"
#include "version.h"
namespace {
inline int set_error(ScriptError* ret, ScriptError serror)
{
if (ret)
*ret = serror;
return 0;
}
}
unsigned int zcash_script_version()
{
return ZCASH_SCRIPT_API_VER;
}
unsigned int zcash_script_legacy_sigop_count_script(
const unsigned char* script,
unsigned int scriptLen)
{
CScript cscript = CScript(script, script + scriptLen);
return cscript.GetSigOpCount(false);
}
int zcash_script_verify_callback(
const void* ctx,
void (*sighash)(unsigned char* sighash, unsigned int sighashLen, const void* ctx, const unsigned char* scriptCode, unsigned int scriptCodeLen, int hashType),
int64_t nLockTime,
uint8_t isFinal,
const unsigned char* scriptPubKey,
unsigned int scriptPubKeyLen,
const unsigned char* scriptSig,
unsigned int scriptSigLen,
unsigned int flags,
ScriptError* script_err)
{
try {
CScriptNum nLockTimeNum = CScriptNum(nLockTime);
return VerifyScript(
CScript(scriptSig, scriptSig + scriptSigLen),
CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen),
flags,
CallbackTransactionSignatureChecker(ctx, sighash, nLockTimeNum, isFinal != 0),
0,
script_err);
} catch (const std::exception&) {
return set_error(script_err, SCRIPT_ERR_VERIFY_SCRIPT);
}
}