| 43 | } |
| 44 | |
| 45 | std::pair<AnyScriptOutput, std::unique_ptr<AnyScriptInput>> p2shGenerate(const InputView &inputView, const blocksci::CScriptView &scriptView, const RawTransaction &tx, const SpendData<blocksci::AddressType::Enum::SCRIPTHASH> &) { |
| 46 | blocksci::CScriptView::iterator pc1 = scriptView.begin(); |
| 47 | blocksci::CScriptView::iterator prevpc = scriptView.begin(); |
| 48 | blocksci::CScriptView::iterator prevprevpc = scriptView.begin(); |
| 49 | blocksci::opcodetype opcode1; |
| 50 | ranges::subrange<const unsigned char *> vch1; |
| 51 | |
| 52 | ranges::subrange<const unsigned char *> lastScript; |
| 53 | while(true) { |
| 54 | prevprevpc = prevpc; |
| 55 | prevpc = pc1; |
| 56 | lastScript = vch1; |
| 57 | if(!scriptView.GetOp(pc1, opcode1, vch1)) { |
| 58 | break; |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | blocksci::CScriptView::iterator begin = scriptView.begin(); |
| 63 | auto wrappedInputBegin = &*begin; |
| 64 | auto wrappedInputLength = static_cast<uint32_t>(std::distance(begin, prevprevpc)); |
| 65 | |
| 66 | blocksci::CScriptView wrappedOutputScript(lastScript.begin(), lastScript.end()); |
| 67 | blocksci::CScriptView p2shScriptView{wrappedInputBegin, wrappedInputBegin + wrappedInputLength}; |
| 68 | AnyScriptOutput wrappedScriptOutput(wrappedOutputScript, false, inputView.witnessActivated); |
| 69 | return std::make_pair(wrappedScriptOutput, std::make_unique<AnyScriptInput>(inputView, p2shScriptView, tx, AnySpendData{wrappedScriptOutput})); |
| 70 | } |
| 71 | |
| 72 | ScriptInputData<blocksci::AddressType::Enum::SCRIPTHASH>::ScriptInputData(std::pair<AnyScriptOutput, std::unique_ptr<AnyScriptInput>> data) : wrappedScriptOutput(data.first), wrappedScriptInput(std::move(data.second)) {} |
| 73 |
no test coverage detected