Skip to content

Commit

Permalink
Merge pull request #403 from BoostryJP/feature/#402
Browse files Browse the repository at this point in the history
feat: Spec change of lock function of ST
  • Loading branch information
YoshihitoAso authored Dec 14, 2022
2 parents b11bed3 + 1cf669e commit 2c534aa
Show file tree
Hide file tree
Showing 7 changed files with 295 additions and 437 deletions.
88 changes: 51 additions & 37 deletions contracts/token/IbetShare.sol
Original file line number Diff line number Diff line change
Expand Up @@ -256,24 +256,6 @@ contract IbetShare is Ownable, IbetSecurityTokenInterface {
return balances[_address];
}

/// @notice 資産ロックアドレスの認可
/// @dev オーナーのみ実行可能
/// @param _lockAddress 認可対象のアドレス
/// @param _auth 認可状態(true:認可、false:未認可)
function authorizeLockAddress(address _lockAddress, bool _auth)
public
override
onlyOwner()
{
authorizedLockAddress[_lockAddress] = _auth;

// イベント登録
emit AuthorizeLockAddress(
_lockAddress,
_auth
);
}

/// @notice ロック中資産の参照
/// @param _lockAddress ロック先アドレス
/// @param _accountAddress ロック対象アカウント
Expand All @@ -290,17 +272,15 @@ contract IbetShare is Ownable, IbetSecurityTokenInterface {
/// @notice 資産をロックする
/// @param _lockAddress 資産ロック先アドレス
/// @param _value ロックする数量
function lock(address _lockAddress, uint256 _value)
/// @param _data イベント出力用の任意のデータ
function lock(
address _lockAddress,
uint256 _value,
string memory _data
)
public
override
{
// ロック対象が認可済みアドレス、または発行者アドレスであることをチェック
require(
authorizedLockAddress[_lockAddress] == true ||
_lockAddress == owner,
ErrorCode.ERR_IbetShare_lock_110001
);

// ロック数量が保有数量を上回っている場合、エラーを返す
if (balanceOf(msg.sender) < _value) revert(ErrorCode.ERR_IbetShare_lock_110002);

Expand All @@ -312,25 +292,24 @@ contract IbetShare is Ownable, IbetSecurityTokenInterface {
emit Lock(
msg.sender,
_lockAddress,
_value
_value,
_data
);
}

/// @notice 資産をアンロックする
/// @dev 認可済みアドレスあるいは発行体のみ実行可能
/// @param _accountAddress アンロック対象のアドレス
/// @param _recipientAddress 受取アドレス
function unlock(address _accountAddress, address _recipientAddress, uint256 _value)
/// @param _data イベント出力用の任意のデータ
function unlock(
address _accountAddress,
address _recipientAddress,
uint256 _value,
string memory _data
)
public
override
{
// msg.senderが認可済みアドレス、または発行者アドレスであることをチェック
require(
authorizedLockAddress[msg.sender] == true ||
msg.sender == owner,
ErrorCode.ERR_IbetShare_unlock_110101
);

// アンロック数量がロック数量を上回ってる場合、エラーを返す
if (lockedOf(msg.sender, _accountAddress) < _value) revert(ErrorCode.ERR_IbetShare_unlock_110102);

Expand All @@ -343,7 +322,42 @@ contract IbetShare is Ownable, IbetSecurityTokenInterface {
_accountAddress,
msg.sender,
_recipientAddress,
_value
_value,
_data
);
}

/// @notice 資産を強制アンロックする
/// @dev 発行体のみ実行可能
/// @param _lockAddress 資産ロック先アドレス
/// @param _accountAddress アンロック対象のアドレス
/// @param _recipientAddress 受取アドレス
/// @param _data イベント出力用の任意のデータ
function forceUnlock(
address _lockAddress,
address _accountAddress,
address _recipientAddress,
uint256 _value,
string memory _data
)
public
override
onlyOwner()
{
// アンロック数量がロック数量を上回ってる場合、エラーを返す
if (lockedOf(_lockAddress, _accountAddress) < _value) revert(ErrorCode.ERR_IbetShare_forceUnlock_111201);

// データ更新
locked[_lockAddress][_accountAddress] = lockedOf(_lockAddress, _accountAddress).sub(_value);
balances[_recipientAddress] = balanceOf(_recipientAddress).add(_value);

// イベント登録
emit Unlock(
_accountAddress,
_lockAddress,
_recipientAddress,
_value,
_data
);
}

Expand Down
88 changes: 51 additions & 37 deletions contracts/token/IbetStraightBond.sol
Original file line number Diff line number Diff line change
Expand Up @@ -475,24 +475,6 @@ contract IbetStraightBond is Ownable, IbetSecurityTokenInterface {
);
}

/// @notice 資産ロックアドレスの認可
/// @dev オーナーのみ実行可能
/// @param _lockAddress 認可対象のアドレス
/// @param _auth 認可状態(true:認可、false:未認可)
function authorizeLockAddress(address _lockAddress, bool _auth)
public
override
onlyOwner()
{
authorizedLockAddress[_lockAddress] = _auth;

// イベント登録
emit AuthorizeLockAddress(
_lockAddress,
_auth
);
}

/// @notice ロック中資産の参照
/// @param _lockAddress ロック先アドレス
/// @param _accountAddress ロック対象アカウント
Expand All @@ -509,17 +491,15 @@ contract IbetStraightBond is Ownable, IbetSecurityTokenInterface {
/// @notice 資産をロックする
/// @param _lockAddress 資産ロック先アドレス
/// @param _value ロックする数量
function lock(address _lockAddress, uint256 _value)
/// @param _data イベント出力用の任意のデータ
function lock(
address _lockAddress,
uint256 _value,
string memory _data
)
public
override
{
// ロック対象が認可済みアドレス、または発行者アドレスであることをチェック
require(
authorizedLockAddress[_lockAddress] == true ||
_lockAddress == owner,
ErrorCode.ERR_IbetStraightBond_lock_120001
);

// ロック数量が保有数量を上回っている場合、エラーを返す
if (balanceOf(msg.sender) < _value) revert(ErrorCode.ERR_IbetStraightBond_lock_120002);

Expand All @@ -531,25 +511,24 @@ contract IbetStraightBond is Ownable, IbetSecurityTokenInterface {
emit Lock(
msg.sender,
_lockAddress,
_value
_value,
_data
);
}

/// @notice 資産をアンロックする
/// @dev 認可済みアドレスあるいは発行体のみ実行可能
/// @param _accountAddress アンロック対象のアドレス
/// @param _recipientAddress 受取アドレス
function unlock(address _accountAddress, address _recipientAddress, uint256 _value)
/// @param _data イベント出力用の任意のデータ
function unlock(
address _accountAddress,
address _recipientAddress,
uint256 _value,
string memory _data
)
public
override
{
// msg.senderが認可済みアドレス、または発行者アドレスであることをチェック
require(
authorizedLockAddress[msg.sender] == true ||
msg.sender == owner,
ErrorCode.ERR_IbetStraightBond_unlock_120101
);

// アンロック数量がロック数量を上回ってる場合、エラーを返す
if (lockedOf(msg.sender, _accountAddress) < _value) revert(ErrorCode.ERR_IbetStraightBond_unlock_120102);

Expand All @@ -562,7 +541,42 @@ contract IbetStraightBond is Ownable, IbetSecurityTokenInterface {
_accountAddress,
msg.sender,
_recipientAddress,
_value
_value,
_data
);
}

/// @notice 資産を強制アンロックする
/// @dev 発行体のみ実行可能
/// @param _lockAddress 資産ロック先アドレス
/// @param _accountAddress アンロック対象のアドレス
/// @param _recipientAddress 受取アドレス
/// @param _data イベント出力用の任意のデータ
function forceUnlock(
address _lockAddress,
address _accountAddress,
address _recipientAddress,
uint256 _value,
string memory _data
)
public
override
onlyOwner()
{
// アンロック数量がロック数量を上回ってる場合、エラーを返す
if (lockedOf(_lockAddress, _accountAddress) < _value) revert(ErrorCode.ERR_IbetStraightBond_forceUnlock_121201);

// データ更新
locked[_lockAddress][_accountAddress] = lockedOf(_lockAddress, _accountAddress).sub(_value);
balances[_recipientAddress] = balanceOf(_recipientAddress).add(_value);

// イベント登録
emit Unlock(
_accountAddress,
_lockAddress,
_recipientAddress,
_value,
_data
);
}

Expand Down
6 changes: 4 additions & 2 deletions contracts/utils/Errors.sol
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ library ErrorCode {
// IbetShare_redeemFrom
string constant ERR_IbetShare_redeemFrom_111101 = "111101";
string constant ERR_IbetShare_redeemFrom_111102 = "111102";

// IbetShare_forceUnlock
string constant ERR_IbetShare_forceUnlock_111201 = "111201";

// 12XXXX
// IbetStraightBond_lock
Expand Down Expand Up @@ -106,7 +107,8 @@ library ErrorCode {
// IbetStraightBond_redeemFrom
string constant ERR_IbetStraightBond_redeemFrom_121101 = "121101";
string constant ERR_IbetStraightBond_redeemFrom_121102 = "121102";

// IbetStraightBond_forceUnlock
string constant ERR_IbetStraightBond_forceUnlock_121201 = "121201";

// 13XXXX
// IbetCoupon_transferToContract
Expand Down
12 changes: 12 additions & 0 deletions docs/Errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ Developers will receive error msg as code, and each error code is described belo
| **111101** | Redeem amount is less than locked address balance. | - |
| **111102** | Redeem amount is less than target address balance. | - |

#### forceUnlock (1112XX)

| Code | Situation | Possible causes |
|------------|----------------------------------------------------|-----------------|
| **111201** | Unlock amount is greater than locked amount. | - |

### IbetStraightBond (12XXXX)

#### lock (1200XX)
Expand Down Expand Up @@ -218,6 +224,12 @@ Developers will receive error msg as code, and each error code is described belo
| **121101** | Redeem amount is less than locked address balance. | - |
| **121102** | Redeem amount is less than target address balance. | - |

#### forceUnlock (1212XX)

| Code | Situation | Possible causes |
|------------|----------------------------------------------------|-----------------|
| **121201** | Unlock amount is greater than locked amount. | - |

### IbetCoupon (13XXXX)

#### transferToContract (1300XX)
Expand Down
44 changes: 23 additions & 21 deletions interfaces/IbetSecurityTokenInterface.sol
Original file line number Diff line number Diff line change
Expand Up @@ -190,36 +190,42 @@ abstract contract IbetSecurityTokenInterface is IbetStandardTokenInterface {
// 資産ロック関連機能
// -------------------------------------------------------------------

/// 認可済みのロック先アドレス
mapping(address => bool) public authorizedLockAddress;

/// ロック中数量
/// lockAddress => accountAddress => balance
mapping(address => mapping(address => uint256)) public locked;

/// @notice 資産ロックアドレスの認可
/// @param _lockAddress 認可対象のアドレス
/// @param _auth 認可状態(true:認可、false:未認可)
function authorizeLockAddress(
address _lockAddress,
bool _auth
) public virtual;

/// @notice 資産をロックする
/// @param _lockAddress 資産ロック先アドレス
/// @param _value ロックする数量
/// @param _data イベント出力用の任意のデータ
function lock(
address _lockAddress,
uint256 _value
uint256 _value,
string memory _data
) public virtual;

/// @notice 資産をアンロックする
/// @param _accountAddress アンロック対象のアドレス
/// @param _recipientAddress 受取アドレス
/// @param _data イベント出力用の任意のデータ
function unlock(
address _accountAddress,
address _recipientAddress,
uint256 _value
uint256 _value,
string memory _data
) public virtual;

/// @notice 資産を強制アンロックする
/// @param _lockAddress 資産ロック先アドレス
/// @param _accountAddress アンロック対象のアドレス
/// @param _recipientAddress 受取アドレス
/// @param _data イベント出力用の任意のデータ
function forceUnlock(
address _lockAddress,
address _accountAddress,
address _recipientAddress,
uint256 _value,
string memory _data
) public virtual;

/// @notice ロック中資産の参照
Expand All @@ -231,25 +237,21 @@ abstract contract IbetSecurityTokenInterface is IbetStandardTokenInterface {
address _accountAddress
) public view virtual returns (uint256);

/// Event: 資産ロックアドレスの認可
event AuthorizeLockAddress(
address lockAddress,
bool auth
);

/// Event: 資産ロック
event Lock(
address indexed accountAddress,
address indexed lockAddress,
uint256 value
uint256 value,
string data
);

/// Event: 資産アンロック
event Unlock(
address indexed accountAddress,
address indexed lockAddress,
address recipientAddress,
uint256 value
uint256 value,
string data
);

// -------------------------------------------------------------------
Expand Down
Loading

0 comments on commit 2c534aa

Please sign in to comment.