Skip to content
This repository was archived by the owner on Jan 30, 2025. It is now read-only.

Commit bccbf8e

Browse files
committed
improve cli, deploy demo contracts to eth sepolia and add addresses to cli/addresses/sepolia
1 parent 40a9996 commit bccbf8e

11 files changed

+279
-140
lines changed

.gitignore

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ contracts/ImageID.sol
1010
tests/Elf.sol
1111

1212
# Autogenerated addresses
13-
cli/addresses
13+
cli/addresses/local
14+
15+
# Data from binance
16+
stripped_prices.json
17+
response.json
1418

1519
# Dotenv file
1620
.env

cli/addresses/sepolia/BTCUSDT.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0x0E6fCA9871cc802cBC22c491B1Fb50574dE00dA7

cli/addresses/sepolia/ETHBTC.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0x62E4901444BcA98974d36F9633339A4Bd9292448

cli/addresses/sepolia/ETHUSDC.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0xf406556Ec65bA5f45293ad56eF85c64E2188c4cC

cli/addresses/sepolia/ETHUSDT.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0xe08756b621eaC34BDFBD21B63B1D06d7a0f3C7e1

cli/addresses/sepolia/feeder.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0x61fF66e21F37F13C87985f95f33C9e22736D7797

cli/deploy_feeder.py

+45-61
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,63 @@
1-
key_file = open('cli/anvil_private_key.txt', 'r')
2-
private_key = key_file.readline().strip()
3-
key_file.close()
4-
51
import subprocess
62
import sys
73
import os
4+
from utils.network import *
5+
6+
def deploy_data_feeder(net):
87

9-
if not os.path.exists("cli/addresses/feeder"):
10-
os.makedirs("cli/addresses/feeder")
11-
12-
def deploy_data_feeder(what, command):
13-
print("===================================")
14-
result = subprocess.run(command, capture_output=True, text=True)
15-
exit_code = result.returncode
16-
print("stdout:")
17-
print(result.stdout)
18-
print("stderr:")
19-
print(result.stderr)
20-
if (exit_code == 0):
21-
print(what, "SUCCESSFUL!")
8+
if net == network_enum.LOCAL:
9+
print("deploying DataFeedFeeder to", net.value)
2210
else:
23-
print(what, "FAILED!")
11+
while(True):
12+
user_input = input("You are deploying DataFeeder to " + net.value + " network. Are you sure? [y/n]: ").lower()
13+
if user_input == 'y':
14+
break
15+
elif user_input == 'n':
16+
print("cancelled execution", file=sys.stderr)
17+
sys.exit(1)
18+
else:
19+
print("Please enter 'y' or 'n'.")
20+
continue
21+
22+
23+
deployment_command = ["forge", "script", rpc_url(net), chain_id(net), "--broadcast", "script/Deploy.s.sol"]
24+
result = run_subprocess(deployment_command, "DataFeedFeeder deployment")
25+
data_feeder_address = result.split("Deployed DataFeedFeeder to ")[1].split("\n")[0].strip()
26+
27+
if (data_feeder_address.find('0x') != 0 or len(data_feeder_address) != 42):
28+
print("Deployment was successfull, but address parsing from server response FAILED", file=sys.stderr)
29+
print("expected address afrer \"Deployed DataFeedFeeder to\"\n", file=sys.stderr)
30+
print("response:", result, file=sys.stderr)
2431
sys.exit(1)
25-
print("===================================")
2632

27-
data_feeder_address = result.stdout.split("Deployed DataFeedFeeder to ")[1].split("\n")[0]
28-
file = open('cli/addresses/feeder/address.txt', 'w')
33+
if not os.path.exists(os.path.dirname(address_path(net.value, "feeder"))):
34+
os.makedirs(os.path.dirname(address_path(net.value, "feeder")))
35+
36+
file = open(address_path(net.value, "feeder"), 'w')
2937
file.write(data_feeder_address)
38+
print("wrote address to", address_path(net.value, "feeder"), "\n======================================")
39+
file.close()
40+
3041
file.close()
3142

3243

33-
def request_storage_addresses(pair_name):
34-
file = open('cli/addresses/feeder/address.txt', 'r')
35-
data_feeder_address = file.readline().strip()
44+
def request_storage_addresses(net, pair_name):
45+
command = [ "cast", "call", rpc_url(net), get_feeder_address(net.value), "getPairStorageAddress(string)(address)", pair_name]
46+
result = run_subprocess(command, "request DataFeedStorage address for " + pair_name + " ")
47+
48+
file = open(address_path(net.value, pair_name), 'w')
49+
print("wrote address to", address_path(net.value, pair_name), "\n======================================")
50+
file.write(result.strip())
3651
file.close()
3752

38-
command = [
39-
"cast",
40-
"call",
41-
"--rpc-url",
42-
"http://localhost:8545",
43-
data_feeder_address,
44-
"getPairStorageAddress(string)(address)",
45-
pair_name
46-
]
47-
48-
result = subprocess.run(command, capture_output=True, text=True)
49-
50-
exit_code = result.returncode
51-
52-
if (exit_code == 0):
53-
print("Successfully requested DataFeedStorage address for", pair_name, ":", result.stdout)
54-
file = open('cli/addresses/' + pair_name + ".txt", 'w')
55-
file.write(result.stdout)
56-
file.close()
57-
else:
58-
print("DataFeedStorage address request for", pair_name, " has FAILED!")
59-
print(result.stderr)
60-
sys.exit(1)
61-
print("===================================")
6253

54+
parser = argparse.ArgumentParser(description="Data feeder parameters")
55+
parser.add_argument('-n', '--network', type=parse_network, required=True, help="Choose network (local, sepolia, eth_mainnet)")
6356

57+
args = parser.parse_args()
6458

65-
deployment_command = [
66-
"forge",
67-
"script",
68-
"--rpc-url",
69-
"http://localhost:8545",
70-
"--broadcast",
71-
"script/Deploy.s.sol"
72-
]
7359

74-
deploy_data_feeder("DataFeedFeeder deployment", deployment_command)
60+
deploy_data_feeder(args.network)
7561

76-
request_storage_addresses("ETHBTC")
77-
request_storage_addresses("BTCUSDT")
78-
request_storage_addresses("ETHUSDT")
79-
request_storage_addresses("ETHUSDC")
62+
for p in pair_name_enum:
63+
request_storage_addresses(args.network, p.value)

cli/feed_feeder.py

+38-24
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,52 @@
1-
import subprocess
21
import sys
2+
import argparse
3+
from utils.network import *
34

4-
def feed_test_data(test_input_nr):
5-
file = open('cli/addresses/feeder/address.txt', 'r')
6-
data_feeder_address = file.readline().strip()
7-
file.close()
85

6+
def prepare_json (_binance_flag, _test_set_nr, binance_json_file):
7+
if ((not _binance_flag) and (_test_set_nr is None)) == True:
8+
print("Use ether the --binance or --test-set-nr=1 or --test-set-nr=2 flag")
9+
sys.exit(1)
10+
11+
test_input_file = "test_inputs/0" + str(_test_set_nr) + ".json"
12+
13+
if _binance_flag:
14+
run_subprocess(["python3", "data-provider/script.py"], "request from binance")
15+
16+
if _test_set_nr is not None:
17+
if not os.path.isfile(test_input_file):
18+
print(test_input_file, "file does not exist")
19+
sys.exit(1)
20+
run_subprocess(["cp", test_input_file, binance_json_file], "copy test input to prover input dir")
21+
22+
23+
def feed_data(net, binance_json_file):
924
command = [
1025
"cargo",
1126
"run",
1227
"--bin",
1328
"publisher",
1429
"--",
15-
"--chain-id=31337",
16-
"--rpc-url=http://localhost:8545",
17-
"--contract=" + data_feeder_address,
18-
"--json-path=test_inputs/0" + str(test_input_nr) + ".json"]
30+
chain_id(net),
31+
rpc_url(net),
32+
"--contract=" + get_feeder_address(net.value),
33+
"--json-path=" + binance_json_file
34+
]
1935

20-
result = subprocess.run(command, capture_output=True, text=True)
36+
run_subprocess(command, "DataFeeder feeding")
2137

22-
exit_code = result.returncode
2338

24-
if (exit_code == 0):
25-
print("Successfully feeded data_feeder")
26-
print(result.stdout)
27-
else:
28-
print("Data feeder feeding has FAILED!")
29-
print(result.stderr)
30-
sys.exit(1)
31-
print("===================================")
39+
parser = argparse.ArgumentParser(description="Data feeder parameters")
40+
parser.add_argument('-n', '--network', type=parse_network, required=True, help="Choose network (local, sepolia, eth_mainnet)")
41+
42+
data_source_group = parser.add_mutually_exclusive_group()
43+
data_source_group.add_argument('--binance', action='store_true', help='Request data from binance and feed')
44+
data_source_group.add_argument('-nr', '--test-set-nr', action='store', type=int, help='Take dataset from test_inputs/, possible values: 1,2')
45+
46+
args = parser.parse_args()
47+
3248

33-
if len(sys.argv) > 1:
34-
number = int(sys.argv[1])
35-
feed_test_data(number)
36-
else:
37-
print("Enter number of the test file you want to prove (1, 2)")
49+
binance_json_file = "stripped_prices.json"
50+
prepare_json(args.binance, args.test_set_nr, binance_json_file)
51+
feed_data(args.network, binance_json_file)
3852

cli/request_storage.py

+59-45
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,71 @@
11
import subprocess
22
import sys
3+
from datetime import datetime
4+
from utils.network import *
35

4-
def get(pair_name, request_name):
5-
file = open('cli/addresses/' + pair_name + '.txt', 'r')
6+
7+
class method_enum(enum.Enum):
8+
DECIMALS = "decimals"
9+
DESCRIPTION = "description"
10+
LATEST_ANSWER = "latestAnswer"
11+
LATEST_ROUND = "latestRound"
12+
LATEST_ROUND_DATA = "latestRoundData"
13+
14+
def parse_request(value):
15+
try:
16+
return method_enum(value)
17+
except ValueError:
18+
raise argparse.ArgumentTypeError(f"Invalid network: {value}. Possible valies: {[n.value for n in method_enum]}")
19+
20+
def get_request_signature(req):
21+
match req:
22+
case method_enum.DECIMALS:
23+
return "decimals()(uint8)"
24+
case method_enum.DESCRIPTION:
25+
return "description()(string)"
26+
case method_enum.LATEST_ANSWER:
27+
return "latestAnswer()(uint256)"
28+
case method_enum.LATEST_ROUND:
29+
return "latestRound()(uint256)"
30+
case method_enum.LATEST_ROUND_DATA:
31+
return "latestRoundData()(uint80, uint256, uint256, uint256, uint80)"
32+
33+
def do_request(pair, net, req):
34+
file = open('cli/addresses/' + net.value + '/' + pair.value + '.txt', 'r')
635
storage_address = file.readline().strip()
736
file.close()
837

9-
match request_name:
10-
case "decimals":
11-
request_prod = 'decimals()(uint8)'
12-
case "description":
13-
request_prod = 'description()(string)'
14-
case "latestAnswer":
15-
request_prod = 'latestAnswer()(uint256)'
16-
case "latestRound":
17-
request_prod = 'latestRound()(uint256)'
18-
case _:
19-
request_prod = 'latestRoundData()(uint80, uint256, uint256, uint256, uint80)'
20-
21-
print("requesting method", request_prod)
22-
23-
command = ["cast", "call", "--rpc-url", "http://localhost:8545", storage_address, request_prod]
24-
25-
26-
result = subprocess.run(command, capture_output=True, text=True)
27-
28-
exit_code = result.returncode
29-
30-
if (exit_code == 0):
31-
print("Successfully requested data from storage")
32-
if (request_prod != 'latestRoundData()(uint80, uint256, uint256, uint256, uint80)'):
33-
print(result.stdout)
34-
else:
35-
res = result.stdout
36-
res = res.split("\n")
37-
print("round number:", res[0])
38-
print("answer:", res[1], "(price:", int(res[1].split(" [")[0]) / 100000, ")")
39-
print("timestamp:", res[2])
38+
print("requesting method", req.value)
39+
40+
command = [
41+
"cast",
42+
"call",
43+
rpc_url(net),
44+
storage_address,
45+
get_request_signature(req)
46+
]
47+
48+
result = run_subprocess(command, "request method '" + req.value + "' for " + pair.value)
49+
50+
if req == method_enum.LATEST_ROUND_DATA:
51+
result = result.split("\n")
52+
print("round number:", result[0])
53+
print("answer:", result[1], "(price:", int(result[1].split(" [")[0]) / 100000, ")")
54+
55+
timestamp = int(int(result[2].split(" [")[0]) / 1000)
56+
readable_date = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
57+
print("timestamp:", timestamp, "(human readable:)", readable_date)
4058
else:
41-
print("Storage request has failed")
42-
print(result.stderr)
43-
sys.exit(1)
59+
print("result:", result)
4460
print("===================================")
4561

46-
if len(sys.argv) == 2:
47-
pair = sys.argv[1]
48-
get(pair, "")
49-
elif len(sys.argv) > 2:
50-
pair = sys.argv[1]
51-
request = sys.argv[2]
52-
get(pair, request)
53-
else:
54-
print("Enter pair name and request")
5562

63+
parser = argparse.ArgumentParser(description="Storage request parameters")
64+
parser.add_argument('-n', '--network', type=parse_network, required=True, help="Choose network (local, sepolia, eth_mainnet)")
65+
parser.add_argument('-p', '--pair', type=parse_pairname, required=True, help="Choose pair (ETHBTC, BTCUSDT, ETHUSDT, ETHUSDC)")
66+
parser.add_argument('-m', '--method', type=parse_request, required=True,
67+
help="Choose request (decimals, description, latestAnswer, latestRound, latestRoundData)")
5668

69+
args = parser.parse_args()
5770

71+
do_request(args.pair, args.network, args.method)

0 commit comments

Comments
 (0)