@@ -6,7 +6,8 @@ import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/O
66import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol " ;
77import { Clones } from "@openzeppelin/contracts/proxy/Clones.sol " ;
88import { Strings } from "@openzeppelin/contracts/utils/Strings.sol " ;
9- import { IPToken, Metadata as TokenMetadata } from "./IPToken.sol " ;
9+ import { IIPToken, Metadata as TokenMetadata } from "./IIPToken.sol " ;
10+ import { IPToken } from "./IPToken.sol " ;
1011import { WrappedIPToken } from "./WrappedIPToken.sol " ;
1112
1213import { IPermissioner } from "./Permissioner.sol " ;
@@ -33,14 +34,14 @@ contract Tokenizer is UUPSUpgradeable, OwnableUpgradeable, IControlIPTs {
3334 string symbol
3435 );
3536
36- event TokenWrapped (IERC20Metadata tokenContract , IPToken wrappedIpt );
37- event IPTokenImplementationUpdated (IPToken indexed old , IPToken indexed _new );
37+ event TokenWrapped (IERC20Metadata tokenContract , IIPToken wrappedIpt );
38+ event IPTokenImplementationUpdated (IIPToken indexed old , IIPToken indexed _new );
3839 event PermissionerUpdated (IPermissioner indexed old , IPermissioner indexed _new );
3940
4041 IPNFT internal ipnft;
4142
4243 /// @dev a map of all IPTs. We're staying with the the initial term "synthesized" to keep the storage layout intact
43- mapping (uint256 => IPToken ) public synthesized;
44+ mapping (uint256 => IIPToken ) public synthesized;
4445
4546 /// @dev not used, needed to ensure that storage slots are still in order after 1.1 -> 1.2, use ipTokenImplementation
4647 /// @custom:oz-upgrades-unsafe-allow state-variable-immutable
@@ -105,7 +106,7 @@ contract Tokenizer is UUPSUpgradeable, OwnableUpgradeable, IControlIPTs {
105106 ipTokenImplementation = _ipTokenImplementation;
106107 }
107108
108- /**
109+ /**
109110 * @dev sets legacy IPTs on the tokenized mapping
110111 */
111112 function reinit (WrappedIPToken _wrappedIpTokenImplementation ) public onlyOwner reinitializer (6 ) {
@@ -158,12 +159,17 @@ contract Tokenizer is UUPSUpgradeable, OwnableUpgradeable, IControlIPTs {
158159 token.issue (_msgSender (), tokenAmount);
159160 }
160161
161- function attachIpt (
162- uint256 ipnftId ,
163- string memory agreementCid ,
164- bytes calldata signedAgreement ,
165- IERC20Metadata tokenContract
166- ) external {
162+ /**
163+ * @notice since 1.4 allows attaching an existing ERC20 contract as IPT
164+ * @param ipnftId the token id on the underlying nft collection
165+ * @param agreementCid a content hash that contains legal terms for IP token owners
166+ * @param signedAgreement the sender's signature over the signed agreemeent text (must be created on the client)
167+ * @return IPToken a wrapped IPToken that represents the tokenized ipnft for permissioners and carries metadata
168+ */
169+ function attachIpt (uint256 ipnftId , string memory agreementCid , bytes calldata signedAgreement , IERC20Metadata tokenContract )
170+ external
171+ returns (IIPToken)
172+ {
167173 if (_msgSender () != controllerOf (ipnftId)) {
168174 revert MustControlIpnft ();
169175 }
@@ -187,6 +193,7 @@ contract Tokenizer is UUPSUpgradeable, OwnableUpgradeable, IControlIPTs {
187193 );
188194 emit TokenWrapped (tokenContract, wrappedIpt);
189195 permissioner.accept (wrappedIpt, _msgSender (), signedAgreement);
196+ return wrappedIpt;
190197 }
191198
192199 /**
0 commit comments