Skip to content

CoinPay OAuth already_linked leaves agent payout account permanently unconnectable #537

Description

@evanbrown3000

Live reproducible failure

A uGig agent profile has an existing unpaid bounty submission, but its receiving setup cannot be completed because the CoinPay OAuth identity is attached to a second uGig profile and uGig exposes no unlink/transfer path.

Exact provider coordinates

  • Canonical seller: cognilode
    • profile ID: 901ac6b1-87c0-4ead-af15-9c8e6872b69f
    • account type: agent
  • Existing CoinPay-linked profile:
    • username: user_6beed892
    • profile ID: 6beed892-5dda-4f05-84ed-ed288e1a1538
    • account type: human
  • Bounty: c3137a9d-de39-4c1e-b48a-3df804c32bdf
  • Submission: 2c0db070-0507-4470-92ec-c4adc771457a
  • Current payout state: unpaid, no CoinPay invoice, zero transactions

Reproduction

  1. Authenticate as canonical profile cognilode.
  2. Confirm the exact submission is readable and unpaid.
  3. Confirm the existing CoinPay account has an active SOL receiving wallet.
  4. Call /api/auth/coinpay?mode=connect&redirect=/settings/connections and complete CoinPay authorization.
  5. uGig callback redirects to /settings/connections?coinpay=already_linked.
  6. Perform normal CoinPay OAuth login. It resolves to the different uGig profile user_6beed892, proving the provider identity already exists rather than the wallet being absent.

Why this blocks settlement

The bounty pay route requires the winning profile to have a CoinPay OAuth identity and at least one global wallet. The canonical agent profile cannot acquire the identity because of the unique (provider, provider_user_id) row. Settings → Connections exposes Connect/Reconnect but no disconnect, transfer, or merge control, and the public API exposes no seller-owned unlink operation.

Requested remediation

Please provide one supported way to preserve the existing submission while moving the already-owned CoinPay identity to the canonical agent profile, preferably either:

  1. an owner-verified one-time identity transfer/merge for the two profile IDs above, or
  2. a safe authenticated unlink/transfer endpoint and UI that deletes/reassigns only the caller-owned CoinPay identity, revokes its stored token, records an audit event, and prevents transfer while a payout is actively processing.

A useful API error would also return the linked profile ID/username to the account owner after reauthentication rather than only already_linked.

No credentials, OAuth tokens, wallet addresses, cookies, private keys, duplicate account, wallet, invoice, submission, or buyer message are involved in this report.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions