Saturn Foundation enables UBI at a global scale by providing a smart contract vault into which people can deposit money. This money is then distributed to all WorldID verified participants every certain interval and every certain amount.
At its core, Saturn Foundation is a smart contract (deployed on Optimism Sepolia) which allows people to deposit money into it (payable contract). Once money is deposited, the sender gets back voting tokens in exchange. More on this in a bit. the contract distributes it to all of the participants of the UBI every certain interval and in X amount.
Interval and amount is set at launch but can be changed with the voting tokens from before but contributors.
To participate in UBI, all a user has to do is to sign in with WorldID and be WorldID Orb verified. This is a necessity to prevent users from claiming the UBI more than once.
The frontend UI is build in NextJS, and we used wagmi and rainbowkit for wallet functionality and blockchain interaction. WorldID verificaton proof is verified on chain inside Saturn Foundation smart contract called SaturnToken, which is built in Solidity and deployed on Optimism Sepolia using Foundry.
Originally, we had the idea of deploying our contract logic on Flow, however due to not being able to verify WorldID on chain and Flow's non-support with LayerZero or CCIP, we decided to roll with Optimism Sepolia for simplicity (because that's where WorldID contract lives).
Saturn Foundaton smart contract is built in Solidity and is deployed on Optimism Sepolia testnet. It is a payable contract, meaning people can deposit funds into it. It has functions distribute() - checks if interval is passed and distributes funds to a list of participants (can only add yourself if you're world id orb verified), and only once, and participate function - which takes the parameters from WorldID verification from the frontenf - nullifier, root, signal, and proof. It then calls the worldid contract on Optimism Sepolia and verifies the proof. If proof is valid - that is, user is orb verified and also not done the verification with this contract before, the function adds the user's address to participants[] list. the distribute function then distriutes x amount of funds every interval to all of the participant[] addresses.