The backend for the project formerly known as signet, now known as beignet.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

submission.go 2.8 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package utils
  2. import (
  3. "fmt"
  4. "math"
  5. "github.com/imosed/signet/client"
  6. . "github.com/imosed/signet/data"
  7. "github.com/stellar/go/clients/horizonclient"
  8. "github.com/stellar/go/keypair"
  9. "github.com/stellar/go/network"
  10. "github.com/stellar/go/protocols/horizon"
  11. "github.com/stellar/go/txnbuild"
  12. "github.com/stellar/go/xdr"
  13. "gorm.io/gorm/clause"
  14. )
  15. func getFraction(price float64) xdr.Price {
  16. factor := math.Pow(10, 8)
  17. return xdr.Price{N: xdr.Int32(price * factor), D: xdr.Int32(factor)}
  18. }
  19. func SubmitGroupFund(fundID uint) (bool, error) {
  20. var fund RewardFund
  21. Db.Preload(clause.Associations).Find(&fund, fundID)
  22. var err error
  23. source := keypair.MustParseFull(fund.FundSecret)
  24. sourceReq := horizonclient.AccountRequest{AccountID: source.Address()}
  25. var sourceAcct horizon.Account
  26. sourceAcct, err = client.SignetClient.AccountDetail(sourceReq)
  27. offerReq := horizonclient.OfferRequest{
  28. Seller: fund.SellingWallet,
  29. Selling: fmt.Sprintf("%s:%s", fund.Asset, fund.IssuerWallet),
  30. Order: horizonclient.OrderDesc,
  31. }
  32. if err, ok := FindOffer(offerReq, &fund); !ok {
  33. return false, err
  34. }
  35. var currentContributions = fund.Contributions
  36. var submissionAmount = sumContributions(currentContributions)
  37. tr := Db.Begin()
  38. tr.Table("contributions").
  39. Where("reward_fund_id = ? and submitted is null or submitted = false", fundID).
  40. Updates(Contribution{Submitted: true})
  41. var tx *txnbuild.Transaction
  42. tx, err = txnbuild.NewTransaction(
  43. txnbuild.TransactionParams{
  44. SourceAccount: &sourceAcct,
  45. IncrementSequenceNum: true,
  46. Operations: []txnbuild.Operation{
  47. &txnbuild.ChangeTrust{
  48. Line: txnbuild.CreditAsset{
  49. Code: fund.Asset,
  50. Issuer: fund.IssuerWallet,
  51. }.MustToChangeTrustAsset(),
  52. SourceAccount: fund.FundWallet,
  53. },
  54. &txnbuild.ManageBuyOffer{
  55. Selling: txnbuild.NativeAsset{},
  56. Buying: txnbuild.CreditAsset{
  57. Code: fund.Asset,
  58. Issuer: fund.IssuerWallet,
  59. },
  60. Amount: fmt.Sprintf("%f", submissionAmount),
  61. Price: getFraction(fund.Price),
  62. OfferID: 0,
  63. SourceAccount: fund.FundWallet,
  64. },
  65. },
  66. BaseFee: txnbuild.MinBaseFee,
  67. Memo: txnbuild.Memo(nil),
  68. Preconditions: txnbuild.Preconditions{
  69. TimeBounds: txnbuild.NewInfiniteTimeout(), // TODO: change from infinite
  70. },
  71. })
  72. if err != nil {
  73. tr.Rollback()
  74. return false, err
  75. }
  76. tx, err = tx.Sign(network.TestNetworkPassphrase, source)
  77. if err != nil {
  78. tr.Rollback()
  79. return false, err
  80. }
  81. _, err = client.SignetClient.SubmitTransaction(tx)
  82. if err != nil {
  83. tr.Rollback()
  84. return false, err
  85. }
  86. tr.Commit()
  87. return true, nil
  88. }
  89. func sumContributions(contributions []Contribution) float64 {
  90. var total float64 = 0
  91. for _, contribution := range contributions {
  92. if !contribution.Submitted {
  93. total += contribution.Amount
  94. }
  95. }
  96. return total
  97. }