mirror of
https://github.com/status-im/status-go.git
synced 2025-02-16 00:37:38 +00:00
author shashankshampi <shashank.sanket1995@gmail.com> 1729780155 +0530 committer shashankshampi <shashank.sanket1995@gmail.com> 1730274350 +0530 test: Code Migration from status-cli-tests fix_: functional tests (#5979) * fix_: generate on test-functional * chore(test)_: fix functional test assertion --------- Co-authored-by: Siddarth Kumar <siddarthkay@gmail.com> feat(accounts)_: cherry-pick Persist acceptance of Terms of Use & Privacy policy (#5766) (#5977) * feat(accounts)_: Persist acceptance of Terms of Use & Privacy policy (#5766) The original GH issue https://github.com/status-im/status-mobile/issues/21113 came from a request from the Legal team. We must show to Status v1 users the new terms (Terms of Use & Privacy Policy) right after they upgrade to Status v2 from the stores. The solution we use is to create a flag in the accounts table, named hasAcceptedTerms. The flag will be set to true on the first account ever created in v2 and we provide a native call in mobile/status.go#AcceptTerms, which allows the client to persist the user's choice in case they are upgrading (from v1 -> v2, or from a v2 older than this PR). This solution is not the best because we should store the setting in a separate table, not in the accounts table. Related Mobile PR https://github.com/status-im/status-mobile/pull/21124 * fix(test)_: Compare addresses using uppercased strings --------- Co-authored-by: Icaro Motta <icaro.ldm@gmail.com> test_: restore account (#5960) feat_: `LogOnPanic` linter (#5969) * feat_: LogOnPanic linter * fix_: add missing defer LogOnPanic * chore_: make vendor * fix_: tests, address pr comments * fix_: address pr comments fix(ci)_: remove workspace and tmp dir This ensures we do not encounter weird errors like: ``` + ln -s /home/jenkins/workspace/go_prs_linux_x86_64_main_PR-5907 /home/jenkins/workspace/go_prs_linux_x86_64_main_PR-5907@tmp/go/src/github.com/status-im/status-go ln: failed to create symbolic link '/home/jenkins/workspace/go_prs_linux_x86_64_main_PR-5907@tmp/go/src/github.com/status-im/status-go': File exists script returned exit code 1 ``` Signed-off-by: Jakub Sokołowski <jakub@status.im> chore_: enable windows and macos CI build (#5840) - Added support for Windows and macOS in CI pipelines - Added missing dependencies for Windows and x86-64-darwin - Resolved macOS SDK version compatibility for darwin-x86_64 The `mkShell` override was necessary to ensure compatibility with the newer macOS SDK (version 11.0) for x86_64. The default SDK (10.12) was causing build failures because of the missing libs and frameworks. OverrideSDK creates a mapping from the default SDK in all package categories to the requested SDK (11.0). fix(contacts)_: fix trust status not being saved to cache when changed (#5965) Fixes https://github.com/status-im/status-desktop/issues/16392 cleanup added logger and cleanup review comments changes fix_: functional tests (#5979) * fix_: generate on test-functional * chore(test)_: fix functional test assertion --------- Co-authored-by: Siddarth Kumar <siddarthkay@gmail.com> feat(accounts)_: cherry-pick Persist acceptance of Terms of Use & Privacy policy (#5766) (#5977) * feat(accounts)_: Persist acceptance of Terms of Use & Privacy policy (#5766) The original GH issue https://github.com/status-im/status-mobile/issues/21113 came from a request from the Legal team. We must show to Status v1 users the new terms (Terms of Use & Privacy Policy) right after they upgrade to Status v2 from the stores. The solution we use is to create a flag in the accounts table, named hasAcceptedTerms. The flag will be set to true on the first account ever created in v2 and we provide a native call in mobile/status.go#AcceptTerms, which allows the client to persist the user's choice in case they are upgrading (from v1 -> v2, or from a v2 older than this PR). This solution is not the best because we should store the setting in a separate table, not in the accounts table. Related Mobile PR https://github.com/status-im/status-mobile/pull/21124 * fix(test)_: Compare addresses using uppercased strings --------- Co-authored-by: Icaro Motta <icaro.ldm@gmail.com> test_: restore account (#5960) feat_: `LogOnPanic` linter (#5969) * feat_: LogOnPanic linter * fix_: add missing defer LogOnPanic * chore_: make vendor * fix_: tests, address pr comments * fix_: address pr comments chore_: enable windows and macos CI build (#5840) - Added support for Windows and macOS in CI pipelines - Added missing dependencies for Windows and x86-64-darwin - Resolved macOS SDK version compatibility for darwin-x86_64 The `mkShell` override was necessary to ensure compatibility with the newer macOS SDK (version 11.0) for x86_64. The default SDK (10.12) was causing build failures because of the missing libs and frameworks. OverrideSDK creates a mapping from the default SDK in all package categories to the requested SDK (11.0). fix(contacts)_: fix trust status not being saved to cache when changed (#5965) Fixes https://github.com/status-im/status-desktop/issues/16392 test_: remove port bind chore(wallet)_: move route execution code to separate module chore_: replace geth logger with zap logger (#5962) closes: #6002 feat(telemetry)_: add metrics for message reliability (#5899) * feat(telemetry)_: track message reliability Add metrics for dial errors, missed messages, missed relevant messages, and confirmed delivery. * fix_: handle error from json marshal chore_: use zap logger as request logger iterates: status-im/status-desktop#16536 test_: unique project per run test_: use docker compose v2, more concrete project name fix(codecov)_: ignore folders without tests Otherwise Codecov reports incorrect numbers when making changes. https://docs.codecov.com/docs/ignoring-paths Signed-off-by: Jakub Sokołowski <jakub@status.im> test_: verify schema of signals during init; fix schema verification warnings (#5947) fix_: update defaultGorushURL (#6011) fix(tests)_: use non-standard port to avoid conflicts We have observed `nimbus-eth2` build failures reporting this port: ```json { "lvl": "NTC", "ts": "2024-10-28 13:51:32.308+00:00", "msg": "REST HTTP server could not be started", "topics": "beacnde", "address": "127.0.0.1:5432", "reason": "(98) Address already in use" } ``` https://ci.status.im/job/nimbus-eth2/job/platforms/job/linux/job/x86_64/job/main/job/PR-6683/3/ Signed-off-by: Jakub Sokołowski <jakub@status.im> fix_: create request logger ad-hoc in tests Fixes `TestCall` failing when run concurrently. chore_: configure codecov (#6005) * chore_: configure codecov * fix_: after_n_builds
205 lines
6.7 KiB
Go
205 lines
6.7 KiB
Go
package routeexecution
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/status-im/status-go/eth-node/types"
|
|
|
|
status_common "github.com/status-im/status-go/common"
|
|
statusErrors "github.com/status-im/status-go/errors"
|
|
"github.com/status-im/status-go/services/wallet/requests"
|
|
"github.com/status-im/status-go/services/wallet/responses"
|
|
"github.com/status-im/status-go/services/wallet/router"
|
|
"github.com/status-im/status-go/services/wallet/router/pathprocessor"
|
|
"github.com/status-im/status-go/services/wallet/router/sendtype"
|
|
"github.com/status-im/status-go/services/wallet/transfer"
|
|
"github.com/status-im/status-go/signal"
|
|
)
|
|
|
|
type Manager struct {
|
|
router *router.Router
|
|
transactionManager *transfer.TransactionManager
|
|
transferController *transfer.Controller
|
|
}
|
|
|
|
func NewManager(router *router.Router, transactionManager *transfer.TransactionManager, transferController *transfer.Controller) *Manager {
|
|
return &Manager{
|
|
router: router,
|
|
transactionManager: transactionManager,
|
|
transferController: transferController,
|
|
}
|
|
}
|
|
|
|
func (m *Manager) BuildTransactionsFromRoute(ctx context.Context, buildInputParams *requests.RouterBuildTransactionsParams) {
|
|
go func() {
|
|
defer status_common.LogOnPanic()
|
|
|
|
m.router.StopSuggestedRoutesAsyncCalculation()
|
|
|
|
var err error
|
|
response := &responses.RouterTransactionsForSigning{
|
|
SendDetails: &responses.SendDetails{
|
|
Uuid: buildInputParams.Uuid,
|
|
},
|
|
}
|
|
|
|
defer func() {
|
|
if err != nil {
|
|
m.transactionManager.ClearLocalRouterTransactionsData()
|
|
err = statusErrors.CreateErrorResponseFromError(err)
|
|
response.SendDetails.ErrorResponse = err.(*statusErrors.ErrorResponse)
|
|
}
|
|
signal.SendWalletEvent(signal.SignRouterTransactions, response)
|
|
}()
|
|
|
|
route, routeInputParams := m.router.GetBestRouteAndAssociatedInputParams()
|
|
if routeInputParams.Uuid != buildInputParams.Uuid {
|
|
// should never be here
|
|
err = ErrCannotResolveRouteId
|
|
return
|
|
}
|
|
|
|
updateFields(response.SendDetails, routeInputParams)
|
|
|
|
// notify client that sending transactions started (has 3 steps, building txs, signing txs, sending txs)
|
|
signal.SendWalletEvent(signal.RouterSendingTransactionsStarted, response.SendDetails)
|
|
|
|
response.SigningDetails, err = m.transactionManager.BuildTransactionsFromRoute(
|
|
route,
|
|
m.router.GetPathProcessors(),
|
|
transfer.BuildRouteExtraParams{
|
|
AddressFrom: routeInputParams.AddrFrom,
|
|
AddressTo: routeInputParams.AddrTo,
|
|
Username: routeInputParams.Username,
|
|
PublicKey: routeInputParams.PublicKey,
|
|
PackID: routeInputParams.PackID.ToInt(),
|
|
SlippagePercentage: buildInputParams.SlippagePercentage,
|
|
},
|
|
)
|
|
}()
|
|
}
|
|
|
|
func (m *Manager) SendRouterTransactionsWithSignatures(ctx context.Context, sendInputParams *requests.RouterSendTransactionsParams) {
|
|
go func() {
|
|
defer status_common.LogOnPanic()
|
|
|
|
var (
|
|
err error
|
|
routeInputParams requests.RouteInputParams
|
|
)
|
|
response := &responses.RouterSentTransactions{
|
|
SendDetails: &responses.SendDetails{
|
|
Uuid: sendInputParams.Uuid,
|
|
},
|
|
}
|
|
|
|
defer func() {
|
|
clearLocalData := true
|
|
if routeInputParams.SendType == sendtype.Swap {
|
|
// in case of swap don't clear local data if an approval is placed, but swap tx is not sent yet
|
|
if m.transactionManager.ApprovalRequiredForPath(pathprocessor.ProcessorSwapParaswapName) &&
|
|
m.transactionManager.ApprovalPlacedForPath(pathprocessor.ProcessorSwapParaswapName) &&
|
|
!m.transactionManager.TxPlacedForPath(pathprocessor.ProcessorSwapParaswapName) {
|
|
clearLocalData = false
|
|
}
|
|
}
|
|
|
|
if clearLocalData {
|
|
m.transactionManager.ClearLocalRouterTransactionsData()
|
|
}
|
|
|
|
if err != nil {
|
|
err = statusErrors.CreateErrorResponseFromError(err)
|
|
response.SendDetails.ErrorResponse = err.(*statusErrors.ErrorResponse)
|
|
}
|
|
signal.SendWalletEvent(signal.RouterTransactionsSent, response)
|
|
}()
|
|
|
|
_, routeInputParams = m.router.GetBestRouteAndAssociatedInputParams()
|
|
if routeInputParams.Uuid != sendInputParams.Uuid {
|
|
err = ErrCannotResolveRouteId
|
|
return
|
|
}
|
|
|
|
updateFields(response.SendDetails, routeInputParams)
|
|
|
|
err = m.transactionManager.ValidateAndAddSignaturesToRouterTransactions(sendInputParams.Signatures)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// prepare multitx
|
|
var mtType transfer.MultiTransactionType = transfer.MultiTransactionSend
|
|
if routeInputParams.SendType == sendtype.Bridge {
|
|
mtType = transfer.MultiTransactionBridge
|
|
} else if routeInputParams.SendType == sendtype.Swap {
|
|
mtType = transfer.MultiTransactionSwap
|
|
}
|
|
|
|
multiTx := transfer.NewMultiTransaction(
|
|
/* Timestamp: */ uint64(time.Now().Unix()),
|
|
/* FromNetworkID: */ 0,
|
|
/* ToNetworkID: */ 0,
|
|
/* FromTxHash: */ common.Hash{},
|
|
/* ToTxHash: */ common.Hash{},
|
|
/* FromAddress: */ routeInputParams.AddrFrom,
|
|
/* ToAddress: */ routeInputParams.AddrTo,
|
|
/* FromAsset: */ routeInputParams.TokenID,
|
|
/* ToAsset: */ routeInputParams.ToTokenID,
|
|
/* FromAmount: */ routeInputParams.AmountIn,
|
|
/* ToAmount: */ routeInputParams.AmountOut,
|
|
/* Type: */ mtType,
|
|
/* CrossTxID: */ "",
|
|
)
|
|
|
|
_, err = m.transactionManager.InsertMultiTransaction(multiTx)
|
|
if err != nil {
|
|
return
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
response.SentTransactions, err = m.transactionManager.SendRouterTransactions(ctx, multiTx)
|
|
|
|
var (
|
|
chainIDs []uint64
|
|
addresses []common.Address
|
|
)
|
|
for _, tx := range response.SentTransactions {
|
|
chainIDs = append(chainIDs, tx.FromChain)
|
|
addresses = append(addresses, common.Address(tx.FromAddress))
|
|
go func(chainId uint64, txHash common.Hash) {
|
|
defer status_common.LogOnPanic()
|
|
err = m.transactionManager.WatchTransaction(context.Background(), chainId, txHash)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}(tx.FromChain, common.Hash(tx.Hash))
|
|
}
|
|
err = m.transferController.CheckRecentHistory(chainIDs, addresses)
|
|
}()
|
|
}
|
|
|
|
func updateFields(sd *responses.SendDetails, inputParams requests.RouteInputParams) {
|
|
sd.SendType = int(inputParams.SendType)
|
|
sd.FromAddress = types.Address(inputParams.AddrFrom)
|
|
sd.ToAddress = types.Address(inputParams.AddrTo)
|
|
sd.FromToken = inputParams.TokenID
|
|
sd.ToToken = inputParams.ToTokenID
|
|
if inputParams.AmountIn != nil {
|
|
sd.FromAmount = inputParams.AmountIn.String()
|
|
}
|
|
if inputParams.AmountOut != nil {
|
|
sd.ToAmount = inputParams.AmountOut.String()
|
|
}
|
|
sd.OwnerTokenBeingSent = inputParams.TokenIDIsOwnerToken
|
|
sd.Username = inputParams.Username
|
|
sd.PublicKey = inputParams.PublicKey
|
|
if inputParams.PackID != nil {
|
|
sd.PackID = inputParams.PackID.String()
|
|
}
|
|
}
|