Skip to content

Commit 1625590

Browse files
committed
Updated Escrow contract to include finalResultsHash and additional parameters for oracle fees.
Enhanced Escrow data in Python and Typescript SDK to support final results hash and oracle fees. Updated Subgraph for adding oracle fees and final results hash
1 parent a8bf4b2 commit 1625590

File tree

14 files changed

+415
-67
lines changed

14 files changed

+415
-67
lines changed

packages/core/contracts/Escrow.sol

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ contract Escrow is IEscrow, ReentrancyGuard {
4646
address[] recipients,
4747
uint256[] amounts,
4848
bool isPartial,
49-
string finalResultsUrl
49+
string finalResultsUrl,
50+
string finalResultsHash
5051
);
5152
event Cancelled();
5253
event Completed();
@@ -380,9 +381,8 @@ contract Escrow is IEscrow, ReentrancyGuard {
380381

381382
uint256 totalBulkAmount;
382383
for (uint256 i; i < _recipients.length; ) {
383-
uint256 amount = _amounts[i];
384-
require(amount > 0, 'Zero amount');
385-
totalBulkAmount += amount;
384+
require(_amounts[i] > 0, 'Zero amount');
385+
totalBulkAmount += _amounts[i];
386386
unchecked {
387387
++i;
388388
}
@@ -399,20 +399,19 @@ contract Escrow is IEscrow, ReentrancyGuard {
399399
IERC20 erc20 = IERC20(token);
400400

401401
for (uint256 i; i < _recipients.length; ) {
402-
uint256 amount = _amounts[i];
403402
uint256 reputationOracleFee = (reputationOracleFeePercentage *
404-
amount) / 100;
403+
_amounts[i]) / 100;
405404
uint256 recordingOracleFee = (recordingOracleFeePercentage *
406-
amount) / 100;
407-
uint256 exchangeOracleFee = (exchangeOracleFeePercentage * amount) /
408-
100;
405+
_amounts[i]) / 100;
406+
uint256 exchangeOracleFee = (exchangeOracleFeePercentage *
407+
_amounts[i]) / 100;
409408

410409
totalReputationOracleFee += reputationOracleFee;
411410
totalRecordingOracleFee += recordingOracleFee;
412411
totalExchangeOracleFee += exchangeOracleFee;
413412

414413
netAmounts[i] =
415-
amount -
414+
_amounts[i] -
416415
reputationOracleFee -
417416
recordingOracleFee -
418417
exchangeOracleFee;
@@ -454,7 +453,8 @@ contract Escrow is IEscrow, ReentrancyGuard {
454453
eventRecipients,
455454
netAmounts,
456455
isPartial,
457-
_url
456+
_url,
457+
_hash
458458
);
459459

460460
if (!isPartial) {

packages/core/test/Escrow.ts

Lines changed: 56 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -930,11 +930,13 @@ describe('Escrow', function () {
930930
);
931931

932932
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalAmount);
933-
await escrow
934-
.connect(reputationOracle)
935-
[
936-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
937-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false);
933+
await expect(
934+
escrow
935+
.connect(reputationOracle)
936+
[
937+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
938+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false)
939+
).to.emit(escrow, 'BulkTransferV3');
938940

939941
const finalBalances = await Promise.all(
940942
recipients.map((r) => token.balanceOf(r))
@@ -992,11 +994,13 @@ describe('Escrow', function () {
992994

993995
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalPayout);
994996

995-
await escrow
996-
.connect(reputationOracle)
997-
[
998-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
999-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false);
997+
await expect(
998+
escrow
999+
.connect(reputationOracle)
1000+
[
1001+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1002+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false)
1003+
).to.emit(escrow, 'BulkTransferV3');
10001004

10011005
const finalBalances = await Promise.all(
10021006
recipients.map((r) => token.balanceOf(r))
@@ -1045,11 +1049,13 @@ describe('Escrow', function () {
10451049

10461050
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalAmount);
10471051

1048-
await escrow
1049-
.connect(reputationOracle)
1050-
[
1051-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1052-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', true);
1052+
await expect(
1053+
escrow
1054+
.connect(reputationOracle)
1055+
[
1056+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1057+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', true)
1058+
).to.emit(escrow, 'BulkTransferV3');
10531059

10541060
const finalBalances = await Promise.all(
10551061
recipients.map((r) => token.balanceOf(r))
@@ -1104,11 +1110,13 @@ describe('Escrow', function () {
11041110
await escrow.connect(launcher).requestCancellation();
11051111

11061112
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalAmount);
1107-
await escrow
1108-
.connect(reputationOracle)
1109-
[
1110-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1111-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false);
1113+
await expect(
1114+
escrow
1115+
.connect(reputationOracle)
1116+
[
1117+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1118+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false)
1119+
).to.emit(escrow, 'BulkTransferV3');
11121120

11131121
const finalBalances = await Promise.all(
11141122
recipients.map((r) => token.balanceOf(r))
@@ -1157,11 +1165,13 @@ describe('Escrow', function () {
11571165

11581166
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalAmount);
11591167

1160-
await escrow
1161-
.connect(admin)
1162-
[
1163-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1164-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false);
1168+
await expect(
1169+
escrow
1170+
.connect(admin)
1171+
[
1172+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1173+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false)
1174+
).to.emit(escrow, 'BulkTransferV3');
11651175

11661176
const finalBalances = await Promise.all(
11671177
recipients.map((r) => token.balanceOf(r))
@@ -1219,11 +1229,13 @@ describe('Escrow', function () {
12191229

12201230
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalPayout);
12211231

1222-
await escrow
1223-
.connect(admin)
1224-
[
1225-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1226-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false);
1232+
await expect(
1233+
escrow
1234+
.connect(admin)
1235+
[
1236+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1237+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false)
1238+
).to.emit(escrow, 'BulkTransferV3');
12271239

12281240
const finalBalances = await Promise.all(
12291241
recipients.map((r) => token.balanceOf(r))
@@ -1272,11 +1284,13 @@ describe('Escrow', function () {
12721284

12731285
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalAmount);
12741286

1275-
await escrow
1276-
.connect(admin)
1277-
[
1278-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1279-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', true);
1287+
await expect(
1288+
escrow
1289+
.connect(admin)
1290+
[
1291+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1292+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', true)
1293+
).to.emit(escrow, 'BulkTransferV3');
12801294

12811295
const finalBalances = await Promise.all(
12821296
recipients.map((r) => token.balanceOf(r))
@@ -1331,11 +1345,13 @@ describe('Escrow', function () {
13311345
await escrow.connect(launcher).requestCancellation();
13321346

13331347
await storeResults(FIXTURE_URL, FIXTURE_HASH, totalAmount);
1334-
await escrow
1335-
.connect(admin)
1336-
[
1337-
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1338-
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false);
1348+
await expect(
1349+
escrow
1350+
.connect(admin)
1351+
[
1352+
'bulkPayOut(address[],uint256[],string,string,string,bool)'
1353+
](recipients, amounts, FIXTURE_URL, FIXTURE_HASH, '000', false)
1354+
).to.emit(escrow, 'BulkTransferV3');
13391355

13401356
const finalBalances = await Promise.all(
13411357
recipients.map((r) => token.balanceOf(r))

packages/sdk/python/human-protocol-sdk/human_protocol_sdk/escrow/escrow_utils.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,17 @@ def __init__(
6262
total_funded_amount: int,
6363
created_at: datetime,
6464
final_results_url: Optional[str] = None,
65+
final_results_hash: Optional[str] = None,
6566
intermediate_results_url: Optional[str] = None,
67+
intermediate_results_hash: Optional[str] = None,
6668
manifest_hash: Optional[str] = None,
6769
manifest: Optional[str] = None,
6870
recording_oracle: Optional[str] = None,
6971
reputation_oracle: Optional[str] = None,
7072
exchange_oracle: Optional[str] = None,
73+
recording_oracle_fee: Optional[int] = None,
74+
reputation_oracle_fee: Optional[int] = None,
75+
exchange_oracle_fee: Optional[int] = None,
7176
):
7277
"""
7378
Initializes an EscrowData instance.
@@ -85,12 +90,17 @@ def __init__(
8590
:param total_funded_amount: Total funded amount
8691
:param created_at: Creation date
8792
:param final_results_url: URL for final results.
93+
:param final_results_hash: Hash for final results.
8894
:param intermediate_results_url: URL for intermediate results.
95+
:param intermediate_results_hash: Hash for intermediate results.
8996
:param manifest_hash: Manifest hash.
9097
:param manifest: Manifest data (JSON/URL).
9198
:param recording_oracle: Recording Oracle address.
9299
:param reputation_oracle: Reputation Oracle address.
93100
:param exchange_oracle: Exchange Oracle address.
101+
:param recording_oracle_fee: Fee for the Recording Oracle.
102+
:param reputation_oracle_fee: Fee for the Reputation Oracle.
103+
:param exchange_oracle_fee: Fee for the Exchange Oracle.
94104
"""
95105

96106
self.id = id
@@ -100,13 +110,18 @@ def __init__(
100110
self.count = count
101111
self.factory_address = factory_address
102112
self.final_results_url = final_results_url
113+
self.final_results_hash = final_results_hash
103114
self.intermediate_results_url = intermediate_results_url
115+
self.intermediate_results_hash = intermediate_results_hash
104116
self.launcher = launcher
105117
self.manifest_hash = manifest_hash
106118
self.manifest = manifest
107119
self.recording_oracle = recording_oracle
108120
self.reputation_oracle = reputation_oracle
109121
self.exchange_oracle = exchange_oracle
122+
self.recording_oracle_fee = recording_oracle_fee
123+
self.reputation_oracle_fee = reputation_oracle_fee
124+
self.exchange_oracle_fee = exchange_oracle_fee
110125
self.status = status
111126
self.token = token
112127
self.total_funded_amount = total_funded_amount
@@ -287,12 +302,31 @@ def get_escrows(
287302
total_funded_amount=int(escrow.get("totalFundedAmount", 0)),
288303
created_at=datetime.fromtimestamp(int(escrow.get("createdAt", 0))),
289304
final_results_url=escrow.get("finalResultsUrl", None),
305+
final_results_hash=escrow.get("finalResultsHash", None),
290306
intermediate_results_url=escrow.get("intermediateResultsUrl", None),
307+
intermediate_results_hash=escrow.get(
308+
"intermediateResultsHash", None
309+
),
291310
manifest_hash=escrow.get("manifestHash", None),
292311
manifest=escrow.get("manifest", None),
293312
recording_oracle=escrow.get("recordingOracle", None),
294313
reputation_oracle=escrow.get("reputationOracle", None),
295314
exchange_oracle=escrow.get("exchangeOracle", None),
315+
recording_oracle_fee=(
316+
int(escrow.get("recordingOracleFee"))
317+
if escrow.get("recordingOracleFee", None) not in (None, "")
318+
else None
319+
),
320+
reputation_oracle_fee=(
321+
int(escrow.get("reputationOracleFee"))
322+
if escrow.get("reputationOracleFee", None) not in (None, "")
323+
else None
324+
),
325+
exchange_oracle_fee=(
326+
int(escrow.get("exchangeOracleFee"))
327+
if escrow.get("exchangeOracleFee", None) not in (None, "")
328+
else None
329+
),
296330
)
297331
for escrow in escrows_raw
298332
]
@@ -369,12 +403,29 @@ def get_escrow(
369403
total_funded_amount=int(escrow.get("totalFundedAmount", 0)),
370404
created_at=datetime.fromtimestamp(int(escrow.get("createdAt", 0))),
371405
final_results_url=escrow.get("finalResultsUrl", None),
406+
final_results_hash=escrow.get("finalResultsHash", None),
372407
intermediate_results_url=escrow.get("intermediateResultsUrl", None),
408+
intermediate_results_hash=escrow.get("intermediateResultsHash", None),
373409
manifest_hash=escrow.get("manifestHash", None),
374410
manifest=escrow.get("manifest", None),
375411
recording_oracle=escrow.get("recordingOracle", None),
376412
reputation_oracle=escrow.get("reputationOracle", None),
377413
exchange_oracle=escrow.get("exchangeOracle", None),
414+
recording_oracle_fee=(
415+
int(escrow.get("recordingOracleFee"))
416+
if escrow.get("recordingOracleFee", None) not in (None, "")
417+
else None
418+
),
419+
reputation_oracle_fee=(
420+
int(escrow.get("reputationOracleFee"))
421+
if escrow.get("reputationOracleFee", None) not in (None, "")
422+
else None
423+
),
424+
exchange_oracle_fee=(
425+
int(escrow.get("exchangeOracleFee"))
426+
if escrow.get("exchangeOracleFee", None) not in (None, "")
427+
else None
428+
),
378429
)
379430

380431
@staticmethod

0 commit comments

Comments
 (0)