mirror of
https://github.com/alexgo-io/gaze-brc20-indexer.git
synced 2026-01-12 14:34:54 +08:00
* fix: don't remove first block * fix: make etching_terms nullable * fix: fix panic if empty pkscript * chore: change testnet starting block * feat: more logs * fix: extract tapscript bug * feat: more logs * fix: switch pk to block height * chore: remove redundant log * fix: repo * fix: not found error * fix: golangci-lint * feat: add etching tx hash to rune entries * feat: stop main if indexer failed * fix: check balance after populating current balance * fix: sql ambiguous column * feat: add tx hash and out index in tx output * fix: actually use transactions to write db * fix: create rune entry states only during flushes * fix: mint cap reached off by one * fix: debug log unsafe * feat: prevent processing of txs before activation height * feat: add rune number to rune entry * feat: include new rune entries in event hash and flushing * refactor(config): separate init and get config func Co-authored-by: Gaze <dev@gaze.network> * feat: remove annoying log Co-authored-by: Gaze <dev@gaze.network> * feat: mod tidy Co-authored-by: Gaze <dev@gaze.network> * refactor: move main to root Co-authored-by: Gaze <dev@gaze.network> * feat(cli): create cli commands Co-authored-by: Gaze <dev@gaze.network> * refactor: move main logic to command Co-authored-by: Gaze <dev@gaze.network> * doc: remove unused desc Co-authored-by: Gaze <dev@gaze.network> * refactor: test structure in runestone_test.go * fix: edict flaws were ignored * feat: more tests * refactor(cli): add local flag Co-authored-by: Gaze <dev@gaze.network> * feat: set symbol limit to utf8.MaxRune * refactor(cli): flags for each module Co-authored-by: Gaze <dev@gaze.network> * feat(cli): support db selection Co-authored-by: Gaze <dev@gaze.network> * fix: remove temp code Co-authored-by: Gaze <dev@gaze.network> * fix: get data from cache in processor first, then dg * feat(cli): add version command Co-authored-by: Gaze <dev@gaze.network> * doc(cli): add refactor plan Co-authored-by: Gaze <dev@gaze.network> * refactor(cli): rename files Co-authored-by: Gaze <dev@gaze.network> * feat: add main.go Co-authored-by: Gaze <dev@gaze.network> * feat: more tests * feat: add overflow err * feat: finish runestone tests * refactor(cli): separate protocol config and cli flag Co-authored-by: Gaze <dev@gaze.network> * chore(btc): update example config Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add get block header to datasource interface Co-authored-by: Gaze <dev@gaze.network> * feat(btc): reorg handling Co-authored-by: Gaze <dev@gaze.network> * fix: interface Co-authored-by: Gaze <dev@gaze.network> * fix: rename postgres config key * fix: migrated runes indexer integration to new cli * fix: commit every block * feat(btc): add revert data query Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add revert data to processor Co-authored-by: Gaze <dev@gaze.network> * feat: implement public errors * fix: use errs in api * refactor: move api and usecase outside of internal * feat: add custom opcode check for datapush * fix: break if input utxo is not P2TR * fix: zero len destination case * fix: get the rest of transaction data in GetTransaction * refactor: create subscription utils tools Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add btc_database from datasource Co-authored-by: Gaze <dev@gaze.network> * doc(btc): add note Co-authored-by: Gaze <dev@gaze.network> * wip(btc): imple prepare range func Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add pg queries for datasource Co-authored-by: Gaze <dev@gaze.network> * feat(btc): update queries Co-authored-by: Gaze <dev@gaze.network> * feat(btc): implement repo for get blocks Co-authored-by: Gaze <dev@gaze.network> * feat(btc): update dg Co-authored-by: Gaze <dev@gaze.network> * fix(btc): return nil if errors Co-authored-by: Gaze <dev@gaze.network> * feat(btc): update fetch async for db datasource Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add get block header from db for reorg handling Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add todo notes Co-authored-by: Gaze <dev@gaze.network> * feat: implement get tx by hash * fix: rename func * fix: rename func * fix: rename func * fix: fix get transaction by hash * feat: integrate bitcoin client db to main * fix: reduce chunk size * fix: stop main if bitcoin indexer failed * fix: stop main if runes indexer failed * fix: move stop() inside goroutine * chore: add log * fix: duplicate rune entry number * feat(btc): add witness utils Co-authored-by: Gaze <dev@gaze.network> * feat(btc): witness datamodel parsing Co-authored-by: Gaze <dev@gaze.network> * fix(btc): invalid table name Co-authored-by: Gaze <dev@gaze.network> * fix(btc): remove uniqte index for hash Co-authored-by: Gaze <dev@gaze.network> * doc: add todo Co-authored-by: Gaze <dev@gaze.network> * feat(logger): remove error verbose Co-authored-by: Gaze <dev@gaze.network> * feat: support postgresql db Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add err notfound Co-authored-by: Gaze <dev@gaze.network> * fix: invalid pgx version Co-authored-by: Gaze <dev@gaze.network> * fix: invalid indexer flow Co-authored-by: Gaze <dev@gaze.network> * feat: refactor runes api * feat: implement http server * fix: mount runes api * fix: error handler * fix: first empty state error Co-authored-by: Gaze <dev@gaze.network> * fix: off by one confirmation * ci: ignore RollBack error * fix: change WithPublicMessage to be prefix * feat: bump cstream version Co-authored-by: Gaze <dev@gaze.network> * feat(btc): nullable pkscript Co-authored-by: Gaze <dev@gaze.network> * feat(btc): change rollback style Co-authored-by: Gaze <dev@gaze.network> * refactor: move runes out of internal * feat: rename id field to runeId in rune transaction * feat(btc): update index Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add default current block Co-authored-by: Gaze <dev@gaze.network> * doc: add note Co-authored-by: Gaze <dev@gaze.network> * fix(btc): use int64 to store sequence Co-authored-by: Gaze <dev@gaze.network> * fix(btc): upgrade data type for numbers Co-authored-by: Gaze <dev@gaze.network> * feat(btc): upgrade data type for idx Co-authored-by: Gaze <dev@gaze.network> * feat(btc): get indexed block impl Co-authored-by: Gaze <dev@gaze.network> * feat(btc): add common.ZeroHash Co-authored-by: Gaze <dev@gaze.network> * feat: add chainparam * feat: implement get transactions * fix: wrong condition for non-OP_RETURN output * feat(btc): add verify indexer states Co-authored-by: Gaze <dev@gaze.network> * refactor: sorting code Co-authored-by: Gaze <dev@gaze.network> * feat: fix interface * feat(btc): update chuunk size Co-authored-by: Gaze <dev@gaze.network> * feat: add rune_etched column in rune transaction * fix: missing field in create * feat: add runeEtched in get transactions * feat: implement get token info * feat: add holders count in token info * feat: implement get holders * fix: return a new repository when beginning a new tx * fix: rename type * feat: add pkscript to outpoint balance * feat: implement get utxos by address api * fix: spend outpoint bug * feat: implement get balances by address batch * feat: sort balances result by amount * ci: create Dockerfile Co-authored-by: Gaze <dev@gaze.network> * ci: add arg run Co-authored-by: Gaze <dev@gaze.network> * perf: add automaxprocs Co-authored-by: Gaze <dev@gaze.network> * chore: add performance logging Co-authored-by: Gaze <dev@gaze.network> * chore: add performance logger for debyug Co-authored-by: Gaze <dev@gaze.network> * fix: empty etched at * fix: revert data sequentially * fix: remove unused funcs * fix: main.go * feat: add flag --api-only to run cmd * fix: create index * fix: don't add zero mint to unallocated * fix: ignore zero burn amount * feat(reorg): add reorg detail Co-authored-by: Gaze <dev@gaze.network> * fix: wrong index type * feat: implement reporting client to report runes blocks * feat: implement report node * feat(runes): add latest block api Co-authored-by: Gaze <dev@gaze.network> * feat(btc): use logger warn Co-authored-by: Gaze <dev@gaze.network> * fix(btc): txout aren't revert if it's have to revert spent Co-authored-by: Gaze <dev@gaze.network> * fix: annoying error when unsubscribe fetcher Co-authored-by: Gaze <dev@gaze.network> * refactor(btc): readable code Co-authored-by: Gaze <dev@gaze.network> * fix(indexer): fix subscription closed before process when success fetch Co-authored-by: Gaze <dev@gaze.network> * fix: remove module enum * fix: increase max reorg limit * feat: add starting height for runes mainnet * fix(btc): fix `with` modified same row twice Co-authored-by: Gaze <dev@gaze.network> * fix(runes): handling latest block not found Co-authored-by: Gaze <dev@gaze.network> * feat: add decimals in get transactions * fix: wrong condition * feat: add more index * feat: implement get transactions by pkscript * feat: allow query by rune id too * feat: more comments * perf(btc): bitcoin indexer performance optimization (#4) * feat(btc): not null to witness Co-authored-by: Gaze <dev@gaze.network> * perf(btc): add batch insert txin Co-authored-by: Gaze <dev@gaze.network> * perf(btc): batch insert txout Co-authored-by: Gaze <dev@gaze.network> * perf(btc): batch insert transaction Co-authored-by: Gaze <dev@gaze.network> * feat(btc): remove old queries Co-authored-by: Gaze <dev@gaze.network> * fix(btc): typo Co-authored-by: Gaze <dev@gaze.network> * perf(btc): batch insert blocks (#5) Co-authored-by: Gaze <gazenw@users.noreply.github.com> --------- Co-authored-by: Gaze <gazenw@users.noreply.github.com> * feat(btc): Duplicate coinbase transaction handling (#7) * feat(btc): tx_hash can duplicated in block v1 Co-authored-by: Gaze <dev@gaze.network> * feat(btc): duplicate tx will use same txin/txout from previous tx Co-authored-by: Gaze <dev@gaze.network> * feat(btc): prevent revert block v1 data if you really want to revert the data before the block version 2, you should reset the database and reindex the data instead. Co-authored-by: Gaze <dev@gaze.network> * doc(btc): update list duplicate tx hash Co-authored-by: Gaze <dev@gaze.network> * doc(btc): update docs Co-authored-by: Gaze <dev@gaze.network> * fix(btc): use last v1 block instead Co-authored-by: Gaze <dev@gaze.network> --------- Co-authored-by: Gaze <gazenw@users.noreply.github.com> * feat: add ping handler * fix: type Co-authored-by: Gaze <dev@gaze.network> * doc: add refactor note Co-authored-by: Gaze <dev@gaze.network> * ci: add golang linter and test runner gh action * ci: use go-test-action@v0 * ci: annotate test result * ci: update running flag * fix: try to fix malformed import path * feat: add mock test * ci: remove annotation ci * ci: add annotate test result * chore: remove unused * feat: try testify * feat: remove test * ci: add go test on macos, windows and go latest version * ci: test building * feat: remove mock code * ci: add sqlc diff checker action (#10) * feat: Graceful shutdown (#8) * feat: add shutdown function for indexer Co-authored-by: Gaze <dev@gaze.network> * feat: add force shutdown Co-authored-by: Gaze <dev@gaze.network> * revert Co-authored-by: Gaze <dev@gaze.network> * feat(btc): remove unused Co-authored-by: Gaze <dev@gaze.network> * style: go fmt Co-authored-by: Gaze <dev@gaze.network> * feat: separate context for worker and application * feat: increase force shutdown timeout Co-authored-by: Gaze <dev@gaze.network> * feat(btc): update logging Co-authored-by: Gaze <dev@gaze.network> * feat(btc): update shutdown function Co-authored-by: Gaze <dev@gaze.network> * feat: remove wg for shutdown Co-authored-by: Gaze <dev@gaze.network> * feat: refactor shutdown flow Co-authored-by: Gaze <dev@gaze.network> * feat: update shutdown flow Co-authored-by: Gaze <dev@gaze.network> * feat: update maming Co-authored-by: Gaze <dev@gaze.network> * feat: update force shutdown logic Co-authored-by: Gaze <dev@gaze.network> --------- Co-authored-by: Gaze <gazenw@users.noreply.github.com> * feat: check reporting config name * fix: use db config in bitcoin module for runes datasource * Add migrate commands (#2) * feat: add migrate up * feat: add down migration * fix: example * feat: change description * fix: hardcode migration source directory * Update README.md for public release. (#11) * feat: initial draft for README.md * fix: remove some sections * feat: add block reporting to first description * fix: reduce redundancy * feat: update README.md * Update README.md * feat: update README.md * fix: update config.yaml in README * fix: remove redundant words * fix: change default datasource * fix: config.yaml comments * feat: update README.md * refactor(logger): format logging (#12) * feat(logger): format main logger * feat(logger): use duration ms for gcp output * refactor(logger): bitcoin node logger * refactor(logger): indexer logger * refactor(logger): fix cmd logger * refactor(logger): logger in config pacakge * refactor(logger): set pgx error log level debug * refactor(logger): btcclient datasource * refactor: processor name * refactor(logger): runese logger * refactor(logger): update logger * fix(runes): wrong btc db datasource * refactor(logger): remove unnecessary debug log * refactor: update logger in indexer * fix(logger): deadlock in load() * fix: remove unused --------- Co-authored-by: Gaze <gazenw@users.noreply.github.com> * feat(btc): remove unused func * fix: fix golangci-lint error * fix(pg): update logger level * doc: update config example * feat: go mod tidy * doc: update readme * fix: panic cause didn't handle error * doc: update example config * doc: update example config in readme * feat(logger): only log error stacktrace when debug mode is on * feat(reporting): handling invalid config error * feat(pg): handling invalid config error * fix: panic in get_token_info --------- Co-authored-by: Gaze <gazenw@users.noreply.github.com> Co-authored-by: Planxnx <thanee@cleverse.com> Co-authored-by: Thanee Charattrakool <37617738+Planxnx@users.noreply.github.com>
817 lines
24 KiB
Go
817 lines
24 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.26.0
|
|
// source: data.sql
|
|
|
|
package gen
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const countRuneEntries = `-- name: CountRuneEntries :one
|
|
SELECT COUNT(*) FROM runes_entries
|
|
`
|
|
|
|
func (q *Queries) CountRuneEntries(ctx context.Context) (int64, error) {
|
|
row := q.db.QueryRow(ctx, countRuneEntries)
|
|
var count int64
|
|
err := row.Scan(&count)
|
|
return count, err
|
|
}
|
|
|
|
const createIndexedBlock = `-- name: CreateIndexedBlock :exec
|
|
INSERT INTO runes_indexed_blocks (hash, height, prev_hash, event_hash, cumulative_event_hash) VALUES ($1, $2, $3, $4, $5)
|
|
`
|
|
|
|
type CreateIndexedBlockParams struct {
|
|
Hash string
|
|
Height int32
|
|
PrevHash string
|
|
EventHash string
|
|
CumulativeEventHash string
|
|
}
|
|
|
|
func (q *Queries) CreateIndexedBlock(ctx context.Context, arg CreateIndexedBlockParams) error {
|
|
_, err := q.db.Exec(ctx, createIndexedBlock,
|
|
arg.Hash,
|
|
arg.Height,
|
|
arg.PrevHash,
|
|
arg.EventHash,
|
|
arg.CumulativeEventHash,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const createRuneEntry = `-- name: CreateRuneEntry :exec
|
|
INSERT INTO runes_entries (rune_id, rune, number, spacers, premine, symbol, divisibility, terms, terms_amount, terms_cap, terms_height_start, terms_height_end, terms_offset_start, terms_offset_end, turbo, etching_block, etching_tx_hash, etched_at)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)
|
|
`
|
|
|
|
type CreateRuneEntryParams struct {
|
|
RuneID string
|
|
Rune string
|
|
Number int64
|
|
Spacers int32
|
|
Premine pgtype.Numeric
|
|
Symbol int32
|
|
Divisibility int16
|
|
Terms bool
|
|
TermsAmount pgtype.Numeric
|
|
TermsCap pgtype.Numeric
|
|
TermsHeightStart pgtype.Int4
|
|
TermsHeightEnd pgtype.Int4
|
|
TermsOffsetStart pgtype.Int4
|
|
TermsOffsetEnd pgtype.Int4
|
|
Turbo bool
|
|
EtchingBlock int32
|
|
EtchingTxHash string
|
|
EtchedAt pgtype.Timestamp
|
|
}
|
|
|
|
func (q *Queries) CreateRuneEntry(ctx context.Context, arg CreateRuneEntryParams) error {
|
|
_, err := q.db.Exec(ctx, createRuneEntry,
|
|
arg.RuneID,
|
|
arg.Rune,
|
|
arg.Number,
|
|
arg.Spacers,
|
|
arg.Premine,
|
|
arg.Symbol,
|
|
arg.Divisibility,
|
|
arg.Terms,
|
|
arg.TermsAmount,
|
|
arg.TermsCap,
|
|
arg.TermsHeightStart,
|
|
arg.TermsHeightEnd,
|
|
arg.TermsOffsetStart,
|
|
arg.TermsOffsetEnd,
|
|
arg.Turbo,
|
|
arg.EtchingBlock,
|
|
arg.EtchingTxHash,
|
|
arg.EtchedAt,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const createRuneEntryState = `-- name: CreateRuneEntryState :exec
|
|
INSERT INTO runes_entry_states (rune_id, block_height, mints, burned_amount, completed_at, completed_at_height) VALUES ($1, $2, $3, $4, $5, $6)
|
|
`
|
|
|
|
type CreateRuneEntryStateParams struct {
|
|
RuneID string
|
|
BlockHeight int32
|
|
Mints pgtype.Numeric
|
|
BurnedAmount pgtype.Numeric
|
|
CompletedAt pgtype.Timestamp
|
|
CompletedAtHeight pgtype.Int4
|
|
}
|
|
|
|
func (q *Queries) CreateRuneEntryState(ctx context.Context, arg CreateRuneEntryStateParams) error {
|
|
_, err := q.db.Exec(ctx, createRuneEntryState,
|
|
arg.RuneID,
|
|
arg.BlockHeight,
|
|
arg.Mints,
|
|
arg.BurnedAmount,
|
|
arg.CompletedAt,
|
|
arg.CompletedAtHeight,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const createRuneTransaction = `-- name: CreateRuneTransaction :exec
|
|
INSERT INTO runes_transactions (hash, block_height, index, timestamp, inputs, outputs, mints, burns, rune_etched) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
`
|
|
|
|
type CreateRuneTransactionParams struct {
|
|
Hash string
|
|
BlockHeight int32
|
|
Index int32
|
|
Timestamp pgtype.Timestamp
|
|
Inputs []byte
|
|
Outputs []byte
|
|
Mints []byte
|
|
Burns []byte
|
|
RuneEtched bool
|
|
}
|
|
|
|
func (q *Queries) CreateRuneTransaction(ctx context.Context, arg CreateRuneTransactionParams) error {
|
|
_, err := q.db.Exec(ctx, createRuneTransaction,
|
|
arg.Hash,
|
|
arg.BlockHeight,
|
|
arg.Index,
|
|
arg.Timestamp,
|
|
arg.Inputs,
|
|
arg.Outputs,
|
|
arg.Mints,
|
|
arg.Burns,
|
|
arg.RuneEtched,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const createRunestone = `-- name: CreateRunestone :exec
|
|
INSERT INTO runes_runestones (tx_hash, block_height, etching, etching_divisibility, etching_premine, etching_rune, etching_spacers, etching_symbol, etching_terms, etching_terms_amount, etching_terms_cap, etching_terms_height_start, etching_terms_height_end, etching_terms_offset_start, etching_terms_offset_end, etching_turbo, edicts, mint, pointer, cenotaph, flaws)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21)
|
|
`
|
|
|
|
type CreateRunestoneParams struct {
|
|
TxHash string
|
|
BlockHeight int32
|
|
Etching bool
|
|
EtchingDivisibility pgtype.Int2
|
|
EtchingPremine pgtype.Numeric
|
|
EtchingRune pgtype.Text
|
|
EtchingSpacers pgtype.Int4
|
|
EtchingSymbol pgtype.Int4
|
|
EtchingTerms pgtype.Bool
|
|
EtchingTermsAmount pgtype.Numeric
|
|
EtchingTermsCap pgtype.Numeric
|
|
EtchingTermsHeightStart pgtype.Int4
|
|
EtchingTermsHeightEnd pgtype.Int4
|
|
EtchingTermsOffsetStart pgtype.Int4
|
|
EtchingTermsOffsetEnd pgtype.Int4
|
|
EtchingTurbo pgtype.Bool
|
|
Edicts []byte
|
|
Mint pgtype.Text
|
|
Pointer pgtype.Int4
|
|
Cenotaph bool
|
|
Flaws int32
|
|
}
|
|
|
|
func (q *Queries) CreateRunestone(ctx context.Context, arg CreateRunestoneParams) error {
|
|
_, err := q.db.Exec(ctx, createRunestone,
|
|
arg.TxHash,
|
|
arg.BlockHeight,
|
|
arg.Etching,
|
|
arg.EtchingDivisibility,
|
|
arg.EtchingPremine,
|
|
arg.EtchingRune,
|
|
arg.EtchingSpacers,
|
|
arg.EtchingSymbol,
|
|
arg.EtchingTerms,
|
|
arg.EtchingTermsAmount,
|
|
arg.EtchingTermsCap,
|
|
arg.EtchingTermsHeightStart,
|
|
arg.EtchingTermsHeightEnd,
|
|
arg.EtchingTermsOffsetStart,
|
|
arg.EtchingTermsOffsetEnd,
|
|
arg.EtchingTurbo,
|
|
arg.Edicts,
|
|
arg.Mint,
|
|
arg.Pointer,
|
|
arg.Cenotaph,
|
|
arg.Flaws,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const deleteIndexedBlockSinceHeight = `-- name: DeleteIndexedBlockSinceHeight :exec
|
|
DELETE FROM runes_indexed_blocks WHERE height >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteIndexedBlockSinceHeight(ctx context.Context, height int32) error {
|
|
_, err := q.db.Exec(ctx, deleteIndexedBlockSinceHeight, height)
|
|
return err
|
|
}
|
|
|
|
const deleteOutPointBalancesSinceHeight = `-- name: DeleteOutPointBalancesSinceHeight :exec
|
|
DELETE FROM runes_outpoint_balances WHERE block_height >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteOutPointBalancesSinceHeight(ctx context.Context, blockHeight int32) error {
|
|
_, err := q.db.Exec(ctx, deleteOutPointBalancesSinceHeight, blockHeight)
|
|
return err
|
|
}
|
|
|
|
const deleteRuneBalancesSinceHeight = `-- name: DeleteRuneBalancesSinceHeight :exec
|
|
DELETE FROM runes_balances WHERE block_height >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteRuneBalancesSinceHeight(ctx context.Context, blockHeight int32) error {
|
|
_, err := q.db.Exec(ctx, deleteRuneBalancesSinceHeight, blockHeight)
|
|
return err
|
|
}
|
|
|
|
const deleteRuneEntriesSinceHeight = `-- name: DeleteRuneEntriesSinceHeight :exec
|
|
DELETE FROM runes_entries WHERE etching_block >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteRuneEntriesSinceHeight(ctx context.Context, etchingBlock int32) error {
|
|
_, err := q.db.Exec(ctx, deleteRuneEntriesSinceHeight, etchingBlock)
|
|
return err
|
|
}
|
|
|
|
const deleteRuneEntryStatesSinceHeight = `-- name: DeleteRuneEntryStatesSinceHeight :exec
|
|
DELETE FROM runes_entry_states WHERE block_height >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteRuneEntryStatesSinceHeight(ctx context.Context, blockHeight int32) error {
|
|
_, err := q.db.Exec(ctx, deleteRuneEntryStatesSinceHeight, blockHeight)
|
|
return err
|
|
}
|
|
|
|
const deleteRuneTransactionsSinceHeight = `-- name: DeleteRuneTransactionsSinceHeight :exec
|
|
DELETE FROM runes_transactions WHERE block_height >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteRuneTransactionsSinceHeight(ctx context.Context, blockHeight int32) error {
|
|
_, err := q.db.Exec(ctx, deleteRuneTransactionsSinceHeight, blockHeight)
|
|
return err
|
|
}
|
|
|
|
const deleteRunestonesSinceHeight = `-- name: DeleteRunestonesSinceHeight :exec
|
|
DELETE FROM runes_runestones WHERE block_height >= $1
|
|
`
|
|
|
|
func (q *Queries) DeleteRunestonesSinceHeight(ctx context.Context, blockHeight int32) error {
|
|
_, err := q.db.Exec(ctx, deleteRunestonesSinceHeight, blockHeight)
|
|
return err
|
|
}
|
|
|
|
const getBalanceByPkScriptAndRuneId = `-- name: GetBalanceByPkScriptAndRuneId :one
|
|
SELECT pkscript, block_height, rune_id, amount FROM runes_balances WHERE pkscript = $1 AND rune_id = $2 AND block_height <= $3 ORDER BY block_height DESC LIMIT 1
|
|
`
|
|
|
|
type GetBalanceByPkScriptAndRuneIdParams struct {
|
|
Pkscript string
|
|
RuneID string
|
|
BlockHeight int32
|
|
}
|
|
|
|
func (q *Queries) GetBalanceByPkScriptAndRuneId(ctx context.Context, arg GetBalanceByPkScriptAndRuneIdParams) (RunesBalance, error) {
|
|
row := q.db.QueryRow(ctx, getBalanceByPkScriptAndRuneId, arg.Pkscript, arg.RuneID, arg.BlockHeight)
|
|
var i RunesBalance
|
|
err := row.Scan(
|
|
&i.Pkscript,
|
|
&i.BlockHeight,
|
|
&i.RuneID,
|
|
&i.Amount,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getBalancesByPkScript = `-- name: GetBalancesByPkScript :many
|
|
WITH balances AS (
|
|
SELECT DISTINCT ON (rune_id) pkscript, block_height, rune_id, amount FROM runes_balances WHERE pkscript = $1 AND block_height <= $2 ORDER BY rune_id, block_height DESC
|
|
)
|
|
SELECT pkscript, block_height, rune_id, amount FROM balances WHERE amount > 0
|
|
`
|
|
|
|
type GetBalancesByPkScriptParams struct {
|
|
Pkscript string
|
|
BlockHeight int32
|
|
}
|
|
|
|
type GetBalancesByPkScriptRow struct {
|
|
Pkscript string
|
|
BlockHeight int32
|
|
RuneID string
|
|
Amount pgtype.Numeric
|
|
}
|
|
|
|
func (q *Queries) GetBalancesByPkScript(ctx context.Context, arg GetBalancesByPkScriptParams) ([]GetBalancesByPkScriptRow, error) {
|
|
rows, err := q.db.Query(ctx, getBalancesByPkScript, arg.Pkscript, arg.BlockHeight)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetBalancesByPkScriptRow
|
|
for rows.Next() {
|
|
var i GetBalancesByPkScriptRow
|
|
if err := rows.Scan(
|
|
&i.Pkscript,
|
|
&i.BlockHeight,
|
|
&i.RuneID,
|
|
&i.Amount,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getBalancesByRuneId = `-- name: GetBalancesByRuneId :many
|
|
WITH balances AS (
|
|
SELECT DISTINCT ON (pkscript) pkscript, block_height, rune_id, amount FROM runes_balances WHERE rune_id = $1 AND block_height <= $2 ORDER BY pkscript, block_height DESC
|
|
)
|
|
SELECT pkscript, block_height, rune_id, amount FROM balances WHERE amount > 0
|
|
`
|
|
|
|
type GetBalancesByRuneIdParams struct {
|
|
RuneID string
|
|
BlockHeight int32
|
|
}
|
|
|
|
type GetBalancesByRuneIdRow struct {
|
|
Pkscript string
|
|
BlockHeight int32
|
|
RuneID string
|
|
Amount pgtype.Numeric
|
|
}
|
|
|
|
func (q *Queries) GetBalancesByRuneId(ctx context.Context, arg GetBalancesByRuneIdParams) ([]GetBalancesByRuneIdRow, error) {
|
|
rows, err := q.db.Query(ctx, getBalancesByRuneId, arg.RuneID, arg.BlockHeight)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetBalancesByRuneIdRow
|
|
for rows.Next() {
|
|
var i GetBalancesByRuneIdRow
|
|
if err := rows.Scan(
|
|
&i.Pkscript,
|
|
&i.BlockHeight,
|
|
&i.RuneID,
|
|
&i.Amount,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getIndexedBlockByHeight = `-- name: GetIndexedBlockByHeight :one
|
|
SELECT height, hash, prev_hash, event_hash, cumulative_event_hash FROM runes_indexed_blocks WHERE height = $1
|
|
`
|
|
|
|
func (q *Queries) GetIndexedBlockByHeight(ctx context.Context, height int32) (RunesIndexedBlock, error) {
|
|
row := q.db.QueryRow(ctx, getIndexedBlockByHeight, height)
|
|
var i RunesIndexedBlock
|
|
err := row.Scan(
|
|
&i.Height,
|
|
&i.Hash,
|
|
&i.PrevHash,
|
|
&i.EventHash,
|
|
&i.CumulativeEventHash,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getLatestIndexedBlock = `-- name: GetLatestIndexedBlock :one
|
|
SELECT height, hash, prev_hash, event_hash, cumulative_event_hash FROM runes_indexed_blocks ORDER BY height DESC LIMIT 1
|
|
`
|
|
|
|
func (q *Queries) GetLatestIndexedBlock(ctx context.Context) (RunesIndexedBlock, error) {
|
|
row := q.db.QueryRow(ctx, getLatestIndexedBlock)
|
|
var i RunesIndexedBlock
|
|
err := row.Scan(
|
|
&i.Height,
|
|
&i.Hash,
|
|
&i.PrevHash,
|
|
&i.EventHash,
|
|
&i.CumulativeEventHash,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getOutPointBalancesAtOutPoint = `-- name: GetOutPointBalancesAtOutPoint :many
|
|
SELECT rune_id, pkscript, tx_hash, tx_idx, amount, block_height, spent_height FROM runes_outpoint_balances WHERE tx_hash = $1 AND tx_idx = $2
|
|
`
|
|
|
|
type GetOutPointBalancesAtOutPointParams struct {
|
|
TxHash string
|
|
TxIdx int32
|
|
}
|
|
|
|
func (q *Queries) GetOutPointBalancesAtOutPoint(ctx context.Context, arg GetOutPointBalancesAtOutPointParams) ([]RunesOutpointBalance, error) {
|
|
rows, err := q.db.Query(ctx, getOutPointBalancesAtOutPoint, arg.TxHash, arg.TxIdx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []RunesOutpointBalance
|
|
for rows.Next() {
|
|
var i RunesOutpointBalance
|
|
if err := rows.Scan(
|
|
&i.RuneID,
|
|
&i.Pkscript,
|
|
&i.TxHash,
|
|
&i.TxIdx,
|
|
&i.Amount,
|
|
&i.BlockHeight,
|
|
&i.SpentHeight,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getRuneEntriesByRuneIds = `-- name: GetRuneEntriesByRuneIds :many
|
|
WITH states AS (
|
|
-- select latest state
|
|
SELECT DISTINCT ON (rune_id) rune_id, block_height, mints, burned_amount, completed_at, completed_at_height FROM runes_entry_states WHERE rune_id = ANY($1::text[]) ORDER BY rune_id, block_height DESC
|
|
)
|
|
SELECT runes_entries.rune_id, number, rune, spacers, premine, symbol, divisibility, terms, terms_amount, terms_cap, terms_height_start, terms_height_end, terms_offset_start, terms_offset_end, turbo, etching_block, etching_tx_hash, etched_at, states.rune_id, block_height, mints, burned_amount, completed_at, completed_at_height FROM runes_entries
|
|
LEFT JOIN states ON runes_entries.rune_id = states.rune_id
|
|
WHERE runes_entries.rune_id = ANY($1::text[])
|
|
`
|
|
|
|
type GetRuneEntriesByRuneIdsRow struct {
|
|
RuneID string
|
|
Number int64
|
|
Rune string
|
|
Spacers int32
|
|
Premine pgtype.Numeric
|
|
Symbol int32
|
|
Divisibility int16
|
|
Terms bool
|
|
TermsAmount pgtype.Numeric
|
|
TermsCap pgtype.Numeric
|
|
TermsHeightStart pgtype.Int4
|
|
TermsHeightEnd pgtype.Int4
|
|
TermsOffsetStart pgtype.Int4
|
|
TermsOffsetEnd pgtype.Int4
|
|
Turbo bool
|
|
EtchingBlock int32
|
|
EtchingTxHash string
|
|
EtchedAt pgtype.Timestamp
|
|
RuneID_2 pgtype.Text
|
|
BlockHeight pgtype.Int4
|
|
Mints pgtype.Numeric
|
|
BurnedAmount pgtype.Numeric
|
|
CompletedAt pgtype.Timestamp
|
|
CompletedAtHeight pgtype.Int4
|
|
}
|
|
|
|
func (q *Queries) GetRuneEntriesByRuneIds(ctx context.Context, runeIds []string) ([]GetRuneEntriesByRuneIdsRow, error) {
|
|
rows, err := q.db.Query(ctx, getRuneEntriesByRuneIds, runeIds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetRuneEntriesByRuneIdsRow
|
|
for rows.Next() {
|
|
var i GetRuneEntriesByRuneIdsRow
|
|
if err := rows.Scan(
|
|
&i.RuneID,
|
|
&i.Number,
|
|
&i.Rune,
|
|
&i.Spacers,
|
|
&i.Premine,
|
|
&i.Symbol,
|
|
&i.Divisibility,
|
|
&i.Terms,
|
|
&i.TermsAmount,
|
|
&i.TermsCap,
|
|
&i.TermsHeightStart,
|
|
&i.TermsHeightEnd,
|
|
&i.TermsOffsetStart,
|
|
&i.TermsOffsetEnd,
|
|
&i.Turbo,
|
|
&i.EtchingBlock,
|
|
&i.EtchingTxHash,
|
|
&i.EtchedAt,
|
|
&i.RuneID_2,
|
|
&i.BlockHeight,
|
|
&i.Mints,
|
|
&i.BurnedAmount,
|
|
&i.CompletedAt,
|
|
&i.CompletedAtHeight,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getRuneEntriesByRuneIdsAndHeight = `-- name: GetRuneEntriesByRuneIdsAndHeight :many
|
|
WITH states AS (
|
|
-- select latest state
|
|
SELECT DISTINCT ON (rune_id) rune_id, block_height, mints, burned_amount, completed_at, completed_at_height FROM runes_entry_states WHERE rune_id = ANY($1::text[]) AND block_height <= $2 ORDER BY rune_id, block_height DESC
|
|
)
|
|
SELECT runes_entries.rune_id, number, rune, spacers, premine, symbol, divisibility, terms, terms_amount, terms_cap, terms_height_start, terms_height_end, terms_offset_start, terms_offset_end, turbo, etching_block, etching_tx_hash, etched_at, states.rune_id, block_height, mints, burned_amount, completed_at, completed_at_height FROM runes_entries
|
|
LEFT JOIN states ON runes_entries.rune_id = states.rune_id
|
|
WHERE runes_entries.rune_id = ANY($1::text[]) AND etching_block <= $2
|
|
`
|
|
|
|
type GetRuneEntriesByRuneIdsAndHeightParams struct {
|
|
RuneIds []string
|
|
Height int32
|
|
}
|
|
|
|
type GetRuneEntriesByRuneIdsAndHeightRow struct {
|
|
RuneID string
|
|
Number int64
|
|
Rune string
|
|
Spacers int32
|
|
Premine pgtype.Numeric
|
|
Symbol int32
|
|
Divisibility int16
|
|
Terms bool
|
|
TermsAmount pgtype.Numeric
|
|
TermsCap pgtype.Numeric
|
|
TermsHeightStart pgtype.Int4
|
|
TermsHeightEnd pgtype.Int4
|
|
TermsOffsetStart pgtype.Int4
|
|
TermsOffsetEnd pgtype.Int4
|
|
Turbo bool
|
|
EtchingBlock int32
|
|
EtchingTxHash string
|
|
EtchedAt pgtype.Timestamp
|
|
RuneID_2 pgtype.Text
|
|
BlockHeight pgtype.Int4
|
|
Mints pgtype.Numeric
|
|
BurnedAmount pgtype.Numeric
|
|
CompletedAt pgtype.Timestamp
|
|
CompletedAtHeight pgtype.Int4
|
|
}
|
|
|
|
func (q *Queries) GetRuneEntriesByRuneIdsAndHeight(ctx context.Context, arg GetRuneEntriesByRuneIdsAndHeightParams) ([]GetRuneEntriesByRuneIdsAndHeightRow, error) {
|
|
rows, err := q.db.Query(ctx, getRuneEntriesByRuneIdsAndHeight, arg.RuneIds, arg.Height)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetRuneEntriesByRuneIdsAndHeightRow
|
|
for rows.Next() {
|
|
var i GetRuneEntriesByRuneIdsAndHeightRow
|
|
if err := rows.Scan(
|
|
&i.RuneID,
|
|
&i.Number,
|
|
&i.Rune,
|
|
&i.Spacers,
|
|
&i.Premine,
|
|
&i.Symbol,
|
|
&i.Divisibility,
|
|
&i.Terms,
|
|
&i.TermsAmount,
|
|
&i.TermsCap,
|
|
&i.TermsHeightStart,
|
|
&i.TermsHeightEnd,
|
|
&i.TermsOffsetStart,
|
|
&i.TermsOffsetEnd,
|
|
&i.Turbo,
|
|
&i.EtchingBlock,
|
|
&i.EtchingTxHash,
|
|
&i.EtchedAt,
|
|
&i.RuneID_2,
|
|
&i.BlockHeight,
|
|
&i.Mints,
|
|
&i.BurnedAmount,
|
|
&i.CompletedAt,
|
|
&i.CompletedAtHeight,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getRuneIdFromRune = `-- name: GetRuneIdFromRune :one
|
|
SELECT rune_id FROM runes_entries WHERE rune = $1
|
|
`
|
|
|
|
func (q *Queries) GetRuneIdFromRune(ctx context.Context, rune string) (string, error) {
|
|
row := q.db.QueryRow(ctx, getRuneIdFromRune, rune)
|
|
var rune_id string
|
|
err := row.Scan(&rune_id)
|
|
return rune_id, err
|
|
}
|
|
|
|
const getRuneTransactions = `-- name: GetRuneTransactions :many
|
|
SELECT hash, runes_transactions.block_height, index, timestamp, inputs, outputs, mints, burns, rune_etched, tx_hash, runes_runestones.block_height, etching, etching_divisibility, etching_premine, etching_rune, etching_spacers, etching_symbol, etching_terms, etching_terms_amount, etching_terms_cap, etching_terms_height_start, etching_terms_height_end, etching_terms_offset_start, etching_terms_offset_end, etching_turbo, edicts, mint, pointer, cenotaph, flaws FROM runes_transactions
|
|
LEFT JOIN runes_runestones ON runes_transactions.hash = runes_runestones.tx_hash
|
|
WHERE (
|
|
$1::BOOLEAN = FALSE -- if @filter_pk_script is TRUE, apply pk_script filter
|
|
OR runes_transactions.outputs @> $2::JSONB
|
|
OR runes_transactions.inputs @> $2::JSONB
|
|
) AND (
|
|
$3::BOOLEAN = FALSE -- if @filter_rune_id is TRUE, apply rune_id filter
|
|
OR runes_transactions.outputs @> $4::JSONB
|
|
OR runes_transactions.inputs @> $4::JSONB
|
|
OR runes_transactions.mints ? $5
|
|
OR runes_transactions.burns ? $5
|
|
OR (runes_transactions.rune_etched = TRUE AND runes_transactions.block_height = $6 AND runes_transactions.index = $7)
|
|
) AND (
|
|
$8::INT = 0 OR runes_transactions.block_height = $8::INT -- if @block_height > 0, apply block_height filter
|
|
)
|
|
`
|
|
|
|
type GetRuneTransactionsParams struct {
|
|
FilterPkScript bool
|
|
PkScriptParam []byte
|
|
FilterRuneID bool
|
|
RuneIDParam []byte
|
|
RuneID []byte
|
|
RuneIDBlockHeight int32
|
|
RuneIDTxIndex int32
|
|
BlockHeight int32
|
|
}
|
|
|
|
type GetRuneTransactionsRow struct {
|
|
Hash string
|
|
BlockHeight int32
|
|
Index int32
|
|
Timestamp pgtype.Timestamp
|
|
Inputs []byte
|
|
Outputs []byte
|
|
Mints []byte
|
|
Burns []byte
|
|
RuneEtched bool
|
|
TxHash pgtype.Text
|
|
BlockHeight_2 pgtype.Int4
|
|
Etching pgtype.Bool
|
|
EtchingDivisibility pgtype.Int2
|
|
EtchingPremine pgtype.Numeric
|
|
EtchingRune pgtype.Text
|
|
EtchingSpacers pgtype.Int4
|
|
EtchingSymbol pgtype.Int4
|
|
EtchingTerms pgtype.Bool
|
|
EtchingTermsAmount pgtype.Numeric
|
|
EtchingTermsCap pgtype.Numeric
|
|
EtchingTermsHeightStart pgtype.Int4
|
|
EtchingTermsHeightEnd pgtype.Int4
|
|
EtchingTermsOffsetStart pgtype.Int4
|
|
EtchingTermsOffsetEnd pgtype.Int4
|
|
EtchingTurbo pgtype.Bool
|
|
Edicts []byte
|
|
Mint pgtype.Text
|
|
Pointer pgtype.Int4
|
|
Cenotaph pgtype.Bool
|
|
Flaws pgtype.Int4
|
|
}
|
|
|
|
func (q *Queries) GetRuneTransactions(ctx context.Context, arg GetRuneTransactionsParams) ([]GetRuneTransactionsRow, error) {
|
|
rows, err := q.db.Query(ctx, getRuneTransactions,
|
|
arg.FilterPkScript,
|
|
arg.PkScriptParam,
|
|
arg.FilterRuneID,
|
|
arg.RuneIDParam,
|
|
arg.RuneID,
|
|
arg.RuneIDBlockHeight,
|
|
arg.RuneIDTxIndex,
|
|
arg.BlockHeight,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetRuneTransactionsRow
|
|
for rows.Next() {
|
|
var i GetRuneTransactionsRow
|
|
if err := rows.Scan(
|
|
&i.Hash,
|
|
&i.BlockHeight,
|
|
&i.Index,
|
|
&i.Timestamp,
|
|
&i.Inputs,
|
|
&i.Outputs,
|
|
&i.Mints,
|
|
&i.Burns,
|
|
&i.RuneEtched,
|
|
&i.TxHash,
|
|
&i.BlockHeight_2,
|
|
&i.Etching,
|
|
&i.EtchingDivisibility,
|
|
&i.EtchingPremine,
|
|
&i.EtchingRune,
|
|
&i.EtchingSpacers,
|
|
&i.EtchingSymbol,
|
|
&i.EtchingTerms,
|
|
&i.EtchingTermsAmount,
|
|
&i.EtchingTermsCap,
|
|
&i.EtchingTermsHeightStart,
|
|
&i.EtchingTermsHeightEnd,
|
|
&i.EtchingTermsOffsetStart,
|
|
&i.EtchingTermsOffsetEnd,
|
|
&i.EtchingTurbo,
|
|
&i.Edicts,
|
|
&i.Mint,
|
|
&i.Pointer,
|
|
&i.Cenotaph,
|
|
&i.Flaws,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getUnspentOutPointBalancesByPkScript = `-- name: GetUnspentOutPointBalancesByPkScript :many
|
|
SELECT rune_id, pkscript, tx_hash, tx_idx, amount, block_height, spent_height FROM runes_outpoint_balances WHERE pkscript = $1 AND block_height <= $2 AND (spent_height IS NULL OR spent_height > $2)
|
|
`
|
|
|
|
type GetUnspentOutPointBalancesByPkScriptParams struct {
|
|
Pkscript string
|
|
BlockHeight int32
|
|
}
|
|
|
|
func (q *Queries) GetUnspentOutPointBalancesByPkScript(ctx context.Context, arg GetUnspentOutPointBalancesByPkScriptParams) ([]RunesOutpointBalance, error) {
|
|
rows, err := q.db.Query(ctx, getUnspentOutPointBalancesByPkScript, arg.Pkscript, arg.BlockHeight)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []RunesOutpointBalance
|
|
for rows.Next() {
|
|
var i RunesOutpointBalance
|
|
if err := rows.Scan(
|
|
&i.RuneID,
|
|
&i.Pkscript,
|
|
&i.TxHash,
|
|
&i.TxIdx,
|
|
&i.Amount,
|
|
&i.BlockHeight,
|
|
&i.SpentHeight,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const spendOutPointBalances = `-- name: SpendOutPointBalances :exec
|
|
UPDATE runes_outpoint_balances SET spent_height = $1 WHERE tx_hash = $2 AND tx_idx = $3
|
|
`
|
|
|
|
type SpendOutPointBalancesParams struct {
|
|
SpentHeight pgtype.Int4
|
|
TxHash string
|
|
TxIdx int32
|
|
}
|
|
|
|
func (q *Queries) SpendOutPointBalances(ctx context.Context, arg SpendOutPointBalancesParams) error {
|
|
_, err := q.db.Exec(ctx, spendOutPointBalances, arg.SpentHeight, arg.TxHash, arg.TxIdx)
|
|
return err
|
|
}
|
|
|
|
const unspendOutPointBalancesSinceHeight = `-- name: UnspendOutPointBalancesSinceHeight :exec
|
|
UPDATE runes_outpoint_balances SET spent_height = NULL WHERE spent_height >= $1
|
|
`
|
|
|
|
func (q *Queries) UnspendOutPointBalancesSinceHeight(ctx context.Context, spentHeight pgtype.Int4) error {
|
|
_, err := q.db.Exec(ctx, unspendOutPointBalancesSinceHeight, spentHeight)
|
|
return err
|
|
}
|