We're building a fiat on/off ramp targeted towards Indian market utilising the open banking API of a fiat p2p payment system called UPI. We have escrow smart contracts that are linked to banking apis via oracles. Our plan is to have most of the functionality implemented on-chain including order/user matching as opposed to having everything except escrows off-chain. Most of the fiat on-ramps (eg with escrow contracts still rely on manual methods of release funds from the escrow where are ours is completely automated via banking api's. We rely on a fiat payment network that already has payment aliases and thus doesn't have any risk of exposing payment info on the blockchain.

How it's made

We have access to a sandbox API environment that is integrated to a smart contract based escrow via Chainlink. We are using a chainlink oracle via our own chainlink node that is connected to an external adaptor that interacts with the open banking API. We have two types of smart contracts: * Escrow contracts that hold with user funds and release it to buyers on confirmation of fiat payment by the oracle. * Comptroller contract, that interacts with the chainlink oracle contract and initiates a fiat payment request while making sure the parameters for either fiat or crypto payment are not tampered with. For the smart contracts we used openzeppelin proxy contracts for deploying separate escrows for each seller to prevent funds being pooled into a single contract and reducing contract deployment gas costs for sellers. We have nice separation of concerns between the escrow contracts and the comptroller contract which is used to initiate payment requests. We used typescript and express.js to build the external adapter that connects to the chainlink node.