Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 20.02 KB | None | 0 0
  1. {-# STDLIB_VERSION 3 #-}
  2. {-# CONTENT_TYPE DAPP #-}
  3. {-# SCRIPT_TYPE ACCOUNT #-}
  4.  
  5. let NONE = "none"
  6. func getNumberByKey(key: String) = {
  7.     let num = match getInteger(this, key) {
  8.             case a:Int => a
  9.             case _ => 0
  10.     }
  11.     num
  12. }
  13. func getStrByKey(key: String) = {
  14.     let str = match getString(this, key) {
  15.             case a:String => a
  16.             case _ => NONE
  17.     }
  18.     str
  19. }
  20. func getKeyWhitelistRef(account: String) = {
  21.     "wl_ref_" + account
  22. }
  23. func getKeyWhitelistStatus(account: String) = {
  24.     "wl_sts_" + account
  25. }
  26. func getKeyBalance(account: String) = {
  27.     "balance_" + account
  28. }
  29. func getKeyWhitelistBio(account: String) = {
  30.     "wl_bio_" + account
  31. }
  32. func getKeyWhitelistBlock(account: String) = {
  33.     "wl_blk_" + account
  34. }
  35. func getKeyItemAuthor(item: String) = {
  36.     "author_" + item
  37. }
  38. func getKeyItemBlock(item: String) = {
  39.     "block_" + item
  40. }
  41. func getKeyItemVotingExpiration(item: String) = {
  42.     "expiration_block_" + item
  43. }
  44. func getKeyItemBank(item: String) = {
  45.     "bank_" + item
  46. }
  47. func getKeyItemStatus(item: String) = {
  48.     "status_" + item
  49. }
  50. func getKeyItemData(item: String) = {
  51.     "datajson_" + item
  52. }
  53. func getKeyItemCrowdExpiration(item: String) = {
  54.     "expiration_one_" + item
  55. }
  56. func getKeyItemWhaleExpiration(item: String) = {
  57.     "expiration_two_" + item
  58. }
  59. func getKeyItemNCommits(item: String) = {
  60.     "ncommits_" + item
  61. }
  62. func getKeyItemAccCommit(item: String, account: String) = {
  63.     "commit_" + item + "_" + account
  64. }
  65. func getKeyItemAccReveal(item: String, account: String) = {
  66.     "reveal_" + item + "_" + account
  67. }
  68. func getKeyItemVotesYes(item: String) = {
  69.     "cnt_yes_" + item
  70. }
  71. func getKeyItemVotesNo(item: String) = {
  72.     "cnt_no_" + item
  73. }
  74. func getKeyItemAccFinal(item: String, account: String) = {
  75.     "final_" + item + "_" + account
  76. }
  77. func getKeyItemFundPositive(item: String) = {
  78.     "positive_fund_" + item
  79. }
  80. func getKeyItemFundNegative(item: String) = {
  81.     "negative_fund_" + item
  82. }
  83. func getKeyItemAccFundPositive(item: String, account: String) = {
  84.     getKeyItemFundPositive(item) + "_" + account
  85. }
  86. func getKeyItemAccFundNegative(item: String, account: String) = {
  87.     getKeyItemFundNegative(item) + "_" + account
  88. }
  89. func getKeyItemAccReviewsCnt(item: String, account: String) = {
  90.     "reviews_cnt_" + item + "_" + account
  91. }
  92. func getKeyItemAccReview(item: String, account: String) = {
  93.     "review_" + item + "_" + account
  94. }
  95. func getKeyItemAccReviewText(item: String, account: String, cnt: String) = {
  96.     getKeyItemAccReview(item, account) + "_text_id:" + cnt
  97. }
  98. func getKeyItemAccReviewMode(item: String, account: String, cnt: String) = {
  99.     getKeyItemAccReview(item, account) + "_mode_id:" + cnt
  100. }
  101. func getKeyItemAccReviewTier(item: String, account: String, cnt: String) = {
  102.     getKeyItemAccReview(item, account) + "_tier_id:" + cnt
  103. }
  104. func getKeyItemBuyoutAmount(item: String) = {
  105.     "buyout_amount_" + item
  106. }
  107. func getKeyItemAccWinnings(item: String, account: String) = {
  108.     "winnings_" + item + "_" + account
  109. }
  110.  
  111. func getValueWhitelistRef(account: String) = {
  112.     getStrByKey(getKeyWhitelistRef(account))
  113. }
  114. func getValueWhitelistStatus(account: String) = {
  115.     getStrByKey(getKeyWhitelistStatus(account))
  116. }
  117. func getValueBalance(account: String) = {
  118.     getNumberByKey(getKeyBalance(account))
  119. }
  120. func getValueWhitelistBio(account: String) = {
  121.     getStrByKey(getKeyWhitelistBio(account))
  122. }
  123. func getValueWhitelistBlock(account: String) = {
  124.     getStrByKey(getKeyWhitelistBlock(account))
  125. }
  126. func getValueItemAuthor(item: String) = {
  127.     getStrByKey(getKeyItemAuthor(item))
  128. }
  129. func getValueItemBlock(item: String) = {
  130.     getNumberByKey(getKeyItemBlock(item))
  131. }
  132. func getValueItemVotingExpiration(item: String) = {
  133.     getNumberByKey(getKeyItemVotingExpiration(item))
  134. }
  135. func getValueItemBank(item: String) = {
  136.     getNumberByKey(getKeyItemBank(item))
  137. }
  138. func getValueItemStatus(item: String) = {
  139.     getStrByKey(getKeyItemStatus(item))
  140. }
  141. func getValueItemData(item: String) = {
  142.     getStrByKey(getKeyItemData(item))
  143. }
  144. func getValueItemCrowdExpiration(item: String) = {
  145.     getNumberByKey(getKeyItemCrowdExpiration(item))
  146. }
  147. func getValueItemWhaleExpiration(item: String) = {
  148.     getNumberByKey(getKeyItemWhaleExpiration(item))
  149. }
  150. func getValueItemNCommits(item: String) = {
  151.     getNumberByKey(getKeyItemNCommits(item))
  152. }
  153. func getValueItemAccCommit(item: String, account: String) = {
  154.     getStrByKey(getKeyItemAccCommit(item, account))
  155. }
  156. func getValueItemAccReveal(item: String, account: String) = {
  157.     getStrByKey(getKeyItemAccReveal(item, account))
  158. }
  159. func getValueItemVotesYes(item: String) = {
  160.     getNumberByKey(getKeyItemVotesYes(item))
  161. }
  162. func getValueItemVotesNo(item: String) = {
  163.     getNumberByKey(getKeyItemVotesNo(item))
  164. }
  165. func getValueItemAccFinal(item: String, account: String) = {
  166.     getStrByKey(getKeyItemAccFinal(item, account))
  167. }
  168. func getValueItemFundPositive(item: String) = {
  169.     getNumberByKey(getKeyItemFundPositive(item))
  170. }
  171. func getValueItemFundNegative(item: String) = {
  172.     getNumberByKey(getKeyItemFundNegative(item))
  173. }
  174. func getValueItemAccFundPositive(item: String, account: String) = {
  175.     getNumberByKey(getKeyItemAccFundPositive(item, account))
  176. }
  177. func getValueItemAccFundNegative(item: String, account: String) = {
  178.     getNumberByKey(getKeyItemAccFundNegative(item, account))
  179. }
  180. func getValueItemAccReviewsCnt(item: String, account: String) = {
  181.     getNumberByKey(getKeyItemAccReviewsCnt(item, account))
  182. }
  183. func getValueItemAccReviewText(item: String, account: String, cnt: String) = {
  184.     getStrByKey(getKeyItemAccReviewText(item, account, cnt))
  185. }
  186. func getValueItemAccReviewMode(item: String, account: String, cnt: String) = {
  187.     getStrByKey(getKeyItemAccReviewMode(item, account, cnt))
  188. }
  189. func getValueItemAccReviewTier(item: String, account: String, cnt: String) = {
  190.     getNumberByKey(getKeyItemAccReviewTier(item, account, cnt))
  191. }
  192. func getValueItemBuyoutAmount(item: String) = {
  193.     getNumberByKey(getKeyItemBuyoutAmount(item))
  194. }
  195. func getValueItemAccWinnings(item: String, account: String) = {
  196.     getNumberByKey(getKeyItemAccWinnings(item, account))
  197. }
  198.  
  199. let WHITELISTED = "registered"
  200. let INVITED = "invited"
  201. let WHALE = "whale"
  202.  
  203. let NEW = "new"
  204. let COMMIT = "voting_commit"
  205. let REVEAL = "voting_reveal"
  206. let FEATURED = "featured"
  207. let DELISTED = "delisted"
  208. let CASHOUT = "cashout"
  209. let BUYOUT = "buyout"
  210. let FINISHED = "finished"
  211. let CLAIMED = "claimed"
  212.  
  213. let POSITIVE = "positive"
  214. let NEGATIVE = "negative"
  215.  
  216. let GENESIS = "3NBB3iv7YDRsD8ZM2Pw2V5eTcsfqh3j2mvF"
  217.  
  218. # (GLOBALS) TCR implementation with commit-reveal scheme
  219. let VOTERS = 3
  220. let QUORUM = 2
  221. let LISTINGFEE = 500000000/1000
  222. let VOTEBET = 150000000/1000
  223.  
  224. let TIERS = [10, 50, 250, 1250, 6250]
  225. let MULTIPLIER = 150
  226.  
  227. @Callable(i)
  228. func inviteuser(newaccount: String, data: String) = {
  229.     let account = toBase58String(i.caller.bytes)
  230.     if (getValueWhitelistRef(newaccount) != NONE)
  231.         then throw("User has already been invited")
  232.     else if (getKeyWhitelistStatus(account) != WHITELISTED && account != GENESIS)
  233.         then throw("Your account should be whitelisted")
  234.     else {
  235.         WriteSet([
  236.             DataEntry(getKeyWhitelistRef(newaccount), account),
  237.             DataEntry(getKeyWhitelistBio(newaccount), data),
  238.             DataEntry(getKeyWhitelistStatus(newaccount), INVITED)
  239.         ])
  240.     }
  241. }
  242. @Callable(i)
  243. func signup(data: String, type: String) = {
  244.     let account = toBase58String(i.caller.bytes)
  245.     if (getValueWhitelistStatus(account) != INVITED && GENESIS != account)
  246.         then throw("Referral invite needed")
  247.     else {
  248.         WriteSet([
  249.             DataEntry(getKeyWhitelistBio(account), data),
  250.             DataEntry(getKeyWhitelistBlock(account), height),
  251.             DataEntry(getKeyWhitelistStatus(account), if (type == WHALE) then WHALE else WHITELISTED)
  252.         ])
  253.     }
  254. }
  255. @Callable(i)
  256. func withdraw() = {
  257.     let currentKey = toBase58String(i.caller.bytes)
  258.     let amount = getValueBalance(currentKey)
  259.     if (amount <= 0) then throw("Not enough balance")
  260.     else ScriptResult(
  261.         WriteSet([ DataEntry(getKeyBalance(currentKey), 0)]),
  262.         TransferSet([ScriptTransfer(i.caller, amount, unit)])
  263.     )
  264. }
  265. @Callable(i)
  266. func additem(item: String, expVoting: Int, expCrowd: Int, expWhale: Int, data: String) = {
  267.     let account = toBase58String(i.caller.bytes)
  268.     let pmt = extract(i.payment)
  269.     if (isDefined(pmt.assetId)) then throw("can use waves only at the moment")
  270.     else {
  271.         if (pmt.amount != LISTINGFEE)
  272.             then throw("Please pay exact amount for the listing")
  273.         else if (expVoting > 2 && expCrowd > 3 && expWhale > 4)
  274.             then throw("Incorrect time parameters")
  275.         else if (getValueItemAuthor(item) != NONE)
  276.             then throw("Item already exist")
  277.         else WriteSet([
  278.             DataEntry(getKeyItemAuthor(item), account),
  279.             DataEntry(getKeyItemBlock(item), height),
  280.             DataEntry(getKeyItemVotingExpiration(item), height + expVoting),
  281.             DataEntry(getKeyItemBank(item), LISTINGFEE),
  282.             DataEntry(getKeyItemStatus(item), NEW),
  283.             DataEntry(getKeyItemData(item), data),
  284.             DataEntry(getKeyItemCrowdExpiration(item), height + expCrowd),
  285.             DataEntry(getKeyItemWhaleExpiration(item), height + expWhale)
  286.         ])
  287.     }
  288. }
  289. @Callable(i)
  290. func votecommit(item: String, hash: String) = {
  291.     let account = toBase58String(i.caller.bytes)
  292.     let commits = getValueItemNCommits(item)
  293.     let status = getValueItemStatus(item)
  294.     let pmt = extract(i.payment)
  295.     if (isDefined(pmt.assetId)) then throw("can use waves only at the moment")
  296.     else {
  297.         if (pmt.amount != 2*VOTEBET)
  298.             then throw("Not enough funds to vote for a new item")
  299.         else if (height > getValueItemVotingExpiration(item))
  300.             then throw("The voting has expired")
  301.         else if (getValueItemAuthor(item) == account)
  302.             then throw("Cannot vote for own proposal")
  303.         else if (status != NEW && status != COMMIT)
  304.             then throw("Wrong item status for 'commit' action")
  305.         else if (commits >= VOTERS)
  306.             then throw("No more voters for this item")
  307.         else if (getValueItemAccCommit(item, account) != NONE)
  308.             then throw("Can't vote twice")
  309.         else WriteSet([
  310.             DataEntry(getKeyItemStatus(item), if ( commits + 1 == VOTERS ) then REVEAL else COMMIT),
  311.             DataEntry(getKeyItemAccCommit(item, account), hash),
  312.             DataEntry(getKeyItemNCommits(item), commits + 1)
  313.         ])
  314.     }
  315. }
  316. @Callable(i)
  317. func votereveal(item: String, vote: String, salt: String) = {
  318.     let ridehash = toBase58String(sha256(toBytes(vote + salt)))
  319.     let account = toBase58String(i.caller.bytes)
  320.     let yesmltp = if(vote == FEATURED) then 1 else 0
  321.     let notmltp = if(vote == DELISTED) then 1 else 0
  322.     let yescnt = getValueItemVotesYes(item)
  323.     let notcnt = getValueItemVotesNo(item)
  324.     let newstatus = if ( yescnt >= QUORUM ) then FEATURED else
  325.         (if ( notcnt >= QUORUM ) then DELISTED else REVEAL)
  326.     if (getValueItemAccCommit(item, account) != ridehash)
  327.         then throw("Hashes don't match")
  328.     else if (height > getValueItemVotingExpiration(item))
  329.         then throw("The challenge has expired")
  330.     else if (getValueItemNCommits(item) < VOTERS)
  331.         then throw("It's still commit stage")
  332.     else if (getValueItemStatus(item) != REVEAL && getValueItemStatus(item) != newstatus)
  333.         then throw("Wrong item status for 'reveal' action")
  334.     else if (getValueItemAccReveal(item, account) != NONE)
  335.         then throw("Can't vote twice")
  336.     else if (vote != FEATURED && vote != DELISTED)
  337.         then throw("Bad vote result format")
  338.     else WriteSet([
  339.             DataEntry(getKeyItemAccReveal(item, account), vote),
  340.             DataEntry(getKeyItemVotesYes(item), yescnt + yesmltp),
  341.             DataEntry(getKeyItemVotesNo(item), notcnt + notmltp),
  342.             DataEntry(getKeyItemStatus(item), newstatus),
  343.             DataEntry(getKeyBalance(account), getValueBalance(account) + VOTEBET)
  344.         ])
  345. }
  346.  
  347. @Callable(i)
  348. func finalizevoting(item: String, account: String) = {
  349.     let yescnt = getValueItemVotesYes(item)
  350.     let notcnt = getValueItemVotesNo(item)
  351.     let accvote = getValueItemAccReveal(item, account)
  352.     let isauthor = account == getValueItemAuthor(item)
  353.     let finalstatus = if ( yescnt > QUORUM ) then FEATURED else
  354.         (if ( notcnt > QUORUM ) then DELISTED else NONE)
  355.     let mltisnotfullmajority = if (yescnt == VOTERS || notcnt == VOTERS) then 0 else 1
  356.     let nwinners = if ( finalstatus == FEATURED ) then yescnt else
  357.         (if ( finalstatus == DELISTED ) then notcnt else 0)
  358.     let nloosers = VOTERS - nwinners
  359.     let mltacciswinner = if (finalstatus == accvote) then 1 else 0
  360.     let voteprofit = if (nwinners == 0) then 0 else
  361.         mltacciswinner*(VOTEBET +
  362.             mltisnotfullmajority*(nloosers*VOTEBET + LISTINGFEE)/nwinners)
  363.     let authorreturn = LISTINGFEE*(if(isauthor) then 1 else 0)*
  364.         (if (mltisnotfullmajority == 1) then 0 else 1)*(if(finalstatus == FEATURED) then 1 else 0)
  365.     if (height < getValueItemVotingExpiration(item))
  366.         then throw("The voting hasn't finished yet")
  367.     else if (getValueItemAccFinal(item, account) == FINISHED)
  368.         then throw("Account has already claimed")
  369.     else if (accvote == NONE && !isauthor)
  370.         then throw("Account hasnot voted, hasnot reveal or isnot author")
  371.     else if (finalstatus == NONE)
  372.         then throw("Voting has expired")
  373.     else WriteSet([
  374.         DataEntry(getKeyItemAccFinal(item, account), FINISHED),
  375.         DataEntry(getKeyBalance(account), getValueBalance(account) + voteprofit + authorreturn)
  376.     ])
  377. }
  378.  
  379. @Callable(i)
  380. func closeexpiredvoting(item: String, account: String) = {
  381.     let finalstatus = if ( getValueItemVotesYes(item) > QUORUM ) then FEATURED else
  382.         (if ( getValueItemVotesNo(item) > QUORUM ) then DELISTED else NONE)
  383.     let accvote = getValueItemAccReveal(item, account)
  384.     let isauthor = account == getValueItemAuthor(item)
  385.     let acccomi = getValueItemAccCommit(item, account)
  386.     let hasrevealstage = getValueItemNCommits(item) == VOTERS
  387.     let authorreturn = LISTINGFEE*(if(isauthor) then 1 else 0)
  388.     let votersreturn1 = VOTEBET*(if(hasrevealstage) then 1 else 0)*
  389.         (if (accvote != NONE) then 1 else 0)
  390.     let votersreturn2 = 2*VOTEBET*(if(hasrevealstage) then 0 else 1)*
  391.         (if (acccomi != NONE) then 1 else 0)
  392.     if (height < getValueItemVotingExpiration(item))
  393.         then throw("The voting hasn't finished yet")
  394.     else if (!isauthor && acccomi == NONE)
  395.         then throw("Wrong account or item")
  396.     else if (getValueItemAccFinal(item, account) == FINISHED)
  397.         then throw("Account has already claimed")
  398.     else if (finalstatus != NONE)
  399.         then throw("Wrong item status")
  400.     else WriteSet([
  401.         DataEntry(getKeyItemAccFinal(item, account), FINISHED),
  402.         DataEntry(getKeyBalance(account), getValueBalance(account) +
  403.             authorreturn + votersreturn1 + votersreturn2)
  404.     ])
  405. }
  406.  
  407. @Callable(i)
  408. func donate( item: String, tier: Int, mode: String, review: String ) = {
  409.     let account = toBase58String(i.caller.bytes)
  410.     let pmt = extract(i.payment)
  411.     if (isDefined(pmt.assetId)) then throw("can use waves only at the moment")
  412.     else {
  413.         let cnt = getValueItemAccReviewsCnt(item, account) + 1
  414.         let newnegativefund = getValueItemFundNegative(item) +
  415.                     ( if ( mode == NEGATIVE ) then 1 else 0) * pmt.amount
  416.         let newpositivefund = getValueItemFundPositive(item) +
  417.                     ( if ( mode == POSITIVE ) then 1 else 0) * pmt.amount
  418.         if (getValueItemStatus(item) != FEATURED)
  419.             then throw("The project hasn't accepted by community")
  420.         else if (height >= getValueItemCrowdExpiration(item))
  421.             then throw("The time for crowdfunding has expired")
  422.         else if (newnegativefund >= newpositivefund)
  423.             then throw("Negative fund can't be higher than positive fund")
  424.         else if (mode != POSITIVE && mode != NEGATIVE)
  425.             then throw("Wrong mode parameter")
  426.         else if (getValueItemAuthor(item) == account)
  427.             then throw("Can't donate own project")
  428.         else if (pmt.amount != TIERS[tier - 1])
  429.             then throw("The payment must be equal to tier amount: " + toString(TIERS[tier - 1]))
  430.         else WriteSet([
  431.             DataEntry(getKeyItemAccReviewsCnt(item, account), cnt),
  432.             DataEntry(getKeyItemAccFundPositive(item, account),
  433.                 getValueItemAccFundPositive(item, account) +
  434.                     ( if ( mode == POSITIVE ) then 1 else 0) * pmt.amount ),
  435.             DataEntry(getKeyItemAccFundNegative(item, account),
  436.                 getValueItemAccFundNegative(item, account) +
  437.                     ( if ( mode == NEGATIVE ) then 1 else 0) * pmt.amount ),
  438.             DataEntry(getKeyItemFundPositive(item), newpositivefund),
  439.             DataEntry(getKeyItemFundNegative(item), newnegativefund),
  440.             DataEntry(getKeyItemAccReviewText(item, account, toString(cnt)), review),
  441.             DataEntry(getKeyItemAccReviewMode(item, account, toString(cnt)), mode),
  442.             DataEntry(getKeyItemAccReviewTier(item, account, toString(cnt)), tier)
  443.         ])
  444.     }
  445. }
  446.  
  447. @Callable(i)
  448. func whale( item: String ) = {
  449.     let pmt = extract(i.payment)
  450.     if (isDefined(pmt.assetId)) then throw("can use waves only at the moment")
  451.     else {
  452.         if (getValueItemStatus(item) != FEATURED)
  453.             then throw("The project hasn't accepted by community")
  454.         else if (height < getValueItemCrowdExpiration(item))
  455.             then throw("The time for crowdfunding has not expired yet")
  456.         else if (height > getValueItemWhaleExpiration(item))
  457.             then throw("The time for grant has expired")
  458.         else if (getValueItemStatus(item) == BUYOUT)
  459.             then throw("Investement has already done")
  460.         else if (pmt.amount < (getValueItemFundPositive(item)*MULTIPLIER)/100)
  461.             then throw("Investement must be more than "
  462.             + toString(MULTIPLIER) + "% of supportes funds")
  463.         else WriteSet([
  464.             DataEntry(getKeyItemStatus(item), BUYOUT),
  465.             DataEntry(getKeyBalance(getValueItemAuthor(item)),
  466.                 getValueBalance(getValueItemAuthor(item)) + getValueItemFundPositive(item)),
  467.             DataEntry(getKeyItemBuyoutAmount(item), pmt.amount)
  468.         ])
  469.     }
  470. }
  471.  
  472. @Callable(i)
  473. func claimwinnings( item: String, account: String ) = {
  474.     let status = getValueItemStatus(item)
  475.     let isbayout = if (status == BUYOUT) then 1 else 0
  476.     let iscrowdf = if (status != BUYOUT) then 1 else 0
  477.     let positivefund = getValueItemFundPositive(item)
  478.     let negativefund = getValueItemFundNegative(item)
  479.     let share = isbayout*(getValueItemAccFundPositive(item, account)*100)/
  480.             (if (positivefund <= 0) then 1 else positivefund) +
  481.         iscrowdf*(getValueItemAccFundNegative(item, account)*100)/
  482.             (if (negativefund <= 0) then 1 else negativefund)
  483.     let tmpnegwin = (negativefund*MULTIPLIER)/100
  484.     let betprofit = isbayout*((share*negativefund)/100) +
  485.         iscrowdf*((share*(if (tmpnegwin < positivefund) then tmpnegwin else positivefund))/100)
  486.     let roiprofit = isbayout*((share*getValueItemBuyoutAmount(item))/100)
  487.     let authorprofit = (if (getValueItemAuthor(item) == account) then 1 else 0)*
  488.         positivefund*(if (status != BUYOUT) then 1 else 0)
  489.     if (status == DELISTED)
  490.         then throw("The project hasn't accepted by community")
  491.     else if (status != BUYOUT && height <= getValueItemWhaleExpiration(item))
  492.         then throw("The time for grant has not expired yet")
  493.     else if (positivefund + negativefund <= 0)
  494.         then throw("The campaign wasn't active")
  495.     else WriteSet([
  496.         DataEntry(getKeyBalance(account), getValueBalance(account) +
  497.             betprofit + roiprofit + authorprofit),
  498.         DataEntry(getKeyItemStatus(item), if (authorprofit > 0) then CASHOUT else status),
  499.         DataEntry(getKeyItemAccFinal(item, account), CLAIMED)
  500.     ])
  501. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement