Artists are grossly underpaid on streaming platforms like Spotify, Apple Music, etc. They require upto millions of streams for them to even make minimum wage.
I created a platform where the user gets tokens to interact with the artist, and the number of tokens received would be proportional to the number of times the user has listened to that particular artist. This data is pulled from the user's Last.fm scrobbling service via an oracle. This incentivizes users to stream more and in turn leads to more profits for the artist.
I implemented quadratic voting in polls, which lets user express his/her views in a more effective manner. Polls can be used for variety of purposes which includes selecting a city for the show, set list for the show, etc. The contract acts like a escrow account and user can get back the tokens after the polling is done.
There's a leaderboard page which shows the top 10 accounts with the most number of tokens.
The real challenge was to make sure the user doesn't use someonelse's last.fm account. To mitigate that, the server verifies the user on last.fm login and adds it to a mapping. So, when the user requests for coins with a particular last.fm account, the contract checks if he/she is verified.
Another challenge I ran into was signing and sending the transaction from the server itself. Web3JS documentation was kind of confusing and it took me some time to figure it out.