Files
xrpl-dev-portal/_code-samples/non-fungible-token/go/nft-cancel/ws/main.go

167 lines
4.7 KiB
Go

package main
import (
"fmt"
"github.com/Peersyst/xrpl-go/pkg/crypto"
"github.com/Peersyst/xrpl-go/xrpl/faucet"
"github.com/Peersyst/xrpl-go/xrpl/transaction"
txnTypes "github.com/Peersyst/xrpl-go/xrpl/transaction/types"
"github.com/Peersyst/xrpl-go/xrpl/wallet"
"github.com/Peersyst/xrpl-go/xrpl/websocket"
"github.com/Peersyst/xrpl-go/xrpl/websocket/types"
)
func main() {
// Connect to the XRPL devnet
fmt.Println("Connecting to devnet...")
client := websocket.NewClient(
websocket.NewClientConfig().
WithHost("wss://s.devnet.rippletest.net:51233").
WithFaucetProvider(faucet.NewDevnetFaucetProvider()),
)
defer client.Disconnect()
if err := client.Connect(); err != nil {
panic(err)
}
if !client.IsConnected() {
fmt.Println("Failed to connect to devnet")
return
}
fmt.Println("Connected to devnet")
fmt.Println()
// Step 1: Fund wallet
fmt.Println("Funding wallet...")
// Create and fund the NFT minter wallet
nftMinter, err := wallet.New(crypto.ED25519())
if err != nil {
panic(err)
}
if err := client.FundWallet(&nftMinter); err != nil {
panic(err)
}
fmt.Println("NFT minter wallet funded!")
// Step 2: Mint two NFTs
fmt.Println("Minting first NFT...")
nftMint := transaction.NFTokenMint{
BaseTx: transaction.BaseTx{
Account: nftMinter.ClassicAddress,
TransactionType: transaction.NFTokenMintTx,
},
NFTokenTaxon: 0,
URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com
}
nftMint.SetTransferableFlag()
responseMint, err := client.SubmitTxAndWait(nftMint.Flatten(), &types.SubmitOptions{
Autofill: true,
Wallet: &nftMinter,
})
if err != nil {
panic(err)
}
if !responseMint.Validated {
fmt.Println("First NFTokenMint transaction is not in a validated ledger", responseMint)
return
}
fmt.Println("First NFT minted successfully! - Hash: ", responseMint.Hash)
fmt.Println()
// Step 3: Retrieve the NFT token ID
fmt.Println("Retrieving NFT ID...")
metaMap, ok := responseMint.Meta.(map[string]any)
if !ok {
fmt.Println("Meta is not a map[string]any")
return
}
nftokenID1, ok := metaMap["nftoken_id"].(string)
if !ok {
fmt.Println("nftoken_id not found or not a string")
return
}
fmt.Println("nftoken_id:", nftokenID1)
fmt.Println()
// ------
fmt.Println("Minting second NFT...")
nftMint2 := transaction.NFTokenMint{
BaseTx: transaction.BaseTx{
Account: nftMinter.ClassicAddress,
TransactionType: transaction.NFTokenMintTx,
},
NFTokenTaxon: 0,
URI: txnTypes.NFTokenURI("68747470733A2F2F676F6F676C652E636F6D"), // https://google.com
}
nftMint2.SetTransferableFlag()
responseMint2, err := client.SubmitTxAndWait(nftMint2.Flatten(), &types.SubmitOptions{
Autofill: true,
Wallet: &nftMinter,
})
if err != nil {
panic(err)
}
if !responseMint.Validated {
fmt.Println("Second NFTokenMint transaction is not in a validated ledger", responseMint)
return
}
fmt.Println("Second NFT minted successfully! - Hash: ", responseMint.Hash)
fmt.Println()
// Step 3: Retrieve the second NFT token ID
fmt.Println("Retrieving second NFT ID...")
metaMap2, ok := responseMint2.Meta.(map[string]any)
if !ok {
fmt.Println("Meta is not a map[string]any")
return
}
nftokenID2, ok := metaMap2["nftoken_id"].(string)
if !ok {
fmt.Println("nftoken_id not found or not a string")
return
}
fmt.Println("nftoken_id:", nftokenID2)
fmt.Println()
// Step 4: Cancel the NFT offers
fmt.Println("Canceling NFT offers...")
nftCancel := transaction.NFTokenCancelOffer{
BaseTx: transaction.BaseTx{
Account: nftMinter.ClassicAddress,
TransactionType: transaction.NFTokenAcceptOfferTx,
},
NFTokenOffers: []txnTypes.NFTokenID{
txnTypes.NFTokenID(nftokenID1),
txnTypes.NFTokenID(nftokenID2),
},
}
response, err := client.SubmitTxAndWait(nftCancel.Flatten(), &types.SubmitOptions{
Autofill: true,
Wallet: &nftMinter,
})
if err != nil {
panic(err)
}
if !response.Validated {
fmt.Println("NFTokenCancelOffer transaction is not in a validated ledger", response)
return
}
fmt.Println("NFT offers canceled successfully! - Hash: ", response.Hash)
}