@version 1
condition triggered_by: transaction, on: add_liquidity(token1_min_amount, token2_min_amount), as: [
token_transfers: (
user_amounts = get_user_transfers_amount(transaction)
valid_transfers? = user_amounts.token1 > 0 && user_amounts.token2 > 0
valid_min? = user_amounts.token1 >= token1_min_amount && user_amounts.token2 >= token2_min_amount
valid_transfers? && valid_min?
)
]
actions triggered_by: transaction, on: add_liquidity(token1_min_amount, token2_min_amount) do
pool_balances = get_pool_balances()
user_amounts = get_user_transfers_amount(transaction)
lp_token_supply = State.get("lp_token_supply", 0)
reserves = State.get("reserves", [token1: 0, token2: 0])
final_amounts = get_final_amounts(user_amounts, reserves, token1_min_amount, token2_min_amount)
token1_to_refund = user_amounts.token1 - final_amounts.token1
token2_to_refund = user_amounts.token2 - final_amounts.token2
token1_amount = user_amounts.token1 + pool_balances.token1 - reserves.token1 - token1_to_refund
token2_amount = user_amounts.token2 + pool_balances.token2 - reserves.token2 - token2_to_refund
lp_token_to_mint = get_lp_token_to_mint(token1_amount, token2_amount)
# Handle invalid values and refund user
valid_amounts? = final_amounts.token1 > 0 && final_amounts.token2 > 0
valid_liquidity? = lp_token_to_mint > 0
if valid_amounts? && valid_liquidity? do
lp_token_to_mint_bigint = Math.trunc(lp_token_to_mint * 100_000_000)
# Remove minimum liquidity if this is the first liquidity if the pool
# First liquidity minted and burned on pool creation
if lp_token_supply == 0 do
lp_token_to_mint_bigint = lp_token_to_mint_bigint - 10
end
token_specification = [
aeip: [8, 18, 19],
supply: lp_token_to_mint_bigint,
token_reference: 0x0000D1B4A0597A033F7DD0C8CA274745F850A990725B7B73B5E8CEBC7C4F9EA82954,
recipients: [
[to: transaction.address, amount: lp_token_to_mint_bigint]
]
]
new_token1_reserve = user_amounts.token1 + pool_balances.token1 - token1_to_refund
new_token2_reserve = user_amounts.token2 + pool_balances.token2 - token2_to_refund
State.set("lp_token_supply", lp_token_supply + lp_token_to_mint)
State.set("reserves", [token1: new_token1_reserve, token2: new_token2_reserve])
if token1_to_refund > 0 do
Contract.add_token_transfer(to: transaction.address, amount: token1_to_refund, token_address: "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF")
end
if token2_to_refund > 0 do
if "UCO" == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: token2_to_refund)
else
Contract.add_token_transfer(to: transaction.address, amount: token2_to_refund, token_address: "UCO")
end
end
Contract.set_type("token")
Contract.set_content(Json.to_string(token_specification))
else
# Liquidity provision is invalid, refund user of it's tokens
Contract.set_type("transfer")
if "UCO" == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: user_amounts.token2)
else
Contract.add_token_transfer(to: transaction.address, amount: user_amounts.token2, token_address: "UCO")
end
Contract.add_token_transfer(to: transaction.address, amount: user_amounts.token1, token_address: "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF")
end
end
condition triggered_by: transaction, on: remove_liquidity(), as: [
token_transfers: (
user_amount = get_user_lp_amount(transaction.token_transfers)
user_amount > 0
)
]
actions triggered_by: transaction, on: remove_liquidity() do
return? = true
user_amount = get_user_lp_amount(transaction.token_transfers)
lp_token_supply = State.get("lp_token_supply", 0)
if lp_token_supply > 0 do
pool_balances = get_pool_balances()
token1_to_remove = (user_amount * pool_balances.token1) / lp_token_supply
token2_to_remove = (user_amount * pool_balances.token2) / lp_token_supply
if token1_to_remove > 0 && token2_to_remove > 0 do
return? = false
new_token1_reserve = pool_balances.token1 - token1_to_remove
new_token2_reserve = pool_balances.token2 - token2_to_remove
State.set("lp_token_supply", lp_token_supply - user_amount)
State.set("reserves", [token1: new_token1_reserve, token2: new_token2_reserve])
Contract.set_type("transfer")
Contract.add_token_transfer(to: transaction.address, amount: token1_to_remove, token_address: "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF")
if "UCO" == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: token2_to_remove)
else
Contract.add_token_transfer(to: transaction.address, amount: token2_to_remove, token_address: "UCO")
end
end
end
if return? do
# Refund is invalid, return LP tokens to user
Contract.set_type("transfer")
Contract.add_token_transfer(to: transaction.address, amount: user_amount, token_address: 0x0000D1B4A0597A033F7DD0C8CA274745F850A990725B7B73B5E8CEBC7C4F9EA82954)
end
end
condition triggered_by: transaction, on: swap(_min_to_receive), as: [
token_transfers: (
transfer = get_user_transfer(transaction)
transfer != nil
)
]
actions triggered_by: transaction, on: swap(min_to_receive) do
transfer = get_user_transfer(transaction)
swap = get_output_swap_infos(transfer.token_address, transfer.amount)
if swap.output_amount > 0 && swap.output_amount >= min_to_receive do
pool_balances = get_pool_balances()
token_to_send = nil
token1_volume = 0
token2_volume = 0
token1_fee = 0
token2_fee = 0
token1_protocol_fee = 0
token2_protocol_fee = 0
if transfer.token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" do
pool_balances = [
token1: pool_balances.token1 + transfer.amount - swap.protocol_fee,
token2: pool_balances.token2 - swap.output_amount
]
token_to_send = "UCO"
token1_volume = transfer.amount
token1_fee = swap.fee
token1_protocol_fee = swap.protocol_fee
else
pool_balances = [
token1: pool_balances.token1 - swap.output_amount,
token2: pool_balances.token2 + transfer.amount - swap.protocol_fee
]
token_to_send = "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF"
token2_volume = transfer.amount
token2_fee = swap.fee
token2_protocol_fee = swap.protocol_fee
end
State.set("reserves", [token1: pool_balances.token1, token2: pool_balances.token2])
stats = State.get("stats", [
token1_total_fee: 0,
token2_total_fee: 0,
token1_total_volume: 0,
token2_total_volume: 0,
token1_total_protocol_fee: 0,
token2_total_protocol_fee: 0,
])
token1_total_fee = Map.get(stats, "token1_total_fee") + token1_fee
token2_total_fee = Map.get(stats, "token2_total_fee") + token2_fee
token1_total_volume = Map.get(stats, "token1_total_volume") + token1_volume
token2_total_volume = Map.get(stats, "token2_total_volume") + token2_volume
token1_total_protocol_fee = Map.get(stats, "token1_total_protocol_fee") + token1_protocol_fee
token2_total_protocol_fee = Map.get(stats, "token2_total_protocol_fee") + token2_protocol_fee
stats = Map.set(stats, "token1_total_fee", token1_total_fee)
stats = Map.set(stats, "token2_total_fee", token2_total_fee)
stats = Map.set(stats, "token1_total_volume", token1_total_volume)
stats = Map.set(stats, "token2_total_volume", token2_total_volume)
stats = Map.set(stats, "token1_total_protocol_fee", token1_total_protocol_fee)
stats = Map.set(stats, "token2_total_protocol_fee", token2_total_protocol_fee)
State.set("stats", stats)
Contract.set_type("transfer")
if token_to_send == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: swap.output_amount)
else
Contract.add_token_transfer(to: transaction.address, amount: swap.output_amount, token_address: token_to_send)
end
if swap.protocol_fee > 0 do
if transfer.token_address == "UCO" do
Contract.add_uco_transfer(to: 0x0000CC1FADBD31B043947C016E09CCD59BC3C81E55AB8A4932A046236D5E0FEE9E45, amount: swap.protocol_fee)
else
Contract.add_token_transfer(to: 0x0000CC1FADBD31B043947C016E09CCD59BC3C81E55AB8A4932A046236D5E0FEE9E45, amount: swap.protocol_fee, token_address: transfer.token_address)
end
end
else
# Swap is invalid, return tokens to user
Contract.set_type("transfer")
if transfer.token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" do
Contract.add_token_transfer(to: transaction.address, amount: transfer.amount, token_address: "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF")
else
if transfer.token_address == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: transfer.amount)
else
Contract.add_token_transfer(to: transaction.address, amount: transfer.amount, token_address: "UCO")
end
end
end
end
condition triggered_by: transaction, on: update_code(), as: [
previous_public_key: (
# Pool code can only be updated from the router contract of the dex
# 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) == 0x000077CEC9D9DBC0183CAF843CBB4828A932BB1457E382AC83B31AD6F9755DD50FFC
)
]
actions triggered_by: transaction, on: update_code() do
params = [
"0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF",
"UCO",
0x000090C5AFCC97C2357E964E3DDF5BE9948477F7C1DE2C633CDFC95B202970AEA036,
0x0000D1B4A0597A033F7DD0C8CA274745F850A990725B7B73B5E8CEBC7C4F9EA82954
]
new_code = Contract.call_function(0x00004CE47B2828E923EB679FEF311DD458AA0571C67DB5CB46B4E0793CAC525AC791, "get_pool_code", params)
if Code.is_valid?(new_code) && !Code.is_same?(new_code, contract.code) do
Contract.set_type("contract")
Contract.set_code(new_code)
end
end
condition triggered_by: transaction, on: set_protocol_fee(new_protocol_fee), as: [
content: new_protocol_fee <= 1 && new_protocol_fee >= 0,
previous_public_key: (
previous_address = Chain.get_previous_address()
Chain.get_genesis_address(previous_address) == 0x0000BE4D33FC48CD4791A58EF7296F6916F5A2032A4E66111CF10521D08FC660A4D3
)
]
actions triggered_by: transaction, on: set_protocol_fee(new_protocol_fee) do
State.set("protocol_fee", new_protocol_fee)
end
condition triggered_by: transaction, on: set_lp_fee(new_lp_fee), as: [
content: new_lp_fee <= 1 && new_lp_fee >= 0,
previous_public_key: (
previous_address = Chain.get_previous_address()
Chain.get_genesis_address(previous_address) == 0x0000BE4D33FC48CD4791A58EF7296F6916F5A2032A4E66111CF10521D08FC660A4D3
)
]
actions triggered_by: transaction, on: set_lp_fee(new_lp_fee) do
State.set("lp_fee", new_lp_fee)
end
export fun get_ratio(token_address) do
reserves = State.get("reserves", [token1: 0, token2: 0])
ratio = 0
token_address = String.to_uppercase(token_address)
if reserves.token1 > 0 && reserves.token2 > 0 do
if token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" do
ratio = reserves.token2 / reserves.token1
else
ratio = reserves.token1 / reserves.token2
end
end
ratio
end
export fun get_equivalent_amount(token_address, amount) do
reserves = State.get("reserves", [token1: 0, token2: 0])
ratio = 0
token_address = String.to_uppercase(token_address)
if reserves.token1 > 0 && reserves.token2 > 0 do
if token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" do
ratio = reserves.token2 / reserves.token1
else
ratio = reserves.token1 / reserves.token2
end
end
amount * ratio
end
export fun get_lp_token_to_mint(token1_amount, token2_amount) do
lp_token_supply = State.get("lp_token_supply", 0)
reserves = State.get("reserves", [token1: 0, token2: 0])
if lp_token_supply == 0 || reserves.token1 == 0 || reserves.token2 == 0 do
# First liquidity
Math.sqrt(token1_amount * token2_amount)
else
mint_amount1 = (token1_amount * lp_token_supply) / reserves.token1
mint_amount2 = (token2_amount * lp_token_supply) / reserves.token2
if mint_amount1 < mint_amount2 do
mint_amount1
else
mint_amount2
end
end
end
export fun get_output_swap_infos(token_address, input_amount) do
output_amount = 0
fee = 0
protocol_fee = 0
price_impact = 0
reserves = State.get("reserves", [token1: 0, token2: 0])
token_address = String.to_uppercase(token_address)
if reserves.token1 > 0 && reserves.token2 > 0 do
fee = input_amount * State.get("lp_fee", 0.3) / 100
protocol_fee = input_amount * State.get("protocol_fee", 0) / 100
amount_with_fee = input_amount - fee - protocol_fee
market_price = 0
if token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" do
market_price = reserves.token2 / reserves.token1
amount = (amount_with_fee * reserves.token2) / (amount_with_fee + reserves.token1)
if amount < reserves.token2 do
output_amount = amount
end
else
market_price = reserves.token1 / reserves.token2
amount = (amount_with_fee * reserves.token1) / (amount_with_fee + reserves.token2)
if amount < reserves.token1 do
output_amount = amount
end
end
# This check is necessary as there might be some approximation in small decimal calculation
output_price = output_amount / input_amount
if output_amount > 0 && market_price > output_price do
price_impact = 100 - (output_price * 100 / market_price)
end
end
[
output_amount: output_amount,
fee: fee,
protocol_fee: protocol_fee,
price_impact: price_impact
]
end
export fun get_input_swap_infos(token_address, output_amount) do
input_amount = 0
lp_fee = State.get("lp_fee", 0.3) / 100
protocol_fee = State.get("protocol_fee", 0) / 100
price_impact = 0
reserves = State.get("reserves", [token1: 0, token2: 0])
token_address = String.to_uppercase(token_address)
if reserves.token1 > 0 && reserves.token2 > 0 do
market_price = 0
if token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" && output_amount < reserves.token1 do
market_price = reserves.token1 / reserves.token2
input_amount = (output_amount * reserves.token2) / ((reserves.token1 - output_amount) * (1 - lp_fee - protocol_fee))
else
if output_amount < reserves.token2 do
market_price = reserves.token2 / reserves.token1
input_amount = (output_amount * reserves.token1) / ((reserves.token2 - output_amount) * (1 - lp_fee - protocol_fee))
end
end
if input_amount > 0 do
# This check is necessary as there might be some approximation in small decimal calculation
output_price = output_amount / input_amount
if market_price > output_price do
price_impact = 100 - (output_price * 100 / market_price)
end
end
end
[
input_amount: input_amount,
fee: input_amount * lp_fee,
protocol_fee: input_amount * protocol_fee,
price_impact: price_impact
]
end
export fun get_remove_amounts(lp_token_amount) do
reserves = State.get("reserves", [token1: 0, token2: 0])
lp_token_supply = State.get("lp_token_supply", 0)
token1_to_remove = 0
token2_to_remove = 0
if lp_token_supply > 0 && lp_token_amount < lp_token_supply do
token1_to_remove = (lp_token_amount * reserves.token1) / lp_token_supply
token2_to_remove = (lp_token_amount * reserves.token2) / lp_token_supply
end
[token1: token1_to_remove, token2: token2_to_remove]
end
export fun get_pool_infos() do
reserves = State.get("reserves", [token1: 0, token2: 0])
stats = State.get("stats", [
token1_total_fee: 0,
token2_total_fee: 0,
token1_total_volume: 0,
token2_total_volume: 0,
token1_total_protocol_fee: 0,
token2_total_protocol_fee: 0,
])
[
token1: [
address: "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF",
reserve: reserves.token1
],
token2: [
address: "UCO",
reserve: reserves.token2
],
lp_token: [
address: 0x0000D1B4A0597A033F7DD0C8CA274745F850A990725B7B73B5E8CEBC7C4F9EA82954,
supply: State.get("lp_token_supply", 0)
],
fee: State.get("lp_fee", 0.3),
protocol_fee: State.get("protocol_fee", 0),
stats: stats
]
end
fun get_final_amounts(user_amounts, reserves, token1_min_amount, token2_min_amount) do
final_token1_amount = 0
final_token2_amount = 0
if reserves.token1 > 0 && reserves.token2 > 0 do
token2_ratio = reserves.token2 / reserves.token1
token2_equivalent_amount = user_amounts.token1 * token2_ratio
if token2_equivalent_amount <= user_amounts.token2 && token2_equivalent_amount >= token2_min_amount do
final_token1_amount = user_amounts.token1
final_token2_amount = token2_equivalent_amount
else
token1_ratio = reserves.token1 / reserves.token2
token1_equivalent_amount = user_amounts.token2 * token1_ratio
if token1_equivalent_amount <= user_amounts.token1 && token1_equivalent_amount >= token1_min_amount do
final_token1_amount = token1_equivalent_amount
final_token2_amount = user_amounts.token2
end
end
else
# No reserve
final_token1_amount = user_amounts.token1
final_token2_amount = user_amounts.token2
end
[token1: final_token1_amount, token2: final_token2_amount]
end
fun get_user_transfers_amount(tx) do
contract_address = 0x000090C5AFCC97C2357E964E3DDF5BE9948477F7C1DE2C633CDFC95B202970AEA036
token1_amount = 0
token2_amount = 0
transfers = Map.get(tx.token_transfers, contract_address, [])
uco_amount = Map.get(tx.uco_transfers, contract_address)
if uco_amount != nil do
transfers = List.prepend(transfers, [token_address: "UCO", amount: uco_amount])
end
if List.size(transfers) == 2 do
for transfer in transfers do
if transfer.token_address == "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF" do
token1_amount = transfer.amount
end
if transfer.token_address == "UCO" do
token2_amount = transfer.amount
end
end
end
[token1: token1_amount, token2: token2_amount]
end
fun get_user_transfer(tx) do
contract_address = 0x000090C5AFCC97C2357E964E3DDF5BE9948477F7C1DE2C633CDFC95B202970AEA036
token_transfer = nil
transfers = Map.get(tx.token_transfers, contract_address, [])
uco_amount = Map.get(tx.uco_transfers, contract_address)
if uco_amount != nil do
transfers = List.prepend(transfers, [token_address: "UCO", amount: uco_amount])
end
transfer = List.at(transfers, 0)
tokens = [
"0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF",
"UCO"
]
if List.size(transfers) == 1 && List.in?(tokens, transfer.token_address) do
token_transfer = transfer
end
token_transfer
end
fun get_user_lp_amount(token_transfers) do
lp_token = 0x0000D1B4A0597A033F7DD0C8CA274745F850A990725B7B73B5E8CEBC7C4F9EA82954
lp_amount = 0
transfers = Map.get(token_transfers, Chain.get_burn_address(), [])
for transfer in transfers do
if transfer.token_address == lp_token do
lp_amount = transfer.amount
end
end
lp_amount
end
fun get_pool_balances() do
token2_balance = 0
if "UCO" == "UCO" do
token2_balance = contract.balance.uco
else
token2_id = [token_address: "UCO", token_id: 0]
token2_balance = Map.get(contract.balance.tokens, token2_id, 0)
end
token1_id = [token_address: "0000457EACA7FBAA96DB4A8D506A0B69684F546166FBF3C55391B1461907EFA58EAF", token_id: 0]
[
token1: Map.get(contract.balance.tokens, token1_id, 0),
token2: token2_balance
]
end
Content (0 B)
{
"lp_fee": 0,
"lp_token_supply": 49964.09280399,
"protocol_fee": 0.3,
"reserves": {
"token1": 119.99770756,
"token2": 20970623.7052561
},
"stats": {
"token1_total_fee": 0.22957848,
"token1_total_protocol_fee": 0.7795573,
"token1_total_volume": 313.93250473,
"token2_total_fee": 51672.1377832,
"token2_total_protocol_fee": 141301.53862772,
"token2_total_volume": 59584547.26826393
}
}
-
Secret shared with 1 key
Encoded secret
FF3C2712530D9DDAC7971328B28DF3B79325CB9BCE7B476FC2953978D65AF3AF9941A258BB27F8C0956F22D84260AB7ADFFB6D11B7F404AD166F70A1
Authorized keys
- 000122A6CD9ED07E46835D6E88E5BD0BEE84C3F5E5DBF8E916AD9B2EC912C44AFEC2
Contract recipients (0)
Inputs (0)
Contract inputs (0)
Unspent outputs (2)
-
From 00003E9F...72FCAt 2024-11-18 16:27:06 UTCAmount 20,970,623.7052561 UCO
-
From 00003E9F...72FCAt 2024-11-18 16:27:06 UTCAmount 119.99770756 0000457E...8EAF
Previous public key
00018F60427D5E7150404FE76A5E90AAE07229F6AB038DF7E25FFE2A0296FDF353B4
Previous signature
EF4AA4D0E7B3518F680B0E179FFB181BFE1FD15CC5A30F3E97F4FD624137B9C8232FDEAF262B8BB44D68E6A684EFAE52A950FF2C31324FF0AAF0C86B498FB907
Origin signature
3046022100E52957E82B2FA176AC912F155C39489466E32F60668E5CAAA376FFD0339056AC022100EBB0B4A239FF737E6B6FD27F64CB4CB8A7AB39ABAC8367E9AE0EEC04B15B2DB0
Proof of work
01020420CFD0ED26BC93EBD08099DCE30E642D49054D5EC97AFD03A922DE7F108DA3AC1A29E6E0C7D6B987FC678680AD6784570F1860895015CFA26B3AFA910F6BC222
Proof of integrity
00D0D7BCF0A4541818A42F89434438609EA0AB7FFA8862FADA022ED9F263358123
Coordinator signature
D16104CB593A2032C448CC3BD375BE43B14110B53604FEE32ED28F3A7A0682200B3A1A80B8C4D140EDAF0324996F30C6DBE0A27B47A3362DA22DD9652A38220D
Validator #1 public key
0001B9E2941895A3951F10CE0D7978DD083C3D8A19ACE27F4F98798DF04045B11181
Validator #1 signature
7F50AC96FD157F2717D1E1DC1F7A7EDB1F75053974EEAAC943C678E6C2853F77CE1249358A1700A1F7AA5058BD38BC50A44896B5E6F5CAAA00115360DDF19201
Validator #2 public key
00016DC3C25720E8FB335A38DB1D57FA1CD8AD5287C212B53343907DFA124394C684
Validator #2 signature
F685DEDAD188509F115ED9ADD28DD50219F50340FC420A8CC016C269FB35FF21F5EE9CA3DEC19299665B4007CB25985CAC4FD37E2EAFA6663B66235A37F42306
Validator #3 public key
0001D9711BA3565FCB17BEE7A45EFD5B558494A658827403D5853D454F501C5FDDFC
Validator #3 signature
79C0D8DE7A5BCEC1C71BDC4EA4E3B33080BBBBBA11A0263CAB4169CDCE56CBC88DE47EAB1A227EE2422DE9F98E845DDA4416EFA5FC030D27B962916BCE7FCF0F
Validator #4 public key
00016A24FA6FC34A345FB22A7E90CB6BC583AEA140B679549F745FB51D59A93F7868
Validator #4 signature
933065B8A9F7F0A6D80A75B6B30C456BC80B13107F8E088DA389678A369FCFF071CD1A36D9C22F53F38E392F1FD371DCC3F82DF74E01E56EAC969FEE932A1F0E
Validator #5 public key
00019721EC9787441F168794A0FB579F9383EE194BC5C71D8AA97B1ED6B1B95826F4
Validator #5 signature
616630D77A62272C723B62DB76204E2C9587093ABDF5CE06DE812087BAAE86AE380336B26B0E330E6D3F8C4D26E41B645EF285171A86C45D6D4C66C8269E060E
Validator #6 public key
0001A6201599712BCE8837B0E841A875DF0042FA049626A0CF674EFA574BDCDA3221
Validator #6 signature
086319F9B938BBE01D5108A42C3C3170F44AA1939A34B04C7BE645A60981BF84C2833BD13172A490DAEE540E656E365BB1EA1389FB4749560A9CD4BA79DF1D01