diff --git a/.gitmodules b/.gitmodules index 2efa5062..3aa98cd3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,10 +1,10 @@ [submodule "cairopen_contracts"] url = https://github.com/CairOpen/cairopen-contracts.git path = lib/cairopen_contracts -[submodule "bal7hazar_contracts"] - url = https://github.com/Bal7hazar/cairo-contracts.git - path = lib/bal7hazar_contracts [submodule "cairo_contracts"] url = https://github.com/OpenZeppelin/cairo-contracts path = lib/cairo_contracts branch = refs/heads/v0.4.0b +[submodule "bal7hazar_contracts"] + url = https://github.com/Bal7hazar/cairo-contracts.git + path = lib/bal7hazar_contracts diff --git a/assets/badges/img/banner.png b/assets/badges/img/banner.png new file mode 100644 index 00000000..6b5a8277 Binary files /dev/null and b/assets/badges/img/banner.png differ diff --git a/assets/badges/img/collection.png b/assets/badges/img/collection.png new file mode 100644 index 00000000..4044043e Binary files /dev/null and b/assets/badges/img/collection.png differ diff --git a/assets/badges/img/helper.png b/assets/badges/img/helper.png new file mode 100644 index 00000000..6a5f9adc Binary files /dev/null and b/assets/badges/img/helper.png differ diff --git a/assets/badges/img/level-1.png b/assets/badges/img/level-1.png new file mode 100644 index 00000000..ccad49d4 Binary files /dev/null and b/assets/badges/img/level-1.png differ diff --git a/assets/badges/img/level-2.png b/assets/badges/img/level-2.png new file mode 100644 index 00000000..a197f86c Binary files /dev/null and b/assets/badges/img/level-2.png differ diff --git a/assets/badges/img/team.png b/assets/badges/img/team.png new file mode 100644 index 00000000..89f4b6c3 Binary files /dev/null and b/assets/badges/img/team.png differ diff --git a/assets/badges/json/0.json b/assets/badges/json/0.json new file mode 100644 index 00000000..b9f0aec3 --- /dev/null +++ b/assets/badges/json/0.json @@ -0,0 +1,13 @@ +{ + "description": "Carbonable badge", + "external_url": "https://carbonable.io/", + "youtube_url": "https://www.youtube.com/watch?v=5dZrROBmfKU&ab_channel=Carbonable", + "image": "ipfs://bafybeigsolf5qc6vtyxak5pyxupnj6iymylwz44vbz4avam5bp3in2exf4/team.png", + "name": "Team", + "attributes": [ + { + "trait_type": "Role", + "value": "Team" + } + ] +} \ No newline at end of file diff --git a/assets/badges/json/1.json b/assets/badges/json/1.json new file mode 100644 index 00000000..a842b3ee --- /dev/null +++ b/assets/badges/json/1.json @@ -0,0 +1,13 @@ +{ + "description": "Carbonable badge", + "external_url": "https://carbonable.io/", + "youtube_url": "https://www.youtube.com/watch?v=5dZrROBmfKU&ab_channel=Carbonable", + "image": "ipfs://bafybeigsolf5qc6vtyxak5pyxupnj6iymylwz44vbz4avam5bp3in2exf4/helper.png", + "name": "Helper", + "attributes": [ + { + "trait_type": "Role", + "value": "Helper" + } + ] +} \ No newline at end of file diff --git a/assets/badges/json/2.json b/assets/badges/json/2.json new file mode 100644 index 00000000..33334a08 --- /dev/null +++ b/assets/badges/json/2.json @@ -0,0 +1,17 @@ +{ + "description": "Carbonable badge", + "external_url": "https://carbonable.io/", + "youtube_url": "https://www.youtube.com/watch?v=5dZrROBmfKU&ab_channel=Carbonable", + "image": "ipfs://bafybeigsolf5qc6vtyxak5pyxupnj6iymylwz44vbz4avam5bp3in2exf4/level-1.png", + "name": "Level 1", + "attributes": [ + { + "trait_type": "Role", + "value": "User" + }, + { + "trait_type": "Level", + "value": 1 + } + ] +} \ No newline at end of file diff --git a/assets/badges/json/3.json b/assets/badges/json/3.json new file mode 100644 index 00000000..91c8eaed --- /dev/null +++ b/assets/badges/json/3.json @@ -0,0 +1,17 @@ +{ + "description": "Carbonable badge", + "external_url": "https://carbonable.io/", + "youtube_url": "https://www.youtube.com/watch?v=5dZrROBmfKU&ab_channel=Carbonable", + "image": "ipfs://bafybeigsolf5qc6vtyxak5pyxupnj6iymylwz44vbz4avam5bp3in2exf4/level-2.png", + "name": "Level 2", + "attributes": [ + { + "trait_type": "Role", + "value": "User" + }, + { + "trait_type": "Level", + "value": 2 + } + ] +} \ No newline at end of file diff --git a/assets/badges/json/metadata.json b/assets/badges/json/metadata.json new file mode 100644 index 00000000..7df90082 --- /dev/null +++ b/assets/badges/json/metadata.json @@ -0,0 +1,7 @@ +{ + "name": "Carbonable Badges", + "description": "Carbonable badges.", + "image": "ipfs://bafybeigsolf5qc6vtyxak5pyxupnj6iymylwz44vbz4avam5bp3in2exf4/collection.png", + "external_link": "https://carbonable.io/", + "banner_image_url": "ipfs://bafybeigsolf5qc6vtyxak5pyxupnj6iymylwz44vbz4avam5bp3in2exf4/banner.png" +} \ No newline at end of file diff --git a/lib/bal7hazar_contracts b/lib/bal7hazar_contracts index fdfdd5db..8fcc89d6 160000 --- a/lib/bal7hazar_contracts +++ b/lib/bal7hazar_contracts @@ -1 +1 @@ -Subproject commit fdfdd5db27185f8426418cc1b5c757f2e04d3083 +Subproject commit 8fcc89d6d091be502b3c00feb38fc7c433e1123a diff --git a/scripts/airdrop_badge.sh b/scripts/airdrop_badge.sh new file mode 100755 index 00000000..5a85ae67 --- /dev/null +++ b/scripts/airdrop_badge.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +### CONSTANTS +SCRIPT_DIR=`readlink -f $0 | xargs dirname` +ROOT=`readlink -f $SCRIPT_DIR/..` +STARKNET_ACCOUNTS_FILE=$HOME/.starknet_accounts/starknet_open_zeppelin_accounts.json +PROTOSTAR_TOML_FILE=$ROOT/protostar.toml + +### FUNCTIONS +. $SCRIPT_DIR/library.sh # Logging utilities + +### RAW INPUTS +PROFILE="testnet" +BADGE_CONTRACT=0x00e3f53dd77369d98903828488de01d60a8e118cfc2e007d663aea6111da44ef +RECIPIENT_FILE=$ROOT/scripts/configs/recipients.txt +TOKEN_ID=0 +AMOUNT=1 + +### SETTINGS +CONFIG_FILE=$ROOT/scripts/configs/$PROFILE.config +[ -f $CONFIG_FILE ] && source $CONFIG_FILE || exit_error "$CONFIG_FILE file not found" + +[ -z $ADMIN_ADDRESS ] && ADMIN_ADDRESS=`get_account_address $ACCOUNT $STARKNET_ACCOUNTS_FILE` +[ -z $ADMIN_ADDRESS ] && exit_error "Unable to determine account address" + +[[ -z $NETWORK && ! -z $PROFILE ]] && NETWORK=`get_network $PROFILE $PROTOSTAR_TOML_FILE` +[ -z $NETWORK ] && exit_error "Unable to determine network" + +### PRE_CONDITIONS +check_wallet +check_starknet + +### LAST CHECK +print Profile: $PROFILE +print Account alias: $ACCOUNT +print Admin address: $ADMIN_ADDRESS +print Network: $NETWORK +print Badge contract: $BADGE_CONTRACT +print Recipients: $RECIPIENT_FILE +print Token ID: $TOKEN_ID +print AMOUNT: $AMOUNT +ask "Are you OK to airdrop with those parameters" || return + +### AIRDROP +token_id=$(felt_to_uint256 $TOKEN_ID) +amount=$(felt_to_uint256 $AMOUNT) +data_len=1 +data=0 +for to in $(cat $RECIPIENT_FILE); do + log_info "Mint $AMOUNT token (id=$TOKEN_ID) to $to" + send_transaction "starknet invoke --address $BADGE_CONTRACT --abi ./build/CarbonableBadge_abi.json --function mint --inputs $to $token_id $amount $data_len $data --network $NETWORK --account $ACCOUNT --wallet $WALLET" "$NETWORK" || exit_error +done + +exit_success \ No newline at end of file diff --git a/scripts/configs/recipients.txt b/scripts/configs/recipients.txt new file mode 100644 index 00000000..8aa24608 --- /dev/null +++ b/scripts/configs/recipients.txt @@ -0,0 +1,4 @@ +0x062aabb23d64f4171b83c340f4312f714506f0e63a8b750c7fa02792067baf52 +0x06308ece15a8fb6dacdda24e3963a0174d554807934609effff1cc5464d2cc0a +0x009D02BaA050b9E8f3eb98ff0fa1eDE8E1b20D65CEAE9F05E018B4d8Da3e4b7F +0x024ed6992a5ffad2c51499733811ecb1d31f84e9a9adeca516c362c67d0714ee \ No newline at end of file diff --git a/scripts/configs/testnet.config b/scripts/configs/testnet.config index 7acd16bf..8f9fb646 100644 --- a/scripts/configs/testnet.config +++ b/scripts/configs/testnet.config @@ -3,7 +3,7 @@ ACCOUNT=carbonable WALLET=starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount # ERC-1155 settings -ERC1155_URI="ipfs://bafybeignr4tutoraenal42bjlpn35yfiy5pe3acu7scx7hnsbwshp3dt7e/" +ERC1155_URI="ipfs://bafybeicmkhxgj6sdpdioak42yxcqnfhjjmiloirzn3yfrtjn2tazwq3754" ERC1155_NAME="Carbonable ERC-1155 Test" # ERC-721 settings diff --git a/src/badge/badge.cairo b/src/badge/badge.cairo index ae27a1db..c953fb39 100644 --- a/src/badge/badge.cairo +++ b/src/badge/badge.cairo @@ -51,6 +51,13 @@ func uri{ return CarbonableBadge.uri(id); } +@view +func contractURI{ + syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, bitwise_ptr: BitwiseBuiltin*, range_check_ptr +}() -> (uri_len: felt, uri: felt*) { + return CarbonableBadge.contract_uri(); +} + @view func balanceOf{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( account: felt, id: Uint256 diff --git a/src/badge/library.cairo b/src/badge/library.cairo index f19cc71c..cdd688cf 100644 --- a/src/badge/library.cairo +++ b/src/badge/library.cairo @@ -74,8 +74,23 @@ namespace CarbonableBadge { let (id_str) = StringCodec.felt_to_string(id.low); let (ext_str) = StringCodec.ss_to_string('.json'); - let (pre_str) = StringUtil.concat(uri_str, id_str); - let (str) = StringUtil.concat(pre_str, ext_str); + let (json_str) = StringUtil.concat(id_str, ext_str); + let (str) = StringUtil.path_join(uri_str, json_str); + + return (str.len, str.data); + } + + func contract_uri{ + syscall_ptr: felt*, + pedersen_ptr: HashBuiltin*, + bitwise_ptr: BitwiseBuiltin*, + range_check_ptr, + }() -> (uri_len: felt, uri: felt*) { + alloc_locals; + + let (uri_str) = StringCodec.read('uri'); + let (json_str) = StringCodec.ss_to_string('metadata.json'); + let (str) = StringUtil.path_join(uri_str, json_str); return (str.len, str.data); } diff --git a/src/interfaces/badge.cairo b/src/interfaces/badge.cairo index 5a2751d1..21b7fc11 100644 --- a/src/interfaces/badge.cairo +++ b/src/interfaces/badge.cairo @@ -10,6 +10,9 @@ namespace ICarbonableBadge { func uri(id: Uint256) -> (uri_len: felt, uri: felt*) { } + func contractURI() -> (uri_len: felt, uri: felt*) { + } + func name() -> (name: felt) { } diff --git a/tests/integrations/badge/library.cairo b/tests/integrations/badge/library.cairo index 7dd362fb..17d108c9 100644 --- a/tests/integrations/badge/library.cairo +++ b/tests/integrations/badge/library.cairo @@ -88,6 +88,18 @@ namespace carbonable_badge_instance { return (len, array); } + func contract_uri{ + syscall_ptr: felt*, + pedersen_ptr: HashBuiltin*, + bitwise_ptr: BitwiseBuiltin*, + range_check_ptr, + carbonable_badge: felt, + }() -> (uri_len: felt, uri: felt*) { + alloc_locals; + let (len, array) = ICarbonableBadge.contractURI(carbonable_badge); + return (len, array); + } + func owner{ syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, carbonable_badge: felt }() -> (owner: felt) {