Skip to content

Commit

Permalink
feat(upgrade): add upgrade scripts for Story NFTs (#92)
Browse files Browse the repository at this point in the history
* feat(upgrade): add upgrade scripts for story nfts

* chore: nof new line

* fix: rm duplicated code & invalid sig error

* fix: update address printing logic
  • Loading branch information
sebsadface authored Oct 12, 2024
1 parent 534795d commit e439da2
Show file tree
Hide file tree
Showing 12 changed files with 197 additions and 44 deletions.
46 changes: 46 additions & 0 deletions script/upgrade/UpdateDefaultStoryNFTTemplate.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
/* solhint-disable no-console */

// external
import { console2 } from "forge-std/console2.sol";

// contracts
import { StoryBadgeNFT } from "../../contracts/story-nft/StoryBadgeNFT.sol";
import { IStoryNFTFactory } from "../../contracts/interfaces/story-nft/IStoryNFTFactory.sol";

// script
import { UpgradeHelper } from "../utils/upgrades/UpgradeHelper.s.sol";

contract UpdateDefaultStoryNFTTemplate is UpgradeHelper {
uint256 public constant LICENSE_TERMS_ID = 1;

/// @dev To use, run the following command (e.g., for Story Iliad testnet):
/// forge script script/upgrade/UpdateDefaultStoryNFTTemplate.s.sol:UpdateDefaultStoryNFTTemplate \
/// --rpc-url=$TESTNET_URL -vvvv --broadcast --priority-gas-price=1 --legacy \
/// --verify --verifier=$VERIFIER_NAME --verifier-url=$VERIFIER_URL
///
/// For detailed examples, see the documentation in `../../docs/DEPLOY_UPGRADE.md`.
function run() public override {
super.run();
_beginBroadcast();
_updateDefaultStoryNFTTemplate();
_writeDeployment();
_endBroadcast();
}

function _updateDefaultStoryNFTTemplate() private {
_predeploy("DefaultStoryNftTemplate");
StoryBadgeNFT newDefaultStoryNftTemplate = new StoryBadgeNFT(
ipAssetRegistryAddr,
licensingModuleAddr,
orgNftAddr,
pilTemplateAddr,
LICENSE_TERMS_ID
);
IStoryNFTFactory(storyNftFactoryAddr).setDefaultStoryNftTemplate(address(newDefaultStoryNftTemplate));
defaultStoryNftTemplateAddr = address(newDefaultStoryNftTemplate);
console2.log("DefaultStoryNftTemplate deployed to: ", defaultStoryNftTemplateAddr);
_writeAllAddresses();
}
}
8 changes: 2 additions & 6 deletions script/upgrade/UpgradeDerivativeWorkflows.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,7 @@ contract UpgradeDerivativeWorkflows is UpgradeHelper {
)
);
console2.log("New DerivativeWorkflows Implementation: ", newDerivativeWorkflowsImpl);
_postdeploy("DerivativeWorkflows", address(derivativeWorkflows));
_writeAddress("LicenseAttachmentWorkflows", address(licenseAttachmentWorkflows));
_writeAddress("RegistrationWorkflows", address(registrationWorkflows));
_writeAddress("RoyaltyWorkflows", address(royaltyWorkflows));
_writeAddress("SPGNFTBeacon", address(spgNftBeacon));
_writeAddress("SPGNFTImpl", address(spgNftImpl));
console2.log("DerivativeWorkflows deployed to: ", derivativeWorkflowsAddr);
_writeAllAddresses();
}
}
9 changes: 2 additions & 7 deletions script/upgrade/UpgradeGroupingWorkflows.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ contract UpgradeGroupingWorkflows is UpgradeHelper {
}

function _deployGroupingWorkflows() private {
_writeAddress("DerivativeWorkflows", address(derivativeWorkflows));
_predeploy("GroupingWorkflows");
address newGroupingWorkflowsImpl = address(
new GroupingWorkflows(
Expand All @@ -46,11 +45,7 @@ contract UpgradeGroupingWorkflows is UpgradeHelper {
)
);
console2.log("New GroupingWorkflows Implementation: ", newGroupingWorkflowsImpl);
_postdeploy("GroupingWorkflows", address(groupingWorkflows));
_writeAddress("LicenseAttachmentWorkflows", address(licenseAttachmentWorkflows));
_writeAddress("RegistrationWorkflows", address(registrationWorkflows));
_writeAddress("RoyaltyWorkflows", address(royaltyWorkflows));
_writeAddress("SPGNFTBeacon", address(spgNftBeacon));
_writeAddress("SPGNFTImpl", address(spgNftImpl));
console2.log("GroupingWorkflows deployed to: ", groupingWorkflowsAddr);
_writeAllAddresses();
}
}
9 changes: 2 additions & 7 deletions script/upgrade/UpgradeLicenseAttachmentWorkflows.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ contract UpgradeLicenseAttachmentWorkflows is UpgradeHelper {
}

function _deployLicenseAttachmentWorkflows() private {
_writeAddress("DerivativeWorkflows", address(derivativeWorkflows));
_writeAddress("GroupingWorkflows", address(groupingWorkflows));
_predeploy("LicenseAttachmentWorkflows");
address newLicenseAttachmentWorkflowsImpl = address(
new LicenseAttachmentWorkflows(
Expand All @@ -45,10 +43,7 @@ contract UpgradeLicenseAttachmentWorkflows is UpgradeHelper {
)
);
console2.log("New LicenseAttachmentWorkflows Implementation: ", newLicenseAttachmentWorkflowsImpl);
_postdeploy("LicenseAttachmentWorkflows", address(licenseAttachmentWorkflows));
_writeAddress("RegistrationWorkflows", address(registrationWorkflows));
_writeAddress("RoyaltyWorkflows", address(royaltyWorkflows));
_writeAddress("SPGNFTBeacon", address(spgNftBeacon));
_writeAddress("SPGNFTImpl", address(spgNftImpl));
console2.log("LicenseAttachmentWorkflows deployed to: ", licenseAttachmentWorkflowsAddr);
_writeAllAddresses();
}
}
44 changes: 44 additions & 0 deletions script/upgrade/UpgradeOrgNFT.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
/* solhint-disable no-console */

// external
import { console2 } from "forge-std/console2.sol";

// contracts
import { OrgNFT } from "../../contracts/story-nft/OrgNFT.sol";

// script
import { UpgradeHelper } from "../utils/upgrades/UpgradeHelper.s.sol";

contract UpgradeOrgNFT is UpgradeHelper {
uint256 public constant LICENSE_TERMS_ID = 1;

/// @dev To use, run the following command (e.g., for Story Iliad testnet):
/// forge script script/upgrade/UpgradeOrgNFT.s.sol:UpgradeOrgNFT \
/// --rpc-url=$TESTNET_URL -vvvv --broadcast --priority-gas-price=1 --legacy \
/// --verify --verifier=$VERIFIER_NAME --verifier-url=$VERIFIER_URL
///
/// For detailed examples, see the documentation in `../../docs/DEPLOY_UPGRADE.md`.
function run() public override {
super.run();
_beginBroadcast();
_upgradeOrgNFT();
_writeDeployment();
_endBroadcast();
}

function _upgradeOrgNFT() private {
_predeploy("OrgNFT");
OrgNFT newOrgNft = new OrgNFT(
ipAssetRegistryAddr,
licensingModuleAddr,
storyNftFactoryAddr,
pilTemplateAddr,
LICENSE_TERMS_ID
);
console2.log("New OrgNFT implementation: ", address(newOrgNft));
console2.log("OrgNFT deployed to: ", orgNftAddr);
_writeAllAddresses();
}
}
9 changes: 2 additions & 7 deletions script/upgrade/UpgradeRegistrationWorkflows.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ contract UpgradeRegistrationWorkflows is UpgradeHelper {
}

function _deployRegistrationWorkflows() private {
_writeAddress("DerivativeWorkflows", address(derivativeWorkflows));
_writeAddress("GroupingWorkflows", address(groupingWorkflows));
_writeAddress("LicenseAttachmentWorkflows", address(licenseAttachmentWorkflows));
_predeploy("RegistrationWorkflows");
address newRegistrationWorkflowsImpl = address(
new RegistrationWorkflows(
Expand All @@ -46,9 +43,7 @@ contract UpgradeRegistrationWorkflows is UpgradeHelper {
)
);
console2.log("New RegistrationWorkflows Implementation: ", newRegistrationWorkflowsImpl);
_postdeploy("RegistrationWorkflows", address(registrationWorkflows));
_writeAddress("RoyaltyWorkflows", address(royaltyWorkflows));
_writeAddress("SPGNFTBeacon", address(spgNftBeacon));
_writeAddress("SPGNFTImpl", address(spgNftImpl));
console2.log("RegistrationWorkflows deployed to: ", registrationWorkflowsAddr);
_writeAllAddresses();
}
}
8 changes: 2 additions & 6 deletions script/upgrade/UpgradeRoyaltyWorkflows.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,10 @@ contract UpgradeRoyaltyWorkflows is UpgradeHelper {
}

function _deployRoyaltyWorkflows() private {
_writeAddress("DerivativeWorkflows", address(derivativeWorkflows));
_writeAddress("LicenseAttachmentWorkflows", address(licenseAttachmentWorkflows));
_writeAddress("RegistrationWorkflows", address(registrationWorkflows));
_predeploy("RoyaltyWorkflows");
address newRoyaltyWorkflowsImpl = address(new RoyaltyWorkflows(royaltyModuleAddr));
console2.log("New RoyaltyWorkflows Implementation: ", newRoyaltyWorkflowsImpl);
_postdeploy("RoyaltyWorkflows", address(royaltyWorkflows));
_writeAddress("SPGNFTBeacon", address(spgNftBeacon));
_writeAddress("SPGNFTImpl", address(spgNftImpl));
console2.log("RoyaltyWorkflows deployed to: ", royaltyWorkflowsAddr);
_writeAllAddresses();
}
}
11 changes: 3 additions & 8 deletions script/upgrade/UpgradeSPGNFT.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,15 @@ contract UpgradeSPGNFT is UpgradeHelper {
}

function _deploySPGNFT() private {
_writeAddress("DerivativeWorkflows", address(derivativeWorkflows));
_writeAddress("GroupingWorkflows", address(groupingWorkflows));
_writeAddress("LicenseAttachmentWorkflows", address(licenseAttachmentWorkflows));
_writeAddress("RegistrationWorkflows", address(registrationWorkflows));
_writeAddress("RoyaltyWorkflows", address(royaltyWorkflows));
_writeAddress("SPGNFTBeacon", address(spgNftBeacon));
_predeploy("SPGNFTImpl");
spgNftImpl = new SPGNFT(
address(derivativeWorkflows),
address(groupingWorkflows),
address(licenseAttachmentWorkflows),
address(registrationWorkflows)
);
console2.log("New SPGNFT Implementation: ", address(spgNftImpl));
_postdeploy("SPGNFTImpl", address(spgNftImpl));
spgNftImplAddr = address(spgNftImpl);
console2.log("SPGNFTImpl deployed to: ", spgNftImplAddr);
_writeAllAddresses();
}
}
44 changes: 44 additions & 0 deletions script/upgrade/UpgradeStoryNFTFactory.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
/* solhint-disable no-console */

// external
import { console2 } from "forge-std/console2.sol";

// contracts
import { StoryNFTFactory } from "../../contracts/story-nft/StoryNFTFactory.sol";

// script
import { UpgradeHelper } from "../utils/upgrades/UpgradeHelper.s.sol";

contract UpgradeStoryNFTFactory is UpgradeHelper {
uint256 public constant LICENSE_TERMS_ID = 1;

/// @dev To use, run the following command (e.g., for Story Iliad testnet):
/// forge script script/upgrade/UpgradeStoryNFTFactory.s.sol:UpgradeStoryNFTFactory \
/// --rpc-url=$TESTNET_URL -vvvv --broadcast --priority-gas-price=1 --legacy \
/// --verify --verifier=$VERIFIER_NAME --verifier-url=$VERIFIER_URL
///
/// For detailed examples, see the documentation in `../../docs/DEPLOY_UPGRADE.md`.
function run() public override {
super.run();
_beginBroadcast();
_upgradeStoryNFTFactory();
_writeDeployment();
_endBroadcast();
}

function _upgradeStoryNFTFactory() private {
_predeploy("StoryNFTFactory");
StoryNFTFactory newStoryNftFactory = new StoryNFTFactory(
ipAssetRegistryAddr,
licensingModuleAddr,
pilTemplateAddr,
LICENSE_TERMS_ID,
orgNftAddr
);
console2.log("New StoryNFTFactory implementation: ", address(newStoryNftFactory));
console2.log("StoryNFTFactory deployed to: ", storyNftFactoryAddr);
_writeAllAddresses();
}
}
6 changes: 6 additions & 0 deletions script/utils/StoryProtocolPeripheryAddressManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ contract StoryProtocolPeripheryAddressManager is Script {
address internal royaltyWorkflowsAddr;
address internal spgNftBeaconAddr;
address internal spgNftImplAddr;
address internal defaultStoryNftTemplateAddr;
address internal orgNftAddr;
address internal storyNftFactoryAddr;

function _readStoryProtocolPeripheryAddresses() internal {
string memory root = vm.projectRoot();
Expand All @@ -29,5 +32,8 @@ contract StoryProtocolPeripheryAddressManager is Script {
royaltyWorkflowsAddr = json.readAddress(".main.RoyaltyWorkflows");
spgNftBeaconAddr = json.readAddress(".main.SPGNFTBeacon");
spgNftImplAddr = json.readAddress(".main.SPGNFTImpl");
defaultStoryNftTemplateAddr = json.readAddress(".main.DefaultStoryNftTemplate");
orgNftAddr = json.readAddress(".main.OrgNFT");
storyNftFactoryAddr = json.readAddress(".main.StoryNFTFactory");
}
}
30 changes: 30 additions & 0 deletions script/utils/upgrades/UpgradeHelper.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,34 @@ contract UpgradeHelper is
_writeAddress(contractKey, newAddress);
console2.log(string.concat(contractKey, " deployed to:"), newAddress);
}

function _writeAllAddresses() internal {
string[] memory contractKeys = new string[](10);
contractKeys[0] = "DerivativeWorkflows";
contractKeys[1] = "GroupingWorkflows";
contractKeys[2] = "LicenseAttachmentWorkflows";
contractKeys[3] = "RegistrationWorkflows";
contractKeys[4] = "RoyaltyWorkflows";
contractKeys[5] = "SPGNFTBeacon";
contractKeys[6] = "SPGNFTImpl";
contractKeys[7] = "DefaultStoryNftTemplate";
contractKeys[8] = "OrgNFT";
contractKeys[9] = "StoryNFTFactory";

address[] memory addresses = new address[](10);
addresses[0] = derivativeWorkflowsAddr;
addresses[1] = groupingWorkflowsAddr;
addresses[2] = licenseAttachmentWorkflowsAddr;
addresses[3] = registrationWorkflowsAddr;
addresses[4] = royaltyWorkflowsAddr;
addresses[5] = spgNftBeaconAddr;
addresses[6] = spgNftImplAddr;
addresses[7] = defaultStoryNftTemplateAddr;
addresses[8] = orgNftAddr;
addresses[9] = storyNftFactoryAddr;

for (uint256 i = 0; i < contractKeys.length; i++) {
_writeAddress(contractKeys[i], addresses[i]);
}
}
}
17 changes: 14 additions & 3 deletions test/integration/workflows/RoyaltyIntegration.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ contract RoyaltyIntegration is BaseIntegration {
uint256 deadline = block.timestamp + 1000;

// set permission for licensing module to attach license terms to ancestor IP
(bytes memory signature, , ) = _getSetPermissionSigForPeriphery({
(bytes memory signatureA, , ) = _getSetPermissionSigForPeriphery({
ipId: ancestorIpId,
to: licenseAttachmentWorkflowsAddr,
module: licensingModuleAddr,
Expand All @@ -329,7 +329,18 @@ contract RoyaltyIntegration is BaseIntegration {
royaltyPolicy: royaltyPolicyLRPAddr,
currencyToken: address(StoryUSD)
}),
sigAttach: WorkflowStructs.SignatureData({ signer: testSender, deadline: deadline, signature: signature })
sigAttach: WorkflowStructs.SignatureData({ signer: testSender, deadline: deadline, signature: signatureA })
});

// set permission for licensing module to attach license terms to ancestor IP
(bytes memory signatureC, , ) = _getSetPermissionSigForPeriphery({
ipId: ancestorIpId,
to: licenseAttachmentWorkflowsAddr,
module: licensingModuleAddr,
selector: licensingModule.attachLicenseTerms.selector,
deadline: deadline,
state: IIPAccount(payable(ancestorIpId)).state(),
signerSk: testSenderSk
});

commRemixTermsIdC = licenseAttachmentWorkflows.registerPILTermsAndAttach({
Expand All @@ -340,7 +351,7 @@ contract RoyaltyIntegration is BaseIntegration {
royaltyPolicy: royaltyPolicyLAPAddr,
currencyToken: address(StoryUSD)
}),
sigAttach: WorkflowStructs.SignatureData({ signer: testSender, deadline: deadline, signature: signature })
sigAttach: WorkflowStructs.SignatureData({ signer: testSender, deadline: deadline, signature: signatureC })
});

// register childIpA as derivative of ancestorIp under Terms A
Expand Down

0 comments on commit e439da2

Please sign in to comment.