Skip to main content

Trustless Flow

You can run an AMA integration using purely the RPC and its quite reliable.

You also need to download the latest binary release of the node and run it as OFFLINE=true ./amadeusd, it functions as a utility tool similar to geth.

Get the current chain height and hash from your integrations inception:

curl -s https://nodes.amadeus.bot/api/chain/stats \
| jq -r '.stats.tip.header_unpacked.height'

34959084

curl -s https://nodes.amadeus.bot/api/chain/stats \
| jq -r '.stats.tip.hash'

BENtrybSL5UGBnjJMm7sVZ9fr1CN7Qu9R3SdH88GxdEt

Next generate deposit wallets as required:

./amadeusd --bw-command start generate_wallet

5ibhX6qynQvFuBaQH1phfqCCY3VKMw4kLXkcSeBCNeAyCpyMVYzsEWx9FNBu6yz2XF
3CHRgeHNDzg3qjnFGdruvXqVb45TAWXzGZpnK2mKKHaByy7ZiQUMaDjLbQu1z4AnfsNtN2diM6Tc9PBVPgWZ7zgL

Check for finality and scan the block for deposits or withdrawls:

curl -s https://nodes.amadeus.bot/api/chain/hash/BENtrybSL5UGBnjJMm7sVZ9fr1CN7Qu9R3SdH88GxdEt?filter_on_function=transfer \
| jq -r '.entry.consensus.finality_reached'
true

curl -s https://nodes.amadeus.bot/api/chain/hash/BENtrybSL5UGBnjJMm7sVZ9fr1CN7Qu9R3SdH88GxdEt?filter_on_function=transfer \
| jq -r '.entry.txs_filtered'
[
{
"metadata": {
"entry_hash": "BENtrybSL5UGBnjJMm7sVZ9fr1CN7Qu9R3SdH88GxdEt",
"entry_slot": 34959084
},
"signature": "231XbxmVFKYNJsFb8X49wGAx1HVbW7FuiNFzVxuF1BCey5SpdsRzaSYRzTJEdJ22XF8g3NfzJgqnMrgypxZYbVV3hJWVTqRukY6C6cnPYNDbUTyu2gHVyQvNqRUkNfCmmi58",
"hash": "6NxepwR3YTf3JbNoTtycZ73eLmY79CFzhueFJdYvDsoE",
"tx": {
"nonce": 1760628863344857048,
"signer": "69TDon8KJp3vicNeFR3dg5x5sKY8PJFLmoizX3RN31YL4fwr266AVcXgwy1mjCLy6M",
"actions": [
{
"args": [
"5tUw2maGeGEvNyn6hkwssyNgiEd7K4Dp6jtkDFTSkbHZGiWR4Q12JMpbtC3n3r8cef",
"64516000000000",
"AMA"
],
"function": "transfer",
"op": "call",
"contract": "Coin"
}
]
}
}
]

Parse the single relevant transfer transaction now:

Sender: "69TDon8KJp3vicNeFR3dg5x5sKY8PJFLmoizX3RN31YL4fwr266AVcXgwy1mjCLy6M",
Receiver: "5tUw2maGeGEvNyn6hkwssyNgiEd7K4Dp6jtkDFTSkbHZGiWR4Q12JMpbtC3n3r8cef"
Amount: 64516000000000 (9 decimals)
AmountAsFloat: 64516.0 (64516000000000 / 1_000_000_000)

Check if there is another block after that has reached finality and repeat.

curl -s https://nodes.amadeus.bot/api/chain/hash/BENtrybSL5UGBnjJMm7sVZ9fr1CN7Qu9R3SdH88GxdEt?filter_on_function=transfer \
| jq -r '.entry.next_entry_hash_finality_reached'
789CfwfidnT44vVgGWz7xnm8CB7VLxBYMkUPeGAysWD2

To process a withdrawl now create a serialized transaction substituting the SEED64= envvariable for your sender seed/privatekey as base58, then 69receiver as the receivers public key in base58, amount here cannot be float it must be the full integer accounting for 9 decimals.

SEED64=sender ./amadeusd --bw-command start buildtx Coin transfer ["69receiver", "1000000000", "AMA"]

jKhTr4KjP2rsAGvtHfsX7h5MbBeKt1WbL78N3KVofpRc4f85UBjNhdMJH9AndZLEQpRsg5BcZLQ
CGiYCK7k7hchJcmmBh4cjZDkWzSSpcHenqZrb5tKPRdXDx1Xin13MzKQPukmGDQzgMUzkC2RzQv
DrJJmY7CJqcXPF7QCJrAuHBqyv79ysGnRugkReHwkCRyd99hXwkWeFYHeS1aBLAntpmFwqzc2bD
ANTms9Har4WgEX3pDs32mwCDsTJ3nYPbRAee1Gp77CuZPa9fQsVEGoskFz5xrf2kCXjBG8NhdN1
X5NNfGV5vZDYDt9J3oYG1Z3Z6yWzbv5pbhnkMupiFShSAiXssVa2H7MhozQ2xrtxyNhrtHQGrd5
NAA8dnfNCXYQ2enHtJFFzg6vP2Zajye87BwCxvVv4TELjBKs1ajBqVrrMiT411KhAL1yn1NnTji
RjhEfRyPvh5Mpnu1YoAVvhQFtYCUMWK9y7

%{
signature: <<165, 29, 132, 117, 78, ...>>,
hash: <<224, 102, 230, 139, 81, 81, ...>>,
tx: %{
nonce: 1761339817312206803,
signer: <<180, 138, 83, 27, 27, ...>,
actions: [%{
args: ["69receiver", "1000000000", "AMA"],
function: "transfer",
op: "call",
contract: "Coin"}]
},
tx_encoded: <<7, 1, 3, 5, ...>>
}

Call a similar API build_and_broadcasttx to directly broadcast it to an RPC node:

SEED64=sender ./amadeusd --bw-command start build_and_broadcasttx Coin transfer ["69receiver", "1000000000", "AMA"]

78VMtHDJCtmFohiRNAS89g3pQNvhmtN6KZ4jyGhe74Xr

You can now check the TX hash to confirm the RPC node relayed it to a validator and it got included in the chain

curl -s https://nodes.amadeus.bot/api/chain/tx/78VMtHDJCtmFohiRNAS89g3pQNvhmtN6KZ4jyGhe74Xr | jq
{
"metadata": {
"entry_hash": "8k3HVDQ6cqrbFr8hPcdZV1Tos6UykAuMhs6oaJeV1MbP",
"entry_slot": 36729887
},
"signature": "25iZprHk5MZiZi6CXKLFqM5QNJn2UGxLwKD5ZpiLWJH7Y4h1ai3uJgXsjhczipGW2W2fzCEzft8pneiuG4cRojXnfJ1XeWyAEXMAPQh3Xb1ojJaUV4XyF8iWa6gZgDosdy3i",
"result": {
"error": "ok"
},
"hash": "78VMtHDJCtmFohiRNAS89g3pQNvhmtN6KZ4jyGhe74Xr",
"tx": {
"nonce": 28612872,
"signer": "6KFVHM35azmepNw4MEzDPb65WhjU28oJjTaz9V7QYeCCTVAASHzFUhUiMC2njmUwCS",
"actions": [
{
"args": [
"wqvhdreKnJ3fN45PqmoBwMC..."
],
"function": "submit_sol",
"op": "call",
"contract": "Epoch"
}
]
}
}

The only part missing is to prove the RPC is not lying in a trustless way. This is beyond the scope right now of this guide and protocol upgrades are underway as well.

Of course the best way now is to run a personal node and you can follow the validator guide for that.