diff --git a/api/edge/bff/internal/server/accountapiimp/signup.go b/api/edge/bff/internal/server/accountapiimp/signup.go index 61608aca..8bc3d3aa 100644 --- a/api/edge/bff/internal/server/accountapiimp/signup.go +++ b/api/edge/bff/internal/server/accountapiimp/signup.go @@ -338,9 +338,6 @@ func (a *AccountAPI) openOrgLedgerAccount(ctx context.Context, org *model.Organi return merrors.Internal("chain gateway default asset is not configured") } - // TODO: remove hardcode - currency := "RUB" - var describable *describablev1.Describable name := strings.TrimSpace(sr.LedgerWallet.Name) var description *string @@ -357,26 +354,47 @@ func (a *AccountAPI) openOrgLedgerAccount(ctx context.Context, org *model.Organi } } - resp, err := a.ledgerClient.CreateAccount(ctx, &ledgerv1.CreateAccountRequest{ - OrganizationRef: org.ID.Hex(), - AccountType: ledgerv1.AccountType_ACCOUNT_TYPE_ASSET, - Currency: currency, - Status: ledgerv1.AccountStatus_ACCOUNT_STATUS_ACTIVE, - Role: ledgerv1.AccountRole_ACCOUNT_ROLE_OPERATING, - Metadata: map[string]string{ - "source": "signup", - "login": sr.Account.Login, - }, - Describable: describable, - }) - if err != nil { - a.logger.Warn("Failed to create ledger account for organization", zap.Error(err), mzap.StorableRef(org)) - return err - } - if resp == nil || resp.GetAccount() == nil || strings.TrimSpace(resp.GetAccount().GetLedgerAccountRef()) == "" { - return merrors.Internal("ledger returned empty account reference") + currencies := []string{"RUB", "USDT"} + if chainTokenCurrency := strings.ToUpper(strings.TrimSpace(a.chainAsset.GetTokenSymbol())); chainTokenCurrency != "" { + currencies = append(currencies, chainTokenCurrency) + } + + seen := make(map[string]struct{}, len(currencies)) + for _, currency := range currencies { + currency = strings.ToUpper(strings.TrimSpace(currency)) + if currency == "" { + continue + } + if _, exists := seen[currency]; exists { + continue + } + seen[currency] = struct{}{} + + resp, err := a.ledgerClient.CreateAccount(ctx, &ledgerv1.CreateAccountRequest{ + OrganizationRef: org.ID.Hex(), + AccountType: ledgerv1.AccountType_ACCOUNT_TYPE_ASSET, + Currency: currency, + Status: ledgerv1.AccountStatus_ACCOUNT_STATUS_ACTIVE, + Role: ledgerv1.AccountRole_ACCOUNT_ROLE_OPERATING, + Metadata: map[string]string{ + "source": "signup", + "login": sr.Account.Login, + }, + Describable: describable, + }) + if err != nil { + a.logger.Warn("Failed to create ledger account for organization", zap.Error(err), mzap.StorableRef(org), zap.String("currency", currency)) + return err + } + if resp == nil || resp.GetAccount() == nil || strings.TrimSpace(resp.GetAccount().GetLedgerAccountRef()) == "" { + return merrors.Internal("ledger returned empty account reference") + } + + a.logger.Info("Ledger account created for organization", + mzap.StorableRef(org), + zap.String("currency", currency), + zap.String("ledger_account_ref", resp.GetAccount().GetLedgerAccountRef())) } - a.logger.Info("Ledger account created for organization", mzap.StorableRef(org), zap.String("ledger_account_ref", resp.GetAccount().GetLedgerAccountRef())) return nil } diff --git a/api/edge/bff/internal/server/accountapiimp/signup_ledger_test.go b/api/edge/bff/internal/server/accountapiimp/signup_ledger_test.go index fadb4407..5acb6810 100644 --- a/api/edge/bff/internal/server/accountapiimp/signup_ledger_test.go +++ b/api/edge/bff/internal/server/accountapiimp/signup_ledger_test.go @@ -16,13 +16,13 @@ import ( ) type stubLedgerAccountClient struct { - createReq *ledgerv1.CreateAccountRequest + createReqs []*ledgerv1.CreateAccountRequest createResp *ledgerv1.CreateAccountResponse createErr error } func (s *stubLedgerAccountClient) CreateAccount(_ context.Context, req *ledgerv1.CreateAccountRequest) (*ledgerv1.CreateAccountResponse, error) { - s.createReq = req + s.createReqs = append(s.createReqs, req) return s.createResp, s.createErr } @@ -31,7 +31,7 @@ func (s *stubLedgerAccountClient) Close() error { } func TestOpenOrgLedgerAccount(t *testing.T) { - t.Run("creates operating ledger account", func(t *testing.T) { + t.Run("creates operating ledger accounts for RUB and USDT", func(t *testing.T) { desc := " Main org ledger account " sr := &srequest.Signup{ Account: model.AccountData{ @@ -65,22 +65,26 @@ func TestOpenOrgLedgerAccount(t *testing.T) { err := api.openOrgLedgerAccount(context.Background(), org, sr) assert.NoError(t, err) - if assert.NotNil(t, ledgerStub.createReq) { - assert.Equal(t, org.ID.Hex(), ledgerStub.createReq.GetOrganizationRef()) - assert.Equal(t, "RUB", ledgerStub.createReq.GetCurrency()) - assert.Equal(t, ledgerv1.AccountType_ACCOUNT_TYPE_ASSET, ledgerStub.createReq.GetAccountType()) - assert.Equal(t, ledgerv1.AccountStatus_ACCOUNT_STATUS_ACTIVE, ledgerStub.createReq.GetStatus()) - assert.Equal(t, ledgerv1.AccountRole_ACCOUNT_ROLE_OPERATING, ledgerStub.createReq.GetRole()) - assert.Equal(t, map[string]string{ - "source": "signup", - "login": "owner@example.com", - }, ledgerStub.createReq.GetMetadata()) - if assert.NotNil(t, ledgerStub.createReq.GetDescribable()) { - assert.Equal(t, "Primary Ledger", ledgerStub.createReq.GetDescribable().GetName()) - if assert.NotNil(t, ledgerStub.createReq.GetDescribable().Description) { - assert.Equal(t, "Main org ledger account", ledgerStub.createReq.GetDescribable().GetDescription()) + if assert.Len(t, ledgerStub.createReqs, 2) { + currencies := make([]string, 0, len(ledgerStub.createReqs)) + for _, req := range ledgerStub.createReqs { + currencies = append(currencies, req.GetCurrency()) + assert.Equal(t, org.ID.Hex(), req.GetOrganizationRef()) + assert.Equal(t, ledgerv1.AccountType_ACCOUNT_TYPE_ASSET, req.GetAccountType()) + assert.Equal(t, ledgerv1.AccountStatus_ACCOUNT_STATUS_ACTIVE, req.GetStatus()) + assert.Equal(t, ledgerv1.AccountRole_ACCOUNT_ROLE_OPERATING, req.GetRole()) + assert.Equal(t, map[string]string{ + "source": "signup", + "login": "owner@example.com", + }, req.GetMetadata()) + if assert.NotNil(t, req.GetDescribable()) { + assert.Equal(t, "Primary Ledger", req.GetDescribable().GetName()) + if assert.NotNil(t, req.GetDescribable().Description) { + assert.Equal(t, "Main org ledger account", req.GetDescribable().GetDescription()) + } } } + assert.ElementsMatch(t, []string{"RUB", "USDT"}, currencies) } })