@version 1
####################################
# EVM => Archethic : Request funds #
####################################
condition triggered_by: transaction, on: request_funds(end_time, amount, user_address, secret_hash, evm_tx_address, evm_contract, chain_id), as: [
type: "contract",
code: valid_chargeable_code?(end_time, amount, user_address, secret_hash),
timestamp: (
# End time cannot be less than now or more than 1 day
now = Time.now()
end_time > now && end_time <= now + 86400
),
uco_transfers: (
# Ensure the pool has enough UCO to send the requested fund
contract.balance.uco >= amount
),
content: List.in?([56,137,1], chain_id),
token_transfers: (
charged_contracts = State.get("charged_contracts", Map.new())
!contract_already_charged?(charged_contracts, chain_id, evm_contract)
),
address: (
valid? = false
tx_receipt_request = get_tx_receipt_request(evm_tx_address)
call_status_request = get_call_request(evm_contract, "status()", 2)
call_enough_funds_request = get_call_request(evm_contract, "enoughFunds()", 3)
call_hash_request = get_call_request(evm_contract, "hash()", 4)
call_end_time_request = get_call_request(evm_contract, "lockTime()", 5)
call_amount_request = get_call_request(evm_contract, "amount()", 6)
body = Json.to_string([
tx_receipt_request,
call_status_request,
call_enough_funds_request,
call_hash_request,
call_end_time_request,
call_amount_request
])
chain_data = get_chain_data(chain_id)
headers = ["Content-Type": "application/json"]
evm_responses = query_evm_apis(chain_data.endpoints, "POST", headers, body)
for res in evm_responses do
if !valid? && res.status == 200 && Json.is_valid?(res.body) do
responses = Json.parse(res.body)
tx_receipt = get_response(responses, 1)
call_status = get_response(responses, 2)
call_enough_funds = get_response(responses, 3)
call_hash = get_response(responses, 4)
call_end_time = get_response(responses, 5)
call_amount = get_response(responses, 6)
if !any_nil?([tx_receipt, call_status, call_enough_funds, call_hash, call_end_time, call_amount]) do
# event = Crypto.hash("ContractMinted(address,uint256)", "keccak256")
event = "0x8640c3cb3cba5653efe5a3766dc7a9fb9b02102a9f97fbe9ea39f0082c3bf497"
valid_tx_receipt? = valid_tx_receipt?(tx_receipt, chain_data.proxy_address, evm_contract, event)
# Pending is status 0
valid_status? = valid_status?(call_status, 0)
enough_funds? = enough_funds?(call_enough_funds)
valid_hash? = valid_hash?(call_hash, secret_hash)
valid_end_time? = valid_end_time?(call_end_time, end_time)
valid_amount? = valid_amount?(call_amount, amount, chain_data.decimals)
valid? = valid_tx_receipt? && valid_status? && enough_funds? && valid_hash? && valid_end_time? && valid_amount?
end
end
end
valid?
)
]
actions triggered_by: transaction, on: request_funds(end_time, amount, _, secret_hash, _, evm_contract, chain_id) do
chain_data = get_chain_data(chain_id)
# Delete old contract where end_time is over
charged_contracts = State.get("charged_contracts", Map.new())
charged_contracts = delete_old_charged_contracts(charged_contracts)
charged_contracts = add_charged_contracts(charged_contracts, chain_id, evm_contract, end_time)
State.set("charged_contracts", charged_contracts)
signature = sign_for_evm(secret_hash)
proxy_address = Map.get(chain_data, "proxy_address")
Contract.set_type("transfer")
Contract.add_recipient(
address: transaction.address,
action: "provision",
args: [evm_contract, chain_data.endpoints, signature, proxy_address]
)
Contract.add_uco_transfer(to: transaction.address, amount: amount)
end
##########################################
# Archethic => EVM : Request secret hash #
##########################################
condition triggered_by: transaction, on: request_secret_hash(htlc_genesis_address, amount, user_address, chain_id, evm_user_address), as: [
type: "transfer",
code: valid_signed_code?(htlc_genesis_address, amount, user_address),
content: List.in?([56,137,1], chain_id),
uco_transfers:
(
htlc_genesis_address = String.to_hex(htlc_genesis_address)
Map.get(htlc_genesis_address) == amount
)
]
actions triggered_by: transaction, on: request_secret_hash(htlc_genesis_address, amount, _user_address, chain_id, evm_user_address) do
# Here delete old secret that hasn't been used before endTime
requested_secrets = State.get("requested_secrets", Map.new())
secret = Crypto.hmac(transaction.address)
secret_hash = Crypto.hash(secret, "sha256")
protocol_fee = Contract.call_function(0x0000eeb877e7a3ffd7e81f9a1c4d5eedde7f881866c3154b99b78a9a54e3dfbdccd9, "get_protocol_fee", [])
chain_data = get_chain_data(chain_id)
decimals = Map.get(chain_data, "decimals")
fee_amount = amount * protocol_fee / 100
evm_amount = amount - fee_amount
evm_big_amount = Math.bigint(evm_amount, decimals)
abi_data =
Evm.abi_encode("(bytes32, bytes32, uint, address, uint)", [
Crypto.hash(htlc_genesis_address),
secret_hash,
chain_id,
evm_user_address,
evm_big_amount
])
signature_data = Crypto.hash(abi_data, "keccak256")
# Build signature for EVM verification
signature = sign_for_evm(signature_data)
# Calculate endtime now + 2 hours
now = Time.now()
end_time = now - Math.rem(now, 60) + 7200
# Add secret and signature in content
htlc_map = [
hmac_address: transaction.address,
end_time: end_time,
chain_id: chain_id,
evm_user_address: evm_user_address
]
htlc_genesis_address = String.to_hex(htlc_genesis_address)
requested_secrets = Map.set(requested_secrets, htlc_genesis_address, htlc_map)
State.set("requested_secrets", requested_secrets)
proxy_address = Map.get(chain_data, "proxy_address")
Contract.add_recipient(
address: htlc_genesis_address,
action: "set_secret_hash",
args: [secret_hash, signature, end_time, proxy_address]
)
end
####################################
# Archethic => EVM : Reveal secret #
####################################
condition triggered_by: transaction, on: reveal_secret(htlc_genesis_address, evm_tx_address, evm_contract), as: [
type: "transfer",
content: (
# Ensure htlc_genesis_address exists in pool state
# and end_time has not been reached
valid? = false
htlc_genesis_address = String.to_hex(htlc_genesis_address)
requested_secrets = State.get("requested_secrets", Map.new())
htlc_map = Map.get(requested_secrets, htlc_genesis_address)
if htlc_map != nil do
valid? = htlc_map.end_time > Time.now()
end
valid?
),
address: (
valid? = false
htlc_map = nil
htlc_genesis_address = String.to_hex(htlc_genesis_address)
requested_secrets = State.get("requested_secrets", Map.new())
htlc_map = Map.get(requested_secrets, htlc_genesis_address)
if htlc_map != nil do
tx_receipt_request = get_tx_receipt_request(evm_tx_address)
call_status_request = get_call_request(evm_contract, "status()", 2)
call_enough_funds_request = get_call_request(evm_contract, "enoughFunds()", 3)
call_hash_request = get_call_request(evm_contract, "hash()", 4)
call_end_time_request = get_call_request(evm_contract, "lockTime()", 5)
call_amount_request = get_call_request(evm_contract, "amount()", 6)
call_recipient_request = get_call_request(evm_contract, "recipient()", 7)
body = Json.to_string([
tx_receipt_request,
call_status_request,
call_enough_funds_request,
call_hash_request,
call_end_time_request,
call_amount_request,
call_recipient_request
])
chain_data = get_chain_data(htlc_map.chain_id)
headers = ["Content-Type": "application/json"]
evm_responses = query_evm_apis(chain_data.endpoints, "POST", headers, body)
for res in evm_responses do
if !valid? && res.status == 200 && Json.is_valid?(res.body) do
responses = Json.parse(res.body)
tx_receipt = get_response(responses, 1)
call_status = get_response(responses, 2)
call_enough_funds = get_response(responses, 3)
call_hash = get_response(responses, 4)
call_end_time = get_response(responses, 5)
call_amount = get_response(responses, 6)
call_recipient = get_response(responses, 7)
if !any_nil?([tx_receipt, call_status, call_enough_funds, call_hash, call_end_time, call_amount, call_recipient]) do
# event = Crypto.hash("ContractProvisioned(address,uint256)", "keccak256")
event = "0x0c5d1829e93110ff9c24aa8ac41893b65509108384b3036d4f73ffccb235e9ec"
secret = Crypto.hmac(htlc_map.hmac_address)
secret_hash = Crypto.hash(secret, "sha256")
htlc_data = Contract.call_function(htlc_genesis_address, "get_htlc_data", [])
valid_tx_receipt? = valid_tx_receipt?(tx_receipt, chain_data.proxy_address, evm_contract, event)
# Pending is status 0
valid_status? = valid_status?(call_status, 0)
enough_funds? = enough_funds?(call_enough_funds)
valid_hash? = valid_hash?(call_hash, secret_hash)
valid_end_time? = valid_end_time?(call_end_time, htlc_map.end_time)
valid_amount? = valid_amount?(call_amount, htlc_data.amount, chain_data.decimals)
valid_recipient? = valid_recipient?(call_recipient, Map.get(htlc_map, "evm_user_address"))
valid? = valid_tx_receipt? && valid_status? && enough_funds? && valid_hash? && valid_end_time? && valid_amount? && valid_recipient?
end
end
end
end
valid?
)
]
actions triggered_by: transaction, on: reveal_secret(htlc_genesis_address, _evm_tx_address, evm_contract_address) do
requested_secrets = State.get("requested_secrets", Map.new())
htlc_genesis_address = String.to_hex(htlc_genesis_address)
htlc_map = Map.get(requested_secrets, htlc_genesis_address)
requested_secrets = Map.delete(requested_secrets, htlc_genesis_address)
State.set("requested_secrets", requested_secrets)
secret = Crypto.hmac(htlc_map.hmac_address)
signature = sign_for_evm(secret)
Contract.add_recipient(
address: htlc_genesis_address,
action: "reveal_secret",
args: [secret, signature, evm_contract_address]
)
end
condition triggered_by: transaction, on: refund(htlc_genesis_address), as: [
content: (
# Ensure htlc_genesis_address exists in pool state
# and end_time has not been reached
valid? = false
htlc_genesis_address = String.to_hex(htlc_genesis_address)
requested_secrets = State.get("requested_secrets", Map.new())
htlc_map = Map.get(requested_secrets, htlc_genesis_address)
if htlc_map != nil do
valid? = htlc_map.end_time <= Time.now()
end
valid?
)
]
actions triggered_by: transaction, on: refund(htlc_genesis_address) do
requested_secrets = State.get("requested_secrets", Map.new())
htlc_genesis_address = String.to_hex(htlc_genesis_address)
htlc_map = Map.get(requested_secrets, htlc_genesis_address)
secret = Crypto.hmac(htlc_map.hmac_address)
# Perform a first hash to combine data and "refund"
sig_payload = "#{secret}#{String.to_hex("refund")}"
signature_data = Crypto.hash(sig_payload, "keccak256")
signature = sign_for_evm(signature_data)
requested_secrets = Map.delete(requested_secrets, htlc_genesis_address)
State.set("requested_secrets", requested_secrets)
Contract.add_recipient(
address: htlc_genesis_address,
action: "refund",
args: [secret, signature]
)
end
condition triggered_by: transaction, on: update_code(new_code), as: [
previous_public_key:
(
# Pool code can only be updated from the master chain if the bridge
# Transaction is not yet validated so we need to use previous address
# to get the genesis address
previous_address = Chain.get_previous_address()
Chain.get_genesis_address(previous_address) == 0x000070babcda15ea1e5d3e3fd5b3a4b92fcd48f1be3c533e4454ed77be76dbc5c68b
),
code: Code.is_valid?(new_code)
]
actions triggered_by: transaction, on: update_code(new_code) do
Contract.set_type("contract")
Contract.set_code(new_code)
end
####################
# Public functions #
####################
export fun get_token_address() do
"UCO"
end
#####################
# Private functions #
#####################
fun contract_already_charged?(charged_contracts, chain_id, evm_contract) do
chain_id = String.from_number(chain_id)
evm_contract = String.to_lowercase(evm_contract)
contracts = Map.get(charged_contracts, chain_id, Map.new())
Map.get(contracts, evm_contract, nil) != nil
end
fun add_charged_contracts(charged_contracts, chain_id, evm_contract, end_time) do
chain_id = String.from_number(chain_id)
evm_contract = String.to_lowercase(evm_contract)
contracts = Map.get(charged_contracts, chain_id, Map.new())
updated_contracts = Map.set(contracts, evm_contract, end_time)
Map.set(charged_contracts, chain_id, updated_contracts)
end
fun delete_old_charged_contracts(charged_contracts) do
now = Time.now()
for chain_id in Map.keys(charged_contracts) do
contracts = Map.get(charged_contracts, chain_id)
for address in Map.keys(contracts) do
contract_end_time = Map.get(contracts, address)
if contract_end_time <= now do
contracts = Map.delete(contracts, address)
end
end
charged_contracts = Map.set(charged_contracts, chain_id, contracts)
end
charged_contracts
end
fun valid_chargeable_code?(end_time, amount, user_address, secret_hash) do
args = [
end_time,
user_address,
0x00002075e9fb5329c7f5149802eb75f925d79b5fec5bfcf09dc81993cb9c39feaf5d,
secret_hash,
"UCO",
amount
]
expected_code = Contract.call_function(0x0000eeb877e7a3ffd7e81f9a1c4d5eedde7f881866c3154b99b78a9a54e3dfbdccd9, "get_chargeable_htlc", args)
Code.is_same?(expected_code, transaction.code)
end
fun valid_signed_code?(htlc_address, amount, user_address) do
valid? = false
htlc_address = String.to_hex(htlc_address)
last_htlc_transaction = Chain.get_last_transaction(htlc_address)
if last_htlc_transaction != nil do
args = [
user_address,
0x00002075e9fb5329c7f5149802eb75f925d79b5fec5bfcf09dc81993cb9c39feaf5d,
"UCO",
amount
]
expected_code = Contract.call_function(0x0000eeb877e7a3ffd7e81f9a1c4d5eedde7f881866c3154b99b78a9a54e3dfbdccd9, "get_signed_htlc", args)
valid? = Code.is_same?(expected_code, last_htlc_transaction.code)
end
valid?
end
fun get_chain_data(chain_id) do
data = Map.new()
if chain_id == 56 do
data = Map.set(data, "endpoints", ["https://bsc-dataseed.binance.org","https://bsc-mainnet.infura.io/v3/3a7a2dbdbec046a4961550ddf8c7d78a"])
data = Map.set(data, "proxy_address", "0xe01f0ee653648192812b2d23cbfe7e147727b672")
data = Map.set(data, "decimals", 8)
end
if chain_id == 137 do
data = Map.set(data, "endpoints", ["https://polygon-mainnet.infura.io/v3/3a7a2dbdbec046a4961550ddf8c7d78a","https://polygon-mainnet.g.alchemy.com/v2/0aM2uAp3J-LsOlijDBZ3aZiCUvZdjiHb"])
data = Map.set(data, "proxy_address", "0xd5ca9f76495b853a5054814a10b6365ee8ed745b")
data = Map.set(data, "decimals", 8)
end
if chain_id == 1 do
data = Map.set(data, "endpoints", ["https://mainnet.infura.io/v3/3a7a2dbdbec046a4961550ddf8c7d78a","https://eth-mainnet.g.alchemy.com/v2/tgCq5a1zrmYn4ZjEn74UAW9gUXlDPzQi"])
data = Map.set(data, "proxy_address", "0x346dba8b51485ffbd4b07b0bcb84f48117751ad9")
data = Map.set(data, "decimals", 8)
end
data
end
fun get_call_request(evm_contract, call, id) do
abi_data = Evm.abi_encode(call)
tx = [to: evm_contract, data: "0x#{abi_data}"]
[jsonrpc: "2.0", id: id, method: "eth_call", params: [tx, "latest"]]
end
fun get_response(responses, id) do
response = nil
for res in responses do
if res.id == id do
response = Map.get(res, "result")
end
end
response
end
fun any_nil?(list) do
nil? = false
for i in list do
if i == nil do
nil? = true
end
end
nil?
end
fun get_tx_receipt_request(evm_tx_address) do
[
jsonrpc: "2.0",
id: 1,
method: "eth_getTransactionReceipt",
params: [evm_tx_address]
]
end
fun valid_tx_receipt?(tx_receipt, proxy_address, evm_contract, expected_event) do
logs = nil
for log in tx_receipt.logs do
if String.to_lowercase(log.address) == proxy_address do
logs = log
end
end
if logs != nil do
# Transaction is valid
valid_status? = tx_receipt.status == "0x1"
# Transaction interacted with proxy address
valid_proxy_address? = String.to_lowercase(tx_receipt.to) == proxy_address
# Logs are comming from proxy address
valid_logs_address? = String.to_lowercase(logs.address) == proxy_address
# Pool contract emmited expected event
event = List.at(logs.topics, 0)
valid_event? = String.to_lowercase(event) == expected_event
# Contract minted match evm_contract in parameters
decoded_data = Evm.abi_decode("(address)", List.at(logs.topics, 1))
topic_address = List.at(decoded_data, 0)
valid_contract_address? = topic_address == String.to_lowercase(evm_contract)
valid_status? && valid_proxy_address? && valid_logs_address? && valid_event? && valid_contract_address?
else
false
end
end
fun valid_status?(call_status, expected_status) do
decoded_data = Evm.abi_decode("(uint)", call_status)
List.at(decoded_data, 0) == expected_status
end
fun enough_funds?(call_enough_funds) do
decoded_data = Evm.abi_decode("(bool)", call_enough_funds)
List.at(decoded_data, 0) == true
end
fun valid_hash?(call_hash, secret_hash) do
secret_hash = "0x#{String.to_lowercase(secret_hash)}"
decoded_data = Evm.abi_decode("(bytes32)", call_hash)
List.at(decoded_data, 0) == secret_hash
end
fun valid_end_time?(call_end_time, end_time) do
decoded_data = Evm.abi_decode("(uint256)", call_end_time)
List.at(decoded_data, 0) == end_time
end
fun valid_amount?(call_amount, amount, decimals) do
decoded_data = Evm.abi_decode("(uint256)", call_amount)
big_int_amount = List.at(decoded_data, 0)
decimal_amount = big_int_amount / Math.pow(10, decimals)
decimal_amount == amount
end
fun valid_recipient?(call_recipient, evm_user_address) do
decoded_data = Evm.abi_decode("(address)", call_recipient)
String.to_uppercase(List.at(decoded_data, 0)) == String.to_uppercase(evm_user_address)
end
fun sign_for_evm(data) do
prefix = String.to_hex("\x19Ethereum Signed Message:\n32")
signature_payload = Crypto.hash("#{prefix}#{data}", "keccak256")
sig = Crypto.sign_with_recovery(signature_payload)
if sig.v == 0 do
sig = Map.set(sig, "v", 27)
else
sig = Map.set(sig, "v", 28)
end
sig
end
fun query_evm_apis(endpoints, method, headers, body) do
requests = []
for endpoint in endpoints do
requests = List.append(requests, url: endpoint, method: method, headers: headers, body: body)
end
Http.request_many(requests, false)
end
Content (0 B)
{
"charged_contracts": {
"1": {
"0xd42fbe1adbd3393d55b162ed7c766a84572a4307": 1754680620
},
"137": {},
"56": {}
},
"requested_secrets": {
"00005CE3B7CC3FD4352B418EC118DA5F098E6FA3B8626F32132845104507BF66C18D": {
"chain_id": 137,
"end_time": 1754328840,
"evm_user_address": "0xFa6e7cB57c0a2854ECacBa50673C675Aa9f53621",
"hmac_address": "0000ECB7964D6B9C437675E9520E67B02A6C0737498113EE498CDBD101C2FBC5F25C"
},
"0000A971DE4D25272497EB2B822EB95DDB22B5D29BFE813FCFA5DD7AAA139A0703BB": {
"chain_id": 137,
"end_time": 1764888000,
"evm_user_address": "0xB855696a7589A8Cfa5C60656a12031C87A7EfcBb",
"hmac_address": "00007B469133A5DF16755A23C14FFB3B142D33F6A96F8AF72A68A47AC05F9B7E9B46"
},
"0000B097218B89581994176690DD84C1856CA63A650F80A8633C639B4D35F37580AE": {
"chain_id": 137,
"end_time": 1747858020,
"evm_user_address": "0x1aF2a119fbab52d5fc81E9B5aBBB5A69A982ffd1",
"hmac_address": "000032ADF09609C8C7F3F795AA100BE33479FA284182A5DE70B260119F7A7507D444"
},
"00005E16EFA3687B7839A7F596F573404A3CAE624ED0127D3FFA7FB3EDB4A878924F": {
"chain_id": 137,
"end_time": 1724942700,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "000004AB3757DEF30803E135C281FEBC7154B6F8117C3F3041CC350A415D2F539083"
},
"0000E32849537B52ECD561943448B68BC7B35AEE1CFC039A9032E8F9DD8F5A4533F2": {
"chain_id": 1,
"end_time": 1756569060,
"evm_user_address": "0xE511898944BB3719D7Aeb1E08AD4C45cA9856132",
"hmac_address": "0000D8EA82FBA0D95526B4A2D188B69826CEB8177BDA448575BC09D060D25E3F182E"
},
"000040BE8AEDF65597DF63A0C7E40D1BE45D06AA1D1E57F7AAE2DF32D9B3CB4CF52A": {
"chain_id": 137,
"end_time": 1743980400,
"evm_user_address": "0xbF946576f0DB3bBBeC6884A9e438E77Ca483c450",
"hmac_address": "00007DA2791D265704A6C1D04F0C8BF0258FBEE9A9761EFBCA664180C8D0C31C5114"
},
"0000ED0D323C89AA21A34D54AF709B3C2B7B13E98913D3A9B693D14F784E578C729C": {
"chain_id": 1,
"end_time": 1722511800,
"evm_user_address": "0xad1f4df14dc3eb4094092cf44b713067431813b8",
"hmac_address": "0000DE60DB4C9A2038BFD68972A10054FD98DE3FB7E68203086A9C27E68604E6343E"
},
"0000C6DA4EC5A8DF238C59582F1E1C073490303E88DD39AFF1BD9A079B389862EB48": {
"chain_id": 137,
"end_time": 1715870160,
"hmac_address": "000058ED3FE7F85CE5912204F6DCE8A11A28FCCAE685940CD4EE93978BD4AC718707"
},
"0000F12AC0846D1D547EE50694E9D6AB40B81928D85193246510A4E427C903E83856": {
"chain_id": 137,
"end_time": 1724941440,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "00005B1DC8F3F75CF9D9C61A475EFD7A2BB19E3F778CEC8A901CF0AC97EA36370EA5"
},
"00006EEAD9EDEDD0A4ED367EAC02C8D4660D6250D9F2C93FFE70B3D44469F5B90148": {
"chain_id": 137,
"end_time": 1744142880,
"evm_user_address": "0xBf7dcDeCDE92E98B396B3a7dc63EE5344Dba01EF",
"hmac_address": "000058482CAF76F0E3C797B947A7DFA0A8CC8C8A43A3BD6384252C391496FC8C921C"
},
"0000CC8A7B429981C64E624F39B77DD439277F1B9030A6B165511E1D890F28F1A418": {
"chain_id": 137,
"end_time": 1747221480,
"evm_user_address": "0xBA09766d1Aa06a76823A9991cef2bF4c5D8b8D02",
"hmac_address": "00000F5BE73EE24711ED6BE8DA2E3AAE0E32FCC404566EA915819F8DC49869F4C446"
},
"0000026260CA735F1E385FE025414808141D4E3C6746AEBCAE1F0E7A061CA3E71569": {
"chain_id": 137,
"end_time": 1716208740,
"hmac_address": "00004FFE8645115E4810819ED47BF3D54AF99412D0F6B3B312DB780DDD8B6ED67A4A"
},
"0000F011B64E1397ECCDDF83DF8A352B997F56C93A452DCC3D0B999F896D7C359DDF": {
"chain_id": 56,
"end_time": 1750477080,
"evm_user_address": "0x36a69187A29E332792A5cc716408904102d3709E",
"hmac_address": "0000F92A673F81FFB08BAC7BD213C68FE6104A3E97347112396A35CC40EEEE6859C0"
},
"0000A4F2F00F18C38BBB65C84093DA265A477D555BE95BD10D72C79FB25C5C78089F": {
"chain_id": 137,
"end_time": 1714258020,
"hmac_address": "000087849B359682CC19FDC0D51E2159EAFBDC81D5BBA078898ECE8F4E6D91A9ECAA"
},
"0000F4D82AD73A37A7E73983AC4E661BB7688905C8EE191EF5C449D324EC54DDC5C4": {
"chain_id": 137,
"end_time": 1736899980,
"evm_user_address": "0xBb8CDC81b9bc12f39D1Eb98d8E0a790694c8De39",
"hmac_address": "0000674C5F4D11BE9732033F969C969180B89F4753F926471C220C7D38EDF1E09B6C"
},
"0000786D27087EBE446022D7EFDB1B93B3909A141768440AAFA2A982F41A2196DC61": {
"chain_id": 137,
"end_time": 1747608300,
"evm_user_address": "0x3f48fBf96D25bB507056DE750E91453634CA2d87",
"hmac_address": "0000BADCFBA9861151048345F84F631AB3510955281491E759B755D455902DB7F55B"
},
"000061A6BBD3932D7C52F0862CD2BB818B19F9CD140A39E57D2DE4D0D9CC2957EA0A": {
"chain_id": 1,
"end_time": 1744160940,
"evm_user_address": "0x6592609C665BcBDE2b02A95D449DEB8b68424B26",
"hmac_address": "00009535718285F5A0801F4BB6A191A7652B727477D5920836DFF529D5B3FEA8E4FD"
},
"0000DF1065049854E2E6FCCA1419541A703373F37AAF3A398412B2FF4EE80E591E1E": {
"chain_id": 137,
"end_time": 1738014780,
"evm_user_address": "0xB476bF84BE229F0eB0Ef94402eB265Ee2C4Dffe2",
"hmac_address": "000054644D45C139414B5990EEECFFF0B867B9112DA28A70F017DCCBFA93377CBD2A"
},
"0000D60B0638875B0DF73DBAEE5B298286A5E82F11E56A34F95B9A7FDD3EE36F1266": {
"chain_id": 56,
"end_time": 1727264160,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000BE7E21240303519DF3D056B9CBBD5B4755B63BA6C55587879B71B50AB5425D6B"
},
"00003196A4D9432FCFED2487F0F41118AE1AE70F9C64706F4787CC2B1B02A679AD29": {
"chain_id": 56,
"end_time": 1744040700,
"evm_user_address": "0xE6d5181fBFc6FDFe3DD8A142A7ab94c16AA632e6",
"hmac_address": "00009852CAFC842D31C78D12A925DAD8D81BC6427AA9A5C42892FC4CA8EDD388E6AB"
},
"000020B5C4FAAF5C117857F461BEDA41BACDFCBA8FC033E35D7C7A72F93BF2C0F1BB": {
"chain_id": 137,
"end_time": 1746655020,
"evm_user_address": "0x6c72b5ee45E93CF18717859DC6610D044F4BeFd8",
"hmac_address": "0000615B02D1390BE18C8379AA162C7243AFF0B77A9BABF2FD23135AAAC1C4F3685C"
},
"0000737664E339818B9D666A2C2A02CABAFF06F7126B433407F539BE4AEA79114D9C": {
"chain_id": 137,
"end_time": 1744838880,
"evm_user_address": "0x99eDD6429641A88eC6508d66A85c342c409A6247",
"hmac_address": "0000F42091F90FD78751E4E72FAE842429B175D22BBC6890F122475450A6F58DC642"
},
"0000AC66DC77CE296F59A43EC81193271798C808C77AA4D5ECECE714DE1D4C103888": {
"chain_id": 137,
"end_time": 1715874600,
"hmac_address": "000051373B18A3488DAB9C6348D6662CA765576AAF9ADB41311D55153459A49FB447"
},
"00005D1C1BCE646342DAA6646C19AB80FB08233A6FE9D64587862096465E38CE1FD5": {
"chain_id": 137,
"end_time": 1759044480,
"evm_user_address": "0xC866195f56C87138b02eC93bCF56FD743D788a47",
"hmac_address": "0000A18973536D4DB2B871C5E0CA01F1BAA3E1B944498947AB42BDF5EB0F37A008A6"
},
"0000EF49932B7A87BE788002A9D1727098639E0186AD2E66692FFC6B07221BDE8ED0": {
"chain_id": 1,
"end_time": 1721647980,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000DCE7482904BC0D781AB612696D3CEA6562363F1B5E11C54C7ACFB2DAC06DF51D"
},
"0000E671A1D1F13A8A731478A984F9F4EE62AE0D6DCA9105ED7F940FF951D93B1945": {
"chain_id": 137,
"end_time": 1747578540,
"evm_user_address": "0x49a8ab2988fAa4F597EBdDf52d46c3e8CDCAe9B2",
"hmac_address": "0000599FDD2367752AE942654BB6AB4A1022744413498A1AD09D8A5FB56B35C6108D"
},
"0000FC611D060ED4A0B49EB161E06136EAB61FE490F1C5343D4A7241C2794EF75801": {
"chain_id": 137,
"end_time": 1724941800,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000E1608FBE4C2F047361B8111CB0C96094A778A0CF4F8390C909F168FDD3345763"
},
"000055476851FAB79FCBB99BD85CD218AA29A5403572BB4AF9195BE48F5E7919B633": {
"chain_id": 1,
"end_time": 1721645340,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000FC51FB47AA137D26D5BC5A4A6833175024296F15293ADC043F09EC2CED3F6C07"
},
"000002FE741A451E1C9318D354949D72F1128DC0CE4A3C646A5B8E8E4A14DAFFB11C": {
"chain_id": 137,
"end_time": 1724942820,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000F73CE4E8A2335697BBD89B436258C41CB1252CD7D90542AA85006BC3001E7AE9"
},
"0000584603D899254376E496A9396A370A0E465364E9731991E36167686BBBFAF711": {
"chain_id": 137,
"end_time": 1724940540,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000404DC70BAADBA9810194A9EF59B657B350DF5D132A1F3A5697F7B2880B13549B"
},
"00000F377A67EDE656912DD1AB3DD40FD0B648F3EA984B731E38C1852F9F116A08A3": {
"chain_id": 137,
"end_time": 1735646280,
"evm_user_address": "0xccbe79Dc320a924a851CC58DF19b2dC97c2ae692",
"hmac_address": "0000EB7782A8E70E18FBD3AF9CC79CA8DAB0994F9771354C7BBA14600CA4763BE6E6"
},
"00004ED6806EF5FCD26B9F8FC29C2DAEB6D6A0B69BBD8A5FB2E95C521DF26F4D5BCC": {
"chain_id": 137,
"end_time": 1745161260,
"evm_user_address": "0x91E14D7C11bE684e79bc6418F3cB60948B4a3084",
"hmac_address": "00000A5CED6F2E55388F6AAE1C62D7383548049681FB5DDB3DF60D5BE39CEED56019"
},
"000061C28F1BA59CA7DB024BF564D3B0942329FFD7150257DB1D20611D839AAAE93F": {
"chain_id": 137,
"end_time": 1744318080,
"evm_user_address": "0x4c886e42b5f74651841Cc071235824b5A18d1EA7",
"hmac_address": "0000CDCB00E5E5999B3E0F77FFD1BB35B95728C5D109293D7FF03384E2994D973237"
},
"00004A38AB3C5897DCEDECA0DB9720D8B90D78EA9D013D6E93D3872EBC09BEE590A4": {
"chain_id": 1,
"end_time": 1745021400,
"evm_user_address": "0x7db7561aB8cDE4Fe963EFCd6D38ABCA671c56A65",
"hmac_address": "00007A5979262129FA00A7D3026FC85E111DC8B307F74D4B6B70C375A5629DB7CA30"
},
"00003279512D3C51E490F2C9D2A0126A06DB1A7F96A22A17DEA6533B32664F034A45": {
"chain_id": 137,
"end_time": 1723633440,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "00006DD3DA0C9FE060FE171E3D16352F3399642848BAD48F7BCD44717C2F6B9C9FCF"
},
"0000520E00218EE38F45382BFFA5DAE16622F406519E2E100F017C718606A26DB6CF": {
"chain_id": 137,
"end_time": 1718427840,
"hmac_address": "00000195A74CB6882D2E88DEBF57E4DFCCB0D29AF13B4B394E3626311CBFE273EC9F"
},
"00007260A789973F0879DB94A743EF4B4A9B28DE2C6CFCC24EF5AB28AC835CC73291": {
"chain_id": 137,
"end_time": 1744536120,
"evm_user_address": "0xf1aF186a92bC006d0c7c71Fa452C66908A0214a5",
"hmac_address": "0000B5237A89FDE6B0C64C0B7012191227624A645E47D97A32518D5B9F2D3B986FA2"
},
"0000A556D989B411A3500074A2262700941CA3908788BAB50A476F563ADE6AB67CCD": {
"chain_id": 137,
"end_time": 1715693880,
"hmac_address": "000083359120E10BDF9EC0BD8C0D4A9726B62548DECAE74A710DFB23650BE9B3EB10"
},
"00005870B81A79F6BD65AE2F31481F2D559FD179626C1CC6083D388DFE91F725D62D": {
"chain_id": 137,
"end_time": 1747824060,
"evm_user_address": "0x807F21396295fCBc9aFA0b693C53EFFE0edBc4DA",
"hmac_address": "00001E8AACA76D06C03C7D769ED67C5CB499C53CED7030BE55EB897F812D30391BC4"
},
"00009545F6D85F62110B690C78810181AC98853C9539D2E15CBAB8A8791C6767F5C6": {
"chain_id": 137,
"end_time": 1725282840,
"evm_user_address": "0x7f0f44c4edfbb7c54501547009d32a2bc788be79",
"hmac_address": "0000E7A2022A912024510B1FC281966E1A8CF5A0E2B888BFA7591ABEDE95649FB7CB"
},
"000077DB944B401A2A862B36286D8934C535B42C2B18F4E2AEFBA744431EEA48E6D5": {
"chain_id": 56,
"end_time": 1764888360,
"evm_user_address": "0xB855696a7589A8Cfa5C60656a12031C87A7EfcBb",
"hmac_address": "0000A6AF64D4BB028936C25688E628DEB61967FF43C968239EB308FCA1C5BEF94EA0"
},
"00009A91D3BD244F24261149CBECAEAE1312CBEBF260E9624BC194631DF967C96DD9": {
"chain_id": 137,
"end_time": 1756061940,
"evm_user_address": "0x1ce0E5fC6D1983D451655090DEA34CCde57456c7",
"hmac_address": "00000E5A6EFF9A0BC6B9605D776A9DD3071A44463158C032FA9B26A3107C85CADE2A"
},
"00004389428BA3B99980159E92D50B913F07D78AD663DD46C25D97B8943AFE856D57": {
"chain_id": 137,
"end_time": 1715903880,
"hmac_address": "0000D2C44EAB5CCD42137156A400056D63FA01C2F5BC23C7FACA7816C4E38FC9D1AD"
},
"00005E45DD42394F4A974EA31FFB3738871CF927BC58402247F0D926296F0FB8B819": {
"chain_id": 137,
"end_time": 1750713540,
"evm_user_address": "0x968022fCc68bFDaf5B443F9bC6AF7499E5e5be31",
"hmac_address": "000045CC7F705859BABACE98A710F7EAA0E714443EDBA5EE9FA1D0B9A6DB47D90546"
},
"0000FD9B62664DDD571DC2CF7270A844C9716259328EF58CFEE75B5BA71204650502": {
"chain_id": 137,
"end_time": 1724941920,
"evm_user_address": "0xccbe79dc320a924a851cc58df19b2dc97c2ae692",
"hmac_address": "0000DA7378D581605C44D70E553F2196AE21833FA792E84C6BB4CAE5FE3134ADB793"
},
"00005BF624AFE1DC33983D1D95F98EB47886BDF18BCD63210EC2B24C7903068414E1": {
"chain_id": 137,
"end_time": 1760617620,
"evm_user_address": "0x6F2F24419D3B9cB19B9152A27ec2EBd803F3a7CB",
"hmac_address": "00003A70742ED401B5557D71D23EA91565F33CCA15FB3D4A83DFCDED310CDECFF157"
},
"00002847B347882F4453972C7050D80F9EA1B09334595546AD52630FCED3DAF84630": {
"chain_id": 1,
"end_time": 1744730160,
"evm_user_address": "0x2bfdD4320877328ca95C75Ed420df26758aCB704",
"hmac_address": "0000F81D293472E528A0F21153B63AF6AE0BAF867D572ECDF9503725FD3BA34A2EFC"
},
"00008DC18079322584BE681530A6FABE753FEFDFC4DF19FADF1DE0317FE91312DF6D": {
"chain_id": 1,
"end_time": 1745906280,
"evm_user_address": "0x1D1a52b2Ede7f2637A0D01D73D92C5148877F10d",
"hmac_address": "00002D8A00227C4C4C2C8C8B781F82CFE995FBB9BA8969E2DCEF21F449CF7FBD665E"
},
"00000DC9447E31E59B849190DB6950B123F8D16EDA7076569649EBF86BE3F6E9C51D": {
"chain_id": 137,
"end_time": 1744318500,
"evm_user_address": "0x4c886e42b5f74651841Cc071235824b5A18d1EA7",
"hmac_address": "0000657083C36315D26696F4DE1B8DA17B1D4726072F6FEED0BEA3FE396D0AED1A6D"
},
"0000A337098A9054CB26381A0FF001125FA91E158F536637F66EC8BD6170D5EF31BC": {
"chain_id": 137,
"end_time": 1760185020,
"evm_user_address": "0x0F50097a4ACcE32d45764108A52d54baFEf0b257",
"hmac_address": "000020B1ACF8B23966F5E1127005E25E6A165D05600E545874AF0A2EC0C316699F34"
},
"00005A27448016C310B9C9E79C8D463D8C8E40412C79093A2C41AF89720211C8198D": {
"chain_id": 137,
"end_time": 1744318380,
"evm_user_address": "0x4c886e42b5f74651841Cc071235824b5A18d1EA7",
"hmac_address": "00008ABA58186270A2B8F6AD761545596C3DCE50C356D1F9BB137567D59EA7EEC2AF"
}
}
}
-
Secret shared with 1 key
Encoded secret
CC102EA53B03B8A2060CC42B3F66FC91AC4DBB8FD466C37B2B709AD8FF873BB4385EF45B3B06257CC7E0280687701312D043CA955C8FBE4D980BDBD7
Authorized keys
- 000122A6CD9ED07E46835D6E88E5BD0BEE84C3F5E5DBF8E916AD9B2EC912C44AFEC2
-
Resolved 00002364...0804reveal_secret
[ "F91CCF771A1BB5A1E561FBC3D95FD9EDFE6899725675D0A3DD9F4C6009A50DCA", { "r": "48975CEF6BF43018D7F66A3FA9FEDC82B4902D1C440C9233D95E0A7EAD799B1F", "s": "3A266F5AABADD06376BB9CE8D798ADECA72B80E8BFC35A27865D267BDE66932B", "v": 28 }, "0x34664Fa38eef4356B7FE0f3b50e60b35F861A79F" ]
Inputs (0)
Contract inputs (0)
Unspent outputs (0)
Previous public key
00012FDAF1A1AEECB4370E93F54564506A754B198F0C274AD5B5043AEEDF30F7FF7F
Previous signature
3F20C31E50BF489C2B27682EA23862297E004C7219A5DAF4CF6EA501DEF66051BA0B91EAF873835A478B4E6909B1A09E2F514F45CC67F3A9BF3A0E7770270B03
Origin signature
304502202A4E3C66A1DF8CE129FC497399BC56FE1E698E7321048E11EE450964810E8EA002210098CE90AFAF040A48E5AA572F3480782CEDF7EB2CC98E09CC0ECCF3038692A51C
Proof of work
0102045AAF36BF9EA9E11F1F79834294FB1098C173F2333B562762711E02C63EA9F459909F714C243F04922D1EBE15510E1B4667550E9C980F7742295E002584B0482B
Proof of integrity
0086EF96CBC444C34881EC8167E7C0944412D1738083FA469190CE88CE35246139
Coordinator signature
F66B3D958FB1B76237470DC7B40B3B3740984A522F3665BC7EE98C358A6E6F65E8DD2B46EA31AF76A21F34A2E4A5F7C1C1BD61ADE84857C2F0D686F4DB34FD0F
Validator #1 public key
000166E49C87F679E71BA05324E09D9AF5D120EE9E26F3B2EF552C912B0803EBD0F5
Validator #1 signature
1A92F577CF21B6DB94FD6FA3FD203928233E3688D199CEDB1E06B2EE84DA6502E43BA8E405887D79CDDC81C1F5E9359700F0026F288FC89AB2462B43D876370D
Validator #2 public key
00016A97D34F89B41CCD7C3AE8D9E96A4CAA5D27BF745F3AB3C4A812E032DF68A735
Validator #2 signature
7010CCF3F57D389A4104061D70D1EEF3A9B69A52A47FFFE6B815539B708CE82BEB6F94343B148203F3F2E4A3538C7D37E53396235AAE2430F16332D08B79B60C