{"id":16714743,"url":"https://github.com/yoshidan/solana-auction","last_synced_at":"2025-10-25T01:13:34.559Z","repository":{"id":40640543,"uuid":"505626107","full_name":"yoshidan/solana-auction","owner":"yoshidan","description":"The recipe to develop NFT auction program on Solana chain.","archived":false,"fork":false,"pushed_at":"2022-06-30T07:41:47.000Z","size":85,"stargazers_count":14,"open_issues_count":1,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-14T04:05:14.371Z","etag":null,"topics":["auction","nft","rust","solana","solana-program"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yoshidan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-20T23:21:58.000Z","updated_at":"2025-04-24T17:17:18.000Z","dependencies_parsed_at":"2022-09-18T15:11:59.232Z","dependency_job_id":null,"html_url":"https://github.com/yoshidan/solana-auction","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yoshidan/solana-auction","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoshidan%2Fsolana-auction","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoshidan%2Fsolana-auction/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoshidan%2Fsolana-auction/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoshidan%2Fsolana-auction/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yoshidan","download_url":"https://codeload.github.com/yoshidan/solana-auction/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoshidan%2Fsolana-auction/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279018704,"owners_count":26086605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["auction","nft","rust","solana","solana-program"],"created_at":"2024-10-12T21:06:53.566Z","updated_at":"2025-10-14T13:12:39.319Z","avatar_url":"https://github.com/yoshidan.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# solana-auction \n\nThis is the recipe to develop auction program on [solana](https://solana.com/) chain.\n\n## Prerequisite knowledge for this recipe\n* [Solana Cookbook](https://solanacookbook.com/)\n* [About Escrow](https://paulx.dev/blog/2021/01/14/programming-on-solana-an-introduction/)\n\n## Specifications of this auction system\nAn auction system in which bidders pay FT and make a successful bid for the listed NFT.\n\n```mermaid\n  sequenceDiagram\n      participant Exhibitor\n      participant Bidder1\n      participant Bidder2\n      participant Escrow\n      Exhibitor -\u003e\u003e+ Escrow: send 1 NFT with the initial price 200 FT\n      Note over Escrow: hold 1 NFT\n      Escrow --\u003e\u003e- Exhibitor: result\n      Bidder1 -\u003e\u003e+ Escrow: bid with 201 FT (send 201 FT as deposit)\n      Note over Escrow: hold 201 FT\n      Escrow --\u003e\u003e- Bidder1: result\n      Bidder2 -\u003e\u003e+ Escrow: bid with 202 FT (send 202 FT as deposit)\n      Escrow -\u003e\u003e+ Bidder1: send the deposited 201 FT\n      Note over Escrow: hold 202 FT\n      Escrow --\u003e\u003e- Bidder2: result\n      Note over Bidder2: wait for the auction end \u003cbr/\u003e (default 3600 sec)\n      Bidder2 -\u003e\u003e+ Escrow: receive 1 NFT\n      Escrow -\u003e\u003e+ Exhibitor: send 202 FT\n      Note over Bidder2: hold 1 NFT\n      Note over Exhibitor: hold 202 FT\n      Escrow --\u003e\u003e- Bidder2: result\n```\n\n* The exhibitor exhibits any NFT\n  - Determine the initial price (amount of FT required) at the time of listing\n  - Set the auction deadline at the time of listing\n* The bidder decides the bid amount and bids\n  - Bidder cannot bid without specifying a higher price than existing bidders\n  - Bidder cannot bid on expired auctions\n  - To prevent unsettled, Bidder deposits FT at the time of bidding\n  - If another bidder specifies a higher price than current one, the bid right will move and the deposited FT will be converted.\n* The exhibitor can cancel the auction\n  - Only the exhibitor can cancel\n  - If even one person is bidding, it cannot be canceled\n  - NFT returns to the exhibitor\n* The highest bidder after the auction deadline is the winning bidder.\n  - Only the winning bidder can receive the NFT\n  - The FT deposited by the winning bidder is moved to the exhibitor\n  - Close the auction when the NFT and FT move is complete\n\n## Run\n\nBuild the solana program\n\n```\ncd program\ncargo build-bpf\n```\n\nRun validator on the localnet\n\n```\ncd scripts\nnpm run setup-validator ../program/target/deploy/solana_auction.so\n```\n\n### Setup\nCreate the wallets of exhibitor and bidders and token accounts for FT and NFT.\n\n```\nnpm run setup\n\n┌───────────┬────────────────────────────────────────────────┬─────┬────────────────────────────────────────────────┬─────┬────────────────────────────────────────────────┐\n│  (index)  │                 Wallet Pubkey                  │ FT  │             FT(NAO) Account PubKey             │ NFT │             NFT(X) Account PubKey              │\n├───────────┼────────────────────────────────────────────────┼─────┼────────────────────────────────────────────────┼─────┼────────────────────────────────────────────────┤\n│ exhibitor │ '56soKhmhDDx9A4BUqVZmr7ENqBxroFZmtrNTzw47S5Dr' │ 500 │ '82eyhAL5iWqFaF2SEvWBA4TpB1NxVqdRsbEgJvjWUH6Y' │  1  │ '7RjpXpBXHbkmXSyNnRDB3riscRS4GPGAyR9gWr2SvEsZ' │\n│  bidder1  │ 'V7GoneZRCwqZCRNPo7q7saqXo5WgaZD5aBcgzUSQuP1'  │ 500 │ 'CiagdjQ6hyt7iGKBLufdnBr5qPdntEMz2dyxNyFFXkpx' │  0  │                       ''                       │\n│  bidder2  │ 'HBSLiE4KGxjgUz4ddB7cKKSeNGig8oNnYeCVEAs5VHq7' │ 500 │ 'DKYdBKm9jq8D3ogw9L89zRT1XXK4JDLp9zQhrNaQiCDG' │  0  │                       ''                       │\n└───────────┴────────────────────────────────────────────────┴─────┴────────────────────────────────────────────────┴─────┴────────────────────────────────────────────────┘\n```\nThe account relationship is as follows\n```mermaid\n  flowchart LR\n    ExhibitorWallet[Exhibitor Account]\n    ExhibitorNFTAccount[Exhibitor NFT Token Account  \u003cbr/\u003e amount 1]\n    ExhibitorFTAccount[Exhibitor FT Token Account  \u003cbr/\u003e amount 500]\n    Bidder1Wallet[Bidder1 Account]\n    Bidder1FTAccount[Bidder1 FT Token Account  \u003cbr/\u003e amount 500]\n    Bidder2Wallet[Bidder2 Account]\n    Bidder2FTAccount[Bidder2 FT Token Account  \u003cbr/\u003e amount 500]\n    TokenMintNFT[NFT Token Mint]\n    TokenMintFT[FT Token Mint]\n    PDA[PDA]\n    ExhibitorWallet -- owns --\u003eExhibitorNFTAccount\n    ExhibitorWallet -- owns --\u003eExhibitorFTAccount\n    Bidder1Wallet -- owns --\u003eBidder1FTAccount\n    Bidder2Wallet -- owns --\u003eBidder2FTAccount\n    ExhibitorNFTAccount -- belongs to --\u003eTokenMintNFT\n    ExhibitorFTAccount -- belongs to --\u003eTokenMintFT\n    Bidder1FTAccount -- belongs to --\u003eTokenMintFT\n    Bidder2FTAccount -- belongs to --\u003eTokenMintFT\n```\n\n### Exhibit\nStart auction with the duration 3600 seconds and the initial price of NFT is 200\n* [Solana Program](./program/src/processor.rs#L37)\n* [Client code](./scripts/src/exhibitor.ts)\n```\nnpm run exhibitor 200 3600\n\nAuction data (Held by Escrow Account)\n┌────────────────────────────────┬────────────────────────────────────────────────┐\n│            (index)             │                     value                      │\n├────────────────────────────────┼────────────────────────────────────────────────┤\n│         isInitialized          │                       1                        │\n│        exhibitorPubkey         │ '56soKhmhDDx9A4BUqVZmr7ENqBxroFZmtrNTzw47S5Dr' │\n│    exhibitingNftTempPubkey     │ '2whKYwM683zVirVitGW6UYugxdqbipMouMiFg3Ye8Vgb' │\n│   exhibitorFtReceivingPubkey   │ '82eyhAL5iWqFaF2SEvWBA4TpB1NxVqdRsbEgJvjWUH6Y' │ \n│             price              │                      200                       │ \n│             endAt              │           '2022-06-18T01:28:40.000Z'           │ \n│      highestBidderPubkey       │       '11111111111111111111111111111111'       │ \n│   highestBidderFtTempPubkey    │       '11111111111111111111111111111111'       │ \n│ highestBidderFtReturningPubkey │       '11111111111111111111111111111111'       │ \n└────────────────────────────────┴────────────────────────────────────────────────┘\n\nToken Amount\n┌─────────┬───────────┬────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────┐\n│ (index) │ exhibitor │            Exhibitor Token Account             │ escrow │             Escrow Token Account               │\n├─────────┼───────────┼────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────┤\n│   NFT   │     0     │ '7RjpXpBXHbkmXSyNnRDB3riscRS4GPGAyR9gWr2SvEsZ' │   1    │ '2whKYwM683zVirVitGW6UYugxdqbipMouMiFg3Ye8Vgb' │\n│   FT    │    500    │ '82eyhAL5iWqFaF2SEvWBA4TpB1NxVqdRsbEgJvjWUH6Y' │   0    │                      '-'                       │\n└─────────┴───────────┴────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────┘\n```\n* The exhibitor's NFT has moved to the deposit account that runs the auction.\n* [Layout of auction data](./program/src/state.rs#L10)\n* The account relationship is as follows.\n```mermaid\n  flowchart LR\n    ExhibitorWallet[Exhibitor Account]\n    ExhibitorNFTAccount[Exhibitor NFT Token Account \u003cbr/\u003e amount 0]\n    ExhibitorFTAccount[Exhibitor FT Token Account\u003cbr/\u003e amount 500]\n    Bidder1Wallet[Bidder1 Account]\n    Bidder1FTAccount[Bidder1 FT Token Account  \u003cbr/\u003e amount 500]\n    Bidder2Wallet[Bidder2 Account]\n    Bidder2FTAccount[Bidder2 FT Token Account  \u003cbr/\u003e amount 500]\n    TokenMintNFT[NFT Token Mint]\n    TokenMintFT[FT Token Mint]\n    PDA[PDA]\n    Escrow[Escrow Account \u003cbr/\u003e holding auction data]\n    TempNFTAccount[Temp NFT Token Account \u003cbr/\u003e amount 1]\n    ExhibitorWallet -- owns --\u003eExhibitorNFTAccount\n    ExhibitorWallet -- owns --\u003eExhibitorFTAccount\n    Bidder1Wallet -- owns --\u003eBidder1FTAccount\n    Bidder2Wallet -- owns --\u003eBidder2FTAccount\n    PDA -- owns --\u003e TempNFTAccount\n    ExhibitorNFTAccount -- belongs to --\u003eTokenMintNFT\n    ExhibitorFTAccount -- belongs to --\u003eTokenMintFT\n    Bidder1FTAccount -- belongs to --\u003eTokenMintFT\n    Bidder2FTAccount -- belongs to --\u003eTokenMintFT\n    TempNFTAccount -- belongs to --\u003eTokenMintNFT\n```\n\n### Bid\nBidder1 bids for 201 FT on the listed NFT\n* [Solana Program](./program/src/processor.rs#L40)\n* [Client code](./scripts/src/bidder.ts)\n```\nnpm run bidder1 201\n\n┌────────────────────────────────┬────────────────────────────────────────────────┐\n│            (index)             │                     value                      │\n├────────────────────────────────┼────────────────────────────────────────────────┤\n│         isInitialized          │                       1                        │\n│        exhibitorPubkey         │ '56soKhmhDDx9A4BUqVZmr7ENqBxroFZmtrNTzw47S5Dr' │\n│    exhibitingNftTempPubkey     │ '2whKYwM683zVirVitGW6UYugxdqbipMouMiFg3Ye8Vgb' │\n│   exhibitorFtReceivingPubkey   │ '82eyhAL5iWqFaF2SEvWBA4TpB1NxVqdRsbEgJvjWUH6Y' │ \n│             price              │                      201                       │ \n│             endAt              │           '2022-06-18T01:28:40.000Z'           │ \n│      highestBidderPubkey       │ 'V7GoneZRCwqZCRNPo7q7saqXo5WgaZD5aBcgzUSQuP1'  │ \n│   highestBidderFtTempPubkey    │ '6NQMmsbFEATnzUMue86BqywPd6UCpa5hbNhkyd4gJyqf' │ \n│ highestBidderFtReturningPubkey │ 'CiagdjQ6hyt7iGKBLufdnBr5qPdntEMz2dyxNyFFXkpx' │ \n└────────────────────────────────┴────────────────────────────────────────────────┘\n┌──────────────────────────────┬───────┬────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────┐\n│           (index)            │  own  │              Bidder Token Account              │ escrow │             Temp Token Account                 │\n├──────────────────────────────┼───────┼────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────┤\n│         Bidder's FT          │  299  │ 'CiagdjQ6hyt7iGKBLufdnBr5qPdntEMz2dyxNyFFXkpx' │  201   │ '6NQMmsbFEATnzUMue86BqywPd6UCpa5hbNhkyd4gJyqf' │\n│ Previous Highest Bidder's FT │  NaN  │       '11111111111111111111111111111111'       │  NaN   │       '11111111111111111111111111111111'       │\n└──────────────────────────────┴───────┴────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────┘\n```\n* The bid amount 201 FT specified by Bidder2 has been moved to the temporary token account.\n* The account relationship is as follows.\n```mermaid\n  flowchart LR\n    ExhibitorWallet[Exhibitor Account]\n    ExhibitorNFTAccount[Exhibitor NFT Token Account  \u003cbr/\u003e amount 0]\n    ExhibitorFTAccount[Exhibitor FT Token Account  \u003cbr/\u003e amount 500]\n    Bidder1Wallet[Bidder1 Account]\n    Bidder1FTAccount[Bidder1 FT Token Account  \u003cbr/\u003e amount 299]\n    Bidder1TempFTAccount[Temp Bidder1 FT Token Account \u003cbr/\u003e amount 201] \n    Bidder2Wallet[Bidder2 Account]\n    Bidder2FTAccount[Bidder2 FT Token Account  \u003cbr/\u003e amount 500]\n    TokenMintNFT[NFT Token Mint]\n    TokenMintFT[FT Token Mint]\n    PDA[PDA]\n    Escrow[Escrow Account \u003cbr/\u003e holding auction data]\n    TempNFTAccount[Temp NFT Token Account \u003cbr/\u003e amount 1] \n    ExhibitorWallet -- owns --\u003eExhibitorNFTAccount\n    ExhibitorWallet -- owns --\u003eExhibitorFTAccount\n    Bidder1Wallet -- owns --\u003eBidder1FTAccount\n    Bidder2Wallet -- owns --\u003eBidder2FTAccount\n    PDA -- owns --\u003e TempNFTAccount\n    PDA -- owns --\u003e Bidder1TempFTAccount\n    ExhibitorNFTAccount -- belongs to --\u003eTokenMintNFT\n    ExhibitorFTAccount -- belongs to --\u003eTokenMintFT\n    Bidder1FTAccount -- belongs to --\u003eTokenMintFT\n    Bidder2FTAccount -- belongs to --\u003eTokenMintFT\n    TempNFTAccount -- belongs to --\u003eTokenMintNFT\n    Bidder1TempFTAccount -- belongs to --\u003eTokenMintFT\n```\n\n### Another one bid\nBidder2 bids for 201 FT on the listed NFT. If it is 201 FT or less, an error will occur.\n* [Solana Program](./program/src/processor.rs#L40)\n* [Client code](./scripts/src/bidder.ts)\n```\nnpm run bidder2 202\n\n┌────────────────────────────────┬────────────────────────────────────────────────┐\n│            (index)             │                     value                      │\n├────────────────────────────────┼────────────────────────────────────────────────┤\n│         isInitialized          │                       1                        │\n│        exhibitorPubkey         │ '56soKhmhDDx9A4BUqVZmr7ENqBxroFZmtrNTzw47S5Dr' │\n│    exhibitingNftTempPubkey     │ '2whKYwM683zVirVitGW6UYugxdqbipMouMiFg3Ye8Vgb' │\n│   exhibitorFtReceivingPubkey   │ '82eyhAL5iWqFaF2SEvWBA4TpB1NxVqdRsbEgJvjWUH6Y' │ \n│             price              │                      202                       │ \n│             endAt              │           '2022-06-18T01:28:40.000Z'           │ \n│      highestBidderPubkey       │ 'HBSLiE4KGxjgUz4ddB7cKKSeNGig8oNnYeCVEAs5VHq7' │ \n│   highestBidderFtTempPubkey    │ '7ywDWiZhU8GHPXpU6Wihqzvk8QFB2cMeAvqgzNBzYSjv' │ \n│ highestBidderFtReturningPubkey │ 'DKYdBKm9jq8D3ogw9L89zRT1XXK4JDLp9zQhrNaQiCDG' │\n└────────────────────────────────┴────────────────────────────────────────────────┘\n┌──────────────────────────────┬───────┬────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────┐\n│           (index)            │  own  │              Bidder Token Account              │ escrow │             Temp Token Account                 │\n├──────────────────────────────┼───────┼────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────┤\n│         Bidder's FT          │  298  │ 'DKYdBKm9jq8D3ogw9L89zRT1XXK4JDLp9zQhrNaQiCDG' │  202   │ '7ywDWiZhU8GHPXpU6Wihqzvk8QFB2cMeAvqgzNBzYSjv' │\n│ Previous Highest Bidder's FT │  500  │ 'CiagdjQ6hyt7iGKBLufdnBr5qPdntEMz2dyxNyFFXkpx' │  NaN   │ '6NQMmsbFEATnzUMue86BqywPd6UCpa5hbNhkyd4gJyqf' │\n└──────────────────────────────┴───────┴────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────┘\n```\n* The bid amount 202 FT specified by Bidder2 has been moved to the temporary token account.\n* The FT deposited by Bidder1 has been returned to Bidder1 and the temporary token account is closed.\n* The account relationship is as follows.\n```mermaid\n  flowchart LR\n    ExhibitorWallet[Exhibitor Account]\n    ExhibitorNFTAccount[Exhibitor NFT Token Account ]\n    ExhibitorFTAccount[Exhibitor FT Token Account ]\n    Bidder1Wallet[Bidder1 Account]\n    Bidder1FTAccount[Bidder1 FT Token Account  \u003cbr/\u003e amount 500]\n    Bidder2Wallet[Bidder2 Account]\n    Bidder2FTAccount[Bidder2 FT Token Account  \u003cbr/\u003e amount 298]\n    Bidder2TempFTAccount[Temp Bidder2 FT Token Account \u003cbr/\u003e amount 202]\n    TokenMintNFT[NFT Token Mint]\n    TokenMintFT[FT Token Mint]\n    PDA[PDA]\n    Escrow[Escrow Account \u003cbr/\u003e holding auction data]\n    TempNFTAccount[Temp NFT Token Account \u003cbr/\u003e amount 1]\n    ExhibitorWallet -- owns --\u003eExhibitorNFTAccount\n    ExhibitorWallet -- owns --\u003eExhibitorFTAccount\n    Bidder1Wallet -- owns --\u003eBidder1FTAccount\n    Bidder2Wallet -- owns --\u003eBidder2FTAccount\n    PDA -- owns --\u003e TempNFTAccount\n    PDA -- owns --\u003e Bidder2TempFTAccount\n    ExhibitorNFTAccount -- belongs to --\u003eTokenMintNFT\n    ExhibitorFTAccount -- belongs to --\u003eTokenMintFT\n    Bidder1FTAccount -- belongs to --\u003eTokenMintFT\n    Bidder2FTAccount -- belongs to --\u003eTokenMintFT\n    TempNFTAccount -- belongs to --\u003eTokenMintNFT\n    Bidder2TempFTAccount -- belongs to --\u003eTokenMintFT\n```\n\n### Receive NFT when the auction duration expires.\nAfter 3600 seconds, the winning bidder will be confirmed, FT will move to the exhibitor, and NFT will move to the winning bidder.\n* [Solana Program](./program/src/processor.rs#L47)\n* [Client code](./scripts/src/close.ts)\n```\nnpm run receive2\n\n┌─────────┬───────────┬────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────┐\n│ (index) │ exhibitor │            Exhibitor Token Account             │ bidder │             Bidder Token Account               │\n├─────────┼───────────┼────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────┤\n│   NFT   │     0     │ '7RjpXpBXHbkmXSyNnRDB3riscRS4GPGAyR9gWr2SvEsZ' │   1    │ 'Hc8ivcAFQysW9HNpjQLwzbqjqYA3kG8idLK1i9V5oZ9H' │\n│   FT    │    702    │ '82eyhAL5iWqFaF2SEvWBA4TpB1NxVqdRsbEgJvjWUH6Y' │  298   │ 'DKYdBKm9jq8D3ogw9L89zRT1XXK4JDLp9zQhrNaQiCDG' │\n└─────────┴───────────┴────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────┘\n```\n* The 202 NAO specified by Bidder2 has been moved to the exhibitor.\n* The exhibitor's NFT has moved to Bidder2.\n* The account relationship is as follows.\n```mermaid\n  flowchart LR\n    ExhibitorWallet[Exhibitor Account]\n    ExhibitorNFTAccount[Exhibitor NFT Token Account  \u003cbr/\u003e amount 0]\n    ExhibitorFTAccount[Exhibitor FT Token Account  \u003cbr/\u003e amount 702]\n    Bidder1Wallet[Bidder1 Account]\n    Bidder1FTAccount[Bidder1 FT Token Account  \u003cbr/\u003e amount 500]\n    Bidder2Wallet[Bidder2 Account]\n    Bidder2FTAccount[Bidder2 FT Token Account  \u003cbr/\u003e amount 298]\n    Bidder2NFTAccount[Bidder2 NFT Token Account  \u003cbr/\u003e amount 1]\n    TokenMintNFT[NFT Token Mint]\n    TokenMintFT[FT Token Mint]\n    PDA[PDA]\n    ExhibitorWallet -- owns --\u003eExhibitorNFTAccount\n    ExhibitorWallet -- owns --\u003eExhibitorFTAccount\n    Bidder1Wallet -- owns --\u003eBidder1FTAccount\n    Bidder2Wallet -- owns --\u003eBidder2FTAccount\n    Bidder2Wallet -- owns --\u003eBidder2NFTAccount\n    ExhibitorNFTAccount -- belongs to --\u003eTokenMintNFT\n    ExhibitorFTAccount -- belongs to --\u003eTokenMintFT\n    Bidder1FTAccount -- belongs to --\u003eTokenMintFT\n    Bidder2FTAccount -- belongs to --\u003eTokenMintFT\n    Bidder2NFTAccount -- belongs to --\u003eTokenMintNFT\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoshidan%2Fsolana-auction","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoshidan%2Fsolana-auction","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoshidan%2Fsolana-auction/lists"}