defmodule BitcoinLib.Script.Opcodes.Locktime.CheckLockTimeVerify do
@moduledoc """
Based on https://en.bitcoin.it/wiki/Script#Locktime
Word OP_CHECKLOCKTIMEVERIFY
Opcode 177
Hex 0xb1
Input x
Output x / fail
Marks transaction as invalid if the top stack item is greater than the transaction's
nLockTime field, otherwise script evaluation continues as though an OP_NOP was executed.
Transaction is also invalid if any of these is true:
1. the stack is empty
2. the top stack item is negative
3. the top stack item is greater than or equal to 500000000 while the
transaction's nLockTime field is less than 500000000, or vice versa
4. the input's nSequence field is equal to 0xffffffff. The precise semantics
are described in BIP 0065.
"""
@behaviour BitcoinLib.Script.Opcode
alias BitcoinLib.Script.Opcodes.Locktime.CheckLockTimeVerify
@type t :: CheckLockTimeVerify
defstruct []
@value 0xB1
@doc """
Returns 0xb1
## Examples
iex> BitcoinLib.Script.Opcodes.Locktime.CheckLockTimeVerify.v()
0xb1
"""
@spec v() :: 0xB1
def v do
@value
end
@doc """
Returns <<0xb1>>
## Examples
iex> BitcoinLib.Script.Opcodes.Locktime.CheckLockTimeVerify.encode()
<<0xb1>>
"""
@spec encode() :: <<_::8>>
def encode() do
<<@value::8>>
end
@doc """
Returns 1 if the inputs are exactly equal, 0 otherwise.
## Examples
iex> BitcoinLib.Script.Opcodes.Locktime.CheckLockTimeVerify.execute(
...> %BitcoinLib.Script.Opcodes.Locktime.CheckLockTimeVerify{},
...> [3, 4]
...> )
{:error, "OP_CHECKLOCKTIMEVERIFY execution has not been implemented yet"}
"""
@spec execute(CheckLockTimeVerify.t(), list()) ::
{:ok, [1 | list()]} | {:ok, [0 | list()]} | {:error, binary()}
def execute(_opcode, []),
do: {:error, "trying to execute OP_CHECKLOCKTIMEVERIFY on an empty stack"}
def execute(_opcode, [_first_element | _remaining]) do
{:error, "OP_CHECKLOCKTIMEVERIFY execution has not been implemented yet"}
end
end