ERC-7943: Universal RWA Interface (uRWA)

Thanks @codebyMoh for your comment!

While I agree that the language should aim to be universal, I believe there’s still value in leveraging the functionalities provided by the standard to enable a dynamic mechanism that adapts to each jurisdiction. What we’re working on is a foundational set of primitives that can be combined and extended to support the kinds of functionalities you’re referring to.

Legislation is often not entirely objective and is subject to interpretation. It also evolves over time and is rarely static. Expecting different jurisdictions to fully converge on a single rule set seems unrealistic to me.

That said, once we establish a solid base, I believe this will provide a flexible framework upon which others can build to meet their specific needs.

On a separate note @tinom9 I’ve included a freezing functionality with the following interface:

/// @notice Emitted when `setFrozen` is called, changing the frozen `amount` of `tokenId` tokens for `user`.
/// @param user The address of the user whose tokens are being frozen.
/// @param tokenId The ID of the token being frozen.
/// @param amount The amount of tokens frozen.
event FrozenChange(address indexed user, uint256 indexed tokenId, uint256 indexed amount);

/// @notice Error reverted when a transfer is attempted from `user` but the `amount` is bigger than available (unfrozen) tokens.
/// @param user The address holding the tokens.
/// @param tokenId The ID of the token being transferred. 
/// @param amount The amount being transferred.
/// @param available The amount of tokens that are available to transfer.
error ERC7943NotAvailableAmount(address user, uint256 tokenId, uint256 amount, uint256 available);

/// @notice Changes the frozen status of `amount` of `tokenId` tokens belonging to an `user`.
/// This overwrites the current value, similar to an `approve` function.
/// @dev Requires specific authorization. Frozen tokens cannot be transferred by the user.
/// @param user The address of the user whose tokens are to be frozen/unfrozen.
/// @param tokenId The ID of the token to freeze/unfreeze.
/// @param amount The amount of tokens to freeze/unfreeze. 
function setFrozen(address user, uint256 tokenId, uint256 amount) external;

/// @notice Checks the frozen status/amount of a specific `tokenId`.
/// @param user The address of the user.
/// @param tokenId The ID of the token.
/// @return amount The amount of `tokenId` tokens currently frozen for `user`.
function getFrozen(address user, uint256 tokenId) external view returns (uint256 amount);

I’ve also added some reasoning on the naming in the EIP draft to justify the name chosen and the design too.

1 Like