Skip to content

Commit

Permalink
feat: remark storage and event (#20)
Browse files Browse the repository at this point in the history
* feat: remark storage

* fix: add await for emit

* fix: add await for emit

* fix: add tokenReceived event on restore

---------

Co-authored-by: Rishabh Singh <[email protected]>
  • Loading branch information
RishabhS7 and RishabhSGT authored Sep 13, 2024
1 parent a40a577 commit 35287ac
Show file tree
Hide file tree
Showing 32 changed files with 697 additions and 494 deletions.
70 changes: 39 additions & 31 deletions contracts/TitleEscrow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow

bool public override active;

bytes public remark;

constructor() initializer {}

/**
Expand Down Expand Up @@ -76,10 +78,10 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow
_;
}
/**
* @dev Modifier to check if the bytes array length is within the limit
* @dev Modifier to check if the bytes length is within the limit
*/
modifier remarkLengthLimit(bytes memory remark) {
if (remark.length > 120) revert RemarkLengthExceeded();
modifier remarkLengthLimit(bytes calldata _remark) {
if (_remark.length > 120) revert RemarkLengthExceeded();
_;
}

Expand Down Expand Up @@ -128,16 +130,17 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow
if (data.length == 0) {
revert EmptyReceivingData();
}
(address _beneficiary, address _holder) = abi.decode(data, (address, address));
(address _beneficiary, address _holder, bytes memory _remark) = abi.decode(data, (address, address, bytes));
if (_beneficiary == address(0) || _holder == address(0)) {
revert InvalidTokenTransferToZeroAddressOwners(_beneficiary, _holder);
}
_setBeneficiary(_beneficiary, "");
_setHolder(_holder, "");
remark = _remark;
isMinting = true;
}
} else remark = data;

emit TokenReceived(beneficiary, holder, isMinting, registry, tokenId);
emit TokenReceived(beneficiary, holder, isMinting, registry, tokenId, remark);
return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
}

Expand All @@ -146,65 +149,68 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow
*/
function nominate(
address _nominee,
bytes memory remark
) public virtual override whenNotPaused whenActive onlyBeneficiary whenHoldingToken remarkLengthLimit(remark) {
bytes calldata _remark
) public virtual override whenNotPaused whenActive onlyBeneficiary whenHoldingToken remarkLengthLimit(_remark) {
if (beneficiary == _nominee) {
revert TargetNomineeAlreadyBeneficiary();
}
if (nominee == _nominee) {
revert NomineeAlreadyNominated();
}
remark = _remark;

_setNominee(_nominee, remark);
_setNominee(_nominee, _remark);
}

/**
* @dev See {ITitleEscrow-transferBeneficiary}.
*/
function transferBeneficiary(
address _nominee,
bytes memory remark
) public virtual override whenNotPaused whenActive onlyHolder whenHoldingToken remarkLengthLimit(remark) {
bytes calldata _remark
) public virtual override whenNotPaused whenActive onlyHolder whenHoldingToken remarkLengthLimit(_remark) {
if (_nominee == address(0)) {
revert InvalidTransferToZeroAddress();
}
if (!(beneficiary == holder || nominee == _nominee)) {
revert InvalidNominee();
}
remark = _remark;

_setBeneficiary(_nominee, remark);
_setBeneficiary(_nominee, _remark);
}

/**
* @dev See {ITitleEscrow-transferHolder}.
*/
function transferHolder(
address newHolder,
bytes memory remark
) public virtual override whenNotPaused whenActive onlyHolder whenHoldingToken remarkLengthLimit(remark) {
bytes calldata _remark
) public virtual override whenNotPaused whenActive onlyHolder whenHoldingToken remarkLengthLimit(_remark) {
if (newHolder == address(0)) {
revert InvalidTransferToZeroAddress();
}
if (holder == newHolder) {
revert RecipientAlreadyHolder();
}
remark = _remark;

_setHolder(newHolder, remark);
_setHolder(newHolder, _remark);
}

/**
* @dev See {ITitleEscrow-transferOwners}.
*/
function transferOwners(address _nominee, address newHolder, bytes memory remark) external virtual override {
transferBeneficiary(_nominee, remark);
transferHolder(newHolder, remark);
function transferOwners(address _nominee, address newHolder, bytes calldata _remark) external virtual override {
transferBeneficiary(_nominee, _remark);
transferHolder(newHolder, _remark);
}

/**
* @dev See {ITitleEscrow-surrender}.
*/
function surrender(
bytes memory remark
bytes calldata _remark
)
external
virtual
Expand All @@ -214,18 +220,19 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow
onlyBeneficiary
onlyHolder
whenHoldingToken
remarkLengthLimit(remark)
remarkLengthLimit(_remark)
{
_setNominee(address(0), "");
ITradeTrustToken(registry).transferFrom(address(this), registry, tokenId);
ITradeTrustToken(registry).transferFrom(address(this), registry, tokenId, "");
remark = _remark;

emit Surrender(msg.sender, registry, tokenId, remark);
emit Surrender(msg.sender, registry, tokenId, _remark);
}

/**
* @dev See {ITitleEscrow-shred}.
*/
function shred(bytes memory remark) external virtual override whenNotPaused whenActive remarkLengthLimit(remark) {
function shred(bytes calldata _remark) external virtual override whenNotPaused whenActive remarkLengthLimit(_remark) {
if (_isHoldingToken()) {
revert TokenNotSurrendered();
}
Expand All @@ -236,8 +243,9 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow
_setBeneficiary(address(0), "");
_setHolder(address(0), "");
active = false;
remark = _remark;

emit Shred(registry, tokenId, remark);
emit Shred(registry, tokenId, _remark);
}

/**
Expand All @@ -259,27 +267,27 @@ contract TitleEscrow is Initializable, IERC165, TitleEscrowErrors, ITitleEscrow
* @notice Sets the nominee
* @param newNominee The address of the new nominee
*/
function _setNominee(address newNominee, bytes memory remark) internal virtual {
emit Nomination(nominee, newNominee, registry, tokenId, remark);
function _setNominee(address newNominee, bytes memory _remark) internal virtual {
emit Nomination(nominee, newNominee, registry, tokenId, _remark);
nominee = newNominee;
}

/**
* @notice Sets the beneficiary
* @param newBeneficiary The address of the new beneficiary
*/
function _setBeneficiary(address newBeneficiary, bytes memory remark) internal virtual {
emit BeneficiaryTransfer(beneficiary, newBeneficiary, registry, tokenId, remark);
if (nominee != address(0)) _setNominee(address(0), "");
function _setBeneficiary(address newBeneficiary, bytes memory _remark) internal virtual {
emit BeneficiaryTransfer(beneficiary, newBeneficiary, registry, tokenId, _remark);
if (nominee != address(0)) _setNominee(address(0), "0x");
beneficiary = newBeneficiary;
}

/**
* @notice Sets the holder
* @param newHolder The address of the new holder
*/
function _setHolder(address newHolder, bytes memory remark) internal virtual {
emit HolderTransfer(holder, newHolder, registry, tokenId, remark);
function _setHolder(address newHolder, bytes memory _remark) internal virtual {
emit HolderTransfer(holder, newHolder, registry, tokenId, _remark);
holder = newHolder;
}
}
13 changes: 2 additions & 11 deletions contracts/TradeTrustToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,13 @@ import "./base/TradeTrustTokenBase.sol";
contract TradeTrustToken is TradeTrustTokenBase {
address internal immutable _titleEscrowFactory;
uint256 internal immutable _genesis;

/**
* @notice Creates a new TradeTrustToken contract.
* @param name The name of the token.
* @param symbol The symbol of the token.
* @param titleEscrowFactory_ The address of the TitleEscrowFactory contract.
*/
constructor(
string memory name,
string memory symbol,
address titleEscrowFactory_
) {
constructor(string memory name, string memory symbol, address titleEscrowFactory_) {
_genesis = block.number;
_titleEscrowFactory = titleEscrowFactory_;
initialize(name, symbol, _msgSender());
Expand All @@ -32,11 +27,7 @@ contract TradeTrustToken is TradeTrustTokenBase {
* @param symbol The symbol of the token.
* @param admin The address of the admin.
*/
function initialize(
string memory name,
string memory symbol,
address admin
) internal initializer {
function initialize(string memory name, string memory symbol, address admin) internal initializer {
__TradeTrustTokenBase_init(name, symbol, admin);
}

Expand Down
52 changes: 13 additions & 39 deletions contracts/base/SBTUpgradeable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ contract SBTUpgradeable is
// Token symbol
string private _symbol;

// Last Transaction Remark
bytes public remark;

// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;

Expand All @@ -54,13 +57,9 @@ contract SBTUpgradeable is
/**
* @dev See {ERC165Upgradeable-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC165Upgradeable, IERC165Upgradeable)
returns (bool)
{
function supportsInterface(
bytes4 interfaceId
) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return
interfaceId == type(ISBTUpgradeable).interfaceId ||
interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||
Expand Down Expand Up @@ -120,13 +119,9 @@ contract SBTUpgradeable is
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
function transferFrom(address from, address to, uint256 tokenId, bytes memory _remark) public virtual override {
require(_isOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, "");
_safeTransfer(from, to, tokenId, _remark);
}

/**
Expand All @@ -147,12 +142,7 @@ contract SBTUpgradeable is
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
Expand Down Expand Up @@ -200,11 +190,7 @@ contract SBTUpgradeable is
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
Expand Down Expand Up @@ -272,11 +258,7 @@ contract SBTUpgradeable is
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
function _transfer(address from, address to, uint256 tokenId) internal virtual {
require(SBTUpgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");

Expand Down Expand Up @@ -338,11 +320,7 @@ contract SBTUpgradeable is
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {}

/**
* @dev Hook that is called after any transfer of tokens. This includes
Expand All @@ -355,11 +333,7 @@ contract SBTUpgradeable is
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
function _afterTokenTransfer(address from, address to, uint256 tokenId) internal virtual {}

/**
* @dev This empty reserved space is put in place to allow future versions to add new
Expand Down
Loading

0 comments on commit 35287ac

Please sign in to comment.