Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.25 KB | None | 0 0
  1. {-# STDLIB_VERSION 3 #-}
  2. {-# CONTENT_TYPE DAPP #-}
  3. {-# SCRIPT_TYPE ACCOUNT #-}
  4.  
  5. #
  6. # Smart Contract Implementing Staking and Reward Withdrawal by Users of Neutrino Protocol
  7. # (RPD is Reward Payouts Distribution)
  8. #
  9.  
  10. #-------------------Base functions----------------------
  11. func getNumberByKey(key: String) = {
  12. match getInteger(this, key) {
  13. case a:Int => a
  14. case _ => 0
  15. }
  16. }
  17. func getStringByKey(key: String) = {
  18. match getString(this, key) {
  19. case a:String => a
  20. case _ => ""
  21. }
  22. }
  23. func getBoolByKey(key: String) = {
  24. match getBoolean(this, key) {
  25. case a:Boolean => a
  26. case _ => false
  27. }
  28. }
  29. func getNumberByAddressAndKey(address: String, key: String) = {
  30. match getInteger(addressFromStringValue(address), key) {
  31. case a:Int => a
  32. case _ => 0
  33. }
  34. }
  35. func getStringByAddressAndKey(address: Address, key: String) = {
  36. match getString(address, key) {
  37. case a:String => a
  38. case _ => ""
  39. }
  40. }
  41.  
  42. #-------------------Constructor-------------------------
  43. let NeutrinoAssetIdKey = "neutrino_asset_id"
  44. let NeutrinoContractKey = "neutrino_contract"
  45.  
  46. #-------------------Keys---------------------------------
  47. let BalanceKey = "rpd_balance"
  48. let ControlContractKey = "control_contract"
  49. let AdminsKey = "admins"
  50.  
  51. func getUserBalanceKey(owner: String, assetId: String) = BalanceKey + "_" + assetId + "_" + owner
  52. func getContractBalanceKey(assetId: String) = BalanceKey + "_" + assetId
  53.  
  54. func getExpireProposalKey(hash: String) = "proposal_expire" + "_" + hash
  55. func getOwnerProposalKey(hash: String) = "proposal_owner" + "_" + hash
  56. func getArgumentsProposalKey(hash: String) = "proposal_arguments" + "_" + hash
  57. func getVoteKey(owner: String, hash: String) = "proposal_vote" + "_" + owner + "_" + hash
  58.  
  59. #-------------------Convert functions-------------------
  60. func convertJsonArrayToList(jsonArray: String) = {
  61. jsonArray.split(",") #jsonArray.take(size(jsonArray)-1).drop(1).split(",")
  62. }
  63.  
  64. #-------------------Global vars-------------------------
  65. let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
  66. let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
  67.  
  68. #-------------------Get functions----------------------
  69. func getContractBalance(assetId: String) = getNumberByKey(getContractBalanceKey(assetId))
  70. func getUserBalance(owner : String, assetId: String) = getNumberByKey(getUserBalanceKey(owner, assetId))
  71.  
  72. func getExpireProposal(hash: String) = getNumberByKey(getExpireProposalKey(hash))
  73. func getOwnerProposal(hash: String) = getStringByKey(getOwnerProposalKey(hash))
  74. func getArgumentsProposal(hash: String) = getStringByKey(getArgumentsProposalKey(hash))
  75. func getVote(owner: String, hash: String) = getStringByKey(getVoteKey(owner, hash))
  76.  
  77. #-------------------Callable----------------------
  78. # start neutrino staking
  79. # [called by user]
  80. @Callable(i)
  81. func lockNeutrino() = {
  82. let pmt = extract(i.payment)
  83. if (pmt.assetId != neutrinoAssetId)
  84. then throw("can use neutrino")
  85. else {
  86. let account = toString(i.caller)
  87. let assetIdString = toBase58String(valueOrErrorMessage(pmt.assetId, "parse value error"))
  88.  
  89. WriteSet([
  90. DataEntry(getContractBalanceKey(assetIdString), getContractBalance(assetIdString) + pmt.amount),
  91. DataEntry(getUserBalanceKey(account, assetIdString), getUserBalance(account, assetIdString) + pmt.amount)
  92. ])
  93. }
  94. }
  95.  
  96. # cancel neutrino staking
  97. # [called by user]
  98. @Callable(i)
  99. func unlockNeutrino(unlockAmount: Int, assetIdString: String) = {
  100. let account = toString(i.caller)
  101. let assetId = fromBase58String(assetIdString)
  102. let balance = getUserBalance(account, assetIdString) - unlockAmount
  103. if (balance < 0)
  104. then throw("invalid amount")
  105. else if(assetId != neutrinoAssetId)
  106. then throw("can use neutrino")
  107. else {
  108. ScriptResult(
  109. WriteSet([
  110. DataEntry(getContractBalanceKey(assetIdString), getContractBalance(assetIdString) - unlockAmount),
  111. DataEntry(getUserBalanceKey(account, assetIdString), balance)
  112. ]),
  113. TransferSet([ScriptTransfer(addressFromStringValue(account), unlockAmount, neutrinoAssetId)])
  114. )
  115. }
  116. }
  117.  
  118. # cancel neutrino staking
  119. # [called by user]
  120. @Callable(i)
  121. func vote(hash: String, indexArgument: Int) = {
  122. let arguments = getArgumentsProposal(hash).split(",")
  123. let argument = arguments[indexArgument]
  124. if(height > getExpireProposal(hash))
  125. then throw("proposal is expired")
  126. else {
  127. WriteSet([
  128. DataEntry(getVoteKey(toString(i.caller), hash), argument)
  129. ])
  130. }
  131. }
  132.  
  133.  
  134. @Callable(i)
  135. func createProposal(arguments: String, expairHeight: Int) = {
  136. let hash = toBase58String(keccak256(toBytes(arguments) + toBytes(expairHeight) + i.callerPublicKey))
  137. if(getOwnerProposal(hash) != "")
  138. then throw("proposal is exist")
  139. else {
  140. WriteSet([
  141. DataEntry(getExpireProposalKey(hash), expairHeight),
  142. DataEntry(getOwnerProposalKey(hash), toString(i.caller)),
  143. DataEntry(getArgumentsProposalKey(hash), arguments)
  144. ])
  145. }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement