Transferring Fees to a New Wallet
Change who receives trading fees on an already-launched token — useful when moving from an EOA to a multisig, handing ownership to someone else, or rotating keys.
Who Can Transfer
Only the current fee beneficiary can transfer their share. If you're already the deployer, that's you. If fees were transferred to you previously, you're the current beneficiary.
On-chain the transfer is a call to updateBeneficiary(poolId, newBeneficiary) on the Fees Manager contract — only the current beneficiary's signature is valid.
What Happens to Already-Accrued Fees
The beneficiary transfer is forward-only on the pool's share pointer. Fees already in the pool go to whoever is the beneficiary at claim time, not whoever was the beneficiary when they accumulated.
If you want to collect pre-transfer fees at the old wallet, claim them first, then transfer.
Paths
Bankr wallet (gas sponsored)
If the current beneficiary is a Bankr-managed wallet, execute server-side — no ETH needed in the wallet.
- Web: navigate to the token page at
bankr.bot/launches/<tokenAddress>and use the "Transfer Beneficiary" action - Chat:
"transfer fees for 0xTokenAddress to 0xNewWallet" - Authenticated API:
POST /user/doppler/execute-transfer-beneficiarywith your Privy JWT
External wallet (self-sign)
If you hold the private key yourself (EOA, Ledger, etc.), use the public helper to build an unsigned transaction and sign locally. No authentication required — your signature is the authorization.
Request
curl -X POST https://api.bankr.bot/public/doppler/build-transfer-beneficiary \
-H "Content-Type: application/json" \
-d '{
"tokenAddress": "0xTokenAddress",
"currentBeneficiary": "0xOldWallet",
"newBeneficiary": "0xNewMultisig"
}'
Response
{
"to": "0xFeesManagerAddress...",
"data": "0xabcdef...",
"chainId": 8453,
"description": "Transfer fee beneficiary for MyToken"
}
Sign and broadcast with the current beneficiary's private key. The signing wallet must hold a small amount of ETH on Base for gas.
If currentBeneficiary isn't actually a beneficiary on this pool, the endpoint returns 403.
Direct on-chain
If you'd rather skip the API and encode the call yourself, the ABI is:
function updateBeneficiary(bytes32 poolId, address newBeneficiary);
Call it on the pool's Fees Manager (the initializer address returned by GET /public/doppler/token-fees/:tokenAddress). See Reading Creator Fees → On-chain reads for resolving initializer and poolId.
Multisig Migration (common partner flow)
Moving a partner fee wallet (or a personal EOA) to a multisig typically means running the transfer once per launched token. Workflow:
- Pull the list of tokens where the old wallet is a beneficiary:
curl "https://api.bankr.bot/public/doppler/creator-fees/0xOldWallet" - For each
tokens[].tokenAddress, build a transfer transaction (see above) - Sign and broadcast each with the old wallet's key
- Optionally update your Fee Wallet configuration so future launches route to the multisig automatically
Changing the Fee Wallet setting in the Token Launch tab is forward-only — it does not touch existing tokens. See Fee Wallet Retroactivity.
Gas
| Path | Who pays gas | ETH needed |
|---|---|---|
Bankr wallet via web UI, chat, or execute-transfer-beneficiary | Bankr (sponsored, up to 10 tx/day) | None |
External wallet via build-transfer-beneficiary + self-sign | You | Small amount of ETH on Base |
Direct on-chain updateBeneficiary call | You | Small amount of ETH on Base |
Troubleshooting
"Address is not a beneficiary for this pool" — the currentBeneficiary you passed doesn't hold shares in the pool. Double-check it matches the creator / current beneficiary. Query GET /public/doppler/claimable-fees/:tokenAddress?beneficiary=0x... to verify.
Transaction reverts — the signing wallet must be the current beneficiary. If you recently transferred the beneficiary away, your old wallet no longer has permission.
Accrued fees disappeared after transfer — they didn't disappear. They're now claimable by the new beneficiary (see What Happens to Already-Accrued Fees above).