Documentation
¶
Overview ¶
Package outscript generates potential output scripts for a given public key.
It supports Bitcoin and Bitcoin-like cryptocurrency output script formats (P2PKH, P2SH, P2WPKH, P2WSH, P2PK, P2TR, etc.), EVM-based networks (Ethereum and compatible chains), and other blockchains such as Litecoin, Dogecoin, Namecoin, Monacoin, Electraproto, Dash, Bitcoin Cash, and Massa.
The package also provides transaction building and signing for both Bitcoin-style (with segwit witness data) and EVM transactions, as well as block reward calculations for various cryptocurrency networks.
Index ¶
- Variables
- func BlockReward(network string, blockHeight uint64) (*big.Int, error)
- func CumulativeReward(network string, blockHeight uint64) (*big.Int, error)
- func EvmCall(method string, params ...any) ([]byte, error)
- func GuessPubKeyAndHashByInScript(scriptBytes []byte) (foundPubKey []byte, foundPubKeyHash []byte)
- func GuessPubKeyAndHashByOutScript(scriptBytes []byte) (foundPubKey []byte, foundPubKeyHash []byte)
- func ParsePushBytes(v []byte) ([]byte, int)
- func PushBytes(v []byte) []byte
- type AbiBuffer
- func (buf *AbiBuffer) AppendAddressAny(v any) error
- func (buf *AbiBuffer) AppendBigInt(v *big.Int) error
- func (buf *AbiBuffer) AppendBufferAny(v any) error
- func (buf *AbiBuffer) AppendBytes(v []byte)
- func (buf *AbiBuffer) AppendUint256Any(v any) error
- func (buf *AbiBuffer) Bytes() []byte
- func (buf *AbiBuffer) Call(method string) []byte
- func (buf *AbiBuffer) EncodeAbi(abi string, params ...any) error
- func (buf *AbiBuffer) EncodeAuto(params ...any) error
- func (buf *AbiBuffer) EncodeTypes(types []string, params ...any) error
- type BtcAmount
- type BtcTx
- func (tx *BtcTx) AddNetOutput(network, address string, amount uint64) error
- func (tx *BtcTx) AddOutput(address string, amount uint64) error
- func (tx *BtcTx) Bytes() []byte
- func (tx *BtcTx) ClearInputs()
- func (tx *BtcTx) ComputeSize() int
- func (tx *BtcTx) Dup() *BtcTx
- func (tx *BtcTx) HasWitness() bool
- func (tx *BtcTx) Hash() ([]byte, error)
- func (tx *BtcTx) MarshalBinary() ([]byte, error)
- func (tx *BtcTx) ReadFrom(r io.Reader) (int64, error)
- func (tx *BtcTx) Sign(keys ...*BtcTxSign) error
- func (tx *BtcTx) UnmarshalBinary(buf []byte) error
- type BtcTxInput
- type BtcTxOutput
- type BtcTxSign
- type BtcVarInt
- type Bytes
- type EvmTx
- func (tx *EvmTx) Call(method string, params ...any) error
- func (tx *EvmTx) Hash() ([]byte, error)
- func (tx *EvmTx) MarshalBinary() ([]byte, error)
- func (tx *EvmTx) MarshalJSON() ([]byte, error)
- func (tx *EvmTx) ParseTransaction(buf []byte) error
- func (tx *EvmTx) RlpFields() []any
- func (tx *EvmTx) SenderAddress() (string, error)
- func (tx *EvmTx) SenderPubkey() (*secp256k1.PublicKey, error)
- func (tx *EvmTx) Sign(key crypto.Signer) error
- func (tx *EvmTx) SignBytes() ([]byte, error)
- func (tx *EvmTx) SignWithOptions(key crypto.Signer, opts crypto.SignerOpts) error
- func (tx *EvmTx) Signature() (*secp256k1.Signature, error)
- func (tx *EvmTx) UnmarshalBinary(buf []byte) error
- func (tx *EvmTx) UnmarshalJSON(b []byte) error
- type EvmTxType
- type Format
- type Hex32
- type IHashInfo
- type IPushBytes
- type Insertable
- type Lookup
- type Out
- func GetOuts(pubkey crypto.PublicKey) []*Out
- func GuessOut(script []byte, pubkeyhint crypto.PublicKey) *Out
- func ParseBitcoinAddress(address string) (*Out, error)deprecated
- func ParseBitcoinBasedAddress(network, address string) (*Out, error)
- func ParseEvmAddress(address string) (*Out, error)
- func ParseMassaAddress(address string) (*Out, error)
- func ParseSolanaAddress(address string) (*Out, error)
- type Script
- type SolanaAccountMeta
- type SolanaCompiledInstruction
- type SolanaInstruction
- type SolanaKey
- type SolanaMessage
- type SolanaMessageHeader
- type SolanaTx
- type Transaction
Constants ¶
This section is empty.
Variables ¶
var ( // Formats maps script format names (e.g. "p2pkh", "p2wpkh", "eth") to their // corresponding [Format] definitions. Formats = map[string]Format{ "p2pkh": Format{Bytes{0x76, 0xa9}, IPushBytes{IHash160(Lookup("pubkey:comp"))}, Bytes{0x88, 0xac}}, "p2pukh": Format{Bytes{0x76, 0xa9}, IPushBytes{IHash160(Lookup("pubkey:uncomp"))}, Bytes{0x88, 0xac}}, "p2pk": Format{IPushBytes{Lookup("pubkey:comp")}, Bytes{0xac}}, "p2puk": Format{IPushBytes{Lookup("pubkey:uncomp")}, Bytes{0xac}}, "p2wpkh": Format{Bytes{0}, IPushBytes{IHash160(Lookup("pubkey:comp"))}}, "p2sh:p2pkh": Format{Bytes{0xa9}, IPushBytes{IHash160(Lookup("p2pkh"))}, Bytes{0x87}}, "p2sh:p2pukh": Format{Bytes{0xa9}, IPushBytes{IHash160(Lookup("p2pukh"))}, Bytes{0x87}}, "p2sh:p2pk": Format{Bytes{0xa9}, IPushBytes{IHash160(Lookup("p2pk"))}, Bytes{0x87}}, "p2sh:p2puk": Format{Bytes{0xa9}, IPushBytes{IHash160(Lookup("p2puk"))}, Bytes{0x87}}, "p2sh:p2wpkh": Format{Bytes{0xa9}, IPushBytes{IHash160(Lookup("p2wpkh"))}, Bytes{0x87}}, "p2wsh:p2pkh": Format{Bytes{0}, IPushBytes{IHash(Lookup("p2pkh"), sha256.New)}}, "p2wsh:p2pukh": Format{Bytes{0}, IPushBytes{IHash(Lookup("p2pukh"), sha256.New)}}, "p2wsh:p2pk": Format{Bytes{0}, IPushBytes{IHash(Lookup("p2pk"), sha256.New)}}, "p2wsh:p2puk": Format{Bytes{0}, IPushBytes{IHash(Lookup("p2puk"), sha256.New)}}, "p2wsh:p2wpkh": Format{Bytes{0}, IPushBytes{IHash(Lookup("p2wpkh"), sha256.New)}}, "eth": Format{IHash(Lookup("pubkey:uncomp"), newEtherHash)}, "massa_pubkey": Format{Bytes{0}, Lookup("pubkey:ed25519")}, "massa": Format{Bytes{0, 0}, IHash(Lookup("massa_pubkey"), newMassaHash)}, "solana": Format{Lookup("pubkey:ed25519")}, } // FormatsPerNetwork is a table listing the typically available formats for each network FormatsPerNetwork = map[string][]string{ "bitcoin": []string{"p2wpkh", "p2sh:p2wpkh", "p2puk", "p2pk", "p2pukh", "p2pkh"}, "bitcoin-cash": []string{"p2puk", "p2pk", "p2pukh", "p2pkh"}, "litecoin": []string{"p2wpkh", "p2sh:p2wpkh", "p2puk", "p2pk", "p2pukh", "p2pkh"}, "dogecoin": []string{"p2puk", "p2pk", "p2pukh", "p2pkh"}, "evm": []string{"eth"}, "massa": []string{"massa"}, "solana": []string{"solana"}, } )
var SolanaSystemProgram = mustParseSolanaKey("11111111111111111111111111111111")
SolanaSystemProgram is the address of the Solana System Program.
Functions ¶
func BlockReward ¶
BlockReward returns the block reward at the given blockHeight for the specified network, reading from chainConfigs.
func CumulativeReward ¶
CumulativeReward returns the total minted coins from block 0 through blockHeight (inclusive) for the specified network.
func EvmCall ¶
EvmCall generates calldata for a given EVM call, performing absolutely no check on the provided parameters as to whether these match the ABI or not.
func GuessPubKeyAndHashByInScript ¶
GuessPubKeyAndHashByInScript will attempt to guess the pubkey hash (address component) and possibly the pubkey from an input script.
func GuessPubKeyAndHashByOutScript ¶
GuessPubKeyAndHashByOutScript will attempt to guess the pubkey hash (address component) and possibly the pubkey from a output script.
func ParsePushBytes ¶
ParsePushBytes decodes a Bitcoin script push operation at the start of v, returning the pushed data and the total number of bytes consumed. It returns (nil, 0) on error.
Types ¶
type AbiBuffer ¶
type AbiBuffer struct {
// contains filtered or unexported fields
}
AbiBuffer is a builder for EVM ABI-encoded data. It supports encoding uint256, address, bytes, and string types, as well as generating method call data with the 4-byte function selector.
func NewAbiBuffer ¶
NewAbiBuffer returns a new AbiBuffer initialized with the given byte slice.
func (*AbiBuffer) AppendAddressAny ¶
AppendAddressAny appends a value as an ABI address parameter.
func (*AbiBuffer) AppendBigInt ¶
AppendBigInt appends a big.Int value to the buffer
func (*AbiBuffer) AppendBufferAny ¶
AppendBufferAny appends a value as an ABI bytes/string parameter. Supported Go types are []byte and string.
func (*AbiBuffer) AppendBytes ¶
AppendBytes adds a byte buffer as parameter (which will be actually an offset to a later area)
func (*AbiBuffer) AppendUint256Any ¶
AppendUint256Any appends a value as a uint256-style ABI parameter. Supported Go types are bool, int, and *big.Int.
func (*AbiBuffer) EncodeAbi ¶
EncodeAbi takes as first parameter an abi such as "transfer(address,uint256)" and a matching number of parameters.
func (*AbiBuffer) EncodeAuto ¶
EncodeAuto will encode a bunch of any values into whatever makes sense for the format they are. *big.Int will become uint256, *Script will become addresses, strings and []byte becomes bytes.
Non-compact format is fairly simple since all numeric values are uint256 (including addresses), and only strings/byte arrays are offsets to the end of the buffer where these are stored as length+data+padding
type BtcAmount ¶
type BtcAmount uint64
BtcAmount represents a Bitcoin amount in satoshis (1 BTC = 100,000,000 satoshis). It marshals to JSON as a decimal string with 8 decimal places and supports unmarshaling from decimal strings, integers, and hex-encoded values.
func (BtcAmount) MarshalJSON ¶
MarshalJSON encodes the amount as a JSON number with 8 decimal places (e.g. "1.00000000").
func (*BtcAmount) UnmarshalJSON ¶
UnmarshalJSON decodes a JSON number or quoted string into a BtcAmount.
func (*BtcAmount) UnmarshalText ¶
UnmarshalText decodes a text representation into a BtcAmount. It accepts decimal strings (e.g. "1.5"), integer strings (e.g. "100000000"), and hex-prefixed strings (e.g. "0x5f5e100").
type BtcTx ¶
type BtcTx struct {
Version uint32 `json:"version"`
In []*BtcTxInput `json:"vin"`
Out []*BtcTxOutput `json:"vout"`
Locktime uint32 `json:"locktime"`
}
BtcTx represents a Bitcoin transaction including its inputs, outputs, and witness data.
func (*BtcTx) AddNetOutput ¶
AddNetOutput adds the specified address as an output to the transaction. The address will be parsed for the given network and an error will be returned if the address is not valid. Passing "auto" as network name disables all checks and it is up to the caller to confirm the address and resulting output is valid first.
func (*BtcTx) AddOutput ¶
AddOutput adds the specified address as an output to the transaction. Note that this will not check if the output is valid for a given network, this is up to the caller to confirm things first.
func (*BtcTx) ClearInputs ¶
func (tx *BtcTx) ClearInputs()
ClearInputs removes all the input scripts and witnesses from the transaction. Used during signing.
func (*BtcTx) ComputeSize ¶
EstimateSize computes the transaction size, taking into account specific rules for segwit.
func (*BtcTx) HasWitness ¶
HasWitness reports whether any input in the transaction has witness data.
func (*BtcTx) Hash ¶
Hash computes the double SHA-256 transaction hash (txid) in the standard reversed byte order.
func (*BtcTx) MarshalBinary ¶
MarshalBinary implements encoding.BinaryMarshaler and returns the serialized transaction bytes.
func (*BtcTx) ReadFrom ¶
ReadFrom reads and parses a Bitcoin transaction from r, including segwit witness data if present.
func (*BtcTx) UnmarshalBinary ¶
UnmarshalBinary implements encoding.BinaryUnmarshaler and parses a serialized transaction.
type BtcTxInput ¶
BtcTxInput represents a single input in a Bitcoin transaction.
func (*BtcTxInput) Bytes ¶
func (in *BtcTxInput) Bytes() []byte
Bytes serializes the input into its binary representation (txid + vout + script + sequence).
func (*BtcTxInput) Dup ¶
func (in *BtcTxInput) Dup() *BtcTxInput
Dup returns a deep copy of the BtcTxInput.
func (*BtcTxInput) MarshalJSON ¶
func (in *BtcTxInput) MarshalJSON() ([]byte, error)
MarshalJSON encodes the transaction input as JSON with hex-encoded script and witness data.
func (*BtcTxInput) Prefill ¶
func (in *BtcTxInput) Prefill(scheme string) error
Prefill will fill the transaction input with empty data matching the expected signature length for the given scheme, if supported
type BtcTxOutput ¶
BtcTxOutput represents a single output in a Bitcoin transaction.
func (*BtcTxOutput) Bytes ¶
func (out *BtcTxOutput) Bytes() []byte
Bytes serializes the output into its binary representation (amount + script).
func (*BtcTxOutput) Dup ¶
func (out *BtcTxOutput) Dup() *BtcTxOutput
Dup returns a copy of the BtcTxOutput object; used for transaction signing.
func (*BtcTxOutput) MarshalJSON ¶
func (out *BtcTxOutput) MarshalJSON() ([]byte, error)
MarshalJSON encodes the transaction output as JSON.
func (*BtcTxOutput) ReadFrom ¶
func (out *BtcTxOutput) ReadFrom(r io.Reader) (int64, error)
ReadFrom parses a transaction output from the provided reader.
func (*BtcTxOutput) UnmarshalJSON ¶
func (out *BtcTxOutput) UnmarshalJSON(b []byte) error
UnmarshalJSON decodes a JSON representation into a BtcTxOutput.
type BtcTxSign ¶
type BtcTxSign struct {
Key crypto.Signer
Options crypto.SignerOpts
Scheme string // "p2pk", "p2wpkh", "p2wsh:p2pkh", etc
Amount BtcAmount // value of input, required for segwit transaction signing
SigHash uint32
}
BtcTxSign holds the signing parameters for a single transaction input.
type BtcVarInt ¶
type BtcVarInt uint64
BtcVarInt is a Bitcoin variable-length integer as defined in the Bitcoin protocol. Values 0-0xfc are stored as a single byte; larger values use a prefix byte (0xfd, 0xfe, or 0xff) followed by 2, 4, or 8 bytes respectively in little-endian order.
func (BtcVarInt) Len ¶
Len returns the number of bytes needed to encode this variable-length integer.
type Bytes ¶
type Bytes []byte
Bytes is an Insertable that returns a fixed byte sequence.
type EvmTx ¶
type EvmTx struct {
Nonce uint64
GasTipCap *big.Int // a.k.a. maxPriorityFeePerGas
GasFeeCap *big.Int // a.k.a. maxFeePerGas, correspond to GasFee if tx type is legacy or eip2930
Gas uint64 // gas of tx, can be obtained with eth_estimateGas, 21000 if Data is empty
To string
Value *big.Int
Data []byte
ChainId uint64 // in legacy tx, chainId is encoded in v before signature
Type EvmTxType // type of transaction: legacy, eip2930 or eip1559
AccessList []any // TODO
Signed bool
Y, R, S *big.Int
}
EvmTx represents an Ethereum Virtual Machine transaction. It supports legacy, EIP-2930, EIP-1559, and EIP-4844 transaction types, and can be signed, serialized, parsed, and converted to/from JSON.
func (*EvmTx) Call ¶
Call sets the transaction's Data field to the ABI-encoded method call for the given method signature and parameters.
func (*EvmTx) MarshalBinary ¶
MarshalBinary transforms the transaction into its binary representation
func (*EvmTx) MarshalJSON ¶
MarshalJSON encodes the transaction as a JSON object with hex-encoded numeric fields.
func (*EvmTx) ParseTransaction ¶
ParseTransaction will parse an incoming transaction and return an error in case of failure. In case of error, the state of tx is undefined.
func (*EvmTx) RlpFields ¶
RlpFields returns the Rlp fields for the given transaction, less the signature fields
func (*EvmTx) SenderAddress ¶
SenderAddress recovers and returns the EIP-55 checksummed sender address from the transaction signature.
func (*EvmTx) SenderPubkey ¶
SenderPubkey recovers the sender's public key from the transaction signature.
func (*EvmTx) SignWithOptions ¶
SignWithOptions signs the transaction using the given key and signer options.
func (*EvmTx) Signature ¶
Signature returns the parsed secp256k1 signature from the signed transaction.
func (*EvmTx) UnmarshalBinary ¶
UnmarshalBinary implements encoding.BinaryUnmarshaler
func (*EvmTx) UnmarshalJSON ¶
UnmarshalJSON decodes a JSON representation into an EvmTx.
type Format ¶
type Format []Insertable
Format is a sequence of Insertable values that together define how an output script is constructed from a public key.
type Hex32 ¶
type Hex32 [32]byte
Hex32 is a 32-byte array that marshals to and from a hex-encoded JSON string.
func (Hex32) MarshalJSON ¶
MarshalJSON encodes the 32-byte value as a hex string.
func (Hex32) UnmarshalJSON ¶
UnmarshalJSON decodes a hex string into the 32-byte value.
type IHashInfo ¶
type IHashInfo struct {
// contains filtered or unexported fields
}
IHashInfo is an Insertable that hashes the output of another Insertable using one or more chained hash functions.
func IHash ¶
func IHash(v Insertable, hash ...func() hash.Hash) IHashInfo
IHash returns an IHashInfo that hashes the output of v using the given hash functions in sequence.
func IHash160 ¶
func IHash160(v Insertable) IHashInfo
IHash160 returns an IHashInfo that computes HASH160 (SHA-256 followed by RIPEMD-160) of the output of v.
type IPushBytes ¶
type IPushBytes struct {
// contains filtered or unexported fields
}
IPushBytes is an Insertable that encodes the output of another Insertable as a Bitcoin script push operation.
func (IPushBytes) Bytes ¶
func (i IPushBytes) Bytes(s *Script) ([]byte, error)
Bytes generates the inner value and wraps it as a Bitcoin script push operation.
func (IPushBytes) String ¶
func (i IPushBytes) String() string
String returns a human-readable representation of the push operation.
type Insertable ¶
Insertable is a component that can produce bytes for inclusion in an output script. Implementations include literal Bytes, Lookup references to other formats, IPushBytes for Bitcoin PUSHDATA encoding, and IHashInfo for hashing.
type Lookup ¶
type Lookup string
Lookup is an Insertable that generates bytes by looking up another named format via Script.Generate.
type Out ¶
type Out struct {
Name string `json:"name"` // p2sh, etc
Script string `json:"script"` // out script
Flags []string `json:"flags,omitempty"` // flags
// contains filtered or unexported fields
}
Out represents a generated output script with its format name, hex-encoded script, and optional flags indicating the target network(s).
func GetOuts ¶
GetOuts returns the potential outputs that can be opened in theory with the given pubkey. p2w* values are "pay to segwit" and can only be used on segwit-enabled chains.
func GuessOut ¶
GuessOut will return a out matching the provided script, and attempt to guess the correct type. pubkeyhint can be nil and this function will still be useful, but it won't be able to differenciate between compressed and uncompressed keys if the script contains a hashed key
func ParseBitcoinAddress
deprecated
func ParseBitcoinBasedAddress ¶
ParseBitcoinBasedAddress parses an address in bitcoin format and returns the matching script, for the specified network. The special value "auto" for network will attempt to detect the network.
func ParseEvmAddress ¶
ParseEvmAddress parses an address to return an Out, supporting EVM-based networks.
func ParseMassaAddress ¶
ParseMassaAddress parses a Massa network address (starting with "AU" for user accounts or "AS" for smart contracts) and returns the corresponding Out.
func ParseSolanaAddress ¶
ParseSolanaAddress parses a Solana base58-encoded address and returns the corresponding Out. A valid Solana address is exactly 32 bytes when decoded.
func (*Out) Address ¶
Address returns an address matching the provided out. Flags will be used for hints if multiple addresses are possible.
type Script ¶
type Script struct {
// contains filtered or unexported fields
}
Script holds a public key and caches generated output scripts for various formats.
func New ¶
New returns a new Script object for the given public key, which can be used to generate output scripts
func (*Script) Address ¶
Address formats the key using the specified script (eg. p2sh, etc) and optional flags hints. You can do things like Address("eth") where no hint is needed, or things like Address("p2pkh", "litecoin") so the appropriate format is used.
type SolanaAccountMeta ¶
SolanaAccountMeta describes an account referenced by an instruction.
type SolanaCompiledInstruction ¶
SolanaCompiledInstruction is an instruction with account references replaced by indices into the message's account key array.
type SolanaInstruction ¶
type SolanaInstruction struct {
ProgramID SolanaKey
Accounts []SolanaAccountMeta
Data []byte
}
SolanaInstruction is a high-level instruction before account compilation.
func SolanaTransferInstruction ¶
func SolanaTransferInstruction(from, to SolanaKey, lamports uint64) SolanaInstruction
SolanaTransferInstruction returns a System Program transfer instruction that moves lamports from one account to another.
type SolanaKey ¶
type SolanaKey [32]byte
SolanaKey is a 32-byte public key used to identify accounts on the Solana network.
func ParseSolanaKey ¶
ParseSolanaKey parses a base58-encoded string into a SolanaKey.
type SolanaMessage ¶
type SolanaMessage struct {
Header SolanaMessageHeader
AccountKeys []SolanaKey
RecentBlockhash SolanaKey
Instructions []SolanaCompiledInstruction
}
SolanaMessage is the message portion of a Solana transaction.
func (*SolanaMessage) MarshalBinary ¶
func (msg *SolanaMessage) MarshalBinary() ([]byte, error)
MarshalBinary serializes the message into the Solana wire format.
func (*SolanaMessage) UnmarshalBinary ¶
func (msg *SolanaMessage) UnmarshalBinary(data []byte) error
UnmarshalBinary deserializes a message from the Solana wire format.
type SolanaMessageHeader ¶
type SolanaMessageHeader struct {
NumRequiredSignatures uint8
NumReadonlySignedAccounts uint8
NumReadonlyUnsignedAccounts uint8
}
SolanaMessageHeader contains the counts needed to distinguish signer and readonly accounts in a transaction message.
type SolanaTx ¶
type SolanaTx struct {
Signatures [][]byte
Message SolanaMessage
}
SolanaTx represents a Solana legacy (unversioned) transaction.
func NewSolanaTx ¶
func NewSolanaTx(feePayer, recentBlockhash SolanaKey, instructions ...SolanaInstruction) *SolanaTx
NewSolanaTx compiles a set of high-level instructions into a transaction. The fee payer is always placed first in the account list as a writable signer.
func (*SolanaTx) MarshalBinary ¶
MarshalBinary serializes the transaction into the Solana wire format.
func (*SolanaTx) Sign ¶
func (tx *SolanaTx) Sign(keys ...ed25519.PrivateKey) error
Sign signs the transaction message with the provided Ed25519 private keys. Keys are matched to signature slots by their public key.
func (*SolanaTx) UnmarshalBinary ¶
UnmarshalBinary deserializes a transaction from the Solana wire format.
type Transaction ¶
type Transaction interface {
encoding.BinaryMarshaler
encoding.BinaryUnmarshaler
Hash() ([]byte, error)
}
Transaction is the common interface for cryptocurrency transactions that can be serialized to binary and produce a hash.