Skip to content

Commit 15b998b

Browse files
committed
test: add add and slash collateral tests
1 parent 8e14e52 commit 15b998b

File tree

9 files changed

+471
-6
lines changed

9 files changed

+471
-6
lines changed

contracts/CollateralManagement.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ contract CollateralManagementContract is
105105
Quotes.PegInQuote calldata quote,
106106
bytes32 quoteHash
107107
) external onlyRole(COLLATERAL_SLASHER) override {
108-
uint penalty = Math.min(
108+
uint256 penalty = Math.min(
109109
quote.penaltyFee,
110110
_pegInCollateral[quote.liquidityProviderRskAddress]
111111
);
@@ -165,8 +165,8 @@ contract CollateralManagementContract is
165165
if (!success) revert WithdrawalFailed(providerAddress, amount);
166166
}
167167

168-
function withdrawRewards(address addr) external override {
169-
if (addr == address(0)) revert Flyover.InvalidAddress(addr);
168+
function withdrawRewards() external override {
169+
address addr = msg.sender;
170170
uint256 rewards = _rewards[addr];
171171
if (rewards < 1) revert NothingToWithdraw(addr);
172172
_rewards[addr] = 0;

contracts/interfaces/ICollateralManagement.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ interface ICollateralManagement {
4141
Quotes.PegOutQuote calldata quote,
4242
bytes32 quoteHash
4343
) external;
44-
function withdrawRewards(address addr) external;
44+
function withdrawRewards() external;
4545
function withdrawCollateral() external;
4646
function resign() external;
4747

contracts/split/FlyoverDiscoveryFull.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,8 @@ contract FlyoverDiscoveryFull is
380380
return 0;
381381
}
382382

383-
function withdrawRewards(address addr) external {
383+
function withdrawRewards() external {
384+
address addr = msg.sender;
384385
uint256 rewards = _rewards[addr];
385386
if (rewards < 1) revert NothingToWithdraw(addr);
386387
_rewards[addr] = 0;

contracts/test-contracts/CollateralManagementMock.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ contract CollateralManagementMock is ICollateralManagement {
3434
emit Penalized(address(0), address(0), bytes32(0), Flyover.ProviderType.PegOut, 0, 0);
3535
}
3636

37-
function withdrawRewards(address) external {
37+
function withdrawRewards() external {
3838
emit RewardsWithdrawn(address(0), 0);
3939
}
4040

contracts/test-contracts/WalletMock.sol

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ contract WalletMock {
55

66
bool private _rejectFunds;
77

8+
event TransactionRejected(address indexed to, uint256 indexed value, bytes reason);
89
error PaymentRejected();
910

1011
receive() external payable {
@@ -13,6 +14,11 @@ contract WalletMock {
1314
}
1415
}
1516

17+
function execute(address to, uint256 value, bytes calldata data) external payable {
18+
(bool success, bytes memory reason) = to.call{value: value}(data);
19+
if (!success) emit TransactionRejected(to, value, reason);
20+
}
21+
1622
function setRejectFunds(bool val) external {
1723
_rejectFunds = val;
1824
}

test/collateral/addition.test.ts

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers";
2+
import { deployCollateralManagementWithRoles } from "./fixtures";
3+
import { expect } from "chai";
4+
import { ethers } from "ethers";
5+
6+
describe("CollateralManagementContract addition functionality", () => {
7+
describe("addPegInCollateral function should", function () {
8+
it("only allow registered accounts to add collateral", async function () {
9+
const { collateralManagement, signers, adder } = await loadFixture(
10+
deployCollateralManagementWithRoles
11+
);
12+
const registeredAccount = signers[0];
13+
const notRegisteredAccount = signers[1];
14+
const oneRbtcTx = { value: ethers.parseEther("1") };
15+
16+
await expect(
17+
collateralManagement
18+
.connect(adder)
19+
.addPegInCollateralTo(registeredAccount.address, oneRbtcTx)
20+
).not.to.be.reverted;
21+
await expect(
22+
collateralManagement
23+
.connect(notRegisteredAccount)
24+
.addPegInCollateral(oneRbtcTx)
25+
).to.be.revertedWithCustomError(
26+
collateralManagement,
27+
"ProviderNotRegistered"
28+
);
29+
// adder can only add collateral to other accounts unless they are registered
30+
await expect(
31+
collateralManagement.connect(adder).addPegInCollateral(oneRbtcTx)
32+
).to.be.revertedWithCustomError(
33+
collateralManagement,
34+
"ProviderNotRegistered"
35+
);
36+
const tx = await collateralManagement
37+
.connect(registeredAccount)
38+
.addPegInCollateral(oneRbtcTx);
39+
await expect(tx)
40+
.to.emit(collateralManagement, "PegInCollateralAdded")
41+
.withArgs(registeredAccount.address, oneRbtcTx.value);
42+
await expect(
43+
collateralManagement.getPegInCollateral(registeredAccount.address)
44+
).to.eventually.eq(oneRbtcTx.value * 2n);
45+
});
46+
});
47+
48+
describe("addPegOutCollateral function should", function () {
49+
it("only allow registered accounts to add collateral", async function () {
50+
const { collateralManagement, signers, adder } = await loadFixture(
51+
deployCollateralManagementWithRoles
52+
);
53+
const registeredAccount = signers[2];
54+
const notRegisteredAccount = signers[3];
55+
const oneRbtcTx = { value: ethers.parseEther("1") };
56+
57+
await expect(
58+
collateralManagement
59+
.connect(adder)
60+
.addPegOutCollateralTo(registeredAccount.address, oneRbtcTx)
61+
).not.to.be.reverted;
62+
await expect(
63+
collateralManagement
64+
.connect(notRegisteredAccount)
65+
.addPegOutCollateral(oneRbtcTx)
66+
).to.be.revertedWithCustomError(
67+
collateralManagement,
68+
"ProviderNotRegistered"
69+
);
70+
// adder can only add collateral to other accounts unless they are registered
71+
await expect(
72+
collateralManagement.connect(adder).addPegOutCollateral(oneRbtcTx)
73+
).to.be.revertedWithCustomError(
74+
collateralManagement,
75+
"ProviderNotRegistered"
76+
);
77+
const tx = await collateralManagement
78+
.connect(registeredAccount)
79+
.addPegOutCollateral(oneRbtcTx);
80+
await expect(tx)
81+
.to.emit(collateralManagement, "PegOutCollateralAdded")
82+
.withArgs(registeredAccount.address, oneRbtcTx.value);
83+
await expect(
84+
collateralManagement.getPegOutCollateral(registeredAccount.address)
85+
).to.eventually.eq(oneRbtcTx.value * 2n);
86+
});
87+
});
88+
89+
describe("addPegInCollateralTo function should", function () {
90+
it("only adder to add collateral to other accounts", async function () {
91+
const { collateralManagement, signers, adder } = await loadFixture(
92+
deployCollateralManagementWithRoles
93+
);
94+
const registeredAccount = signers[0];
95+
const notRegisteredAccount = signers[1];
96+
const oneRbtcTx = { value: ethers.parseEther("1") };
97+
98+
const tx = await collateralManagement
99+
.connect(adder)
100+
.addPegInCollateralTo(registeredAccount.address, oneRbtcTx);
101+
await expect(tx)
102+
.to.emit(collateralManagement, "PegInCollateralAdded")
103+
.withArgs(registeredAccount.address, oneRbtcTx.value);
104+
await expect(
105+
collateralManagement.getPegInCollateral(registeredAccount.address)
106+
).to.eventually.eq(oneRbtcTx.value);
107+
await expect(
108+
collateralManagement
109+
.connect(notRegisteredAccount)
110+
.addPegInCollateralTo(registeredAccount.address, oneRbtcTx)
111+
).to.be.revertedWithCustomError(
112+
collateralManagement,
113+
"AccessControlUnauthorizedAccount"
114+
);
115+
await expect(
116+
collateralManagement
117+
.connect(registeredAccount)
118+
.addPegInCollateralTo(registeredAccount.address, oneRbtcTx)
119+
).to.be.revertedWithCustomError(
120+
collateralManagement,
121+
"AccessControlUnauthorizedAccount"
122+
);
123+
});
124+
});
125+
126+
describe("addPegOutCollateralTo function should", function () {
127+
it("only adder to add collateral to other accounts", async function () {
128+
const { collateralManagement, signers, adder } = await loadFixture(
129+
deployCollateralManagementWithRoles
130+
);
131+
const registeredAccount = signers[0];
132+
const notRegisteredAccount = signers[1];
133+
const oneRbtcTx = { value: ethers.parseEther("1") };
134+
135+
const tx = await collateralManagement
136+
.connect(adder)
137+
.addPegOutCollateralTo(registeredAccount.address, oneRbtcTx);
138+
await expect(tx)
139+
.to.emit(collateralManagement, "PegOutCollateralAdded")
140+
.withArgs(registeredAccount.address, oneRbtcTx.value);
141+
await expect(
142+
collateralManagement.getPegOutCollateral(registeredAccount.address)
143+
).to.eventually.eq(oneRbtcTx.value);
144+
await expect(
145+
collateralManagement
146+
.connect(notRegisteredAccount)
147+
.addPegOutCollateralTo(registeredAccount.address, oneRbtcTx)
148+
).to.be.revertedWithCustomError(
149+
collateralManagement,
150+
"AccessControlUnauthorizedAccount"
151+
);
152+
await expect(
153+
collateralManagement
154+
.connect(registeredAccount)
155+
.addPegOutCollateralTo(registeredAccount.address, oneRbtcTx)
156+
).to.be.revertedWithCustomError(
157+
collateralManagement,
158+
"AccessControlUnauthorizedAccount"
159+
);
160+
});
161+
});
162+
});

test/collateral/configurations.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,32 @@ import { COLLATERAL_CONSTANTS } from "../utils/constants";
22
import { expect } from "chai";
33
import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers";
44
import { deployCollateralManagement } from "./fixtures";
5+
import { ethers } from "ethers";
56

67
describe("CollateralManagementContract configurations", () => {
8+
describe("receive function should", function () {
9+
it("reject any RTBC sent to the contract", async function () {
10+
const { collateralManagement, signers, owner } = await loadFixture(
11+
deployCollateralManagement
12+
);
13+
const address = await collateralManagement.getAddress();
14+
await expect(
15+
owner.sendTransaction({ to: address, value: ethers.parseEther("1") })
16+
).to.be.revertedWithCustomError(
17+
collateralManagement,
18+
"PaymentNotAllowed"
19+
);
20+
await expect(
21+
signers[0].sendTransaction({
22+
to: address,
23+
value: ethers.parseEther("1"),
24+
})
25+
).to.be.revertedWithCustomError(
26+
collateralManagement,
27+
"PaymentNotAllowed"
28+
);
29+
});
30+
});
731
describe("initialize function should", function () {
832
it("initialize properly", async function () {
933
const { collateralManagement, owner } = await loadFixture(

test/collateral/fixtures.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,24 @@ export async function deployCollateralManagement() {
3333
collateralManagementParams,
3434
};
3535
}
36+
37+
export async function deployCollateralManagementWithRoles() {
38+
const deployResult = await deployCollateralManagement();
39+
const signers = deployResult.signers;
40+
const adder = signers.pop();
41+
const slasher = signers.pop();
42+
if (!adder || !slasher)
43+
throw new Error("adder and slasher can't be undefined");
44+
const { collateralManagement, owner } = deployResult;
45+
await collateralManagement
46+
.connect(owner)
47+
.grantRole(await collateralManagement.COLLATERAL_ADDER(), adder.address);
48+
await collateralManagement
49+
.connect(owner)
50+
.grantRole(
51+
await collateralManagement.COLLATERAL_SLASHER(),
52+
slasher.address
53+
);
54+
55+
return { adder, slasher, ...deployResult };
56+
}

0 commit comments

Comments
 (0)