#include "Script.h" #include #include Script::Script(std::span data) { for(auto iter = data.begin(); iter != data.end();) { ScriptOperation operation; uint8_t* ptr = data.data(); size_t bytes = data.size_bytes(); operation.opCode = OpCode(*iter++); //std::cout << "found opcode: " << std::showbase << std::hex << std::setw(4) << (int)operation.opCode << std::dec << std::endl; if(operation.opCode <= OpCode::OP_PUSHDATA4) { size_t dataSize = 0; if(operation.opCode < OpCode::OP_PUSHDATA1) { dataSize = operation.opCode; } else if(operation.opCode == OpCode::OP_PUSHDATA1) { dataSize = *iter++; } else if(operation.opCode == OpCode::OP_PUSHDATA2) { dataSize = *((uint16_t*)&iter[0]); iter += 2; } else if(operation.opCode == OpCode::OP_PUSHDATA4) { dataSize = *((uint32_t *) &iter[0]); iter += 4; } operation.input = std::vector(iter, iter + dataSize); iter += dataSize; } _operations.emplace_back(operation); } _type = getType(); } Script::Script() { } ScriptType Script::getType() { if(_operations[0].opCode <= OpCode::OP_PUSHDATA4 && _operations[1].opCode == OpCode::OP_CHECKSIG) { return ScriptType::P2PK; } else if(_operations[0].opCode == OpCode::OP_DUP && _operations[1].opCode == OpCode::OP_HASH160 && _operations[2].opCode <= OpCode::OP_PUSHDATA4 && _operations[3].opCode == OpCode::OP_EQUALVERIFY && _operations[4].opCode == OpCode::OP_CHECKSIG) { return ScriptType::P2PKH; } else { throw std::runtime_error("Unsupported script type"); } }