Skip to content

Commit 5b1ba5c

Browse files
authored
Oracle Contract Test (#1)
1 parent 7a22321 commit 5b1ba5c

File tree

3 files changed

+602
-3
lines changed

3 files changed

+602
-3
lines changed

test/TestOracle.sol

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/TestOracle.t.sol

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
// SPDX-License-Identifier: UNLICENSED
2+
pragma solidity ^0.8.20;
3+
4+
import "forge-std/Test.sol";
5+
import "../src/base/OraclePod.sol";
6+
import "../src/bls/BLSApkRegistry.sol";
7+
import "../src/core/OracleManager.sol";
8+
import "../src/interfaces/IBLSApkRegistry.sol";
9+
import "../src/interfaces/IOracleManager.sol";
10+
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
11+
12+
contract OraclePodTest is Test {
13+
OraclePod logic;
14+
OraclePod pod;
15+
16+
address deployer = address(0xA1);
17+
address oracleManager = address(0xB1);
18+
address other = address(0xC1);
19+
20+
function setUp() public {
21+
vm.prank(deployer);
22+
logic = new OraclePod();
23+
24+
bytes memory initData = abi.encodeWithSelector(
25+
OraclePod.initialize.selector,
26+
deployer,
27+
oracleManager
28+
);
29+
30+
vm.prank(deployer);
31+
ERC1967Proxy proxy = new ERC1967Proxy(address(logic), initData);
32+
pod = OraclePod(address(proxy));
33+
}
34+
35+
function testInitializeSetsOwnerAndOracleManager() public view {
36+
assertEq(pod.owner(), deployer);
37+
assertEq(pod.oracleManager(), oracleManager);
38+
}
39+
40+
function testOnlyOracleManagerCanFillSymbolPrice() public {
41+
uint256 price = 1000 ether;
42+
43+
// 非 oracleManager 调用失败
44+
vm.prank(other);
45+
vm.expectRevert(
46+
"OraclePod.onlyOracleManager: caller is not the oracle manager address"
47+
);
48+
pod.fillSymbolPrice(price);
49+
50+
// oracleManager 调用成功
51+
vm.prank(oracleManager);
52+
pod.fillSymbolPrice(price);
53+
54+
assertEq(pod.getSymbolPrice(), price);
55+
}
56+
57+
function testFillAndGetPrice() public {
58+
uint256 price = 1234;
59+
60+
vm.prank(oracleManager);
61+
pod.fillSymbolPrice(price);
62+
63+
uint256 got = pod.getSymbolPrice();
64+
assertEq(got, price);
65+
}
66+
}
67+
68+
contract OracleManagerTest is Test {
69+
OracleManager oracleManager;
70+
BLSApkRegistry blsRegistry;
71+
OraclePod oraclePod;
72+
73+
address owner = address(0xA1);
74+
address aggregator = address(0xA2);
75+
address operator = address(0xA3);
76+
// address blsRegister = address(0xA4);
77+
address whiteListManager = address(0xA5);
78+
79+
function setUp() public {
80+
// 部署逻辑合约
81+
OracleManager os_logic = new OracleManager();
82+
BLSApkRegistry bls_logic = new BLSApkRegistry();
83+
OraclePod op_logic = new OraclePod();
84+
85+
// 部署代理合约
86+
ERC1967Proxy os_proxy = new ERC1967Proxy(address(os_logic), "");
87+
ERC1967Proxy op_proxy = new ERC1967Proxy(address(op_logic), "");
88+
ERC1967Proxy bls_proxy = new ERC1967Proxy(address(bls_logic), "");
89+
90+
// 转换代理合约的接口
91+
oracleManager = OracleManager(address(os_proxy));
92+
blsRegistry = BLSApkRegistry(address(bls_proxy));
93+
oraclePod = OraclePod(address(op_proxy));
94+
95+
// 初始化合约
96+
vm.prank(owner);
97+
oracleManager.initialize(owner, address(blsRegistry), aggregator);
98+
vm.prank(owner);
99+
blsRegistry.initialize(owner, whiteListManager, address(oracleManager));
100+
vm.prank(owner);
101+
oraclePod.initialize(owner, address(oracleManager));
102+
103+
// 添加 operator 到白名单
104+
vm.prank(whiteListManager);
105+
blsRegistry.addOrRemoveBlsRegisterWhitelist(operator, true);
106+
107+
// 构造一组bls公钥和签名
108+
BN254.G1Point memory msgHash = BN254.G1Point({
109+
X: 18521112453352730579645358173921106118252889045846003563531873900220182176793,
110+
Y: 12220611982697050695278792018747974293998452760543899595396661668417277566823
111+
});
112+
113+
BN254.G1Point memory signature = BN254.G1Point({
114+
X: 15194033674394012071916983731564882240605499108993224505298052923469296043512,
115+
Y: 839159203127434969034550706910060963494405052210926279105817372573420151443
116+
});
117+
118+
BN254.G2Point memory pubKeyG2 = BN254.G2Point({
119+
X: [
120+
6814450613988925037276906495559354220267038225890288520888556922179861427221,
121+
11097154366204527428819849175191533397314611771099148982308553889852330000313
122+
],
123+
Y: [
124+
20799884507081215979545766399242808376431798816319714422985505673585902041706,
125+
13670248609089265475970799020243713070902269374832615406626549692922451548915
126+
]
127+
});
128+
129+
BN254.G1Point memory pubKeyG1 = BN254.G1Point({
130+
X: 21552948824382449035487501529869156133453687741764572533699451941285719913479,
131+
Y: 18512095983377956955654133313299197583137445769983185530805027107069225976299
132+
});
133+
134+
IBLSApkRegistry.PubkeyRegistrationParams memory params = IBLSApkRegistry
135+
.PubkeyRegistrationParams({
136+
pubkeyG1: pubKeyG1,
137+
pubkeyG2: pubKeyG2,
138+
pubkeyRegistrationSignature: signature
139+
});
140+
141+
// operator注册新的 pubkey
142+
vm.prank(operator);
143+
bytes32 pubkeyHash = blsRegistry.registerBLSPublicKey(
144+
operator,
145+
params,
146+
msgHash
147+
);
148+
149+
vm.prank(address(oracleManager));
150+
blsRegistry.registerOperator(address(operator));
151+
}
152+
153+
function test_addOrRemoveOperatorWhitelist() public {
154+
vm.prank(address(0xE5));
155+
vm.expectRevert(
156+
"OracleManager.onlyOracleWhiteListManager: not the aggregator address"
157+
);
158+
oracleManager.addOrRemoveOperatorWhitelist(operator, true);
159+
160+
vm.prank(aggregator);
161+
oracleManager.addOrRemoveOperatorWhitelist(operator, true);
162+
163+
vm.prank(aggregator);
164+
vm.expectRevert(
165+
"OracleManager.addOperatorWhitelist: operator address is zero"
166+
);
167+
oracleManager.addOrRemoveOperatorWhitelist(address(0), true);
168+
}
169+
170+
function test_setAggregatorAddress() public {
171+
vm.prank(address(0xE5));
172+
vm.expectRevert();
173+
oracleManager.setAggregatorAddress(aggregator);
174+
175+
vm.prank(owner);
176+
oracleManager.setAggregatorAddress(aggregator);
177+
178+
vm.prank(owner);
179+
vm.expectRevert(
180+
"OracleManager.addAggregator: aggregatorAddress address is zero"
181+
);
182+
oracleManager.setAggregatorAddress(address(0));
183+
}
184+
185+
function test_addOrRemoveOraclePodToFillWhitelist() public {
186+
vm.prank(address(0xE5));
187+
vm.expectRevert(
188+
"OracleManager.onlyOracleWhiteListManager: not the aggregator address"
189+
);
190+
oracleManager.addOraclePodToFillWhitelist(oraclePod);
191+
192+
vm.prank(address(0xE5));
193+
vm.expectRevert(
194+
"OracleManager.onlyOracleWhiteListManager: not the aggregator address"
195+
);
196+
oracleManager.removeOraclePodToFillWhitelist(oraclePod);
197+
198+
vm.prank(aggregator);
199+
oracleManager.addOraclePodToFillWhitelist(oraclePod);
200+
vm.prank(aggregator);
201+
oracleManager.removeOraclePodToFillWhitelist(oraclePod);
202+
}
203+
204+
function test_RegisterandDegisterOperator() public {
205+
vm.prank(aggregator);
206+
oracleManager.addOrRemoveOperatorWhitelist(operator, true);
207+
208+
vm.prank(address(0xE1));
209+
vm.expectRevert(
210+
"OracleManager.registerOperator: this address have not permission to register "
211+
);
212+
oracleManager.registerOperator("http://node.url");
213+
214+
vm.prank(operator);
215+
oracleManager.registerOperator("http://node.url");
216+
217+
vm.prank(address(0xE1));
218+
vm.expectRevert(
219+
"OracleManager.registerOperator: this address have not permission to register "
220+
);
221+
oracleManager.deRegisterOperator();
222+
223+
vm.prank(operator);
224+
oracleManager.deRegisterOperator();
225+
226+
vm.prank(aggregator);
227+
oracleManager.addOrRemoveOperatorWhitelist(operator, false);
228+
229+
vm.prank(operator);
230+
vm.expectRevert(
231+
"OracleManager.registerOperator: this address have not permission to register "
232+
);
233+
oracleManager.registerOperator("http://node.url");
234+
}
235+
236+
function testFillSymbolPriceWithSignature() public {
237+
vm.prank(aggregator);
238+
oracleManager.addOraclePodToFillWhitelist(oraclePod);
239+
240+
IBLSApkRegistry.OracleNonSignerAndSignature
241+
memory noSignerAndSignature = IBLSApkRegistry
242+
.OracleNonSignerAndSignature({
243+
nonSignerPubkeys: new BN254.G1Point[](0),
244+
apkG2: BN254.G2Point({
245+
X: [
246+
6814450613988925037276906495559354220267038225890288520888556922179861427221,
247+
11097154366204527428819849175191533397314611771099148982308553889852330000313
248+
],
249+
Y: [
250+
20799884507081215979545766399242808376431798816319714422985505673585902041706,
251+
13670248609089265475970799020243713070902269374832615406626549692922451548915
252+
]
253+
}),
254+
sigma: BN254.G1Point({
255+
X: 15194033674394012071916983731564882240605499108993224505298052923469296043512,
256+
Y: 839159203127434969034550706910060963494405052210926279105817372573420151443
257+
}),
258+
totalStake: 888
259+
});
260+
IOracleManager.OracleBatch memory batch = IOracleManager.OracleBatch({
261+
msgHash: 0xea83cdcdd06bf61e414054115a551e23133711d0507dcbc07a4bab7dc4581935,
262+
blockNumber: block.number - 1,
263+
symbolPrice: 888,
264+
blockHash: 0xea83cdcdd06bf61e414054115a551e23133711d0507dcbc07a4bab7dc4581935
265+
});
266+
267+
vm.prank(aggregator);
268+
oracleManager.fillSymbolPriceWithSignature(
269+
oraclePod,
270+
batch,
271+
noSignerAndSignature
272+
);
273+
274+
assertEq(oraclePod.getSymbolPrice(), 888);
275+
}
276+
277+
function testFillSymbolPriceWithoutWhitelistOrAuthority() public {
278+
IBLSApkRegistry.OracleNonSignerAndSignature
279+
memory noSignerAndSignature = IBLSApkRegistry
280+
.OracleNonSignerAndSignature({
281+
nonSignerPubkeys: new BN254.G1Point[](0),
282+
apkG2: BN254.G2Point({
283+
X: [
284+
19552866287184064427995511006223057169680536518603642638640105365054342788017,
285+
19912786774583403697047133238687463296134677575618298225286334615015816916116
286+
],
287+
Y: [
288+
2970994197396269892653525920024039859830728356246595152296683945713431676344,
289+
18119535013136907197909765078809655896321461883746857179927989514870514777799
290+
]
291+
}),
292+
sigma: BN254.G1Point({
293+
X: 15723530600246276940894768360396890326319571568844052976858037242805072605559,
294+
Y: 11650315804718231422577338154702931145725917843701074925949828011449296498014
295+
}),
296+
totalStake: 888
297+
});
298+
IOracleManager.OracleBatch memory batch = IOracleManager.OracleBatch({
299+
msgHash: 0x3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728,
300+
blockNumber: block.number - 1,
301+
symbolPrice: 888,
302+
blockHash: 0x3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
303+
});
304+
305+
vm.prank(address(0xE1));
306+
vm.expectRevert(
307+
"OracleManager.onlyOracleWhiteListManager: not the aggregator address"
308+
);
309+
oracleManager.fillSymbolPriceWithSignature(
310+
oraclePod,
311+
batch,
312+
noSignerAndSignature
313+
);
314+
315+
vm.prank(aggregator);
316+
vm.expectRevert(
317+
"OracleManager.onlyPodWhitelistedForFill: oraclePod not whitelisted"
318+
);
319+
oracleManager.fillSymbolPriceWithSignature(
320+
oraclePod,
321+
batch,
322+
noSignerAndSignature
323+
);
324+
}
325+
}

0 commit comments

Comments
 (0)