Skip to content

Commit

Permalink
Added possibility to choose amount of withdrawn/restaked accumulated …
Browse files Browse the repository at this point in the history
…operator fees, updated related events
  • Loading branch information
br41nl3t committed May 11, 2024
1 parent ac093a1 commit bdf8532
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 69 deletions.
71 changes: 50 additions & 21 deletions abi/Profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,6 @@
"name": "IdentityAlreadyExists",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint72",
"name": "identityId",
"type": "uint72"
}
],
"name": "NoOperatorFees",
"type": "error"
},
{
"inputs": [
{
Expand Down Expand Up @@ -180,10 +169,22 @@
"name": "identityId",
"type": "uint72"
},
{
"indexed": false,
"internalType": "bytes",
"name": "nodeId",
"type": "bytes"
},
{
"indexed": false,
"internalType": "uint96",
"name": "oldAccumulatedOperatorFee",
"type": "uint96"
},
{
"indexed": false,
"internalType": "uint96",
"name": "amount",
"name": "newAccumulatedOperatorFee",
"type": "uint96"
}
],
Expand All @@ -199,14 +200,32 @@
"name": "identityId",
"type": "uint72"
},
{
"indexed": false,
"internalType": "bytes",
"name": "nodeId",
"type": "bytes"
},
{
"indexed": false,
"internalType": "uint96",
"name": "oldAccumulatedOperatorFee",
"type": "uint96"
},
{
"indexed": false,
"internalType": "uint96",
"name": "amount",
"name": "newAccumulatedOperatorFee",
"type": "uint96"
},
{
"indexed": false,
"internalType": "uint256",
"name": "withdrawalPeriodEnd",
"type": "uint256"
}
],
"name": "AccumulatedOperatorFeeWithdrawalCompleted",
"name": "AccumulatedOperatorFeeWithdrawalStarted",
"type": "event"
},
{
Expand All @@ -220,18 +239,18 @@
},
{
"indexed": false,
"internalType": "uint96",
"name": "amount",
"type": "uint96"
"internalType": "bytes",
"name": "nodeId",
"type": "bytes"
},
{
"indexed": false,
"internalType": "uint256",
"name": "finishTimestamp",
"type": "uint256"
"internalType": "uint96",
"name": "withdrawnAmount",
"type": "uint96"
}
],
"name": "AccumulatedOperatorFeeWithdrawalStarted",
"name": "AccumulatedOperatorFeeWithdrawn",
"type": "event"
},
{
Expand Down Expand Up @@ -482,6 +501,11 @@
"internalType": "uint72",
"name": "identityId",
"type": "uint72"
},
{
"internalType": "uint96",
"name": "restakeAmount",
"type": "uint96"
}
],
"name": "stakeAccumulatedOperatorFee",
Expand Down Expand Up @@ -521,6 +545,11 @@
"internalType": "uint72",
"name": "identityId",
"type": "uint72"
},
{
"internalType": "uint96",
"name": "withdrawalAmount",
"type": "uint96"
}
],
"name": "startAccumulatedOperatorFeeWithdrawal",
Expand Down
64 changes: 44 additions & 20 deletions contracts/v1/Profile.sol
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,20 @@ contract Profile is Named, Versioned, ContractStatus, Initializable {
);
event ProfileDeleted(uint72 indexed identityId);
event AskUpdated(uint72 indexed identityId, bytes nodeId, uint96 ask);
event AccumulatedOperatorFeeWithdrawalStarted(uint72 indexed identityId, uint96 amount, uint256 finishTimestamp);
event AccumulatedOperatorFeeWithdrawalCompleted(uint72 indexed identityId, uint96 amount);
event AccumulatedOperatorFeeRestaked(uint72 indexed identityId, uint96 amount);
event AccumulatedOperatorFeeWithdrawalStarted(
uint72 indexed identityId,
bytes nodeId,
uint96 oldAccumulatedOperatorFee,
uint96 newAccumulatedOperatorFee,
uint256 withdrawalPeriodEnd
);
event AccumulatedOperatorFeeWithdrawn(uint72 indexed identityId, bytes nodeId, uint96 withdrawnAmount);
event AccumulatedOperatorFeeRestaked(
uint72 indexed identityId,
bytes nodeId,
uint96 oldAccumulatedOperatorFee,
uint96 newAccumulatedOperatorFee
);

string private constant _NAME = "Profile";
string private constant _VERSION = "1.2.0";
Expand Down Expand Up @@ -174,31 +185,42 @@ contract Profile is Named, Versioned, ContractStatus, Initializable {
}
}

function stakeAccumulatedOperatorFee(uint72 identityId) external onlyAdmin(identityId) {
function stakeAccumulatedOperatorFee(uint72 identityId, uint96 restakeAmount) external onlyAdmin(identityId) {
require(restakeAmount != 0, "Restake amount cannot be 0");

ProfileStorage ps = profileStorage;

uint96 accumulatedOperatorFee = ps.getAccumulatedOperatorFee(identityId);
if (accumulatedOperatorFee == 0) {
revert ProfileErrors.NoOperatorFees(identityId);
}
ps.setAccumulatedOperatorFee(identityId, 0);
stakingContract.addStake(msg.sender, identityId, accumulatedOperatorFee);
uint96 oldAccumulatedOperatorFee = ps.getAccumulatedOperatorFee(identityId);

emit AccumulatedOperatorFeeRestaked(identityId, accumulatedOperatorFee);
require(restakeAmount <= oldAccumulatedOperatorFee, "Restake must be <= balance");

ps.setAccumulatedOperatorFee(identityId, oldAccumulatedOperatorFee - restakeAmount);
stakingContract.addStake(msg.sender, identityId, restakeAmount);

emit AccumulatedOperatorFeeRestaked(
identityId,
ps.getNodeId(identityId),
oldAccumulatedOperatorFee,
oldAccumulatedOperatorFee - restakeAmount
);
}

function startAccumulatedOperatorFeeWithdrawal(uint72 identityId) external onlyAdmin(identityId) {
function startAccumulatedOperatorFeeWithdrawal(
uint72 identityId,
uint96 withdrawalAmount
) external onlyAdmin(identityId) {
require(withdrawalAmount != 0, "Withdrawal amount cannot be 0");

ProfileStorage ps = profileStorage;

uint96 accumulatedOperatorFee = ps.getAccumulatedOperatorFee(identityId);
uint96 oldAccumulatedOperatorFee = ps.getAccumulatedOperatorFee(identityId);

if (accumulatedOperatorFee == 0) {
revert ProfileErrors.NoOperatorFees(identityId);
}
ps.setAccumulatedOperatorFee(identityId, 0);
require(withdrawalAmount <= oldAccumulatedOperatorFee, "Withdrawal must be <= balance");

ps.setAccumulatedOperatorFee(identityId, oldAccumulatedOperatorFee - withdrawalAmount);
ps.setAccumulatedOperatorFeeWithdrawalAmount(
identityId,
ps.getAccumulatedOperatorFeeWithdrawalAmount(identityId) + accumulatedOperatorFee
ps.getAccumulatedOperatorFeeWithdrawalAmount(identityId) + withdrawalAmount
);
ps.setAccumulatedOperatorFeeWithdrawalTimestamp(
identityId,
Expand All @@ -207,7 +229,9 @@ contract Profile is Named, Versioned, ContractStatus, Initializable {

emit AccumulatedOperatorFeeWithdrawalStarted(
identityId,
accumulatedOperatorFee,
ps.getNodeId(identityId),
oldAccumulatedOperatorFee,
oldAccumulatedOperatorFee - withdrawalAmount,
block.timestamp + parametersStorage.stakeWithdrawalDelay()
);
}
Expand All @@ -230,7 +254,7 @@ contract Profile is Named, Versioned, ContractStatus, Initializable {
ps.setAccumulatedOperatorFeeWithdrawalTimestamp(identityId, 0);
ps.transferAccumulatedOperatorFee(msg.sender, withdrawalAmount);

emit AccumulatedOperatorFeeWithdrawalCompleted(identityId, withdrawalAmount);
emit AccumulatedOperatorFeeWithdrawn(identityId, ps.getNodeId(identityId), withdrawalAmount);
}

function _checkIdentityOwner(uint72 identityId) internal view virtual {
Expand Down
52 changes: 26 additions & 26 deletions contracts/v2/storage/paranets/ParanetKnowledgeMinersRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,11 @@ contract ParanetKnowledgeMinersRegistry is Named, Versioned, HubDependentV2 {
bytes32 assertionId,
uint96 updateTokenAmount
) external onlyContracts {
knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][
keccak256(abi.encodePacked(knowledgeAssetStorageContract, tokenId, assertionId))
] = knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].length;
] = knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].length;

knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].push(
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].push(
ParanetStructs.UpdatingKnowledgeAssetState({
knowledgeAssetStorageContract: knowledgeAssetStorageContract,
tokenId: tokenId,
Expand All @@ -184,44 +184,44 @@ contract ParanetKnowledgeMinersRegistry is Named, Versioned, HubDependentV2 {
bytes32 knowledgeAssetStateId
) external onlyContracts {
// 1. Move the last element to the slot of the element to remove
knowledgeMiners[miner].updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][knowledgeAssetStateId]
] = knowledgeMiners[miner].updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].length - 1
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][knowledgeAssetStateId]
] = knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].length - 1
];

// 2. Update the index of the moved element
knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][
keccak256(
abi.encodePacked(
knowledgeMiners[miner]
.updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].length - 1
.updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].length - 1
].knowledgeAssetStorageContract,
knowledgeMiners[miner]
.updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].length - 1
.updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].length - 1
].tokenId,
knowledgeMiners[miner]
.updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].length - 1
.updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].length - 1
].assertionId
)
)
] = knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][knowledgeAssetStateId];
] = knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][knowledgeAssetStateId];

// 3. Remove the last element from the array
knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].pop();
knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].pop();

// 4. Delete the index of the removed element
delete knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][knowledgeAssetStateId];
delete knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][knowledgeAssetStateId];
}

function getUpdatingKnowledgeAssetStates(
address miner,
bytes32 paranetId
) external view returns (ParanetStructs.UpdatingKnowledgeAssetState[] memory) {
return knowledgeMiners[miner].updatingKnowledgeAssets[paranetId];
return knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId];
}

function getUpdatingKnowledgeAssetStates(
Expand All @@ -232,15 +232,15 @@ contract ParanetKnowledgeMinersRegistry is Named, Versioned, HubDependentV2 {
) external view returns (ParanetStructs.UpdatingKnowledgeAssetState[] memory) {
require(start <= end, "Start should be <= End");
require(
end <= knowledgeMiners[miner].updatingKnowledgeAssets[paranetId].length,
end <= knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId].length,
"End should be <= length of Array"
);

ParanetStructs.UpdatingKnowledgeAssetState[] memory slice = new ParanetStructs.UpdatingKnowledgeAssetState[](
end - start
);
for (uint i; i < slice.length; ) {
slice[i] = knowledgeMiners[miner].updatingKnowledgeAssets[paranetId][i];
slice[i] = knowledgeMiners[miner].updatingKnowledgeAssetStates[paranetId][i];

unchecked {
i++;
Expand All @@ -257,8 +257,8 @@ contract ParanetKnowledgeMinersRegistry is Named, Versioned, HubDependentV2 {
uint96 updateTokenAmount
) external onlyContracts {
knowledgeMiners[miner]
.updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][knowledgeAssetStateId]
.updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][knowledgeAssetStateId]
].updateTokenAmount = updateTokenAmount;
}

Expand All @@ -269,8 +269,8 @@ contract ParanetKnowledgeMinersRegistry is Named, Versioned, HubDependentV2 {
uint96 addedUpdateTokenAmount
) external onlyContracts {
knowledgeMiners[miner]
.updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][knowledgeAssetStateId]
.updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][knowledgeAssetStateId]
].updateTokenAmount += addedUpdateTokenAmount;
}

Expand All @@ -281,8 +281,8 @@ contract ParanetKnowledgeMinersRegistry is Named, Versioned, HubDependentV2 {
uint96 subtractedUpdateTokenAmount
) external onlyContracts {
knowledgeMiners[miner]
.updatingKnowledgeAssets[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetsIndexes[paranetId][knowledgeAssetStateId]
.updatingKnowledgeAssetStates[paranetId][
knowledgeMiners[miner].updatingKnowledgeAssetStateIndexes[paranetId][knowledgeAssetStateId]
].updateTokenAmount -= subtractedUpdateTokenAmount;
}

Expand Down
4 changes: 2 additions & 2 deletions contracts/v2/structs/paranets/ParanetStructs.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ library ParanetStructs {
bytes metadata;
mapping(bytes32 => bytes32[]) submittedKnowledgeAssets;
mapping(bytes32 => mapping(bytes32 => uint256)) submittedKnowledgeAssetsIndexes;
mapping(bytes32 => UpdatingKnowledgeAssetState[]) updatingKnowledgeAssets;
mapping(bytes32 => mapping(bytes32 => uint256)) updatingKnowledgeAssetsIndexes;
mapping(bytes32 => UpdatingKnowledgeAssetState[]) updatingKnowledgeAssetStates;
mapping(bytes32 => mapping(bytes32 => uint256)) updatingKnowledgeAssetStateIndexes;
mapping(bytes32 => uint96) cumulativeTracSpent;
mapping(bytes32 => uint96) unrewardedTracSpent;
mapping(bytes32 => uint256) cumulativeAwardedNeuro;
Expand Down

0 comments on commit bdf8532

Please sign in to comment.