MoonShard - is a blog platform, which use model token-as-a-subscription
Therefore each channel or chat inside MoonShard have it's own token.
This means, for example, that each time someone subscribe on closed blog - he buy the token of the channel. Then, these tokens can be gifted to someone else like literally paid subscriptions to specifiec channel
Otherwise, if author want to keep his original content free to anyone, he can accept money for sponsorship and make a protected deals for negotiation of sponsorship content.
These tokens also can be a 'share' what give ordinary subscriber get a share from given sponsorhip payment as sponsor prize.
Tokens can be also distributed among subscribers for a high activity in the channel/chat, what give author opportunity to distribute it's own token.
Community can exchange tokens for some reward from a sponsorship or an author lottery
This far a possible use-cases for token-as-a-subcription :
- exhangable and giftable subscription
- season pass
- share of sponsorship money
- game tokens
- communty points (karma)
- aviability secure sells sponsorhip content
Mesh functionality and possabilities described somewhere else
Crowdsale token (basic implementation) can be created by createCrowdsaleToken
- it will deploy Standard Token with given parameters, then it will deploy standard Crowdsale contract with given parameters
and than it will transfer totalSupply_
to crowdsale contract.
Then you should deploy subscription through subFactory
contract
subscription contract able to deploy through createSubscription
interface on SubFactory.sol
it awaits addresses of owner, chat token and crowdsale of this token.
Subscription contract allow to signIn, signOut from a chat/channel using tokens, which have been bought through crowdsale.
It's also now allow create sponsorship offer through start
function in subscription contract
also have a ban function.
Antispam contract is too raw to deploy
Has not been tested properly yet.
What is the deal dialog? The Deal Diaolog is a standart functional for making a deal in MoonShard platform. On this stage we will use it for standartization of sponsorship offer
In the future would be possible to make any kind of deals with any user and escrow functional, but let's start from small parts.
Let's imagine, that we have standard window with channel info, and we have a button there "offer a deal" or "offer a sponsorship" When we click that button we should see apearing of Deal Dialog window and chat with author should be start here.
In this chat sides can discuss details of the deal. On the left side of a window we should see buttons 'finalize offer' and 'cancel'. When cancel is clicked - chat should be removed. If offering side decide to finalize deal, he should input offer details in the fields and push 'finalize offer' button
When 'finalize offer' button is pressed, next steps should be procceeds:
-
Invoke
approve
function with approval that user want to transfer money on the subscription contract For any approval function inside of the app, user should recive standard approve diaolog window with somethink like "approve that you is you" or something like that. I should note here, that user input price in the USD and we should convert it to tokens value, using price variable on crowdsale contract. Also, I should mention, that approve must chek if user have enough money to send, and if he doesn't, then we could offer him another window like "You have not enough funds, do you want to buy X tokens for procceed purchase?" If he clicked 'yes' then we buy more tokens from crowdsale to have enough money. -
If approve chek has been succeful, invoke
start
function fromsubscription
contract. This function will requirelockid
- UID of the deal (counter). Lockid should be store and procceed by backend, it is not store in the contract. Start creates structure of the deal, pull out approved funds to the subscription contract, write down details of the deal and make deal status = 0 (open). After that we should increase lockid counter on backend side. -
Author should have notification window where he store all open deals. Deals represent like bloks in the list. In each block we have simple info like "from" and "value" and three options - accept, reject, chat. By clicking on chat we procceed to DealDialog window of this deal. If accept was pushed - invoke
accept
function, then subscription contract will close deal, transfer funds to the authorship wallet and emit event. If reject was pushed - invokereject
function, then subscription contract will close deal, transfer funds back to the sponsor and emit event. Backend should recive and store all lockid's of all closed deals -
Possible glithes: There are no safemath protection against stackoverflow in
lockid
variable in deals array. This far solution is to store lockid on backend side and, in possability of approaching stackoverflow, we should start overwrite closed (but not opened!) deals. Since all closed deals are already stored in events, then we have not neccesarity of storing them as a structure, therefore we could rewrite them.
As you can see, function awaits parameters 'decimals' and 'rate' to understand the price of token user want to set up.
The lowest undividable unit in token should be setup by the 'decimals' parameter. For example, if we want lowest unit as 0,001, then we should set up the decimals in value 3.
Ethereum itself has the lowest unit called Wei
and has decimals value 18, so if
we suggest that 1 moonshard is 1$, and we creating new token with decimals 18 and rate =1, then
price for 1 NewToken = 1$.
If we will move decimals forward or backward we can get 1 NewToken = 10$ when decimals = 19 and NewToken = 0,1$ when decimals = 17, therefore we can change price of token moving floating point like that.
Other parameter for price is rate . This mean conversion rate, or how many tokens buyer getting per one payable unit.
For example when d=18 and r=1 buyer get 1 token per 1$. If rate is 2, than 2 token per 1$. In second case price of the token will be 0,5$ and so on
Probably we should to implement some mechanism of dynamic price calculation on client side. (for autocalculation decimals and rate for given user price)
There is a method to dynamicly calculate rate
and decimals
by USD price on frontend side
To do this, take formula
Crowdsale mechanics work like 1$=(1*r) tokens.
that mean that
p=1/r
r=1/p
therefore we understand, that if we want to set up crowdsale price as 6$ for a token, than rate=1/6=0.16
As we undarstand, that Ethereum doesn't support float numbers, we have a problem with correct setting of rate in cases when 1 token is cost bigger than 1$, like when rate should be equal to 0.16
in such cases we should increase number of decimals in the side we want to move the point
In our example, as rate should be setted to 0.16 it is means that we create token with 18+2 decimals value and give rate=16.
this also means, that frontend intarface should ALWAYS ask about decimals before moving funds
Subscritption is a basic contract for subscription managment
signUp
- procceed a transferFrom
from a msg.sender, taking 1 token for subscription deposit
think about it as "subscription activision".
signOut
- return token to a user,stopping subscription.
banUser
- remove user subscription, token return to a crowdsale contract (I'm not really sure what to do with that)
Now for buying sponsorship you should buy channel token first, then open deal dialog
When all details was cleared, sponsor should send approve
with subscription contract address then he should finalize offer with calling start
function from subscription contract.
After that author can accept or decline offer.
Note, that lockd does not store in the contract itself and this variable possible should be calculated somewhere else at backend
MoonShard server should recive state updates about subscription through events from this contract.
`SubFactory` deploy new subscription contracts, receiving addresses of token,chat owner and crowdsale address (for return).
Let's imagine that we are channel owner and we want to set up a price for commercial in our blog
As far as we decided that our content is free of charge and we want to sell commercial instead of setting paywall for subscribers In this case we need to set up a lowest price for entry and high price for them who want to buy commercial
Therefore we set up rate
variable in crowdsale to 100, which will give us token price in USD = 0.001$.
Then we want to sell our commersial by 100$ per one - in this case we should set up price for ad in our subscription contract as
100*100= 10 000 (tokens)
Universale formula for setting up a advertisment price is:
ad_price = n*r*decimals
when n = price in USD for commersials
r = exchange rate between MoonShard token (equal to USD)
decimals = decimals of user (chat) token.
Any subscriber can get money reward from sponsor/author
getPrize
from Prize.sol
will get money reward to user in exchange of his chat tokens.
So now, your users can be motivated to be impactivly in your channel in exchange to tokens because your tokens can be exchanged for a real money.
It's also can be used in any cashback or bayback and also some game mechanics.
-
npm install
-
Install
ganache
from (https://truffleframework.com/ganache) if u want to start local dev ethereum node -
Start ganache or your ethereum node
-
From project directory open terminal here are commands:
truffle migrate --reset
-
note that intarface was not updated from Bigfund token manager, so it's not working propriate for now. I think something wrong with types definytion but I have no time to work on it now.
This part out of date
truffle console
migrate --reset
ST.new("T","tt",9,10000).then(function(ins){ console.log(ins.address);});
- will deploy new ST token from source ST.sol with parameters T as name, tt as symbol, 9 as decimals and 10000 as initial supply. Copy address returnvar inst= ST.at('past returned address here');
- create instanceinst.symbol.call();
var fac = TokenFactory
fac.deployed().then(function(instance){return instance.createSToken("N","nn",9,10000);}).then(function(result){return result.logs;});
- function createSToken from Factoryfac.deployed().then(function(instance){return instance.createToken("N","nn",9,10000);}).then(function(result){return result.logs;});
- function createToken from Factory (ownable token)