From 2baec1e4fe80f791cb46c698eaebe2fbea45a636 Mon Sep 17 00:00:00 2001 From: Marco Peyfuss Date: Sat, 17 Aug 2024 20:42:06 -0600 Subject: [PATCH] Add shape sepolia + fix optimizer runs for 3.3.0 --- Makefile | 111 ++++++++++++++---- deployments.json | 14 +++ foundry.toml | 5 +- sample.env | 2 + script/Deploy.s.sol | 27 ++++- .../multi-metadata/CollectorsChoice.sol | 1 + src/erc-721/multi-metadata/ERC7160TL.sol | 1 + 7 files changed, 138 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index c13fb26..edeb260 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ clean: forge fmt && forge clean build: - forge build --evm-version paris + forge build --evm-version paris --sizes clean_build: clean build @@ -54,6 +54,11 @@ deploy_ERC721TL_base_sepolia: build forge verify-contract $$(cat out.txt) src/erc-721/ERC721TL.sol:ERC721TL --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +deploy_ERC721TL_shape_sepolia: build + forge script script/Deploy.s.sol:DeployERC721TL --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TL.sol:ERC721TL --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + deploy_ERC721TL_mainnet: build forge script script/Deploy.s.sol:DeployERC721TL --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast forge verify-contract $$(cat out.txt) src/erc-721/ERC721TL.sol:ERC721TL --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} @@ -69,6 +74,42 @@ deploy_ERC721TL_base: build forge verify-contract $$(cat out.txt) src/erc-721/ERC721TL.sol:ERC721TL --chain base --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +################################################################ ERC721TLMutable Deployments ################################################################ +deploy_ERC721TLMutable_sepolia: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --chain sepolia --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC721TLMutable_arbitrum_sepolia: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url arbitrum_sepolia --ledger --sender ${SENDER} --broadcast --skip-simulation + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --verifier-url https://api-sepolia.arbiscan.io/api --etherscan-api-key ${ARBISCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC721TLMutable_base_sepolia: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url base_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC721TLMutable_shape_sepolia: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC721TLMutable_mainnet: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC721TLMutable_arbitrum_one: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url arbitrum --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --chain arbitrum --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC721TLMutable_base: build + forge script script/Deploy.s.sol:DeployERC721TLMutable --evm-version paris --rpc-url base --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/ERC721TLMutable.sol:ERC721TLMutable --chain base --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + ################################################################ ERC1155TL Deployments ################################################################ deploy_ERC1155TL_sepolia: build forge script script/Deploy.s.sol:DeployERC1155TL --evm-version paris --rpc-url sepolia --ledger --sender ${SENDER} --broadcast @@ -85,6 +126,11 @@ deploy_ERC1155TL_base_sepolia: build forge verify-contract $$(cat out.txt) src/erc-1155/ERC1155TL.sol:ERC1155TL --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +deploy_ERC1155TL_shape_sepolia: build + forge script script/Deploy.s.sol:DeployERC1155TL --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-1155/ERC1155TL.sol:ERC1155TL --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + deploy_ERC1155TL_mainnet: build forge script script/Deploy.s.sol:DeployERC1155TL --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast forge verify-contract $$(cat out.txt) src/erc-1155/ERC1155TL.sol:ERC1155TL --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} @@ -116,6 +162,11 @@ deploy_Shatter_base_sepolia: build forge verify-contract $$(cat out.txt) src/erc-721/shatter/Shatter.sol:Shatter --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +deploy_Shatter_shape_sepolia: build + forge script script/Deploy.s.sol:DeployShatter --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/shatter/Shatter.sol:Shatter --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + deploy_Shatter_mainnet: build forge script script/Deploy.s.sol:DeployShatter --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast forge verify-contract $$(cat out.txt) src/erc-721/shatter/Shatter.sol:Shatter --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} @@ -147,6 +198,11 @@ deploy_ERC7160TL_base_sepolia: build forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TL.sol:ERC7160TL --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +deploy_ERC7160TL_shape_sepolia: build + forge script script/Deploy.s.sol:DeployERC7160TL --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TL.sol:ERC7160TL --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + deploy_ERC7160TL_mainnet: build forge script script/Deploy.s.sol:DeployERC7160TL --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TL.sol:ERC7160TL --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} @@ -162,35 +218,40 @@ deploy_ERC7160TL_base: build forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TL.sol:ERC7160TL --chain base --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh -################################################################ Doppelganger Deployments ################################################################ -deploy_Doppelganger_sepolia: build - forge script script/Deploy.s.sol:DeployDoppelganger --evm-version paris --rpc-url sepolia --ledger --sender ${SENDER} --broadcast - forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/Doppelganger.sol:Doppelganger --chain sepolia --watch --constructor-args ${CONSTRUCTOR_ARGS} +################################################################ ERC7160TLEditions Deployments ################################################################ +deploy_ERC7160TLEditions_sepolia: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --chain sepolia --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + +deploy_ERC7160TLEditions_arbitrum_sepolia: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url arbitrum_sepolia --ledger --sender ${SENDER} --broadcast --skip-simulation + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --verifier-url https://api-sepolia.arbiscan.io/api --etherscan-api-key ${ARBISCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh -deploy_Doppelganger_arbitrum_sepolia: build - forge script script/Deploy.s.sol:DeployDoppelganger --evm-version paris --rpc-url arbitrum_sepolia --ledger --sender ${SENDER} --broadcast --skip-simulation - forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/Doppelganger.sol:Doppelganger --verifier-url https://api-sepolia.arbiscan.io/api --etherscan-api-key ${ARBISCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} +deploy_ERC7160TLEditions_base_sepolia: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url base_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh -deploy_Doppelganger_base_sepolia: build - forge script script/Deploy.s.sol:DeployDoppelganger --evm-version paris --rpc-url base_sepolia --ledger --sender ${SENDER} --broadcast - forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/Doppelganger.sol:Doppelganger --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} +deploy_ERC7160TLEditions_shape_sepolia: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh -deploy_Doppelganger_mainnet: build - forge script script/Deploy.s.sol:DeployDoppelganger --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast - forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/Doppelganger.sol:Doppelganger --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} +deploy_ERC7160TLEditions_mainnet: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh -deploy_Doppelganger_arbitrum_one: build - forge script script/Deploy.s.sol:DeployDoppelganger --evm-version paris --rpc-url arbitrum --ledger --sender ${SENDER} --broadcast - forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/Doppelganger.sol:Doppelganger --chain arbitrum --watch --constructor-args ${CONSTRUCTOR_ARGS} +deploy_ERC7160TLEditions_arbitrum_one: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url arbitrum --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --chain arbitrum --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh -deploy_Doppelganger_base: build - forge script script/Deploy.s.sol:DeployDoppelganger --evm-version paris --rpc-url base --ledger --sender ${SENDER} --broadcast - forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/Doppelganger.sol:Doppelganger --chain base --watch --constructor-args ${CONSTRUCTOR_ARGS} +deploy_ERC7160TLEditions_base: build + forge script script/Deploy.s.sol:DeployERC7160TLEditions --evm-version paris --rpc-url base --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/ERC7160TLEditions.sol:ERC7160TLEditions --chain base --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh ################################################################ CollectorsChoice Deployments ################################################################ @@ -209,6 +270,11 @@ deploy_CollectorsChoice_base_sepolia: build forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/CollectorsChoice.sol:CollectorsChoice --verifier-url https://api-sepolia.basescan.org/api --etherscan-api-key ${BASESCAN_KEY} --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +deploy_CollectorsChoice_shape_sepolia: build + forge script script/Deploy.s.sol:DeployCollectorsChoice --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/CollectorsChoice.sol:CollectorsChoice --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + deploy_CollectorsChoice_mainnet: build forge script script/Deploy.s.sol:DeployCollectorsChoice --evm-version paris --rpc-url mainnet --ledger --sender ${SENDER} --broadcast forge verify-contract $$(cat out.txt) src/erc-721/multi-metadata/CollectorsChoice.sol:CollectorsChoice --chain mainnet --watch --constructor-args ${CONSTRUCTOR_ARGS} @@ -235,6 +301,11 @@ deploy_TRACE_base_sepolia: build forge verify-contract $$(cat out.txt) src/erc-721/trace/TRACE.sol:TRACE --chain base-sepolia --watch --constructor-args ${CONSTRUCTOR_ARGS} @bash print_and_clean.sh +deploy_TRACE_shape_sepolia: build + forge script script/Deploy.s.sol:DeployTRACE --evm-version paris --rpc-url shape_sepolia --ledger --sender ${SENDER} --broadcast + forge verify-contract $$(cat out.txt) src/erc-721/trace/TRACE.sol:TRACE --verifier blockscout --verifier-url https://explorer-sepolia.shape.network/api --watch --constructor-args ${CONSTRUCTOR_ARGS} + @bash print_and_clean.sh + deploy_TRACE_arbitrum_one: build forge script script/Deploy.s.sol:DeployTRACE --evm-version paris --rpc-url arbitrum --ledger --sender ${SENDER} --broadcast forge verify-contract $$(cat out.txt) src/erc-721/trace/TRACE.sol:TRACE --chain arbitrum --watch --constructor-args ${CONSTRUCTOR_ARGS} diff --git a/deployments.json b/deployments.json index 18b9b9c..f78dcf7 100644 --- a/deployments.json +++ b/deployments.json @@ -16,6 +16,13 @@ "deployed_contract": "0xd631b04e8fdbe152ee4c05273588f444efdedfaf" } }, + "ERC721TLMutable": { + "3.3.0": { + "constructor_args": "0x0000000000000000000000000000000000000000000000000000000000000001", + "salt": "0x0303000000000000000000000000000000000000000000000000000000000000", + "deployed_contract": "0x5731d2e8396c384190978a9d4b16894360b436c4" + } + }, "ERC1155TL": { "3.0.0": { "constructor_args": "0x0000000000000000000000000000000000000000000000000000000000000001", @@ -94,6 +101,13 @@ "deployed_contract": "0xc3225e41e5c88277e637f5298c9932b89d6ec3fa" } }, + "ERC7160TLEditions": { + "3.2.0": { + "constructor_args": "0x0000000000000000000000000000000000000000000000000000000000000001", + "salt": "0x0302000000000000000000000000000000000000000000000000000000000000", + "deployed_contract": "0xd497b9c1cc754b88e3bdf4bf3f9c7327ec28a310" + } + }, "CollectorsChoice": { "3.0.0": { "constructor_args": "0x0000000000000000000000000000000000000000000000000000000000000001", diff --git a/foundry.toml b/foundry.toml index 915af97..6efd603 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,11 +6,12 @@ libs = ['lib'] evm_version = 'paris' auto_detect_solc = true optimizer = true -optimizer_runs = 2000 +optimizer_runs = 10000 verbosity = 3 wrap_comments = true gas_reports = ["ERC721TL", "ERC1155TL", "Doppelganger", "CollectorsChoice", "Shatter", "TRACE", "ERC7160TL"] fs_permissions = [{ access = "read-write", path = "./"}] +show_progess = true [fuzz] runs = 1024 @@ -19,9 +20,11 @@ runs = 1024 sepolia = "${SEPOLIA_RPC_URL}" arbitrum_sepolia = "${ARB_SEPOLIA_RPC_URL}" base_sepolia = "${BASE_SEPOLIA_RPC_URL}" +shape_sepolia = "${SHAPE_SEPOLIA_RPC_URL}" mainnet = "${ETH_RPC_URL}" arbitrum = "${ARB_RPC_URL}" base = "${BASE_RPC_URL}" +shape = "${SHAPE_RPC_URL}" [etherscan] sepolia = { key = "${ETHERSCAN_KEY}" } diff --git a/sample.env b/sample.env index 8f3bc1a..4674680 100644 --- a/sample.env +++ b/sample.env @@ -4,6 +4,8 @@ ARB_SEPOLIA_RPC_URL= ARB_RPC_URL= BASE_SEPOLIA_RPC_URL= BASE_RPC_URL= +SHAPE_SEPOLIA_RPC_URL= +SHAPE_RPC_URL= ARBISCAN_KEY= ETHERSCAN_KEY= BASESCAN_KEY= diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol index fc24bac..26782ae 100644 --- a/script/Deploy.s.sol +++ b/script/Deploy.s.sol @@ -32,6 +32,29 @@ contract DeployERC721TL is Script { } } +contract DeployERC721TLMutable is Script { + using Strings for address; + + function run() public { + // get environment variables + ICreate2Deployer create2Deployer = ICreate2Deployer(vm.envAddress("CREATE2_DEPLOYER")); + bytes memory constructorArgs = vm.envBytes("CONSTRUCTOR_ARGS"); + bytes32 salt = vm.envBytes32("SALT"); + + // get bytecode + bytes memory bytecode = abi.encodePacked(vm.getCode("ERC721TLMutable.sol:ERC721TLMutable"), constructorArgs); + + // deploy + address deployedContract = create2Deployer.computeAddress(salt, keccak256(bytecode)); + console.logAddress(deployedContract); + vm.broadcast(); + create2Deployer.deploy(0, salt, bytecode); + + // save deployed contract address + vm.writeLine("out.txt", deployedContract.toHexString()); + } +} + contract DeployERC1155TL is Script { using Strings for address; @@ -98,7 +121,7 @@ contract DeployERC7160TL is Script { } } -contract DeployDoppelganger is Script { +contract DeployERC7160TLEditions is Script { using Strings for address; function run() public { @@ -108,7 +131,7 @@ contract DeployDoppelganger is Script { bytes32 salt = vm.envBytes32("SALT"); // get bytecode - bytes memory bytecode = abi.encodePacked(vm.getCode("Doppelganger.sol:Doppelganger"), constructorArgs); + bytes memory bytecode = abi.encodePacked(vm.getCode("ERC7160TLEditions.sol:ERC7160TLEditions"), constructorArgs); // deploy address deployedContract = create2Deployer.computeAddress(salt, keccak256(bytecode)); diff --git a/src/erc-721/multi-metadata/CollectorsChoice.sol b/src/erc-721/multi-metadata/CollectorsChoice.sol index 2115a2e..0263322 100644 --- a/src/erc-721/multi-metadata/CollectorsChoice.sol +++ b/src/erc-721/multi-metadata/CollectorsChoice.sol @@ -15,6 +15,7 @@ import {IERC721TL} from "../IERC721TL.sol"; /// @title CollectorsChoice.sol /// @notice Sovereign ERC-7160 Editions with a metadata lock timer (Collectors Choice) Creator Contract with Story Inscriptions +/// @dev When unpinned, the latest metadata added for a token is returned from `tokenURI` and `tokenURIs` /// @author transientlabs.xyz /// @custom:version 3.1.1 contract CollectorsChoice is diff --git a/src/erc-721/multi-metadata/ERC7160TL.sol b/src/erc-721/multi-metadata/ERC7160TL.sol index 5ae3ae1..4ac4298 100644 --- a/src/erc-721/multi-metadata/ERC7160TL.sol +++ b/src/erc-721/multi-metadata/ERC7160TL.sol @@ -301,6 +301,7 @@ contract ERC7160TL is emit BatchMetadataUpdate(1, _counter); } + /// @notice Function to add token uris /// @dev Written to take in many token ids and a base uri that contains metadata files with file names matching the index of each token id in the `tokenIds` array (aka folderIndex) /// @dev No trailing slash on the base uri