-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathscrvusd_keeper.py
196 lines (167 loc) · 47.2 KB
/
scrvusd_keeper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
import time
from time import sleep
from web3 import Web3
from web3.contract import Contract
import json
import os
from getpass import getpass
from eth_account import account, Account
from submit_scrvusd_price import generate_proof
CHAIN = "optimism" # ALTER
BLOCK_NUMBER = None # ALTER, None will take latest
ETH_NETWORK = f"https://eth-mainnet.alchemyapi.io/v2/{os.environ['WEB3_ETHEREUM_MAINNET_ALCHEMY_API_KEY']}" # ALTER
L2_NETWORK = { # ALTER
"optimism": f"https://opt-mainnet.g.alchemy.com/v2/{os.environ['WEB3_OPTIMISM_MAINNET_ALCHEMY_API_KEY']}",
"base": f"https://mainnet.base.org",
"fraxtal": f"https://rpc.frax.com",
"mantle": f"https://rpc.mantle.xyz/",
"arbitrum": f"https://arb-mainnet.g.alchemy.com/v2/{os.environ['WEB3_ARBITRUM_MAINNET_ALCHEMY_API_KEY']}",
"taiko": f"https://rpc.taiko.xyz"
}[CHAIN]
SCRVUSD = "0x0655977FEb2f289A4aB78af67BAB0d17aAb84367"
B_ORACLE, S_ORACLE, PROVER = {
"optimism": ("0x988d1037e9608B21050A8EFba0c6C45e01A3Bce7", "0xC772063cE3e622B458B706Dd2e36309418A1aE42", "0x47ca04Ee05f167583122833abfb0f14aC5677Ee4"),
"base": ("0x3c0a405E914337139992625D5100Ea141a9C4d11", "0x3d8EADb739D1Ef95dd53D718e4810721837c69c1", "0x6a2691068C7CbdA03292Ba0f9c77A25F658bAeF5"),
"fraxtal": ("0xbD2775B8eADaE81501898eB208715f0040E51882", "0x09F8D940EAD55853c51045bcbfE67341B686C071", "0x0094Ad026643994c8fB2136ec912D508B15fe0E5"),
"mantle": ("0x004A476B5B76738E34c86C7144554B9d34402F13", "0xbD2775B8eADaE81501898eB208715f0040E51882", "0x09F8D940EAD55853c51045bcbfE67341B686C071"),
# "arbitrum": ("0x47ca04Ee05f167583122833abfb0f14aC5677Ee4", "0x3195A313F409714e1f173ca095Dba7BfBb5767F7", "0x8Fb3Ec8f2d1Dc089E70CD61f1E49496d443B2124"), redeploy?
"taiko": {"0x1670000000000000000000000000000000000005", "0x070A5C8a99002F50C18B52B90e938BC477611b16", "0x004A476B5B76738E34c86C7144554B9d34402F13"},
}[CHAIN]
VERSION = {
"optimism": "ScrvusdOracle",
"base": "ScrvusdOracle",
"fraxtal": "ScrvusdOracle",
"mantle": "ScrvusdOracle",
# "arbitrum": "ScrvusdOracle",
"taiko": "ScrvusdOracleV1",
}[CHAIN]
last_update = 0 # time.time()
REL_CHANGE_THRESHOLD = 1.00005 # 0.5 bps, should be >1
APPLY_BLOCK_HASH = Web3.keccak(text="ApplyBlockHash(uint256,bytes32)").hex()
COMMIT_BLOCK_HASH = Web3.keccak(text="CommitBlockHash(address,uint256,bytes32)").hex()
eth_web3 = Web3(
provider=Web3.HTTPProvider(
ETH_NETWORK,
# {"verify_ssl": False},
),
# modules={"eth": (AsyncEth,)},
)
l2_web3 = Web3(
provider=Web3.HTTPProvider(
L2_NETWORK,
# {"verify_ssl": False},
),
# modules={"eth": (AsyncEth,)},
)
def account_load_pkey(fname):
path = os.path.expanduser(os.path.join('~', '.brownie', 'accounts', fname + '.json'))
with open(path, 'r') as f:
pkey = account.decode_keyfile_json(json.load(f), getpass())
return pkey
wallet = Account.from_key(account_load_pkey("curve")) # ALTER
def _retrieve_last_applied_block(baddr, logs) -> (int, int):
block_number = -1
apply_block_number = -1
for log in logs:
if log["address"] != baddr:
continue
if log.get("topics") and log["topics"][0].hex() == APPLY_BLOCK_HASH:
block_number = max(block_number, int(log["topics"][1].hex(), 16))
apply_block_number = max(apply_block_number, int(log["blockNumber"]))
if log.get("event") and log["event"] == "ApplyBlockHash":
block_number = max(block_number, log["args"]["number"])
apply_block_number = max(apply_block_number, int(log["blockNumber"]))
return block_number, apply_block_number
def fetch_block_number(boracle):
if CHAIN in ["taiko"]:
# Fetch last available
to = l2_web3.eth.block_number
logs = boracle.events.ChainDataSynced().get_logs(
from_block=to - 100,
to_block=to,
argument_filters={
"chainId": 1,
"kind": "0x73e6d340850343cc6f001515dc593377337c95a6ffe034fe1e844d4dab5da169",
}
)
block_number = max(map(lambda log: log["args"]["blockId"], logs))
time.sleep(1)
print(f"Fetched block: {block_number}")
else:
# Apply latest available blockhash
tx = boracle.functions.apply().build_transaction(
{
"from": wallet.address,
"nonce": l2_web3.eth.get_transaction_count(wallet.address),
}
)
signed_tx = l2_web3.eth.account.sign_transaction(tx, private_key=wallet.key)
tx_hash = l2_web3.eth.send_raw_transaction(signed_tx.raw_transaction)
l2_web3.eth.wait_for_transaction_receipt(tx_hash)
tx_receipt = l2_web3.eth.get_transaction_receipt(tx_hash)
block_number, _ = _retrieve_last_applied_block(boracle.address, tx_receipt["logs"])
assert block_number > 0, "Applied block number not retrieved"
print(f"Applied block: {block_number}")
time.sleep(1)
return block_number
def prove(boracle, prover, block_number=None):
if not block_number:
block_number = fetch_block_number(boracle)
proofs = generate_proof(eth_web3, block_number)
if CHAIN in ["taiko"]:
if isinstance(prover, Contract):
tx = prover.functions.prove(block_number, bytes.fromhex(proofs[1])).build_transaction(
{
"from": wallet.address,
"nonce": l2_web3.eth.get_transaction_count(wallet.address),
}
)
signed_tx = l2_web3.eth.account.sign_transaction(tx, private_key=wallet.key)
l2_web3.eth.send_raw_transaction(signed_tx.raw_transaction)
l2_web3.eth.wait_for_transaction_receipt(signed_tx)
else:
prover.prove(block_number, bytes.fromhex(proofs[1]))
else:
tx = prover.functions.prove(bytes.fromhex(proofs[0]), bytes.fromhex(proofs[1])).build_transaction(
{
"from": wallet.address,
"nonce": l2_web3.eth.get_transaction_count(wallet.address),
}
)
signed_tx = l2_web3.eth.account.sign_transaction(tx, private_key=wallet.key)
l2_web3.eth.send_raw_transaction(signed_tx.raw_transaction)
l2_web3.eth.wait_for_transaction_receipt(signed_tx)
print(f"Submitted proof")
def time_to_update(scrvusd, soracle):
# can be any relative change or time
if time.time() - last_update >= 4 * 3600: # Every 4 hours
return True
price = scrvusd.functions.pricePerShare().call()
if VERSION == "ScrvusdOracle":
oracle_price = soracle.functions.price().call()[1] # take price.future = latest set
elif VERSION == "ScrvusdOracleV1":
oracle_price = soracle.functions.raw_price().call()
return price / oracle_price > REL_CHANGE_THRESHOLD
def loop():
scrvusd = eth_web3.eth.contract(SCRVUSD, abi=[{'name': 'Deposit', 'inputs': [{'name': 'sender', 'type': 'address', 'indexed': True}, {'name': 'owner', 'type': 'address', 'indexed': True}, {'name': 'assets', 'type': 'uint256', 'indexed': False}, {'name': 'shares', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'Withdraw', 'inputs': [{'name': 'sender', 'type': 'address', 'indexed': True}, {'name': 'receiver', 'type': 'address', 'indexed': True}, {'name': 'owner', 'type': 'address', 'indexed': True}, {'name': 'assets', 'type': 'uint256', 'indexed': False}, {'name': 'shares', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'Transfer', 'inputs': [{'name': 'sender', 'type': 'address', 'indexed': True}, {'name': 'receiver', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'Approval', 'inputs': [{'name': 'owner', 'type': 'address', 'indexed': True}, {'name': 'spender', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'StrategyChanged', 'inputs': [{'name': 'strategy', 'type': 'address', 'indexed': True}, {'name': 'change_type', 'type': 'uint256', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'StrategyReported', 'inputs': [{'name': 'strategy', 'type': 'address', 'indexed': True}, {'name': 'gain', 'type': 'uint256', 'indexed': False}, {'name': 'loss', 'type': 'uint256', 'indexed': False}, {'name': 'current_debt', 'type': 'uint256', 'indexed': False}, {'name': 'protocol_fees', 'type': 'uint256', 'indexed': False}, {'name': 'total_fees', 'type': 'uint256', 'indexed': False}, {'name': 'total_refunds', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'DebtUpdated', 'inputs': [{'name': 'strategy', 'type': 'address', 'indexed': True}, {'name': 'current_debt', 'type': 'uint256', 'indexed': False}, {'name': 'new_debt', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'RoleSet', 'inputs': [{'name': 'account', 'type': 'address', 'indexed': True}, {'name': 'role', 'type': 'uint256', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateFutureRoleManager', 'inputs': [{'name': 'future_role_manager', 'type': 'address', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateRoleManager', 'inputs': [{'name': 'role_manager', 'type': 'address', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateAccountant', 'inputs': [{'name': 'accountant', 'type': 'address', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateDepositLimitModule', 'inputs': [{'name': 'deposit_limit_module', 'type': 'address', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateWithdrawLimitModule', 'inputs': [{'name': 'withdraw_limit_module', 'type': 'address', 'indexed': True}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateDefaultQueue', 'inputs': [{'name': 'new_default_queue', 'type': 'address[]', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateUseDefaultQueue', 'inputs': [{'name': 'use_default_queue', 'type': 'bool', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateAutoAllocate', 'inputs': [{'name': 'auto_allocate', 'type': 'bool', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdatedMaxDebtForStrategy', 'inputs': [{'name': 'sender', 'type': 'address', 'indexed': True}, {'name': 'strategy', 'type': 'address', 'indexed': True}, {'name': 'new_debt', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateDepositLimit', 'inputs': [{'name': 'deposit_limit', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateMinimumTotalIdle', 'inputs': [{'name': 'minimum_total_idle', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'UpdateProfitMaxUnlockTime', 'inputs': [{'name': 'profit_max_unlock_time', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'DebtPurchased', 'inputs': [{'name': 'strategy', 'type': 'address', 'indexed': True}, {'name': 'amount', 'type': 'uint256', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'Shutdown', 'inputs': [], 'anonymous': False, 'type': 'event'}, {'stateMutability': 'nonpayable', 'type': 'constructor', 'inputs': [], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'initialize', 'inputs': [{'name': 'asset', 'type': 'address'}, {'name': 'name', 'type': 'string'}, {'name': 'symbol', 'type': 'string'}, {'name': 'role_manager', 'type': 'address'}, {'name': 'profit_max_unlock_time', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'setName', 'inputs': [{'name': 'name', 'type': 'string'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'setSymbol', 'inputs': [{'name': 'symbol', 'type': 'string'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_accountant', 'inputs': [{'name': 'new_accountant', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_default_queue', 'inputs': [{'name': 'new_default_queue', 'type': 'address[]'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_use_default_queue', 'inputs': [{'name': 'use_default_queue', 'type': 'bool'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_auto_allocate', 'inputs': [{'name': 'auto_allocate', 'type': 'bool'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_deposit_limit', 'inputs': [{'name': 'deposit_limit', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_deposit_limit', 'inputs': [{'name': 'deposit_limit', 'type': 'uint256'}, {'name': 'override', 'type': 'bool'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_deposit_limit_module', 'inputs': [{'name': 'deposit_limit_module', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_deposit_limit_module', 'inputs': [{'name': 'deposit_limit_module', 'type': 'address'}, {'name': 'override', 'type': 'bool'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_withdraw_limit_module', 'inputs': [{'name': 'withdraw_limit_module', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_minimum_total_idle', 'inputs': [{'name': 'minimum_total_idle', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'setProfitMaxUnlockTime', 'inputs': [{'name': 'new_profit_max_unlock_time', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'set_role', 'inputs': [{'name': 'account', 'type': 'address'}, {'name': 'role', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'add_role', 'inputs': [{'name': 'account', 'type': 'address'}, {'name': 'role', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'remove_role', 'inputs': [{'name': 'account', 'type': 'address'}, {'name': 'role', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'transfer_role_manager', 'inputs': [{'name': 'role_manager', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'accept_role_manager', 'inputs': [], 'outputs': []}, {'stateMutability': 'view', 'type': 'function', 'name': 'isShutdown', 'inputs': [], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'unlockedShares', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'pricePerShare', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'get_default_queue', 'inputs': [], 'outputs': [{'name': '', 'type': 'address[]'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'process_report', 'inputs': [{'name': 'strategy', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}, {'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'buy_debt', 'inputs': [{'name': 'strategy', 'type': 'address'}, {'name': 'amount', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'add_strategy', 'inputs': [{'name': 'new_strategy', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'add_strategy', 'inputs': [{'name': 'new_strategy', 'type': 'address'}, {'name': 'add_to_queue', 'type': 'bool'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'revoke_strategy', 'inputs': [{'name': 'strategy', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'force_revoke_strategy', 'inputs': [{'name': 'strategy', 'type': 'address'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'update_max_debt_for_strategy', 'inputs': [{'name': 'strategy', 'type': 'address'}, {'name': 'new_max_debt', 'type': 'uint256'}], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'update_debt', 'inputs': [{'name': 'strategy', 'type': 'address'}, {'name': 'target_debt', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'update_debt', 'inputs': [{'name': 'strategy', 'type': 'address'}, {'name': 'target_debt', 'type': 'uint256'}, {'name': 'max_loss', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'shutdown_vault', 'inputs': [], 'outputs': []}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'deposit', 'inputs': [{'name': 'assets', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'mint', 'inputs': [{'name': 'shares', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'withdraw', 'inputs': [{'name': 'assets', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}, {'name': 'owner', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'withdraw', 'inputs': [{'name': 'assets', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}, {'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'withdraw', 'inputs': [{'name': 'assets', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}, {'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}, {'name': 'strategies', 'type': 'address[]'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'redeem', 'inputs': [{'name': 'shares', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}, {'name': 'owner', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'redeem', 'inputs': [{'name': 'shares', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}, {'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'redeem', 'inputs': [{'name': 'shares', 'type': 'uint256'}, {'name': 'receiver', 'type': 'address'}, {'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}, {'name': 'strategies', 'type': 'address[]'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'approve', 'inputs': [{'name': 'spender', 'type': 'address'}, {'name': 'amount', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'transfer', 'inputs': [{'name': 'receiver', 'type': 'address'}, {'name': 'amount', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'transferFrom', 'inputs': [{'name': 'sender', 'type': 'address'}, {'name': 'receiver', 'type': 'address'}, {'name': 'amount', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'permit', 'inputs': [{'name': 'owner', 'type': 'address'}, {'name': 'spender', 'type': 'address'}, {'name': 'amount', 'type': 'uint256'}, {'name': 'deadline', 'type': 'uint256'}, {'name': 'v', 'type': 'uint8'}, {'name': 'r', 'type': 'bytes32'}, {'name': 's', 'type': 'bytes32'}], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'balanceOf', 'inputs': [{'name': 'addr', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'totalSupply', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'totalAssets', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'totalIdle', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'totalDebt', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'convertToShares', 'inputs': [{'name': 'assets', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'previewDeposit', 'inputs': [{'name': 'assets', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'previewMint', 'inputs': [{'name': 'shares', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'convertToAssets', 'inputs': [{'name': 'shares', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxDeposit', 'inputs': [{'name': 'receiver', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxMint', 'inputs': [{'name': 'receiver', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxWithdraw', 'inputs': [{'name': 'owner', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxWithdraw', 'inputs': [{'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxWithdraw', 'inputs': [{'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}, {'name': 'strategies', 'type': 'address[]'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxRedeem', 'inputs': [{'name': 'owner', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxRedeem', 'inputs': [{'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'maxRedeem', 'inputs': [{'name': 'owner', 'type': 'address'}, {'name': 'max_loss', 'type': 'uint256'}, {'name': 'strategies', 'type': 'address[]'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'previewWithdraw', 'inputs': [{'name': 'assets', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'previewRedeem', 'inputs': [{'name': 'shares', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'FACTORY', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'pure', 'type': 'function', 'name': 'apiVersion', 'inputs': [], 'outputs': [{'name': '', 'type': 'string'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'assess_share_of_unrealised_losses', 'inputs': [{'name': 'strategy', 'type': 'address'}, {'name': 'assets_needed', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'profitMaxUnlockTime', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'fullProfitUnlockDate', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'profitUnlockingRate', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'lastProfitUpdate', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'DOMAIN_SEPARATOR', 'inputs': [], 'outputs': [{'name': '', 'type': 'bytes32'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'asset', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'decimals', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint8'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'strategies', 'inputs': [{'name': 'arg0', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'tuple', 'components': [{'name': 'activation', 'type': 'uint256'}, {'name': 'last_report', 'type': 'uint256'}, {'name': 'current_debt', 'type': 'uint256'}, {'name': 'max_debt', 'type': 'uint256'}]}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'default_queue', 'inputs': [{'name': 'arg0', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'use_default_queue', 'inputs': [], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'auto_allocate', 'inputs': [], 'outputs': [{'name': '', 'type': 'bool'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'allowance', 'inputs': [{'name': 'arg0', 'type': 'address'}, {'name': 'arg1', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'minimum_total_idle', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'deposit_limit', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'accountant', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'deposit_limit_module', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'withdraw_limit_module', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'roles', 'inputs': [{'name': 'arg0', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'role_manager', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'future_role_manager', 'inputs': [], 'outputs': [{'name': '', 'type': 'address'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'name', 'inputs': [], 'outputs': [{'name': '', 'type': 'string'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'symbol', 'inputs': [], 'outputs': [{'name': '', 'type': 'string'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'nonces', 'inputs': [{'name': 'arg0', 'type': 'address'}], 'outputs': [{'name': '', 'type': 'uint256'}]}])
if CHAIN in ["taiko"]:
boracle = l2_web3.eth.contract(B_ORACLE, abi=[{'inputs': [], 'name': 'FUNC_NOT_IMPLEMENTED', 'type': 'error'}, {'inputs': [], 'name': 'INVALID_PAUSE_STATUS', 'type': 'error'}, {'inputs': [], 'name': 'LTP_INVALID_ACCOUNT_PROOF', 'type': 'error'}, {'inputs': [], 'name': 'LTP_INVALID_INCLUSION_PROOF', 'type': 'error'}, {'inputs': [], 'name': 'REENTRANT_CALL', 'type': 'error'}, {'inputs': [], 'name': 'RESOLVER_DENIED', 'type': 'error'}, {'inputs': [], 'name': 'RESOLVER_INVALID_MANAGER', 'type': 'error'}, {'inputs': [], 'name': 'RESOLVER_UNEXPECTED_CHAINID', 'type': 'error'}, {'inputs': [{'internalType': 'uint64', 'name': 'chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': 'name', 'type': 'bytes32'}], 'name': 'RESOLVER_ZERO_ADDR', 'type': 'error'}, {'inputs': [], 'name': 'SS_EMPTY_PROOF', 'type': 'error'}, {'inputs': [], 'name': 'SS_INVALID_HOPS_WITH_LOOP', 'type': 'error'}, {'inputs': [], 'name': 'SS_INVALID_LAST_HOP_CHAINID', 'type': 'error'}, {'inputs': [], 'name': 'SS_INVALID_MID_HOP_CHAINID', 'type': 'error'}, {'inputs': [], 'name': 'SS_INVALID_STATE', 'type': 'error'}, {'inputs': [], 'name': 'SS_SIGNAL_NOT_FOUND', 'type': 'error'}, {'inputs': [], 'name': 'SS_UNAUTHORIZED', 'type': 'error'}, {'inputs': [], 'name': 'ZERO_ADDRESS', 'type': 'error'}, {'inputs': [], 'name': 'ZERO_VALUE', 'type': 'error'}, {'anonymous': False, 'inputs': [{'indexed': False, 'internalType': 'address', 'name': 'previousAdmin', 'type': 'address'}, {'indexed': False, 'internalType': 'address', 'name': 'newAdmin', 'type': 'address'}], 'name': 'AdminChanged', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'internalType': 'address', 'name': 'addr', 'type': 'address'}, {'indexed': False, 'internalType': 'bool', 'name': 'authorized', 'type': 'bool'}], 'name': 'Authorized', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'internalType': 'address', 'name': 'beacon', 'type': 'address'}], 'name': 'BeaconUpgraded', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'internalType': 'uint64', 'name': 'chainId', 'type': 'uint64'}, {'indexed': True, 'internalType': 'uint64', 'name': 'blockId', 'type': 'uint64'}, {'indexed': True, 'internalType': 'bytes32', 'name': 'kind', 'type': 'bytes32'}, {'indexed': False, 'internalType': 'bytes32', 'name': 'data', 'type': 'bytes32'}, {'indexed': False, 'internalType': 'bytes32', 'name': 'signal', 'type': 'bytes32'}], 'name': 'ChainDataSynced', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': False, 'internalType': 'uint8', 'name': 'version', 'type': 'uint8'}], 'name': 'Initialized', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'internalType': 'address', 'name': 'previousOwner', 'type': 'address'}, {'indexed': True, 'internalType': 'address', 'name': 'newOwner', 'type': 'address'}], 'name': 'OwnershipTransferStarted', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'internalType': 'address', 'name': 'previousOwner', 'type': 'address'}, {'indexed': True, 'internalType': 'address', 'name': 'newOwner', 'type': 'address'}], 'name': 'OwnershipTransferred', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': False, 'internalType': 'address', 'name': 'account', 'type': 'address'}], 'name': 'Paused', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': False, 'internalType': 'address', 'name': 'app', 'type': 'address'}, {'indexed': False, 'internalType': 'bytes32', 'name': 'signal', 'type': 'bytes32'}, {'indexed': False, 'internalType': 'bytes32', 'name': 'slot', 'type': 'bytes32'}, {'indexed': False, 'internalType': 'bytes32', 'name': 'value', 'type': 'bytes32'}], 'name': 'SignalSent', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': False, 'internalType': 'address', 'name': 'account', 'type': 'address'}], 'name': 'Unpaused', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'internalType': 'address', 'name': 'implementation', 'type': 'address'}], 'name': 'Upgraded', 'type': 'event'}, {'inputs': [], 'name': 'acceptOwnership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'addressManager', 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': '_addr', 'type': 'address'}, {'internalType': 'bool', 'name': '_authorize', 'type': 'bool'}], 'name': 'authorize', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'address', 'name': '_app', 'type': 'address'}, {'internalType': 'bytes32', 'name': '_signal', 'type': 'bytes32'}], 'name': 'getSignalSlot', 'outputs': [{'internalType': 'bytes32', 'name': '', 'type': 'bytes32'}], 'stateMutability': 'pure', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_kind', 'type': 'bytes32'}, {'internalType': 'uint64', 'name': '_blockId', 'type': 'uint64'}], 'name': 'getSyncedChainData', 'outputs': [{'internalType': 'uint64', 'name': 'blockId_', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': 'chainData_', 'type': 'bytes32'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'impl', 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'inNonReentrant', 'outputs': [{'internalType': 'bool', 'name': '', 'type': 'bool'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': '_owner', 'type': 'address'}, {'internalType': 'address', 'name': '_addressManager', 'type': 'address'}], 'name': 'init', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': 'addr', 'type': 'address'}], 'name': 'isAuthorized', 'outputs': [{'internalType': 'bool', 'name': 'authorized', 'type': 'bool'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_kind', 'type': 'bytes32'}, {'internalType': 'uint64', 'name': '_blockId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_chainData', 'type': 'bytes32'}], 'name': 'isChainDataSynced', 'outputs': [{'internalType': 'bool', 'name': '', 'type': 'bool'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': '_app', 'type': 'address'}, {'internalType': 'bytes32', 'name': '_signal', 'type': 'bytes32'}], 'name': 'isSignalSent', 'outputs': [{'internalType': 'bool', 'name': '', 'type': 'bool'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'lastUnpausedAt', 'outputs': [{'internalType': 'uint64', 'name': '', 'type': 'uint64'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'owner', 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'pause', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'paused', 'outputs': [{'internalType': 'bool', 'name': '', 'type': 'bool'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'pendingOwner', 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'address', 'name': '_app', 'type': 'address'}, {'internalType': 'bytes32', 'name': '_signal', 'type': 'bytes32'}, {'internalType': 'bytes', 'name': '_proof', 'type': 'bytes'}], 'name': 'proveSignalReceived', 'outputs': [{'internalType': 'uint256', 'name': 'numCacheOps_', 'type': 'uint256'}], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'proxiableUUID', 'outputs': [{'internalType': 'bytes32', 'name': '', 'type': 'bytes32'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'renounceOwnership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_name', 'type': 'bytes32'}, {'internalType': 'bool', 'name': '_allowZeroAddress', 'type': 'bool'}], 'name': 'resolve', 'outputs': [{'internalType': 'addresspayable', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'bytes32', 'name': '_name', 'type': 'bytes32'}, {'internalType': 'bool', 'name': '_allowZeroAddress', 'type': 'bool'}], 'name': 'resolve', 'outputs': [{'internalType': 'addresspayable', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'bytes32', 'name': '_signal', 'type': 'bytes32'}], 'name': 'sendSignal', 'outputs': [{'internalType': 'bytes32', 'name': '', 'type': 'bytes32'}], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_kind', 'type': 'bytes32'}, {'internalType': 'uint64', 'name': '_blockId', 'type': 'uint64'}], 'name': 'signalForChainData', 'outputs': [{'internalType': 'bytes32', 'name': '', 'type': 'bytes32'}], 'stateMutability': 'pure', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_kind', 'type': 'bytes32'}, {'internalType': 'uint64', 'name': '_blockId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': '_chainData', 'type': 'bytes32'}], 'name': 'syncChainData', 'outputs': [{'internalType': 'bytes32', 'name': '', 'type': 'bytes32'}], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': 'chainId', 'type': 'uint64'}, {'internalType': 'bytes32', 'name': 'kind', 'type': 'bytes32'}], 'name': 'topBlockId', 'outputs': [{'internalType': 'uint64', 'name': 'blockId', 'type': 'uint64'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': 'newOwner', 'type': 'address'}], 'name': 'transferOwnership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'unpause', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': 'newImplementation', 'type': 'address'}], 'name': 'upgradeTo', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': 'newImplementation', 'type': 'address'}, {'internalType': 'bytes', 'name': 'data', 'type': 'bytes'}], 'name': 'upgradeToAndCall', 'outputs': [], 'stateMutability': 'payable', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_chainId', 'type': 'uint64'}, {'internalType': 'address', 'name': '_app', 'type': 'address'}, {'internalType': 'bytes32', 'name': '_signal', 'type': 'bytes32'}, {'internalType': 'bytes', 'name': '_proof', 'type': 'bytes'}], 'name': 'verifySignalReceived', 'outputs': [], 'stateMutability': 'view', 'type': 'function'}])
prover = l2_web3.eth.contract(PROVER, abi=[{'inputs': [{'internalType': 'address', 'name': '_scrvusd_oracle', 'type': 'address'}], 'stateMutability': 'nonpayable', 'type': 'constructor'}, {'inputs': [], 'name': 'SCRVUSD_ORACLE', 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'SIGNAL_SERVICE', 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'uint64', 'name': '_block_number', 'type': 'uint64'}, {'internalType': 'bytes', 'name': '_proof_rlp', 'type': 'bytes'}], 'name': 'prove', 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}], 'stateMutability': 'nonpayable', 'type': 'function'}])
else:
boracle = l2_web3.eth.contract(B_ORACLE, abi=[{'name': 'CommitBlockHash', 'inputs': [{'name': 'committer', 'type': 'address', 'indexed': True}, {'name': 'number', 'type': 'uint256', 'indexed': True}, {'name': 'hash', 'type': 'bytes32', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'name': 'ApplyBlockHash', 'inputs': [{'name': 'number', 'type': 'uint256', 'indexed': True}, {'name': 'hash', 'type': 'bytes32', 'indexed': False}], 'anonymous': False, 'type': 'event'}, {'stateMutability': 'view', 'type': 'function', 'name': 'get_block_hash', 'inputs': [{'name': '_number', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'bytes32'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'commit', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'nonpayable', 'type': 'function', 'name': 'apply', 'inputs': [], 'outputs': [{'name': '', 'type': 'uint256'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'block_hash', 'inputs': [{'name': 'arg0', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'bytes32'}]}, {'stateMutability': 'view', 'type': 'function', 'name': 'commitments', 'inputs': [{'name': 'arg0', 'type': 'address'}, {'name': 'arg1', 'type': 'uint256'}], 'outputs': [{'name': '', 'type': 'bytes32'}]}])
prover = l2_web3.eth.contract(PROVER, abi=[{"inputs": [{"internalType": "bytes", "name": "_block_header_rlp", "type": "bytes"}, {"internalType": "bytes", "name": "_proof_rlp", "type": "bytes"}], "name": "prove", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "nonpayable", "type": "function"}])
if VERSION == "ScrvusdOracle":
soracle = l2_web3.eth.contract(S_ORACLE, abi=[{'anonymous': False, 'inputs': [{'indexed': False, 'name': 'new_price', 'type': 'uint256'}, {'indexed': False, 'name': 'at', 'type': 'uint256'}], 'name': 'PriceUpdate', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': False, 'name': 'prover', 'type': 'address'}], 'name': 'SetProver', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'name': 'previous_owner', 'type': 'address'}, {'indexed': True, 'name': 'new_owner', 'type': 'address'}], 'name': 'OwnershipTransferred', 'type': 'event'}, {'inputs': [{'name': 'new_owner', 'type': 'address'}], 'name': 'transfer_ownership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'renounce_ownership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'owner', 'outputs': [{'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'pricePerShare', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': 'ts', 'type': 'uint256'}], 'name': 'pricePerShare', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'pricePerAsset', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': 'ts', 'type': 'uint256'}], 'name': 'pricePerAsset', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'price_oracle', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': 'i', 'type': 'uint256'}], 'name': 'price_oracle', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_parameters', 'type': 'uint256[8]'}], 'name': 'update_price', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'name': '_max_acceleration', 'type': 'uint256'}], 'name': 'set_max_acceleration', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'name': '_prover', 'type': 'address'}], 'name': 'set_prover', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'version', 'outputs': [{'name': '', 'type': 'string'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'prover', 'outputs': [{'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'price', 'outputs': [{'components': [{'name': 'previous', 'type': 'uint256'}, {'name': 'future', 'type': 'uint256'}], 'name': '', 'type': 'tuple'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'time', 'outputs': [{'components': [{'name': 'previous', 'type': 'uint256'}, {'name': 'future', 'type': 'uint256'}], 'name': '', 'type': 'tuple'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'max_acceleration', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_initial_price', 'type': 'uint256'}, {'name': '_max_acceleration', 'type': 'uint256'}], 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor'}])
elif VERSION == "ScrvusdOracleV1":
soracle = l2_web3.eth.contract(S_ORACLE, abi=[{'anonymous': False, 'inputs': [{'indexed': False, 'name': 'new_price', 'type': 'uint256'}, {'indexed': False, 'name': 'price_params_ts', 'type': 'uint256'}], 'name': 'PriceUpdate', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': False, 'name': 'prover', 'type': 'address'}], 'name': 'SetProver', 'type': 'event'}, {'anonymous': False, 'inputs': [{'indexed': True, 'name': 'previous_owner', 'type': 'address'}, {'indexed': True, 'name': 'new_owner', 'type': 'address'}], 'name': 'OwnershipTransferred', 'type': 'event'}, {'inputs': [{'name': 'new_owner', 'type': 'address'}], 'name': 'transfer_ownership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'renounce_ownership', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'owner', 'outputs': [{'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'price_v0', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_i', 'type': 'uint256'}], 'name': 'price_v0', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'price_v1', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_i', 'type': 'uint256'}], 'name': 'price_v1', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'raw_price', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_i', 'type': 'uint256'}], 'name': 'raw_price', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_i', 'type': 'uint256'}, {'name': '_ts', 'type': 'uint256'}], 'name': 'raw_price', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_parameters', 'type': 'uint256[7]'}, {'name': 'ts', 'type': 'uint256'}], 'name': 'update_price', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'name': '_max_acceleration', 'type': 'uint256'}], 'name': 'set_max_acceleration', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [{'name': '_prover', 'type': 'address'}], 'name': 'set_prover', 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'function'}, {'inputs': [], 'name': 'version', 'outputs': [{'name': '', 'type': 'string'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'prover', 'outputs': [{'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [], 'name': 'max_acceleration', 'outputs': [{'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_initial_price', 'type': 'uint256'}, {'name': '_max_acceleration', 'type': 'uint256'}], 'outputs': [], 'stateMutability': 'nonpayable', 'type': 'constructor'}])
while True:
if time_to_update(scrvusd, soracle):
try:
prove(boracle, prover, block_number=BLOCK_NUMBER)
global last_update
last_update = time.time()
except Exception as e:
print(e)
sleep(12)
if __name__ == '__main__':
loop()