Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 90 additions & 61 deletions packages/contracts/contracts/DependencyRegistryV0.sol
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,76 @@ contract DependencyRegistryV0 is
);
}

/**
* @notice Updates the canvas tag for dependency `dependencyNameAndVersion`.
* @param dependencyNameAndVersion Name and version of dependency (i.e. "name@version") used to identify dependency.
* @param canvasTag The new canvas tag for the dependency.
*/
function updateDependencyCanvasTag(
bytes32 dependencyNameAndVersion,
IDependencyRegistryV0.CanvasTag canvasTag
) external {
_onlyAdminACL(this.updateDependencyCanvasTag.selector);
_onlyExistingDependency(dependencyNameAndVersion);

DependencyRegistryStorageLib.Dependency
storage dependency = DependencyRegistryStorageLib
.s()
.dependencyRecords[dependencyNameAndVersion];
dependency.canvasTag = canvasTag;

emit DependencyCanvasTagUpdated(dependencyNameAndVersion, canvasTag);
}

/**
* @notice Updates the loadAsModule flag for dependency `dependencyNameAndVersion`.
* @param dependencyNameAndVersion Name and version of dependency (i.e. "name@version") used to identify dependency.
* @param loadAsModule The new loadAsModule flag for the dependency.
*/
function updateDependencyLoadAsModule(
bytes32 dependencyNameAndVersion,
bool loadAsModule
) external {
_onlyAdminACL(this.updateDependencyLoadAsModule.selector);
_onlyExistingDependency(dependencyNameAndVersion);

DependencyRegistryStorageLib.Dependency
storage dependency = DependencyRegistryStorageLib
.s()
.dependencyRecords[dependencyNameAndVersion];
dependency.loadAsModule = loadAsModule;

emit DependencyLoadAsModuleUpdated(
dependencyNameAndVersion,
loadAsModule
);
}

/**
* @notice Updates the project script special type for dependency `dependencyNameAndVersion`.
* @param dependencyNameAndVersion Name and version of dependency (i.e. "name@version") used to identify dependency.
* @param projectScriptSpecialType The new project script special type for the dependency.
* For example, "type=‘application/processing" for processing.js
*/
function updateDependencyProjectScriptSpecialType(
bytes32 dependencyNameAndVersion,
string memory projectScriptSpecialType
) external {
_onlyAdminACL(this.updateDependencyProjectScriptSpecialType.selector);
_onlyExistingDependency(dependencyNameAndVersion);

DependencyRegistryStorageLib.Dependency
storage dependency = DependencyRegistryStorageLib
.s()
.dependencyRecords[dependencyNameAndVersion];
dependency.projectScriptSpecialType = projectScriptSpecialType;

emit DependencyProjectScriptSpecialTypeUpdated(
dependencyNameAndVersion,
projectScriptSpecialType
);
}

/**
* @notice These functions were removed in an upgrade, registering and unregistering
* contracts are handled by the core registry.
Expand Down Expand Up @@ -1001,34 +1071,11 @@ contract DependencyRegistryV0 is
* @notice Returns details for a given dependency type `dependencyNameAndVersion` input as string.
* Reverts if input string does not fit within 32 bytes.
* @param dependencyNameAndVersion Name and version of dependency (i.e. "name@version") used to identify dependency.
* @return nameAndVersion String representation of `dependencyNameAndVersion`.
* (e.g. "p5js(atSymbol)1.0.0")
* @return licenseType License type for dependency
* @return preferredCDN Preferred CDN URL for dependency
* @return additionalCDNCount Count of additional CDN URLs for dependency
* @return preferredRepository Preferred repository URL for dependency
* @return additionalRepositoryCount Count of additional repository URLs for dependency
* @return dependencyWebsite Project website URL for dependency
* @return availableOnChain Whether dependency is available on chain
* @return scriptCount Count of on-chain scripts for dependency
* @return dependencyDetails Details for a given dependency type.
*/
function getDependencyDetailsFromString(
string memory dependencyNameAndVersion
)
external
view
returns (
string memory nameAndVersion,
string memory licenseType,
string memory preferredCDN,
uint24 additionalCDNCount,
string memory preferredRepository,
uint24 additionalRepositoryCount,
string memory dependencyWebsite,
bool availableOnChain,
uint24 scriptCount
)
{
) external view returns (DependencyDetails memory dependencyDetails) {
_onlyBytes32String(dependencyNameAndVersion);
return getDependencyDetails(dependencyNameAndVersion.stringToBytes32());
}
Expand Down Expand Up @@ -1377,50 +1424,32 @@ contract DependencyRegistryV0 is
/**
* @notice Returns details for a given dependency type `dependencyNameAndVersion`.
* @param dependencyNameAndVersion Name and version of dependency (i.e. "name@version") used to identify dependency.
* @return nameAndVersion String representation of `dependencyNameAndVersion`.
* (e.g. "p5js(atSymbol)1.0.0")
* @return licenseType License type for dependency
* @return preferredCDN Preferred CDN URL for dependency
* @return additionalCDNCount Count of additional CDN URLs for dependency
* @return preferredRepository Preferred repository URL for dependency
* @return additionalRepositoryCount Count of additional repository URLs for dependency
* @return dependencyWebsite Project website URL for dependency
* @return availableOnChain Whether dependency is available on chain
* @return scriptCount Count of on-chain scripts for dependency
* @return dependencyDetails Details for a given dependency type.
*/
function getDependencyDetails(
bytes32 dependencyNameAndVersion
)
public
view
returns (
string memory nameAndVersion,
string memory licenseType,
string memory preferredCDN,
uint24 additionalCDNCount,
string memory preferredRepository,
uint24 additionalRepositoryCount,
string memory dependencyWebsite,
bool availableOnChain,
uint24 scriptCount
)
{
) public view returns (DependencyDetails memory dependencyDetails) {
DependencyRegistryStorageLib.Dependency
storage dependency = DependencyRegistryStorageLib
.s()
.dependencyRecords[dependencyNameAndVersion];

return (
dependencyNameAndVersion.toString(),
dependency.licenseType.toString(),
dependency.preferredCDN,
dependency.additionalCDNCount,
dependency.preferredRepository,
dependency.additionalRepositoryCount,
dependency.website,
dependency.scriptCount > 0,
dependency.scriptCount
);
dependencyDetails.nameAndVersion = dependencyNameAndVersion.toString();
dependencyDetails.licenseType = dependency.licenseType.toString();
dependencyDetails.preferredCDN = dependency.preferredCDN;
dependencyDetails.additionalCDNCount = dependency.additionalCDNCount;
dependencyDetails.preferredRepository = dependency.preferredRepository;
dependencyDetails.additionalRepositoryCount = dependency
.additionalRepositoryCount;
dependencyDetails.dependencyWebsite = dependency.website;
dependencyDetails.availableOnChain = dependency.scriptCount > 0;
dependencyDetails.scriptCount = dependency.scriptCount;
dependencyDetails.canvasTag = dependency.canvasTag;
dependencyDetails.loadAsModule = dependency.loadAsModule;
dependencyDetails.projectScriptSpecialType = dependency
.projectScriptSpecialType;

// @dev implicit return of dependencyDetails
}

/**
Expand Down
28 changes: 15 additions & 13 deletions packages/contracts/contracts/generator/GenArt721GeneratorV0.sol
Original file line number Diff line number Diff line change
Expand Up @@ -821,17 +821,16 @@ contract GenArt721GeneratorV0 is Initializable, IGenArt721GeneratorV0 {
HTMLTag memory htmlTag
) internal view {
// Get script count and preferred CDN for the dependency.
(
,
,
string memory preferredCDN,
,
,
,
,
,
uint24 scriptCount
) = dependencyRegistry.getDependencyDetails(dependencyNameAndVersion);
string memory preferredCDN;
uint24 scriptCount;
// block scope to avoid stack too deep error
{
IDependencyRegistryV0.DependencyDetails
memory dependencyDetails = dependencyRegistry
.getDependencyDetails(dependencyNameAndVersion);
preferredCDN = dependencyDetails.preferredCDN;
scriptCount = dependencyDetails.scriptCount;
}

// If no scripts on-chain, load the script from the preferred CDN.
if (scriptCount == 0) {
Expand Down Expand Up @@ -1021,8 +1020,11 @@ contract GenArt721GeneratorV0 is Initializable, IGenArt721GeneratorV0 {
return true;
}
// query and return result of dependency registry for on-chain status
(, , , , , , , availableOnChain, ) = dependencyRegistry
.getDependencyDetails(dependencyNameAndVersion);
IDependencyRegistryV0.DependencyDetails
memory dependencyDetails = dependencyRegistry.getDependencyDetails(
dependencyNameAndVersion
);
return dependencyDetails.availableOnChain;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,61 @@ interface IDependencyRegistryV0 {

event UniversalBytecodeStorageReaderUpdated(address indexed newReader);

event DependencyCanvasTagUpdated(
bytes32 indexed dependencyNameAndVersion,
CanvasTag canvasTag
);

event DependencyLoadAsModuleUpdated(
bytes32 indexed dependencyNameAndVersion,
bool loadAsModule
);

event DependencyProjectScriptSpecialTypeUpdated(
bytes32 indexed dependencyNameAndVersion,
string projectScriptSpecialType
);

/**
* @notice Enum representing the canvas tag requirements for a dependency.
* @dev This enum is used to convey the canvas tag for a dependency.
* @dev NoCanvasTag is the default value. No canvas tag is required to be added to the html when generating the project outputs.
* @dev CanvasBeforeProjectScript is used for dependencies that require a canvas tag to be added before the project script.
* @dev CanvasAfterProjectScript is used for dependencies that require a canvas tag to be added after the project script.
*/
enum CanvasTag {
NoCanvasTag, // default
CanvasBeforeProjectScript,
CanvasAfterProjectScript
}

struct DependencyDetails {
// name and version of dependency (i.e. "name@version") used to identify dependency
string nameAndVersion;
// type of license, MIT, GPL, etc.
string licenseType;
// preferred CDN URL for dependency
string preferredCDN;
// count of additional CDN URLs for dependency
uint24 additionalCDNCount;
// preferred code repository URL for dependency
string preferredRepository;
// count of additional repository URLs for dependency
uint24 additionalRepositoryCount;
// project website URL for dependency
string dependencyWebsite;
// whether the dependency is available on chain
bool availableOnChain;
// count of on-chain scripts for dependency
uint24 scriptCount;
// canvas tag for the dependency
CanvasTag canvasTag;
// whether the dependency should be loaded as a module
bool loadAsModule;
// project script special type for the dependency

@yoshiwarab yoshiwarab May 31, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: I feel like this comment could be a little clearer that it's the type attribute on the project script tag because type just feels pretty generic. Might also make sense to call it projectScriptTagSpecialType for clarity but don't feel too strongly about that

string projectScriptSpecialType;
}

/**
* @notice Returns the count of scripts for dependency `dependencyNameAndVersion`.
* @param dependencyNameAndVersion Dependency type to be queried.
Expand Down Expand Up @@ -117,33 +172,11 @@ interface IDependencyRegistryV0 {
/**
* @notice Returns details for a given dependency type `dependencyNameAndVersion`.
* @param dependencyNameAndVersion Name and version of dependency (i.e. "name@version") used to identify dependency.
* @return nameAndVersion String representation of `dependencyNameAndVersion`.
* (e.g. "p5js(atSymbol)1.0.0")
* @return licenseType License type for dependency
* @return preferredCDN Preferred CDN URL for dependency
* @return additionalCDNCount Count of additional CDN URLs for dependency
* @return preferredRepository Preferred repository URL for dependency
* @return additionalRepositoryCount Count of additional repository URLs for dependency
* @return dependencyWebsite Project website URL for dependency
* @return availableOnChain Whether dependency is available on chain
* @return scriptCount Count of on-chain scripts for dependency
* @return dependencyDetails Details for a given dependency type.
*/
function getDependencyDetails(
bytes32 dependencyNameAndVersion
)
external
view
returns (
string memory nameAndVersion,
string memory licenseType,
string memory preferredCDN,
uint24 additionalCDNCount,
string memory preferredRepository,
uint24 additionalRepositoryCount,
string memory dependencyWebsite,
bool availableOnChain,
uint24 scriptCount
);
) external view returns (DependencyDetails memory dependencyDetails);

/**
* @notice Returns the dependency name and version for a given project (`projectId`)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ pragma solidity ^0.8.19;
import "../../interfaces/v0.8.x/IAdminACLV0.sol";
import "../../interfaces/v0.8.x/ICoreRegistryV1.sol";
import "../../interfaces/v0.8.x/IUniversalBytecodeStorageReader.sol";
import {IDependencyRegistryV0} from "../../interfaces/v0.8.x/IDependencyRegistryV0.sol";

import "@openzeppelin-4.7/contracts/utils/structs/EnumerableSet.sol";

/**
Expand Down Expand Up @@ -51,6 +53,12 @@ library DependencyRegistryStorageLib {
uint24 additionalRepositoryCount;
// count of scripts that make up the dependency, if the dependency is available on-chain
uint24 scriptCount;
// canvas tag for the dependency
IDependencyRegistryV0.CanvasTag canvasTag;
// whether the dependency should be loaded as a module
bool loadAsModule;
// project script special type for the dependency
string projectScriptSpecialType;
}

/**
Expand Down
Loading
Loading