From fc7ec9a79b89d9a52ad983532a6d9431d2f14b27 Mon Sep 17 00:00:00 2001 From: Supreme Labs <100731397+supreme2580@users.noreply.github.com> Date: Tue, 5 Nov 2024 22:22:08 +0100 Subject: [PATCH] Award Scripts & Dynamic NFT Data Directory (#260) * wip * award on sepolia * award on mainnet * award on local * award on local * use envs from root * wip * wip * dynamic routing for nft images * dynamic routing for nft images * dynamic routing for nft metadata * up for review * fmt * gofmt * testing fmt * scarb fmt with scarb 2.6.3 * updated markdown * updated markdown * updated markdown * Various readme and test changes * React app env var on docker compose * Scarb fmt * Go fmt --------- Co-authored-by: Brandon Roberts --- CONTRIBUTING.md | 12 ++--- README.md | 4 +- backend/routes/indexer/nft.go | 45 ++++++++--------- backend/routes/nft.go | 3 +- docker-compose.yml | 3 ++ frontend/src/tabs/nfts/NFTs.js | 10 +++- infra/instructions/kube-deploy-steps.txt | 4 +- onchain/README.md | 4 +- onchain/src/art_peace.cairo | 3 +- onchain/src/nfts/canvas_nft.cairo | 8 +++- onchain/src/tests/art_peace.cairo | 10 ++-- onchain/src/tests/vote_quest.cairo | 2 +- tests/integration/docker/award_pixels.sh | 35 ++++++++++++++ tests/integration/docker/deploy.sh | 3 +- tests/integration/docker/rewards.json | 10 ++++ tests/integration/local/deploy.sh | 3 +- tests/integration/mainnet/award_pixels.sh | 48 +++++++++++++++++++ .../integration/mainnet/deploy-canvas-nft.sh | 4 +- tests/integration/sepolia/award_pixels.sh | 48 +++++++++++++++++++ .../integration/sepolia/deploy-canvas-nft.sh | 4 +- 20 files changed, 211 insertions(+), 52 deletions(-) create mode 100755 tests/integration/docker/award_pixels.sh create mode 100644 tests/integration/docker/rewards.json create mode 100755 tests/integration/mainnet/award_pixels.sh create mode 100755 tests/integration/sepolia/award_pixels.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c95d5ea9..0a04bd4a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -## 🛠️ Contributing to art/peace 🛠️ +# 🛠️ Contributing to art/peace 🛠️ Welcome, contributing to `art/peace` is easy! @@ -8,7 +8,7 @@ Welcome, contributing to `art/peace` is easy! 1. Submit your PR against `main` 1. Address PR Review -### Issue +## Issue Project tracking is done via GitHub [issues](https://github.com/keep-starknet-strange/art-peace/issues). First look at open issues to see if your request is already submitted. @@ -26,12 +26,12 @@ These labels are used as prefixes as follows for `issue`, `branch name`, `pr tit - `[bug]` -> `bug/{issue #}-{issue name}` -> `bug:` - `[dev]` -> `dev/{issue #}-{issue name}` -> `dev:` -#### TODO +### TODO If your PR includes a `TODO` comment please open an issue and comment the relevant code with `TODO(#ISSUE_NUM):`. -### Submit PR +## Submit PR Ensure your code is well formatted, well tested and well documented. A core contributor will review your work. Address changes, ensure ci passes, @@ -49,7 +49,7 @@ Scarb linter: scarb fmt ``` -### Additional Resources +## Additional Resources - [Cairo Book](https://book.cairo-lang.org/) - [Starknet Book](https://book.starknet.io/) @@ -58,6 +58,4 @@ scarb fmt - [Starkli Book](https://book.starkli.rs/) - [Syncing a Fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork) -## - Thank you for your contribution! diff --git a/README.md b/README.md index b4d9cd4d..8fd5ec2a 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,8 @@ > Art Peace Round 2 is live! - > Check live stats on this cool [Dune Dashboard](https://dune.com/hessish/artpeace) - -> And go place some pixels and draw cool shit you mfer! ==> https://www.art-peace.net/ +> And go place some pixels and draw cool shit you mfer! ==> [art-peace.net](https://www.art-peace.net) ## Overview diff --git a/backend/routes/indexer/nft.go b/backend/routes/indexer/nft.go index 2d698310..b70e5371 100644 --- a/backend/routes/indexer/nft.go +++ b/backend/routes/indexer/nft.go @@ -162,32 +162,33 @@ func processNFTMintedEvent(event IndexerEvent) { } // TODO: Check if file exists - if _, err := os.Stat("nfts"); os.IsNotExist(err) { - err = os.MkdirAll("nfts", os.ModePerm) - if err != nil { - PrintIndexerError("processNFTMintedEvent", "Error creating nfts directory", tokenIdLowHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) - return - } + roundNumber := os.Getenv("ROUND_NUMBER") + if roundNumber == "" { + PrintIndexerError("processNFTMintedEvent", "Error getting round number from environment", tokenIdLowHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) + return } + roundDir := fmt.Sprintf("round-%s", roundNumber) - if _, err := os.Stat("nfts/images"); os.IsNotExist(err) { - err = os.MkdirAll("nfts/images", os.ModePerm) - if err != nil { - PrintIndexerError("processNFTMintedEvent", "Error creating nfts/images directory", tokenIdLowHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) - return - } + // Create base directories if they don't exist + dirs := []string{ + "nfts", + fmt.Sprintf("nfts/%s", roundDir), + fmt.Sprintf("nfts/%s/images", roundDir), + fmt.Sprintf("nfts/%s/metadata", roundDir), } - if _, err := os.Stat("nfts/meta"); os.IsNotExist(err) { - err = os.MkdirAll("nfts/meta", os.ModePerm) - if err != nil { - PrintIndexerError("processNFTMintedEvent", "Error creating nfts/meta directory", tokenIdLowHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) - return + for _, dir := range dirs { + if _, err := os.Stat(dir); os.IsNotExist(err) { + err = os.MkdirAll(dir, os.ModePerm) + if err != nil { + PrintIndexerError("processNFTMintedEvent", fmt.Sprintf("Error creating %s directory", dir), tokenIdLowHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) + return + } } } // Save image to disk - filename := fmt.Sprintf("nfts/images/nft-%d.png", tokenId) + filename := fmt.Sprintf("nfts/%s/images/nft-%d.png", roundDir, tokenId) file, err := os.Create(filename) if err != nil { PrintIndexerError("processNFTMintedEvent", "Error creating file", tokenIdLowHex, tokenIdHighHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) @@ -207,15 +208,15 @@ func processNFTMintedEvent(event IndexerEvent) { metadata := map[string]interface{}{ "name": name, "description": "User minted art/peace NFT from the canvas.", - "image": fmt.Sprintf("%s/nft-images/nft-%d.png", core.ArtPeaceBackend.GetBackendUrl(), tokenId), + "image": fmt.Sprintf("%s/nft/%s/image/nft-%d.png", core.ArtPeaceBackend.GetBackendUrl(), roundDir, tokenId), "attributes": []map[string]interface{}{ { "trait_type": "Width", - "value": fmt.Sprintf("%d", scaledWidth), + "value": fmt.Sprintf("%d", width), }, { "trait_type": "Height", - "value": fmt.Sprintf("%d", scaledHeight), + "value": fmt.Sprintf("%d", height), }, { "trait_type": "Position", @@ -242,7 +243,7 @@ func processNFTMintedEvent(event IndexerEvent) { return } - metadataFilename := fmt.Sprintf("nfts/meta/nft-%d.json", tokenId) + metadataFilename := fmt.Sprintf("nfts/%s/metadata/nft-%d.json", roundDir, tokenId) err = os.WriteFile(metadataFilename, metadataFile, 0644) if err != nil { PrintIndexerError("processNFTMintedEvent", "Error writing NFT metadata file", tokenIdLowHex, positionHex, widthHex, heightHex, nameHex, imageHashHex, blockNumberHex, minter) diff --git a/backend/routes/nft.go b/backend/routes/nft.go index 9d2e70e4..e27aaefa 100644 --- a/backend/routes/nft.go +++ b/backend/routes/nft.go @@ -33,8 +33,7 @@ func InitNFTRoutes() { } func InitNFTStaticRoutes() { - http.Handle("/nft-images/", http.StripPrefix("/nft-images/", http.FileServer(http.Dir("./nfts/images")))) - http.Handle("/nft-meta/", http.StripPrefix("/nft-meta/", http.FileServer(http.Dir("./nfts/meta")))) + http.Handle("/nft/", http.StripPrefix("/nft/", http.FileServer(http.Dir("./nfts")))) } func getCanvasNFTAddress(w http.ResponseWriter, r *http.Request) { diff --git a/docker-compose.yml b/docker-compose.yml index 1b827f76..55e12a46 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,6 +35,7 @@ services: - POSTGRES_PASSWORD=password - ART_PEACE_END_TIME=3000000000 - ART_PEACE_HOST=0328ced46664355fc4b885ae7011af202313056a7e3d44827fb24c9d3206aaa0 + - ROUND_NUMBER=1 consumer: build: dockerfile: backend/Dockerfile.consumer @@ -47,6 +48,7 @@ services: restart: always environment: - POSTGRES_PASSWORD=password + - ROUND_NUMBER=1 volumes: - nfts:/app/nfts devnet: @@ -138,6 +140,7 @@ services: - devnet environment: - REACT_APP_BASE_PIXEL_TIMER=30000 + - REACT_APP_ROUND_NUMBER=1 volumes: - ./frontend/package.json:/app/package.json - ./frontend/package-lock.json:/app/package-lock.json diff --git a/frontend/src/tabs/nfts/NFTs.js b/frontend/src/tabs/nfts/NFTs.js index 9febad4e..414a1089 100644 --- a/frontend/src/tabs/nfts/NFTs.js +++ b/frontend/src/tabs/nfts/NFTs.js @@ -14,7 +14,9 @@ import { import { PaginationView } from '../../ui/pagination.js'; const NFTsMainSection = (props) => { - const imageURL = nftUrl + '/nft-images/'; + const roundNumber = process.env.REACT_APP_ROUND_NUMBER || '0'; + const imageURL = `${nftUrl}/nft/round-${roundNumber}/images/`; + const metadataURL = `${nftUrl}/nft/round-${roundNumber}/metadata/`; return (
{ tokenId={nft.tokenId} position={nft.position} image={imageURL + 'nft-' + nft.tokenId + '.png'} + metadata={metadataURL + 'nft-' + nft.tokenId + '.json'} width={nft.width} height={nft.height} name={nft.name} @@ -86,7 +89,9 @@ const NFTsMainSection = (props) => { }; const NFTsExpandedSection = (props) => { - const imageURL = nftUrl + '/nft-images/'; + const roundNumber = process.env.REACT_APP_ROUND_NUMBER || '0'; + const imageURL = `${nftUrl}/nft/round-${roundNumber}/images/`; + const metadataURL = `${nftUrl}/nft/round-${roundNumber}/metadata/`; return (
@@ -121,6 +126,7 @@ const NFTsExpandedSection = (props) => { tokenId={nft.tokenId} position={nft.position} image={imageURL + 'nft-' + nft.tokenId + '.png'} + metadata={metadataURL + 'nft-' + nft.tokenId + '.json'} width={nft.width} height={nft.height} name={nft.name} diff --git a/infra/instructions/kube-deploy-steps.txt b/infra/instructions/kube-deploy-steps.txt index 0259b30b..dac2624c 100644 --- a/infra/instructions/kube-deploy-steps.txt +++ b/infra/instructions/kube-deploy-steps.txt @@ -8,12 +8,12 @@ deploy username store to sepolia save address deploy art peace to sepolia vim ./tests/integration/sepolia/deploy.sh - change end time + change end time & round number ./tests/integration/sepolia/deploy.sh save address deploy canvas nft to sepolia ./tests/integration/sepolia/deploy-canvas-nft.sh - save address + save address & round number and set in art_peace contract deploy quests vim ./tests/integration/sepolia/deploy-daily-quests.sh diff --git a/onchain/README.md b/onchain/README.md index 51198add..2f15b9bb 100644 --- a/onchain/README.md +++ b/onchain/README.md @@ -4,12 +4,12 @@ This directory contains the onchain Starknet contract components for `art/peace` ## Build -``` +```bash scarb build ``` ## Test -``` +```bash scarb test ``` diff --git a/onchain/src/art_peace.cairo b/onchain/src/art_peace.cairo index d1ce12b0..7735dcba 100644 --- a/onchain/src/art_peace.cairo +++ b/onchain/src/art_peace.cairo @@ -636,7 +636,8 @@ pub mod ArtPeace { } let member_metadata = self.users_faction_meta.read(user); if member_metadata.member_pixels > 0 { - // TODO: If member_pixels > 0 && < allocation && enough time has passed, return allocation instead of member_pixels + // TODO: If member_pixels > 0 && < allocation && enough time has passed, return + // allocation instead of member_pixels return member_metadata.member_pixels; } else { let time_since_last_pixel = now - member_metadata.member_placed_time; diff --git a/onchain/src/nfts/canvas_nft.cairo b/onchain/src/nfts/canvas_nft.cairo index 2bdb1f51..b63749b4 100644 --- a/onchain/src/nfts/canvas_nft.cairo +++ b/onchain/src/nfts/canvas_nft.cairo @@ -70,8 +70,12 @@ mod CanvasNFT { #[constructor] - fn constructor(ref self: ContractState, name: ByteArray, symbol: ByteArray) { - let base_uri = "https://api.art-peace.net/nft-meta/nft-"; + fn constructor( + ref self: ContractState, name: ByteArray, symbol: ByteArray, round_number: felt252 + ) { + let base_uri = format!( + "https://api.art-peace.net/nft/round-{}/metadata/nft-", round_number + ); self.erc721.initializer(name, symbol, base_uri); } diff --git a/onchain/src/tests/art_peace.cairo b/onchain/src/tests/art_peace.cairo index 5e211af3..e7d74f73 100644 --- a/onchain/src/tests/art_peace.cairo +++ b/onchain/src/tests/art_peace.cairo @@ -70,7 +70,7 @@ pub(crate) fn deploy_contract() -> ContractAddress { start_time: 0, end_time: 1000000, daily_quests_count: 3, - devmode: false + devmode: false, } .serialize(ref calldata); let contract_addr = contract.deploy_at(@calldata, utils::ART_PEACE_CONTRACT()).unwrap(); @@ -162,6 +162,8 @@ fn deploy_nft_contract() -> ContractAddress { let symbol: ByteArray = "A/P"; name.serialize(ref calldata); symbol.serialize(ref calldata); + let round_number: u32 = 1; + round_number.serialize(ref calldata); contract.deploy_at(@calldata, utils::NFT_CONTRACT()).unwrap() } @@ -398,7 +400,7 @@ fn nft_mint_test() { assert!(nft.balance_of(utils::PLAYER2()) == 1, "NFT balance is not correct after transfer"); let nft_meta = IERC721MetadataDispatcher { contract_address: nft.contract_address }; - let expected_uri = "https://api.art-peace.net/nft-meta/nft-0.json"; + let expected_uri = "https://api.art-peace.net/nft/round-1/metadata/nft-0.json"; assert!(nft_meta.token_uri(0) == expected_uri, "NFT URI is not correct"); } @@ -416,8 +418,8 @@ fn nft_set_base_uri_test() { nft_minter.mint_nft(mint_params); snf::stop_prank(CheatTarget::One(nft_minter.contract_address)); - let _base_uri: ByteArray = "https://api.art-peace.net/nft-meta/nft-"; - let expected_uri: ByteArray = "https://api.art-peace.net/nft-meta/nft-0.json"; + let _base_uri: ByteArray = "https://api.art-peace.net/nft/round-1/metadata/nft-"; + let expected_uri: ByteArray = "https://api.art-peace.net/nft/round-1/metadata/nft-0.json"; let nft_meta = IERC721MetadataDispatcher { contract_address: nft.contract_address }; assert!(nft_meta.token_uri(0) == expected_uri, "NFT URI is not correct before change"); diff --git a/onchain/src/tests/vote_quest.cairo b/onchain/src/tests/vote_quest.cairo index e1b3b6d6..11e43d58 100644 --- a/onchain/src/tests/vote_quest.cairo +++ b/onchain/src/tests/vote_quest.cairo @@ -97,7 +97,7 @@ fn vote_quest_double_claim_test() { art_peace_dispatcher.claim_main_quest(0, utils::EMPTY_CALLDATA()); } -// When the `votable_colors` storage variable is not set for a particular day index, trying to +// When the `votable_colors` storage variable is not set for a particular day index, trying to // vote for a color at that day panics with 'Color out of bounds' error #[test] #[should_panic(expected: 'Color out of bounds')] diff --git a/tests/integration/docker/award_pixels.sh b/tests/integration/docker/award_pixels.sh new file mode 100755 index 00000000..76afa311 --- /dev/null +++ b/tests/integration/docker/award_pixels.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Load environment variables from `.env` file +if [ -f ../.env ]; then + export $(grep -v '^#' ../.env | xargs) +fi + +# Set environment and network details +ENVIRONMENT="local" +NETWORK_URL="http://localhost:5050" # Use the URL from your console output +ART_PEACE_CONTRACT="0x6fe75e8821863019aa3e7b824cceaa8a42265bbf1374e3c92eebc698036d438" + +# Define the JSON file path from command line argument +JSON_FILE_PATH="$1" + +# Verify contract exists before proceeding +echo "Verifying contract at $ART_PEACE_CONTRACT..." +if ! starkli class-hash-at $ART_PEACE_CONTRACT --rpc $NETWORK_URL > /dev/null 2>&1; then + echo "Error: ArtPeace contract not found at $ART_PEACE_CONTRACT" + echo "Please verify the contract address is correct" + exit 1 +fi + +echo "Contract verified successfully!" + +# Iterate through each user address and amount in the JSON file +jq -c '.[]' "$JSON_FILE_PATH" | while read -r entry; do + USER_ADDRESS=$(echo "$entry" | jq -r '.address') + AMOUNT=$(echo "$entry" | jq -r '.amount') + echo "Awarding $AMOUNT pixels to $USER_ADDRESS..." + + # Invoke the host_award_user function using starkli + starkli invoke --rpc $NETWORK_URL --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT \ + --watch $ART_PEACE_CONTRACT host_award_user $USER_ADDRESS $AMOUNT +done diff --git a/tests/integration/docker/deploy.sh b/tests/integration/docker/deploy.sh index 2eab87f2..fc99d764 100755 --- a/tests/integration/docker/deploy.sh +++ b/tests/integration/docker/deploy.sh @@ -74,7 +74,8 @@ echo "Declared class \"$NFT_CLASS_NAME\" with hash $NFT_CLASS_HASH" NFT_NAME="0 318195848183955342120051 10" NFT_SYMBOL="0 4271952 3" -CALLDATA=$(echo -n $NFT_NAME $NFT_SYMBOL) +ROUND_NUMBER=3 +CALLDATA=$(echo -n $NFT_NAME $NFT_SYMBOL $ROUND_NUMBER) echo "Deploying contract \"$NFT_CLASS_NAME\"..." echo "/root/.local/bin/sncast --url $RPC_URL --accounts-file $ACCOUNT_FILE --account $ACCOUNT_NAME --wait --json deploy --class-hash $NFT_CLASS_HASH --constructor-calldata $CALLDATA" diff --git a/tests/integration/docker/rewards.json b/tests/integration/docker/rewards.json new file mode 100644 index 00000000..f23b5a8f --- /dev/null +++ b/tests/integration/docker/rewards.json @@ -0,0 +1,10 @@ +[ + { + "address": "0x328ced46664355fc4b885ae7011af202313056a7e3d44827fb24c9d3206aaa0", + "amount": 10 + }, + { + "address": "0x05e01dB693CBF7461a016343042786DaC5A6000104813cF134a1E8B1D0a6810b", + "amount": 20 + } +] diff --git a/tests/integration/local/deploy.sh b/tests/integration/local/deploy.sh index e2fd77df..b7855341 100755 --- a/tests/integration/local/deploy.sh +++ b/tests/integration/local/deploy.sh @@ -69,7 +69,8 @@ echo "Deployed contract \"$ART_PEACE_CLASS_NAME\" with address $ART_PEACE_CONTRA NFT_NAME="0 318195848183955342120051 10" NFT_SYMBOL="0 4271952 3" -CALLDATA=$(echo -n $NFT_NAME $NFT_SYMBOL) +ROUND_NUMBER=3 +CALLDATA=$(echo -n $NFT_NAME $NFT_SYMBOL $ROUND_NUMBER) echo "Deploying contract \"$NFT_CLASS_NAME\"..." echo "sncast --url $RPC_URL --accounts-file $ACCOUNT_FILE --account $ACCOUNT_NAME --wait --json deploy --class-hash $NFT_CLASS_HASH --constructor-calldata $CALLDATA" diff --git a/tests/integration/mainnet/award_pixels.sh b/tests/integration/mainnet/award_pixels.sh new file mode 100755 index 00000000..47f2e62f --- /dev/null +++ b/tests/integration/mainnet/award_pixels.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Award pixels to users + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +WORK_DIR=$SCRIPT_DIR/../../.. +PROJECT_ROOT=$WORK_DIR + +# Load environment variables from `.env` file +if [ -z "$STARKNET_KEYSTORE" ] || [ -z "$STARKNET_ACCOUNT" ]; then + source $PROJECT_ROOT/.env +fi + +# Check if required env variables are set, if not exit +if [ -z "$STARKNET_KEYSTORE" ]; then + echo "Error: STARKNET_KEYSTORE is not set." + exit 1 +elif [ -z "$STARKNET_ACCOUNT" ]; then + echo "Error: STARKNET_ACCOUNT is not set." + exit 1 +fi + +ART_PEACE_CONTRACT=0x067883deb1c1cb60756eb6e60d500081352441a040d5039d0e4ce9fed35d68c1 +NETWORK=mainnet + +# Define the JSON file path from command line argument +JSON_FILE_PATH="$1" + +# Verify contract exists before proceeding +echo "Verifying contract at $ART_PEACE_CONTRACT..." +if ! starkli class-hash-at $ART_PEACE_CONTRACT --network $NETWORK > /dev/null 2>&1; then + echo "Error: ArtPeace contract not found at $ART_PEACE_CONTRACT" + echo "Please verify the contract address is correct" + exit 1 +fi + +# Iterate through each user address and amount in the JSON file +jq -c '.[]' "$JSON_FILE_PATH" | while read -r entry; do + USER_ADDRESS=$(echo "$entry" | jq -r '.address') + AMOUNT=$(echo "$entry" | jq -r '.amount') + echo "Awarding $AMOUNT pixels to $USER_ADDRESS..." + + # Invoke the host_award_user function using starkli + echo "starkli invoke --network $NETWORK --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT \ + --watch $ART_PEACE_CONTRACT host_award_user $USER_ADDRESS $AMOUNT" + starkli invoke --network $NETWORK --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT \ + --watch $ART_PEACE_CONTRACT host_award_user $USER_ADDRESS $AMOUNT +done diff --git a/tests/integration/mainnet/deploy-canvas-nft.sh b/tests/integration/mainnet/deploy-canvas-nft.sh index ff2fcf8e..2bf41e8a 100755 --- a/tests/integration/mainnet/deploy-canvas-nft.sh +++ b/tests/integration/mainnet/deploy-canvas-nft.sh @@ -77,8 +77,10 @@ CANVAS_NFT_DECLARE_OUTPUT=$(starkli declare --network mainnet --keystore $STARKN CANVAS_NFT_CONTRACT_CLASSHASH=$(echo $CANVAS_NFT_DECLARE_OUTPUT | tail -n 1 | awk '{print $NF}') echo "Contract class hash: $CANVAS_NFT_CONTRACT_CLASSHASH" +ROUND_NUMBER=3 + # Deploying the contract -CALLDATA=$(echo 0 81458137135092567582733106 11 0 4271952 3) +CALLDATA=$(echo 0 81458137135092567582733106 11 0 4271952 $ROUND_NUMBER) echo "Deploying the contract..." echo "starkli deploy --network mainnet --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT --watch $CANVAS_NFT_CONTRACT_CLASSHASH $CALLDATA" starkli deploy --network mainnet --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT --watch $CANVAS_NFT_CONTRACT_CLASSHASH $CALLDATA diff --git a/tests/integration/sepolia/award_pixels.sh b/tests/integration/sepolia/award_pixels.sh new file mode 100755 index 00000000..6fcd3c14 --- /dev/null +++ b/tests/integration/sepolia/award_pixels.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Award pixels to users + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +WORK_DIR=$SCRIPT_DIR/../../.. +PROJECT_ROOT=$WORK_DIR + +# Load environment variables from `.env` file +if [ -z "$STARKNET_KEYSTORE" ] || [ -z "$STARKNET_ACCOUNT" ]; then + source $PROJECT_ROOT/.env +fi + +# Check if required env variables are set, if not exit +if [ -z "$STARKNET_KEYSTORE" ]; then + echo "Error: STARKNET_KEYSTORE is not set." + exit 1 +elif [ -z "$STARKNET_ACCOUNT" ]; then + echo "Error: STARKNET_ACCOUNT is not set." + exit 1 +fi + +ART_PEACE_CONTRACT=0x078f4e772300472a68a19f2b1aedbcb7cf2acd6f67a2236372310a528c7eaa67 +NETWORK=sepolia + +# Define the JSON file path from command line argument +JSON_FILE_PATH="$1" + +# Verify contract exists before proceeding +echo "Verifying contract at $ART_PEACE_CONTRACT..." +if ! starkli class-hash-at $ART_PEACE_CONTRACT --network $NETWORK > /dev/null 2>&1; then + echo "Error: ArtPeace contract not found at $ART_PEACE_CONTRACT" + echo "Please verify the contract address is correct" + exit 1 +fi + +# Iterate through each user address and amount in the JSON file +jq -c '.[]' "$JSON_FILE_PATH" | while read -r entry; do + USER_ADDRESS=$(echo "$entry" | jq -r '.address') + AMOUNT=$(echo "$entry" | jq -r '.amount') + echo "Awarding $AMOUNT pixels to $USER_ADDRESS..." + + # Invoke the host_award_user function using starkli + echo "starkli invoke --network $NETWORK --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT \ + --watch $ART_PEACE_CONTRACT host_award_user $USER_ADDRESS $AMOUNT" + starkli invoke --network $NETWORK --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT \ + --watch $ART_PEACE_CONTRACT host_award_user $USER_ADDRESS $AMOUNT +done diff --git a/tests/integration/sepolia/deploy-canvas-nft.sh b/tests/integration/sepolia/deploy-canvas-nft.sh index 1d5262ef..f70febd3 100755 --- a/tests/integration/sepolia/deploy-canvas-nft.sh +++ b/tests/integration/sepolia/deploy-canvas-nft.sh @@ -77,8 +77,10 @@ CANVAS_NFT_DECLARE_OUTPUT=$(starkli declare --network sepolia --keystore $STARKN CANVAS_NFT_CONTRACT_CLASSHASH=$(echo $CANVAS_NFT_DECLARE_OUTPUT | tail -n 1 | awk '{print $NF}') echo "Contract class hash: $CANVAS_NFT_CONTRACT_CLASSHASH" +ROUND_NUMBER=3 + # Deploying the contract -CALLDATA=$(echo 0 318195848183955342120051 10 0 4271952 3) +CALLDATA=$(echo 0 318195848183955342120051 10 0 4271952 $ROUND_NUMBER) echo "Deploying the contract..." echo "starkli deploy --network sepolia --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT --watch $CANVAS_NFT_CONTRACT_CLASSHASH $CALLDATA" starkli deploy --network sepolia --keystore $STARKNET_KEYSTORE --account $STARKNET_ACCOUNT --watch $CANVAS_NFT_CONTRACT_CLASSHASH $CALLDATA