feat(bridge): external account webhook + ENG-350 transfer failure reset - #373
Closed
heyolaniran wants to merge 22 commits into
Closed
Conversation
…63 ENG-297 fix(bridge): apply audit hardening and hosted KYC refinements
Ready to merge. Verified locally: - `yarn check:sdl` passes - targeted bridge/IBEX unit tests pass - `git diff --check` passes **squash & merge** used to keep `tmp/bridge-rebase-pr-ready` clean.
* ENG-297 fix(wallets): support USDT cash wallet parity * fix(wallets): support USDT intraledger sends
* feat: add timeout for Bridge request * feat(bridge): ENG-350 — reset withdrawal state on transfer.failed and surface failure reason * feat(bridge): ENG-350 harden transfer webhook edge cases and notify users * feat(bridge): ENG-350 introduce full KYC status lifecycle with offboarded support * refactor(bridge): rename BridgeDepositLog model to BridgeDeposits * refactor(ibex): rename IbexCryptoReceiveLog model to IbexCryptoReceive * refactor(bridge): rename BridgeReplayLog model to BridgeReplay * fix(bridge) : ENG-289 timeout increase to 15s * feat: adding full kyc status to reflect them stored as bridgeKycStatus in mongoDB instead of just pending state * feat: Kyc status * fix: Duplicated webhook event message * fix: Duplicated webhook deposit event message * fix: Virtual Account Edge case
…esentation (lnflash#370) * feat(cutover): add cash wallet migration state primitives * feat(cutover): persist cash wallet cutover state * feat(cutover): add cash wallet write guard * feat(cutover): classify cash wallet migration candidates * feat(cutover): add cash wallet preflight summary * feat(cutover): collect cash wallet discovery results * feat(cutover): plan primary cash wallet migrations * feat(cutover): upsert planned migration records * feat(cutover): prepare primary migration batch * feat(cutover): start migration worker checkpoint * feat(cutover): record migration source balance * feat(cutover): create balance move invoice checkpoint * feat(cutover): send balance move payment checkpoint * feat(cutover): verify balance move checkpoint * feat(cutover): create fee reimbursement invoice checkpoint * feat(cutover): complete fee reimbursement checkpoint * feat(cutover): flip default wallet checkpoint * feat(cutover): complete migration worker checkpoints * feat(cutover): provision destination checkpoint * feat(cutover): dispatch migration worker steps * feat(cutover): run locked migration batches * feat(cutover): build migration step handlers * feat(cutover): wire migration runtime services * feat(cutover): orchestrate primary migration batches * feat(cutover): add migration lifecycle controls * fix(cutover): align migration indexes with run ids * feat(cutover): add operator command script * chore(cutover): format migration state helpers * feat(cutover): preview dry-run migration plan * fix(cutover): satisfy production build types * feat(cutover): add operator controls and verification * feat(cutover): add client-aware cash wallet presentation * chore(cutover): clean operator artifact whitespace
* docs(bridge): add operations runbook * docs(bridge): add cutover day runbook * docs(bridge): tighten operations runbook safety * docs(bridge): align cutover runbook with lifecycle behavior
feat: external accounts event triggering this commit initialize the webhook endpoint to register on Bridge to trigger external account link after plaid completion
this commit mark the transfer as failed in our bridge withdrawals collection when something went wrong during the trasfer flow, the user is notified with a popup and on return state, as well for transfer successfully completed
Map "usdt" to "USD" and uppercase other currency codes so the push notification shows a human-readable label instead of a raw enum value.
Replace email/password fields with clientId, clientSecret, and
environment ("production" | "sandbox") in the IbexConfig type, JSON
schema, and dev YAML config.
Replace the deprecated email/password sign-in flow with OAuth 2.0
client credentials (M2M). IbexClient now takes clientId/clientSecret/
environment, and getIbexToken posts to {authUrl}/oauth/token with
grant_type=client_credentials, caching the token until 60s before expiry.
forge0x
force-pushed
the
tmp/bridge-rebase-pr-ready
branch
from
May 31, 2026 15:39
d448b2b to
836405e
Compare
Contributor
|
Replaced by #379 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
POST /external-accountwebhook handler — fires after Plaid bank-linking completes, persists the linked account to MongoDB sobridgeExternalAccountsqueries return results. Wires up signature verification, replay routing, and idempotency lock.event === "transfer.failed"branch (Bridge sendstransfer.updated.status_transitioned, nottransfer.failed). Failure detection is now purely by terminal state value. Updates test samples and failure cases to use the real event type.bridgeAddExternalAccount,bridgeInitiateWithdrawal,bridgeExternalAccounts, andbridgeWithdrawals.Test plan
bridgeexternalaccounts, querybridgeExternalAccounts— confirmsidresolver and status mappingexternal_account.createdvia/internal/replay— confirms account persisted and idempotency on duplicate eventtransfer.updated.status_transitionedwith a terminal state via/internal/replay— confirms status flips tofailedand push notification dispatchedalready_terminal, no double notification