solana

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 27, 2020 License: Apache-2.0 Imports: 15 Imported by: 0

README

Solana library for Go

Go library to interface with Solana nodes's JSON-RPC interface, Solana's SPL tokens and the Serum DEX instructions. More contracts to come.

Installation

solana-go works using SemVer but in 0 version, which means that the 'minor' will be changed when some broken changes are introduced into the application, and the 'patch' will be changed when a new feature with new changes is added or for bug fixing. As soon as v1.0.0 be released, solana-go will start to use SemVer as usual.

  1. Install from https://github.com/dfuse-io/solana-go/releases

or

  1. Install using Homebrew on macOS
$ brew install dfuse-io/tap/solana-go
  1. Build from source with:
$ go get -u -v github.com/dfuse-io/solana-go/cmd/slnc

Command-line

$ slnc get balance EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
1461600 lamports

$ slnc get account EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
{
  "lamports": 1461600,
  "data": [
    "AQAAABzjWe1aAS4E+hQrnHUaHF6Hz9CgFhuchf/TG3jN/Nj2gCa3xLwWAAAGAQEAAAAqnl7btTwEZ5CY/3sSZRcUQ0/AjFYqmjuGEQXmctQicw==",
    "base64"
  ],
  "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
  "executable": false,
  "rentEpoch": 108
}

$ slnc spl get mint SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt
Supply               9999647664800000
Decimals             6
No mint authority
No freeze authority

$ slnc serum list markets
...
ALEPH/USDT   EmCzMQfXMgNHcnRoFwAdPe1i2SuiSzMj1mx6wu3KN2uA
ALEPH/WUSDC  B37pZmwrwXHjpgvd9hHDAx1yeDsNevTnbbrN9W12BoGK
BTC/USDT     8AcVjMG2LTbpkjNoyq8RwysokqZunkjy3d5JDzxC6BJa
BTC/WUSDC    CAgAeMD7quTdnr6RPa7JySQpjf3irAmefYNdTb6anemq
ETH/USDT     HfCZdJ1wfsWKfYP2qyWdXTT5PWAGWFctzFjLH48U1Hsd
ETH/WUSDC    ASKiV944nKg1W9vsf7hf3fTsjawK6DwLwrnB2LH9n61c
SOL/USDT     8mDuvJJSgoodovMRYArtVVYBbixWYdGzR47GPrRT65YJ
SOL/WUSDC    Cdp72gDcYMCLLk3aDkPxjeiirKoFqK38ECm8Ywvk94Wi
...

$ slnc serum get market 7JCG9TsCx3AErSV3pvhxiW4AbkKRcJ6ZAveRmJwrgQ16
Price    Quantity  Depth
Asks
...
527.06   444.09    ####################
393.314  443.52    ###############
463.158  443.17    ###########
200      442.63    ######
234.503  442.54    ####
50       441.86    ##
61.563   441.47    #
84.377   440.98
-------  --------
10       439.96
193.303  439.24    ##
50       438.94    ##
0.5      438.87    ##
247.891  437.65    #####
458.296  436.99    #########
452.693  435.68    ##############
372.722  435.12    ##################
0.043    431.94    ##################
...

Library usage

Loading an SPL mint


import "github.com/dfuse-io/solana-go/rpc"
import "github.com/dfuse-io/solana-go/token"

	addr := solana.MustPublicKeyFromBase58("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
	cli := rpc.NewClient("http://api.mainnet-beta.solana.com/rpc")

	var m token.Mint
	err := cli.GetAccountDataIn(context.Background(), addr, &m)
	// handle `err`

	json.NewEncoder(os.Stdout).Encode(m)
	// {"OwnerOption":1,
	//  "Owner":"2wmVCSfPxGPjrnMMn7rchp4uaeoTqN39mXFC2zhPdri9",
	//  "Decimals":128,
	//  "IsInitialized":true}

Getting any account's data:


import "github.com/dfuse-io/solana-go/rpc"
import "github.com/dfuse-io/solana-go/token"

	addr := solana.MustPublicKeyFromBase58("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
	cli := rpc.NewClient("http://api.mainnet-beta.solana.com/rpc")

	acct, err := cli.GetAccountInfo(context.Background(), addr)
	// handle `err`

	json.NewEncoder(os.Stdout).Encode(m)
// {
//   "context": {
//     "Slot": 47836700
//   },
//   "value": {
//     "lamports": 1461600,
//     "data": {
//       "data": "AQAAABzjWe1aAS4E+hQrnHUaHF6Hz9CgFhuchf/TG3jN/Nj2gCa3xLwWAAAGAQEAAAAqnl7btTwEZ5CY/3sSZRcUQ0/AjFYqmjuGEQXmctQicw==",
//       "encoding": "base64"
//     },
//     "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
//     "executable": false,
//     "rentEpoch": 109
//   }
// }

Contributing

Any contributions are welcome, use your standard GitHub-fu to pitch in and improve.

License

Apache 2.0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var InstructionDecoderRegistry = map[string]InstructionDecoder{}

Functions

func DecimalsInBigInt

func DecimalsInBigInt(decimal uint32) *big.Int

func DecodeInstruction added in v0.2.0

func DecodeInstruction(programID PublicKey, accounts []*AccountMeta, inst *CompiledInstruction) (interface{}, error)

func NewRandomPrivateKey added in v0.2.0

func NewRandomPrivateKey() (PublicKey, PrivateKey, error)

func RegisterInstructionDecoder added in v0.2.0

func RegisterInstructionDecoder(programID PublicKey, decoder InstructionDecoder)

Types

type Account added in v0.2.0

type Account struct {
	PrivateKey PrivateKey
}

func AccountFromPrivateKeyBase58 added in v0.2.0

func AccountFromPrivateKeyBase58(privateKey string) (*Account, error)

func NewAccount added in v0.2.0

func NewAccount() *Account

func (*Account) PublicKey added in v0.2.0

func (a *Account) PublicKey() PublicKey

type AccountMeta

type AccountMeta struct {
	PublicKey  PublicKey
	IsSigner   bool
	IsWritable bool
}

type AccountSettable added in v0.2.0

type AccountSettable interface {
	SetAccounts(accounts []*AccountMeta, instructionActIdx []uint8) error
}

type Base58

type Base58 []byte

/

func (Base58) MarshalJSON

func (t Base58) MarshalJSON() ([]byte, error)

func (Base58) String

func (t Base58) String() string

func (*Base58) UnmarshalJSON

func (t *Base58) UnmarshalJSON(data []byte) (err error)

type ByteWrapper

type ByteWrapper struct {
	io.Reader
}

/

func (*ByteWrapper) ReadByte

func (w *ByteWrapper) ReadByte() (byte, error)

type CompiledInstruction

type CompiledInstruction struct {
	ProgramIDIndex uint8         `json:"programIdIndex"`
	AccountCount   bin.Varuint16 `json:"-" bin:"sizeof=Accounts"`
	Accounts       []uint8       `json:"accounts"`
	DataLength     bin.Varuint16 `json:"-" bin:"sizeof=Data"`
	Data           Base58        `json:"data"`
}

type Data

type Data []byte

/

func (Data) MarshalJSON

func (t Data) MarshalJSON() ([]byte, error)

func (Data) String

func (t Data) String() string

func (*Data) UnmarshalJSON

func (t *Data) UnmarshalJSON(data []byte) (err error)

type Hash

type Hash PublicKey

type InstructionDecoder added in v0.2.0

type InstructionDecoder func([]*AccountMeta, *CompiledInstruction) (interface{}, error)

type Message

type Message struct {
	Header          MessageHeader         `json:"header"`
	AccountKeys     []PublicKey           `json:"accountKeys"`
	RecentBlockhash PublicKey             `json:"recentBlockhash"`
	Instructions    []CompiledInstruction `json:"instructions"`
}

type MessageHeader

type MessageHeader struct {
	NumRequiredSignatures       uint8 `json:"numRequiredSignatures"`
	NumReadonlySignedAccounts   uint8 `json:"numReadonlySignedAccounts"`
	NumReadonlyUnsignedAccounts uint8 `json:"numReadonlyUnsignedAccounts"`
}

type Options added in v0.2.0

type Options struct {
	Payer PublicKey
}

type Padding

type Padding []byte

type PrivateKey added in v0.2.0

type PrivateKey []byte

func PrivateKeyFromBase58 added in v0.2.0

func PrivateKeyFromBase58(privkey string) (PrivateKey, error)

func (PrivateKey) PublicKey added in v0.2.0

func (k PrivateKey) PublicKey() PublicKey

func (PrivateKey) Sign added in v0.2.0

func (k PrivateKey) Sign(payload []byte) (Signature, error)

func (PrivateKey) String added in v0.2.0

func (k PrivateKey) String() string

type PublicKey

type PublicKey [32]byte

/

func MustPublicKeyFromBase58

func MustPublicKeyFromBase58(in string) PublicKey

func PublicKeyFromBase58

func PublicKeyFromBase58(in string) (out PublicKey, err error)

func (PublicKey) Equals added in v0.2.0

func (p PublicKey) Equals(pb PublicKey) bool

func (PublicKey) MarshalJSON

func (p PublicKey) MarshalJSON() ([]byte, error)

func (PublicKey) String

func (p PublicKey) String() string

func (*PublicKey) UnmarshalJSON

func (p *PublicKey) UnmarshalJSON(data []byte) (err error)

type Signature

type Signature [64]byte

/

func SignatureFromBase58

func SignatureFromBase58(in string) (out Signature, err error)

func (Signature) MarshalJSON

func (p Signature) MarshalJSON() ([]byte, error)

func (Signature) String

func (p Signature) String() string

func (*Signature) UnmarshalJSON

func (p *Signature) UnmarshalJSON(data []byte) (err error)

type Transaction

type Transaction struct {
	Signatures []Signature `json:"signatures"`
	Message    Message     `json:"message"`
}

func TransactionFromData

func TransactionFromData(in []byte) (*Transaction, error)

func TransactionWithInstructions added in v0.2.0

func TransactionWithInstructions(instructions []TransactionInstruction, blockHash PublicKey, opt *Options) (*Transaction, error)

func (*Transaction) AccountMetaList added in v0.2.0

func (t *Transaction) AccountMetaList() (out []*AccountMeta)

func (*Transaction) IsSigner added in v0.2.0

func (t *Transaction) IsSigner(account PublicKey) bool

func (*Transaction) IsWritable added in v0.2.0

func (t *Transaction) IsWritable(account PublicKey) bool

func (*Transaction) ResolveProgramIDIndex added in v0.2.0

func (t *Transaction) ResolveProgramIDIndex(programIDIndex uint8) (PublicKey, error)

func (*Transaction) Sign added in v0.2.0

func (t *Transaction) Sign(getter privateKeyGetter) (out []Signature, err error)

func (*Transaction) TouchAccount added in v0.2.0

func (t *Transaction) TouchAccount(account PublicKey) bool

type TransactionInstruction added in v0.2.0

type TransactionInstruction interface {
	Accounts() []*AccountMeta // returns the list of accounts the instructions requires
	ProgramID() PublicKey     // the programID the instruction acts on
	Data() ([]byte, error)    // the binary encoded instructions
}

Directories

Path Synopsis
cmd
programs
serum
Code generated by rice embed-go; DO NOT EDIT.
Code generated by rice embed-go; DO NOT EDIT.
token
Code generated by rice embed-go; DO NOT EDIT.
Code generated by rice embed-go; DO NOT EDIT.
rpc
ws

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL