Skip to content

Commit

Permalink
Add NFT transfer and burn to postgres (deso-protocol#117)
Browse files Browse the repository at this point in the history
  • Loading branch information
AeonSw4n authored Sep 20, 2021
1 parent 403c4ef commit 0c4a2d8
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 0 deletions.
85 changes: 85 additions & 0 deletions lib/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ type PGTransaction struct {
MetadataUpdateNFT *PGMetadataUpdateNFT `pg:"rel:belongs-to,join_fk:transaction_hash"`
MetadataAcceptNFTBid *PGMetadataAcceptNFTBid `pg:"rel:belongs-to,join_fk:transaction_hash"`
MetadataNFTBid *PGMetadataNFTBid `pg:"rel:belongs-to,join_fk:transaction_hash"`
MetadataNFTTransfer *PGMetadataNFTTransfer `pg:"rel:belongs-to,join_fk:transaction_hash"`
MetadataAcceptNFTTransfer *PGMetadataAcceptNFTTransfer `pg:"rel:belongs-to,join_fk:transaction_hash"`
MetadataBurnNFT *PGMetadataBurnNFT `pg:"rel:belongs-to,join_fk:transaction_hash"`
MetadataDerivedKey *PGMetadataDerivedKey `pg:"rel:belongs-to,join_fk:transaction_hash"`
}

Expand Down Expand Up @@ -320,6 +323,35 @@ type PGMetadataNFTBid struct {
BidAmountNanos uint64 `pg:",use_zero"`
}

// PGMetadataNFTTransfer represents NFTTransferMetadata
type PGMetadataNFTTransfer struct {
tableName struct{} `pg:"pg_metadata_nft_transfer"`

TransactionHash *BlockHash `pg:",pk,type:bytea"`
NFTPostHash *BlockHash `pg:",pk,type:bytea"`
SerialNumber uint64 `pg:",use_zero"`
ReceiverPublicKey []byte `pg:",pk,type:bytea"`
UnlockableText []byte `pg:",type:bytea"`
}

// PGMetadataAcceptNFTTransfer represents AcceptNFTTransferMetadata
type PGMetadataAcceptNFTTransfer struct {
tableName struct{} `pg:"pg_metadata_accept_nft_transfer"`

TransactionHash *BlockHash `pg:",pk,type:bytea"`
NFTPostHash *BlockHash `pg:",pk,type:bytea"`
SerialNumber uint64 `pg:",use_zero"`
}

// PGMetadataBurnNFT represents BurnNFTMetadata
type PGMetadataBurnNFT struct {
tableName struct{} `pg:"pg_metadata_burn_nft"`

TransactionHash *BlockHash `pg:",pk,type:bytea"`
NFTPostHash *BlockHash `pg:",pk,type:bytea"`
SerialNumber uint64 `pg:",use_zero"`
}

// PGMetadataDerivedKey represents AuthorizeDerivedKeyMetadata
type PGMetadataDerivedKey struct {
tableName struct{} `pg:"pg_metadata_derived_keys"`
Expand Down Expand Up @@ -399,6 +431,8 @@ type PGPost struct {
Pinned bool `pg:",use_zero"`
NFT bool `pg:",use_zero"`
NumNFTCopies uint64 `pg:",use_zero"`
NumNFTCopiesForSale uint64 `pg:",use_zero"`
NumNFTCopiesBurned uint64 `pg:",use_zero"`
Unlockable bool `pg:",use_zero"`
CreatorRoyaltyBasisPoints uint64 `pg:",use_zero"`
CoinRoyaltyBasisPoints uint64 `pg:",use_zero"`
Expand All @@ -422,6 +456,8 @@ func (post *PGPost) NewPostEntry() *PostEntry {
IsPinned: post.Pinned,
IsNFT: post.NFT,
NumNFTCopies: post.NumNFTCopies,
NumNFTCopiesForSale: post.NumNFTCopiesForSale,
NumNFTCopiesBurned: post.NumNFTCopiesBurned,
HasUnlockable: post.Unlockable,
NFTRoyaltyToCoinBasisPoints: post.CoinRoyaltyBasisPoints,
NFTRoyaltyToCreatorBasisPoints: post.CreatorRoyaltyBasisPoints,
Expand Down Expand Up @@ -567,6 +603,7 @@ type PGNFT struct {
MinBidAmountNanos uint64 `pg:",use_zero"`
UnlockableText string
LastAcceptedBidAmountNanos uint64 `pg:",use_zero"`
IsPending bool `pg:",use_zero"`
}

func (nft *PGNFT) NewNFTEntry() *NFTEntry {
Expand All @@ -579,6 +616,7 @@ func (nft *PGNFT) NewNFTEntry() *NFTEntry {
MinBidAmountNanos: nft.MinBidAmountNanos,
UnlockableText: []byte(nft.UnlockableText),
LastAcceptedBidAmountNanos: nft.LastAcceptedBidAmountNanos,
IsPending: nft.IsPending,
}
}

Expand Down Expand Up @@ -749,6 +787,9 @@ func (postgres *Postgres) InsertTransactionsTx(tx *pg.Tx, bitCloutTxns []*MsgBit
var metadataAcceptNFTBids []*PGMetadataAcceptNFTBid
var metadataBidInputs []*PGMetadataBidInput
var metadataNFTBids []*PGMetadataNFTBid
var metadataNFTTransfer []*PGMetadataNFTTransfer
var metadataAcceptNFTTransfer []*PGMetadataAcceptNFTTransfer
var metadataBurnNFT []*PGMetadataBurnNFT
var metadataDerivedKey []*PGMetadataDerivedKey

blockHash := blockNode.Hash
Expand Down Expand Up @@ -936,6 +977,29 @@ func (postgres *Postgres) InsertTransactionsTx(tx *pg.Tx, bitCloutTxns []*MsgBit
SerialNumber: txMeta.SerialNumber,
BidAmountNanos: txMeta.BidAmountNanos,
})
} else if txn.TxnMeta.GetTxnType() == TxnTypeNFTTransfer {
txMeta := txn.TxnMeta.(*NFTTransferMetadata)
metadataNFTTransfer = append(metadataNFTTransfer, &PGMetadataNFTTransfer{
TransactionHash: txnHash,
NFTPostHash: txMeta.NFTPostHash,
SerialNumber: txMeta.SerialNumber,
ReceiverPublicKey: txMeta.ReceiverPublicKey,
UnlockableText: txMeta.UnlockableText,
})
} else if txn.TxnMeta.GetTxnType() == TxnTypeAcceptNFTTransfer {
txMeta := txn.TxnMeta.(*AcceptNFTTransferMetadata)
metadataAcceptNFTTransfer = append(metadataAcceptNFTTransfer, &PGMetadataAcceptNFTTransfer{
TransactionHash: txnHash,
NFTPostHash: txMeta.NFTPostHash,
SerialNumber: txMeta.SerialNumber,
})
} else if txn.TxnMeta.GetTxnType() == TxnTypeBurnNFT {
txMeta := txn.TxnMeta.(*BurnNFTMetadata)
metadataBurnNFT = append(metadataBurnNFT, &PGMetadataBurnNFT{
TransactionHash: txnHash,
NFTPostHash: txMeta.NFTPostHash,
SerialNumber: txMeta.SerialNumber,
})
} else if txn.TxnMeta.GetTxnType() == TxnTypeAuthorizeDerivedKey {
txMeta := txn.TxnMeta.(*AuthorizeDerivedKeyMetadata)
metadataDerivedKey = append(metadataDerivedKey, &PGMetadataDerivedKey{
Expand Down Expand Up @@ -1066,6 +1130,24 @@ func (postgres *Postgres) InsertTransactionsTx(tx *pg.Tx, bitCloutTxns []*MsgBit
}
}

if len(metadataNFTTransfer) > 0 {
if _, err := tx.Model(&metadataNFTTransfer).Returning("NULL").Insert(); err != nil {
return err
}
}

if len(metadataAcceptNFTTransfer) > 0 {
if _, err := tx.Model(&metadataAcceptNFTTransfer).Returning("NULL").Insert(); err != nil {
return err
}
}

if len(metadataBurnNFT) > 0 {
if _, err := tx.Model(&metadataBurnNFT).Returning("NULL").Insert(); err != nil {
return err
}
}

if len(metadataDerivedKey) > 0 {
if _, err := tx.Model(&metadataDerivedKey).Returning("NULL").Insert(); err != nil {
return err
Expand Down Expand Up @@ -1241,6 +1323,8 @@ func (postgres *Postgres) flushPosts(tx *pg.Tx, view *UtxoView) error {
Pinned: postEntry.IsPinned,
NFT: postEntry.IsNFT,
NumNFTCopies: postEntry.NumNFTCopies,
NumNFTCopiesForSale: postEntry.NumNFTCopiesForSale,
NumNFTCopiesBurned: postEntry.NumNFTCopiesBurned,
Unlockable: postEntry.HasUnlockable,
CreatorRoyaltyBasisPoints: postEntry.NFTRoyaltyToCreatorBasisPoints,
CoinRoyaltyBasisPoints: postEntry.NFTRoyaltyToCoinBasisPoints,
Expand Down Expand Up @@ -1521,6 +1605,7 @@ func (postgres *Postgres) flushNFTs(tx *pg.Tx, view *UtxoView) error {
MinBidAmountNanos: nftEntry.MinBidAmountNanos,
UnlockableText: string(nftEntry.UnlockableText),
LastAcceptedBidAmountNanos: nftEntry.LastAcceptedBidAmountNanos,
IsPending: nftEntry.IsPending,
}

if nftEntry.isDeleted {
Expand Down
81 changes: 81 additions & 0 deletions migrate/20210917204532_nft_transfer_and_burn_update.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package migrate

import (
"github.com/go-pg/pg/v10/orm"
migrations "github.com/robinjoseph08/go-pg-migrations/v3"
)

func init() {
up := func(db orm.DB) error {
_, err := db.Exec(`
CREATE TABLE pg_metadata_nft_transfer (
transaction_hash BYTEA PRIMARY KEY,
nft_post_hash BYTEA NOT NULL,
serial_number BIGINT NOT NULL,
receiver_public_key BYTEA NOT NULL,
unlockable_text BYTEA NOT NULL
);
`)
if err != nil {
return err
}

_, err = db.Exec(`
CREATE TABLE pg_metadata_accept_nft_transfer (
transaction_hash BYTEA PRIMARY KEY,
nft_post_hash BYTEA NOT NULL,
serial_number BIGINT NOT NULL
);
`)
if err != nil {
return err
}

_, err = db.Exec(`
CREATE TABLE pg_metadata_burn_nft (
transaction_hash BYTEA PRIMARY KEY,
nft_post_hash BYTEA NOT NULL,
serial_number BIGINT NOT NULL
);
`)
if err != nil {
return err
}

_, err = db.Exec(`
ALTER TABLE IF EXISTS pg_posts
ADD num_nft_copies_for_sale BIGINT,
ADD num_nft_copies_burned BIGINT
;
ALTER TABLE IF EXISTS pg_nfts
ADD is_pending BOOL
;
`)

return nil
}

down := func(db orm.DB) error {
_, err := db.Exec(`
DROP TABLE pg_metadata_nft_transfer;
DROP TABLE pg_metadata_accept_nft_transfer;
DROP TABLE pg_metadata_burn_nft;
ALTER TABLE IF EXISTS pg_posts
DROP COLUMN IF EXISTS num_nft_copies_for_sale,
DROP COLUMN IF EXISTS num_nft_copies_burned
;
ALTER TABLE IF EXISTS pg_nfts
DROP COLUMN IF EXISTS is_pending
;
`)
if err != nil {
return err
}

return nil
}

opts := migrations.MigrationOptions{}

migrations.Register("20210917204532_nft_transfer_and_burn_update", up, down, opts)
}

0 comments on commit 0c4a2d8

Please sign in to comment.