|
|
|
|
@@ -8,6 +8,7 @@ import (
|
|
|
|
|
|
|
|
|
|
"github.com/tech/sendico/gateway/chain/internal/appversion"
|
|
|
|
|
"github.com/tech/sendico/gateway/chain/internal/service/gateway/shared"
|
|
|
|
|
chainstoragemodel "github.com/tech/sendico/gateway/chain/storage/model"
|
|
|
|
|
chainasset "github.com/tech/sendico/pkg/chain"
|
|
|
|
|
"github.com/tech/sendico/pkg/connector/params"
|
|
|
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
|
|
|
@@ -17,6 +18,7 @@ import (
|
|
|
|
|
chainv1 "github.com/tech/sendico/pkg/proto/gateway/chain/v1"
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"google.golang.org/protobuf/types/known/structpb"
|
|
|
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const chainConnectorID = "chain"
|
|
|
|
|
@@ -293,11 +295,21 @@ func (s *Service) GetOperation(ctx context.Context, req *connectorv1.GetOperatio
|
|
|
|
|
if req == nil || strings.TrimSpace(req.GetOperationId()) == "" {
|
|
|
|
|
return nil, merrors.InvalidArgument("get_operation: operation_id is required")
|
|
|
|
|
}
|
|
|
|
|
resp, err := s.GetTransfer(ctx, &chainv1.GetTransferRequest{TransferRef: strings.TrimSpace(req.GetOperationId())})
|
|
|
|
|
|
|
|
|
|
operationRef := strings.TrimSpace(req.GetOperationId())
|
|
|
|
|
if s.storage == nil || s.storage.Transfers() == nil {
|
|
|
|
|
return nil, merrors.Internal("get_operation: storage is not configured")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
transfer, err := s.storage.Transfers().FindByOperationRef(ctx, "", operationRef)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return &connectorv1.GetOperationResponse{Operation: chainTransferToOperation(resp.GetTransfer())}, nil
|
|
|
|
|
if transfer == nil {
|
|
|
|
|
return nil, merrors.NoData("transfer not found")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &connectorv1.GetOperationResponse{Operation: chainTransferToOperation(storageTransferToProto(transfer))}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Service) ListOperations(ctx context.Context, req *connectorv1.ListOperationsRequest) (*connectorv1.ListOperationsResponse, error) {
|
|
|
|
|
@@ -493,6 +505,61 @@ func feeEstimateResult(resp *chainv1.EstimateTransferFeeResponse) *structpb.Stru
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func storageTransferToProto(transfer *chainstoragemodel.Transfer) *chainv1.Transfer {
|
|
|
|
|
if transfer == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
destination := &chainv1.TransferDestination{Memo: strings.TrimSpace(transfer.Destination.Memo)}
|
|
|
|
|
if managedWalletRef := strings.TrimSpace(transfer.Destination.ManagedWalletRef); managedWalletRef != "" {
|
|
|
|
|
destination.Destination = &chainv1.TransferDestination_ManagedWalletRef{ManagedWalletRef: managedWalletRef}
|
|
|
|
|
} else if externalAddress := strings.TrimSpace(transfer.Destination.ExternalAddress); externalAddress != "" {
|
|
|
|
|
destination.Destination = &chainv1.TransferDestination_ExternalAddress{ExternalAddress: externalAddress}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fees := make([]*chainv1.ServiceFeeBreakdown, 0, len(transfer.Fees))
|
|
|
|
|
for _, fee := range transfer.Fees {
|
|
|
|
|
fees = append(fees, &chainv1.ServiceFeeBreakdown{
|
|
|
|
|
FeeCode: strings.TrimSpace(fee.FeeCode),
|
|
|
|
|
Amount: fee.Amount,
|
|
|
|
|
Description: strings.TrimSpace(fee.Description),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
asset := &chainv1.Asset{
|
|
|
|
|
Chain: shared.ChainEnumFromName(transfer.Network),
|
|
|
|
|
TokenSymbol: strings.TrimSpace(transfer.TokenSymbol),
|
|
|
|
|
ContractAddress: strings.TrimSpace(transfer.ContractAddress),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protoTransfer := &chainv1.Transfer{
|
|
|
|
|
TransferRef: strings.TrimSpace(transfer.TransferRef),
|
|
|
|
|
IdempotencyKey: strings.TrimSpace(transfer.IdempotencyKey),
|
|
|
|
|
IntentRef: strings.TrimSpace(transfer.IntentRef),
|
|
|
|
|
OperationRef: strings.TrimSpace(transfer.OperationRef),
|
|
|
|
|
OrganizationRef: strings.TrimSpace(transfer.OrganizationRef),
|
|
|
|
|
SourceWalletRef: strings.TrimSpace(transfer.SourceWalletRef),
|
|
|
|
|
Destination: destination,
|
|
|
|
|
Asset: asset,
|
|
|
|
|
RequestedAmount: shared.MonenyToProto(transfer.RequestedAmount),
|
|
|
|
|
NetAmount: shared.MonenyToProto(transfer.NetAmount),
|
|
|
|
|
Fees: fees,
|
|
|
|
|
Status: shared.TransferStatusToProto(transfer.Status),
|
|
|
|
|
TransactionHash: strings.TrimSpace(transfer.TxHash),
|
|
|
|
|
FailureReason: strings.TrimSpace(transfer.FailureReason),
|
|
|
|
|
PaymentRef: strings.TrimSpace(transfer.PaymentRef),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !transfer.CreatedAt.IsZero() {
|
|
|
|
|
protoTransfer.CreatedAt = timestamppb.New(transfer.CreatedAt.UTC())
|
|
|
|
|
}
|
|
|
|
|
if !transfer.UpdatedAt.IsZero() {
|
|
|
|
|
protoTransfer.UpdatedAt = timestamppb.New(transfer.UpdatedAt.UTC())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return protoTransfer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func gasTopUpResult(amount *moneyv1.Money, capHit bool, transferRef string) *structpb.Struct {
|
|
|
|
|
payload := map[string]interface{}{
|
|
|
|
|
"cap_hit": capHit,
|
|
|
|
|
@@ -518,18 +585,33 @@ func chainTransferToOperation(transfer *chainv1.Transfer) *connectorv1.Operation
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
op := &connectorv1.Operation{
|
|
|
|
|
OperationId: strings.TrimSpace(transfer.GetTransferRef()),
|
|
|
|
|
Type: connectorv1.OperationType_TRANSFER,
|
|
|
|
|
Status: chainTransferStatusToOperation(transfer.GetStatus()),
|
|
|
|
|
Money: transfer.GetRequestedAmount(),
|
|
|
|
|
ProviderRef: strings.TrimSpace(transfer.GetTransactionHash()),
|
|
|
|
|
CreatedAt: transfer.GetCreatedAt(),
|
|
|
|
|
UpdatedAt: transfer.GetUpdatedAt(),
|
|
|
|
|
OperationId: strings.TrimSpace(transfer.GetTransferRef()),
|
|
|
|
|
Type: connectorv1.OperationType_TRANSFER,
|
|
|
|
|
Status: chainTransferStatusToOperation(transfer.GetStatus()),
|
|
|
|
|
Money: transfer.GetRequestedAmount(),
|
|
|
|
|
ProviderRef: strings.TrimSpace(transfer.GetTransactionHash()),
|
|
|
|
|
IntentRef: strings.TrimSpace(transfer.GetIntentRef()),
|
|
|
|
|
OperationRef: strings.TrimSpace(transfer.GetOperationRef()),
|
|
|
|
|
CreatedAt: transfer.GetCreatedAt(),
|
|
|
|
|
UpdatedAt: transfer.GetUpdatedAt(),
|
|
|
|
|
From: &connectorv1.OperationParty{Ref: &connectorv1.OperationParty_Account{Account: &connectorv1.AccountRef{
|
|
|
|
|
ConnectorId: chainConnectorID,
|
|
|
|
|
AccountId: strings.TrimSpace(transfer.GetSourceWalletRef()),
|
|
|
|
|
}}},
|
|
|
|
|
}
|
|
|
|
|
params := map[string]interface{}{}
|
|
|
|
|
if paymentRef := strings.TrimSpace(transfer.GetPaymentRef()); paymentRef != "" {
|
|
|
|
|
params["payment_ref"] = paymentRef
|
|
|
|
|
}
|
|
|
|
|
if organizationRef := strings.TrimSpace(transfer.GetOrganizationRef()); organizationRef != "" {
|
|
|
|
|
params["organization_ref"] = organizationRef
|
|
|
|
|
}
|
|
|
|
|
if failureReason := strings.TrimSpace(transfer.GetFailureReason()); failureReason != "" {
|
|
|
|
|
params["failure_reason"] = failureReason
|
|
|
|
|
}
|
|
|
|
|
if len(params) > 0 {
|
|
|
|
|
op.Params = structFromMap(params)
|
|
|
|
|
}
|
|
|
|
|
if dest := transfer.GetDestination(); dest != nil {
|
|
|
|
|
switch d := dest.GetDestination().(type) {
|
|
|
|
|
case *chainv1.TransferDestination_ManagedWalletRef:
|
|
|
|
|
@@ -629,6 +711,17 @@ func operationAccountID(party *connectorv1.OperationParty) string {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func structFromMap(values map[string]interface{}) *structpb.Struct {
|
|
|
|
|
if len(values) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
result, err := structpb.NewStruct(values)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func connectorError(code connectorv1.ErrorCode, message string, op *connectorv1.Operation, accountID string) *connectorv1.ConnectorError {
|
|
|
|
|
err := &connectorv1.ConnectorError{
|
|
|
|
|
Code: code,
|
|
|
|
|
|