defmodule BitcoinLib.Script.Opcodes.Arithmetic.GreaterThan do
@moduledoc """
Based on https://en.bitcoin.it/wiki/Script
Word OP_GREATERTHAN
Opcode 160
Hex 0xa0
Input a b
Output out
Returns 1 if a is greater than b, 0 otherwise.
"""
@behaviour BitcoinLib.Script.Opcode
defstruct []
alias BitcoinLib.Script.Opcodes.Arithmetic.GreaterThan
@type t :: GreaterThan
@value 0xA0
@doc """
Returns 0xa0
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.GreaterThan.v()
0xa0
"""
@spec v() :: 0xA0
def v do
@value
end
@doc """
Returns <<0xa0>>
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.GreaterThan.encode()
<<0xa0>>
"""
@spec encode() :: <<_::8>>
def encode() do
<<@value::8>>
end
@doc """
Returns 1 if a is greater than b, 0 otherwise.
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.GreaterThan.execute(
...> %BitcoinLib.Script.Opcodes.Arithmetic.GreaterThan{},
...> [2, 3, 1]
...> )
{:ok, [0, 1]}
"""
@spec execute(GreaterThan.t(), list()) :: {:ok, list()}
def execute(%GreaterThan{}, [first, second] ++ remaining) do
case first > second do
true -> {:ok, [1 | remaining]}
false -> {:ok, [0 | remaining]}
end
end
end