# Rialto Refund Mechanism ## Context Railto is a software program which provides connectivity between two EVM compatible chains. It achives this by providing event realaying across both the chains . ### Types of bridges Railto has two types of bridges - Incoming Bridges : These are all the bridges that bring liquidity to our system , from foreign L1 chains. For these bridges the source chain for tokens is `not` Findora EVM . - Example : BUSD Bridge BUSD(Existing on BSC) <-> BUSD.b (Existing on FRA) Use case : Bring TVL to our network - Outgoing Bridges : THese bridges move liquidity away from our system, to other L1 chains. FRA EVM is the source chain for all of them . - Example : FRA Bridge FRA(existing on FRA EVM) <-> FRA.f (Existing on BSC) Usecase : enable us to create LPs in dex's like pancake swap. Note : Both the bridges are bidectional ### How a bridge functions Using BUSD <-> BUSD.b (Incoming Bridge) as an example 1. Railto deployes a locking contract on `BSC` , and a minting contract on `FRA EVM` 2. User approves locking Smart contract on BSC - Uses pays gas in BNB (BSC) 3. User deposits to locking smart contract - User pays gas in BNB (BSC) 4. Relayers relay locking event and Vote to mint Busd.b - Relayers pay in FRA (funded by operators) 5. Busd.b is minted and trasfered to recipent . The recipent address is part of the event relayed . ### Why we need a refund mechanism - A user has to pay gas twice in step 1 and step 2 above , in the source chain . Although the value of the gas usage might not be much in terms of USD for chains like BSC , but this amount can be substantial for the Ethereum network . We plan to subsidise the users in some way. . - Provide a user with FRA , as soon as they bring their tokens to our chain . Obtaining which might be difficult for users since they would have to buy it from exchanges like gate.io - This can also be used for marketing .The idea of getting gas refunded is appeling to most defi users . - The refund mechanism is required only for Incoming chains , We do not need a one for Outgoing as FRA itself is quite cheap ## Refund Mechanism - The main idea is to refund the users in FRA equivalent for what they spend in the source chain . Example : If a user spends 1 BNB in gas (hypothetical). We refund 1 BNB = $640 i.e $640/$0.04 FRA = 16,000 FRA - Note - A calculation like this might benifit from using a oracle price feed , But we can also do this calculation offchain . The reason being - The gas usage for `Approve` and `Deposit` transactions is almost constant . - Although the gas price might vary , we can account for that by keeping this distribution value easily configurable. ( More details on this on the Techinical implementation section) - Integrating with a price feed oracle will be a bigger developemt effort and would definitly delay the launch a little bit. ## Technical Implementation - Using the same example as above . When BUSD.b is minted on FRA EVM , the smart contrct emits an event which contains {Recipient Address , Name of token minted}. - The token name / address of the minting token can be used to obtain the SourceChain .(Tokens like USDT would still have different minting contracts on FRA EVM) ### Create an off-chain deamon - The deamon maintains the following maps ```go= refund_amount = map[Sourcechain]Amount refund_amoun[BSC] -> 250 FRA refund_amoun[ETH] -> 2000 FRA ``` ```go= gas_used_l1 = map [SourceChain]GasUsed gas_used_l1[BSC] -> 1000 gas_used_l1[ETH] -> 1000 ``` - This map amount is based on the USD calculation below ```rust gas_price = fetch (Cmc API with parameter SourceChain) fra_price = fetch (Cmc API with parameter FRA) usd_value_source_chain = gas_used_l1[SourceChain] * gas_price refund_amount = usd_value_source_chain / fra_price * reducing_factor [More details on reducing factor in later sections] ``` - This daemon then listens to events from the minting smart contract and uses the calculations above to create a list like below ```json= DistributionList : [ { "address" : "0x96B05C238b99768F349135de0653b687f9c13fEE", "refund_amount" : "250" } ] ``` - The daemon should only add an entry to this list after it has been confirmed on the blockchain i.e receive atleast three confirmations - Since this daemon can parse events as soon as the are commited , the maximum price fluctiontion that we have to worry about is 3 blocks , i.e 48secs . ### Create a distribution script - THe distribution script parses the `DistributionList` json , creates sendTx for each entry and submits the transactions - The sender of this tx can be a Foundation controlled address (Need inputs here) ### Additional points to note - The refund amount should be at max equivalent to the USD amount the user spend in the orginal chain ( Preferably we keep the reducing_factor less than 1). This will prevent users from spamming the TX , to burn out the relayer balances . ( the relayers pay to vote for every trasfer). - For outgoing chains , we should set a relayer-fee , for the same purpose as above. The vote txs would cost us quite a bit on L1 chains like ethereum.