defmodule BitcoinLib.Script.Opcodes.Arithmetic.Sub do
@moduledoc """
Based on https://en.bitcoin.it/wiki/Script
Word OP_SUB
Opcode 148
Hex 0x94
Input a b
Output out
b is subtracted from a.
"""
@behaviour BitcoinLib.Script.Opcode
defstruct []
alias BitcoinLib.Script.Opcodes.Arithmetic.Sub
@type t :: Sub
@value 0x94
@doc """
Returns 0x94
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.Sub.v()
0x94
"""
@spec v() :: 0x94
def v do
@value
end
@doc """
Returns <<0x94>>
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.Sub.encode()
<<0x94>>
"""
@spec encode() :: <<_::8>>
def encode() do
<<@value::8>>
end
@doc """
b is subtracted from a.
## Examples
iex> BitcoinLib.Script.Opcodes.Arithmetic.Sub.execute(
...> %BitcoinLib.Script.Opcodes.Arithmetic.Sub{},
...> [7, 3, 1]
...> )
{:ok, [4, 1]}
"""
@spec execute(Sub.t(), list()) :: {:ok, list()}
def execute(%Sub{}, [first, second] ++ remaining) do
{:ok, [first - second | remaining]}
end
end