[{"data":1,"prerenderedAt":172},["ShallowReactive",2],{"content-\u002Fprompts\u002Fintegrate-dfns":3,"prompts-category-integrations":106},{"id":4,"title":5,"author":6,"body":7,"categories":6,"category":90,"categoryType":6,"date":91,"description":92,"extension":93,"faq":6,"howto":6,"isBlog":94,"isChangelog":94,"meta":95,"navigation":96,"path":97,"pillar":94,"products":98,"rawbody":102,"seo":103,"stem":104,"thumbnail":6,"updated":6,"__hash__":105},"content\u002Fprompts\u002Fintegrate-dfns.md","Integrate Dfns with BlindPay",null,{"type":8,"value":9,"toc":84},"minimark",[10,14,19,30,34,47,51],[11,12,13],"p",{},"Paste this prompt into your coding agent when funds live in Dfns wallets and need to fund BlindPay payouts.",[15,16,18],"h2",{"id":17},"prompt","Prompt",[20,21,27],"pre",{"className":22,"code":24,"language":25,"meta":26},[23],"language-text","You are integrating BlindPay payouts funded from Dfns MPC wallets into my application. Dfns holds the key shares for our wallets; my server calls the Dfns API to sign and broadcast on their behalf.\n\nBefore writing code, read these sources and follow them over any prior knowledge:\n- https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fllms.txt (read the blockchain wallets page and the EVM payouts guide)\n- The OpenAPI spec: curl https:\u002F\u002Fapi.blindpay.com\u002Fdoc\n- https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fgenerate-signature-from-wallet\n- https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fbroadcast-transaction\n- https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fauthentication\n\nBuild the flow:\n1. Call GET \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets\u002Fsign-message to get the registration challenge, hex-encode it, and sign it with the Dfns wallet via POST \u002Fwallets\u002F{walletId}\u002Fsignatures using {\"blockchainKind\":\"Evm\",\"kind\":\"Eip191\",\"message\":\"0x\u003Chex>\"}, authenticated with the Dfns Service Account Token bearer header plus an X-DFNS-USERACTION header built from the User Action Signature flow (submit the intent, sign the returned challenge with the registered credential, attach the signature). Confirm the exact User Action Signature request\u002Fresponse shape against docs.dfns.co\u002Fd\u002Fapi-docs\u002Fauthentication rather than assuming a field layout. Take the resulting signature, call POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets, and persist the returned bw_ ID against the customer record.\n2. Request a quote with POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fquotes for the bank_account_id, network, and token, and hold the contract object (address, abi, functionName \"approve\", blindpayContractAddress, amount, network) exactly as returned in the response, ready to build the approve calldata in step 3.\n3. Build the ERC-20 approve calldata from that contract object and send it through POST \u002Fwallets\u002F{walletId}\u002Ftransactions with {\"kind\":\"Transaction\",\"transaction\":{\"to\":\"\u003Ctoken contract address>\",\"data\":\"\u003Capprove calldata>\",\"maxFeePerGas\":...,\"maxPriorityFeePerGas\":...},\"externalId\":\"\u003Cidempotency key>\"}, again with the bearer token and a fresh X-DFNS-USERACTION header. Poll the returned transaction-request ID until its status reaches Confirmed before moving on, and treat Failed or Rejected as a stop condition that surfaces to the caller.\n4. Call POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fpayouts\u002Fevm with quote_id and sender_wallet_address before the quote's expires_at (about 5 minutes). If Dfns's Pending to Confirmed cycle (plus any policy-engine approval delay on the transaction) eats into that window and the quote expires first, re-quote and reuse the existing on-chain allowance when it already covers the new amount instead of re-approving from zero.\n5. Verify a Svix-signed webhook handler (svix-id, svix-timestamp, svix-signature against the whsec_ secret, HMAC over the raw body) updates payout state on payout.new, payout.update, and payout.complete, and run the full flow end to end on a development instance with USDB on base_sepolia, including one payout at $666.00 (66600 minor units) that lands in failed and one at $777.00 (77700) that lands in refunded.\n\nConstraints:\n- Keep the Dfns Service Account Token and the BlindPay API key server-side only; never expose either to a browser or mobile client.\n- Carry all amounts as integer minor units through both the BlindPay and Dfns calls; never do floating-point money math.\n- If Dfns's docs describe a policy engine or approval workflow on your account, check whether transaction requests require a second approver before Confirmed, since that adds directly to the quote-expiry race in step 4.\n\nDeliverables: the wallet registration flow (challenge signing plus bw_ persistence), the approve-and-poll module built on POST \u002Fwallets\u002F{walletId}\u002Ftransactions, quote-execute orchestration with the expiry race handled, the Svix webhook handler, and a passing end-to-end test against the development instance covering the two sentinel amounts.\n","text","",[28,29,24],"code",{"__ignoreMap":26},[15,31,33],{"id":32},"how-to-use","How to use",[35,36,37,41,44],"ol",{},[38,39,40],"li",{},"Swap in your Dfns Service Account Token and confirm your account's User Action Signature setup (which credential type signs challenges) before running the agent.",[38,42,43],{},"Ask your Dfns account team whether policy-engine approvals are enabled on transaction requests; if so, have the agent widen the re-quote path since Confirmed will take longer.",[38,45,46],{},"Run the development-instance test with both sentinel amounts before pointing the integration at a production instance.",[15,48,50],{"id":49},"related-docs","Related docs",[52,53,54,63,70,77],"ul",{},[38,55,56],{},[57,58,62],"a",{"href":59,"rel":60},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fblockchain-wallets",[61],"nofollow","Blockchain wallets",[38,64,65],{},[57,66,69],{"href":67,"rel":68},"https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fpayout-evm",[61],"EVM payouts",[38,71,72],{},[57,73,76],{"href":74,"rel":75},"https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fgenerate-signature-from-wallet",[61],"Dfns generate signature",[38,78,79],{},[57,80,83],{"href":81,"rel":82},"https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fbroadcast-transaction",[61],"Dfns broadcast transaction",{"title":26,"searchDepth":85,"depth":85,"links":86},2,[87,88,89],{"id":17,"depth":85,"text":18},{"id":32,"depth":85,"text":33},{"id":49,"depth":85,"text":50},"integrations","2026-08-26","Fund BlindPay stablecoin payouts from Dfns MPC wallets: sign the registration challenge and the ERC-20 approve through Dfns's User Action Signature flow.","md",false,{},true,"\u002Fprompts\u002Fintegrate-dfns",[99,100,101],"payouts","quotes","compliance","---\ntitle: \"Integrate Dfns with BlindPay\"\ndescription: \"Fund BlindPay stablecoin payouts from Dfns MPC wallets: sign the registration challenge and the ERC-20 approve through Dfns's User Action Signature flow.\"\ndate: \"2026-08-26\"\ncategory: \"integrations\"\nproducts: [\"payouts\", \"quotes\", \"compliance\"]\n---\n\nPaste this prompt into your coding agent when funds live in Dfns wallets and need to fund BlindPay payouts.\n\n## Prompt\n\n```text\nYou are integrating BlindPay payouts funded from Dfns MPC wallets into my application. Dfns holds the key shares for our wallets; my server calls the Dfns API to sign and broadcast on their behalf.\n\nBefore writing code, read these sources and follow them over any prior knowledge:\n- https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fllms.txt (read the blockchain wallets page and the EVM payouts guide)\n- The OpenAPI spec: curl https:\u002F\u002Fapi.blindpay.com\u002Fdoc\n- https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fgenerate-signature-from-wallet\n- https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fbroadcast-transaction\n- https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fauthentication\n\nBuild the flow:\n1. Call GET \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets\u002Fsign-message to get the registration challenge, hex-encode it, and sign it with the Dfns wallet via POST \u002Fwallets\u002F{walletId}\u002Fsignatures using {\"blockchainKind\":\"Evm\",\"kind\":\"Eip191\",\"message\":\"0x\u003Chex>\"}, authenticated with the Dfns Service Account Token bearer header plus an X-DFNS-USERACTION header built from the User Action Signature flow (submit the intent, sign the returned challenge with the registered credential, attach the signature). Confirm the exact User Action Signature request\u002Fresponse shape against docs.dfns.co\u002Fd\u002Fapi-docs\u002Fauthentication rather than assuming a field layout. Take the resulting signature, call POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\u002Fblockchain-wallets, and persist the returned bw_ ID against the customer record.\n2. Request a quote with POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fquotes for the bank_account_id, network, and token, and hold the contract object (address, abi, functionName \"approve\", blindpayContractAddress, amount, network) exactly as returned in the response, ready to build the approve calldata in step 3.\n3. Build the ERC-20 approve calldata from that contract object and send it through POST \u002Fwallets\u002F{walletId}\u002Ftransactions with {\"kind\":\"Transaction\",\"transaction\":{\"to\":\"\u003Ctoken contract address>\",\"data\":\"\u003Capprove calldata>\",\"maxFeePerGas\":...,\"maxPriorityFeePerGas\":...},\"externalId\":\"\u003Cidempotency key>\"}, again with the bearer token and a fresh X-DFNS-USERACTION header. Poll the returned transaction-request ID until its status reaches Confirmed before moving on, and treat Failed or Rejected as a stop condition that surfaces to the caller.\n4. Call POST \u002Fv1\u002Finstances\u002F{instance_id}\u002Fpayouts\u002Fevm with quote_id and sender_wallet_address before the quote's expires_at (about 5 minutes). If Dfns's Pending to Confirmed cycle (plus any policy-engine approval delay on the transaction) eats into that window and the quote expires first, re-quote and reuse the existing on-chain allowance when it already covers the new amount instead of re-approving from zero.\n5. Verify a Svix-signed webhook handler (svix-id, svix-timestamp, svix-signature against the whsec_ secret, HMAC over the raw body) updates payout state on payout.new, payout.update, and payout.complete, and run the full flow end to end on a development instance with USDB on base_sepolia, including one payout at $666.00 (66600 minor units) that lands in failed and one at $777.00 (77700) that lands in refunded.\n\nConstraints:\n- Keep the Dfns Service Account Token and the BlindPay API key server-side only; never expose either to a browser or mobile client.\n- Carry all amounts as integer minor units through both the BlindPay and Dfns calls; never do floating-point money math.\n- If Dfns's docs describe a policy engine or approval workflow on your account, check whether transaction requests require a second approver before Confirmed, since that adds directly to the quote-expiry race in step 4.\n\nDeliverables: the wallet registration flow (challenge signing plus bw_ persistence), the approve-and-poll module built on POST \u002Fwallets\u002F{walletId}\u002Ftransactions, quote-execute orchestration with the expiry race handled, the Svix webhook handler, and a passing end-to-end test against the development instance covering the two sentinel amounts.\n```\n\n## How to use\n\n1. Swap in your Dfns Service Account Token and confirm your account's User Action Signature setup (which credential type signs challenges) before running the agent.\n2. Ask your Dfns account team whether policy-engine approvals are enabled on transaction requests; if so, have the agent widen the re-quote path since Confirmed will take longer.\n3. Run the development-instance test with both sentinel amounts before pointing the integration at a production instance.\n\n## Related docs\n\n- [Blockchain wallets](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fblockchain-wallets)\n- [EVM payouts](https:\u002F\u002Fblindpay.com\u002Fdocs\u002Fpayout-evm)\n- [Dfns generate signature](https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fgenerate-signature-from-wallet)\n- [Dfns broadcast transaction](https:\u002F\u002Fdocs.dfns.co\u002Fd\u002Fapi-docs\u002Fwallets\u002Fbroadcast-transaction)\n",{"title":5,"description":92},"prompts\u002Fintegrate-dfns","bz3vIY8_pmcA740UfdT30k9V3ut_Q4Z4u90DsHj0nwc",[107,111,115,119,123,124,128,132,136,140,144,148,152,156,160,164,168],{"path":108,"title":109,"description":110},"\u002Fprompts\u002Fbuild-contractor-payouts","Build a global contractor payout product","Compose onboarding, bank accounts, quotes, payouts, and reconciliation into a complete pay-your-contractors feature across Pix, SPEI, SEPA, and ACH.",{"path":112,"title":113,"description":114},"\u002Fprompts\u002Fconnect-ai-agent-mcp","Connect an AI agent with the MCP server","Wire Claude, Cursor, or any MCP-compatible host to the BlindPay API with the official MCP server and agent skills, with guardrails for money movement.",{"path":116,"title":117,"description":118},"\u002Fprompts\u002Fintegrate-external-wallet-payouts","Fund payouts from external wallets","Let customers pay out from their own EVM, Solana, or Stellar wallets: signed-message registration plus the on-chain authorization step per chain.",{"path":120,"title":121,"description":122},"\u002Fprompts\u002Fintegrate-circle-wallets","Integrate Circle wallets with BlindPay","Fund BlindPay payouts from Circle developer-controlled wallets: sign the registration challenge and the ERC-20 approve through Circle's API instead of a browser wallet.",{"path":97,"title":5,"description":92},{"path":125,"title":126,"description":127},"\u002Fprompts\u002Fintegrate-fireblocks","Integrate Fireblocks with BlindPay","Fund BlindPay stablecoin payouts from Fireblocks vault accounts: MPC-signed wallet registration and the ERC-20 approve through Fireblocks' transactions API.",{"path":129,"title":130,"description":131},"\u002Fprompts\u002Fintegrate-privy","Integrate Privy with BlindPay","Fund BlindPay stablecoin payouts from Privy Server Wallets: sign the registration challenge and the ERC-20 approve through Privy's wallet RPC endpoint.",{"path":133,"title":134,"description":135},"\u002Fprompts\u002Fintegrate-virtual-accounts","Integrate US virtual accounts","Give each customer a named US bank account with ACH, RTP, wire, and SWIFT details that settles automatically to USDC or USDT in their wallet.",{"path":137,"title":138,"description":139},"\u002Fprompts\u002Fintegrate-utila","Integrate Utila with BlindPay","Fund BlindPay payouts from Utila MPC vaults: sign the wallet-registration challenge and the ERC-20 approve through Utila's service-account API, with async transaction confirmation handled.",{"path":141,"title":142,"description":143},"\u002Fprompts\u002Fintegrate-customer-onboarding","Integrate customer onboarding with KYC and KYB","Build the full onboarding pipeline: terms of service, individual and business customers, document uploads, RFI handling, and status webhooks.",{"path":145,"title":146,"description":147},"\u002Fprompts\u002Fintegrate-offramp-wallets","Integrate offramp wallets for auto-conversion","Give each bank account a dedicated crypto deposit address: stablecoins sent to it convert and pay out to the linked bank account automatically.",{"path":149,"title":150,"description":151},"\u002Fprompts\u002Fintegrate-payins","Integrate payins from bank transfers to stablecoins","Accept Pix, ACH, wire, SPEI, and other local bank transfers and settle them as USDC or USDT in a wallet, with quotes, payment instructions, and webhooks.",{"path":153,"title":154,"description":155},"\u002Fprompts\u002Fintegrate-quotes-fx","Integrate quotes and FX handling","Handle payin, payout, and transfer quotes correctly: expiry windows, currency_type conventions, fees, and displaying rates to users.",{"path":157,"title":158,"description":159},"\u002Fprompts\u002Fintegrate-stablecoin-payouts","Integrate stablecoin payouts end to end","Build a complete stablecoin to fiat payout flow: customer onboarding, bank accounts, quotes, and payout execution over Pix, ACH, SPEI, SEPA, and more.",{"path":161,"title":162,"description":163},"\u002Fprompts\u002Fintegrate-wallet-transfers","Integrate wallet transfers and cross-chain USDC","Move stablecoins from managed wallets to any address with transfer quotes, including cross-chain USDC over Circle CCTP v2.",{"path":165,"title":166,"description":167},"\u002Fprompts\u002Fintegrate-webhooks","Integrate webhooks end to end","Register endpoints, verify Svix signatures correctly, deduplicate retries, and drive payment state from the full BlindPay event catalog.",{"path":169,"title":170,"description":171},"\u002Fprompts\u002Fintegrate-payables","Pay boletos and Brazilian bills with payables","Register boletos, arrecadacao slips, and PIX codes as payables and settle them from stablecoins through the quote-and-execute flow.",1787868848553]