ImplicitEx is a non-custodial USDC transfer interface operating on Polygon (chain ID 137). It allows a sender to transfer USDC to a recipient address they specify. A platform fee of 1% is charged on each transfer. The production portal currently limits transfers to 250.00 USDC, making the highest fee reachable through the supported interface 2.50 USDC. The application does not hold, route through, or control user funds beyond what the user explicitly authorizes through their own wallet.
This document was prepared in response to Blockaid tickets #1290666 and #1290665 concerning the classification of the ImplicitEx USDC approval request as deceptive. The sections below document the complete transaction lifecycle, deployed security controls, fee mechanics, and independently verifiable on-chain evidence available for review.
USDC is an ERC-20 token. ERC-20 tokens cannot be spent by a smart contract without the token holder first granting a spending allowance to that contract. The approve() call is the standard ERC-20 mechanism for establishing this permission. The allowance requested equals exactly the amount the user has already reviewed on-screen: the recipient amount plus the platform fee. No additional buffer is requested.
Many applications request an unlimited or large blanket allowance to avoid requiring a new approval on each transaction. ImplicitEx does not do this. The allowance request is calculated per transaction and covers only the current transfer total. After the contract calls transferFrom(), the allowance returns to zero. The user's residual exposure is zero after each transaction completes.
The smart contract does not hold funds at any point in the transfer. The transferWithFee() function issues two safeTransferFrom() calls in a single atomic execution: one from the sender directly to the recipient, and one from the sender directly to the treasury. The contract is not an intermediate holder. If either call fails, the entire transaction reverts and no funds move.
User Browser
│
▼
ImplicitEx Transfer Portal
(https://implicitex.com / https://portal.implicitex.com)
│
├──── Reads on-chain state via public JSON-RPC
│ (polygon-bor-rpc.publicnode.com, chain ID 137)
│
▼
MetaMask or WalletConnect-compatible wallet
│
├──── Prompt 1 of 2: User signs USDC approve() for exact total debit
│
└──── Prompt 2 of 2: User signs transferWithFee() execution
│
▼
ImplicitExTransfer contract
0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0
│
├────► Recipient (address entered by user)
│ Receives: transfer amount
│
└────► Treasury
0xa7cE4232811021d2Dd01f4f0f264Df2427ab3919
Receives: platform fee (1% of transfer amount)
| Domain | Role | Status |
|---|---|---|
https://implicitex.com |
Primary production domain | Live |
https://portal.implicitex.com |
Transfer portal, direct entry point | Live |
https://implicitex-236f2.web.app |
Firebase staging URL — included in original Blockaid report | Staging |
| Parameter | Value |
|---|---|
| Network | Polygon PoS Mainnet |
| Chain ID | 137 (hex: 0x89) |
| RPC endpoint | polygon-bor-rpc.publicnode.com (public, no key required) |
| Block explorer | polygonscan.com |
The following describes a 1.00 USDC transfer. The same sequence applies at all amounts within the configured limits.
The user enters a recipient Ethereum address and a transfer amount. No wallet connection is required at this stage.
The portal calls previewTransfer(sender, amount) on the contract. This is a read-only view call. It returns the calculated fee, total debit, sender USDC balance, current allowance, and a boolean indicating whether the transfer can proceed.
The portal also validates locally:
No wallet action is initiated during this phase.
Before any wallet prompt is triggered, the portal presents a summary of the pending transaction:
Recipient: 0xe0B02A6d...796B Amount: 1.000000 USDC Platform fee: 0.010000 USDC Total debit: 1.010000 USDC Network: Polygon
The user must explicitly confirm past this screen to proceed. No wallet prompt has been issued at this point.
The portal calls approve(contractAddress, totalDebit) on the Circle USDC token contract (0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359).
MetaMask surfaces this as a "Set a spending cap for your USDC" dialog. The spending cap displayed equals the exact total debit shown on the review screen — 1.010000 USDC in this example. During the observed 2026-07-23 transaction documented in Section 7, MetaMask displayed a Blockaid warning at this stage.
The approval amount is not unlimited. It is not padded with a buffer. It matches the review screen figure precisely.
After the approval transaction is confirmed on-chain, the portal calls transferWithFee(recipientAddress, 1000000) on the ImplicitExTransfer contract. MetaMask surfaces this as a separate contract interaction confirmation. The user must approve this second step independently.
The contract executes atomically:
USDC.safeTransferFrom(sender, recipient, 1000000) // 1.000000 USDC → recipient USDC.safeTransferFrom(sender, treasury, 10000) // 0.010000 USDC → treasury fee
If either call reverts, the entire transaction reverts. The contract retains nothing.
The portal polls for block confirmation. It displays a pending state until the transaction is confirmed on-chain, then transitions to a confirmed state. It does not report success at submission time.
| Flow | Amount | Verified |
|---|---|---|
| Sender USDC deducted | 1.010000 USDC | Gate 4 smoke (2026-06-15) |
| Recipient USDC received | 1.000000 USDC | Gate 4 smoke, Polygonscan confirmed |
| Treasury fee received | 0.010000 USDC | Gate 4 smoke, Polygonscan confirmed |
| Contract retained | 0.000000 USDC | Gate 4 smoke, zero-custody confirmed |
| Capability | Permitted | Notes |
|---|---|---|
| Read wallet address | Yes | Required to populate sender field |
| Request USDC allowance | Yes — exact amount only | ERC-20 standard mechanism; amount matches review screen |
Execute transferWithFee() | Yes — requires separate user signature | Wallet presents a second, distinct confirmation |
| Access funds beyond approved amount | No | Constrained by ERC-20 allowance model |
| Bypass wallet confirmation | No | Every on-chain action requires a valid user signature |
| Move funds without user signature | No | No server-side signing; no key storage |
| Hold user funds in contract | No | Direct sender→recipient and sender→treasury routing |
| Withdraw accumulated contract balance | No | Contract holds no USDC balance; no withdrawal function |
| Request unlimited USDC allowance | No | Approval amount is computed per transaction |
| Reverse or refund a confirmed transaction | No | Blockchain transactions are final; no reversal mechanism exists |
Every on-chain action requires a private-key signature from the user. The wallet mediates this. The portal cannot initiate, sign, or bypass any wallet action.
Portal → constructs transaction parameters Wallet → displays parameters to user User → signs or rejects Blockchain → executes only if user signature is valid and allowance is sufficient
The portal has no mechanism to sign transactions on the user's behalf, store private keys, or initiate any transaction without explicit user action at the wallet prompt.
| Contract name | ImplicitExTransfer |
| Solidity version | ^0.8.24 |
| License | MIT |
| Deployed address | 0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0 |
| Source file | app-web/contracts/implicitex_transfer.sol |
| Polygonscan source | Verified — https://polygonscan.com/address/0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0#code |
transferWithFee(address recipient, uint256 amount)This is the only function that moves funds. Execution sequence:
whenNotPaused)nonReentrant)(amount × feeBasisPoints) / 10000safeTransferFrom(sender, recipient, amount)safeTransferFrom(sender, treasury, fee)TransferExecuted eventpreviewTransfer(address sender, uint256 amount)Read-only. Returns five values without any state change or gas cost beyond the RPC call:
| Return value | Description |
|---|---|
fee | Calculated platform fee for this amount |
totalDebit | Amount + fee (the figure shown on the review screen) |
balance | Sender's current USDC balance |
allowance | Current USDC allowance granted to the contract |
canTransfer | Boolean — true if balance and allowance are sufficient |
The portal calls this function before presenting the review screen and again immediately before initiating the approval step, to confirm on-chain state has not changed between input and execution.
| Constant | Value | Description |
|---|---|---|
MAX_FEE_BPS |
100 | Maximum fee rate, in basis points. 100 bps = 1.00%. The owner cannot set feeBasisPoints above this value. This is the only compile-time fee constraint in the deployed contract. |
The deployed contract does not enforce an absolute per-transfer fee ceiling in USDC terms. The fee formula is (amount × feeBasisPoints) / 10000 with no cap on the resulting amount. The production portal's 250.00 USDC transfer ceiling (portal-enforced, not contract-enforced) limits the maximum fee reachable through the supported interface to 2.50 USDC. See Section 9 for disclosure of the future fee cap policy.
| Event | Triggered by |
|---|---|
TransferExecuted(sender, recipient, amountSent, feeAmount, totalDebited) | Every successful transferWithFee() call |
TreasuryUpdated(previousTreasury, newTreasury) | Owner changes the fee recipient address |
FeeUpdated(previousFeeBps, newFeeBps) | Owner changes the fee rate |
MinTransferUpdated(previous, new) | Owner changes the minimum transfer floor |
PrecisionUpdated(previous, new) | Owner changes the transfer precision setting |
TokensRescued(token, to, amount) | Owner calls rescueERC20 for a non-USDC token |
| Function | Effect | Constraint |
|---|---|---|
setTreasury(address) | Update the fee recipient address | Cannot be zero address |
setFeeBasisPoints(uint16) | Adjust the fee rate | Cannot exceed MAX_FEE_BPS (100) |
setMinTransferAmount(uint256) | Change the minimum transfer floor | Owner discretion |
setTransferPrecision(uint256) | Change required precision divisor | Owner discretion |
pause() | Halt all transferWithFee() calls | Owner-only |
unpause() | Resume transfers | Owner-only |
rescueERC20(token, to, amount) | Recover tokens sent to the contract by mistake | Explicitly reverts if token == USDC — USDC cannot be drained via this function |
The contract uses OpenZeppelin Ownable2Step. An ownership transfer requires two transactions: the current owner nominates a new address, and that address must explicitly accept. This prevents accidental or unilateral ownership loss.
Current owner: 0x776A0D6b9F96445A38303F56d5B923e6d1FF8E97
The following controls are active in the currently deployed contract and portal. "Deployed" means the control is live in production and was verified during the Gate 4 controlled smoke (2026-06-15). "Portal-enforced" means the control is implemented in the frontend JavaScript and does not rely on the contract.
| Control | Mechanism | Layer |
|---|---|---|
| Exact-amount allowance | approve(contract, amount + fee) — no unlimited approval, no buffer |
Portal-enforced |
| Non-custodial routing | safeTransferFrom(sender, recipient) and safeTransferFrom(sender, treasury) — contract is never an intermediate holder |
Contract |
| Reentrancy protection | nonReentrant modifier on transferWithFee() |
Contract |
| Pause mechanism | whenNotPaused modifier; owner can halt all transfers |
Contract |
| Zero-address rejection | Recipient validated as non-zero before safeTransferFrom() |
Contract |
| EOA-only recipients | Contract addresses rejected as recipients | Contract |
| USDC drain prevention | rescueERC20 explicitly reverts when token == USDC |
Contract |
| Transfer floor | minTransferAmount — 1.000000 USDC at current deployment |
Contract |
| Transfer ceiling (soft launch) | 250.000000 USDC per transaction — limits maximum reachable fee to 2.50 USDC at current 1% rate | Portal-enforced |
| Two-step ownership | Ownable2Step — ownership change requires explicit acceptance from new owner |
Contract |
| Chain enforcement | Portal validates chain ID 137 before any wallet prompt | Portal-enforced |
| Global and per-chain transfer gates | As of 2026-07-22, the global transfersEnabled flag is true; Polygon mainnet (chain 137) is true; and Amoy testnet is false. These are frontend operating controls, not immutable contract limits. Contract-level paused() is separate and can be verified using the read-only query in Section 10.3. |
Portal-enforced |
| Atomic execution | Both safeTransferFrom calls execute in one transaction; either both succeed or both revert |
Contract |
| On-chain confirmation requirement | Portal displays pending state until block confirmation; does not report success at submission | Portal-enforced |
| Flow identity token | In-progress flow is invalidated on wallet account change or network change mid-session | Portal-enforced |
This section documents a production portal transaction observed on 2026-07-23. It follows the user-visible lifecycle from portal initialization through transaction submission. The Blockaid warning is recorded as one observed event within the ERC-20 approval stage.
| Stage | Observed evidence |
|---|---|
| 1. Portal loaded | Production portal and Polygon chain data rendered successfully. |
| 2. Wallet connection | MetaMask unlock, site connection request, sender address, and USDC balance. |
| 3. Recipient validation | Recipient address accepted with “Format valid” status. |
| 4. Fee calculation | 5.00 USDC amount produced a 0.050000 USDC platform fee. |
| 5. User confirmation | Execute Transfer remained disabled until the user checked the explicit acknowledgement. |
| 6. ERC-20 approval request | MetaMask presented a 5.05 USDC spending-cap request. |
| 7. Observed Blockaid warning | The approval prompt displayed “This is a deceptive request.” |
| 8. Transfer transaction request | After approval, MetaMask displayed the separate ImplicitEx contract transaction. |
| 9. Transaction submission | The transfer was broadcast to Polygon and assigned a transaction hash. |
| 10. Activity record | The portal recorded the transfer as submitted and awaiting confirmation. |
| 11. Proof packet | The portal export recorded the approval hash, transaction hash, parties, amounts, and submitted-state settlement fields. |
portal.implicitex.com.
The portal requested a USDC allowance equal to the current transfer total. The requested cap was not unlimited and did not include an additional buffer.
After the approval transaction completed, the portal issued the separate transferWithFee() request. This second wallet prompt identified Polygon, portal.implicitex.com, and the ImplicitEx contract.
The exported proof packet records both wallet-stage and transaction-stage identifiers:
| Approval hash: | 0x4ad31a0bc64a4ca3827e82d035405ffb40ce113886ecb1cadd501978ee6ba9ad |
| Transaction hash: | 0x0a41b0c3375c489bd91fb126a0bed07d5e783ecfcf91d0f0d391c82090edab63 |
| Explorer | Polygonscan transaction record |
| Status at export | submitted |
| Block number | Not observed at export (null) |
| Funds moved | Not resolved at export (null) |
status: confirmed, a non-null blockNumber, a non-null resolvedAt, and fundsMoved: true.
| Suite | Tests passed | Result |
|---|---|---|
| Contract (Hardhat / Chai) | 59 / 59 | PASS |
| Observability | 31 / 31 | PASS |
| Analytics | 24 / 24 | PASS |
| Consent | 15 / 15 | PASS |
| Portal integrity | — | PASS |
| Static reference audit | 631 references checked | PASS |
The contract test suite (59 tests, Hardhat / Chai) covers the following scenarios:
nonReentrantpreviewTransfer() accuracy — fee and total-debit calculationrescueERC20 — USDC rejection, non-USDC token recoveryA controlled transfer was executed on Polygon mainnet from the production frontend. This is the primary on-chain evidence of correct fee routing and zero-custody behavior.
Date: 2026-06-15 Network: Polygon mainnet, chain ID 137 Site: https://implicitex-236f2.web.app Contract: 0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0 Sender: 0x2489587C9da6EaB970a5479BA70273BA37961221 Recipient: 0xe0B02A6d9738aa36eE48004211E264b7a815796B Treasury: 0xa7cE4232811021d2Dd01f4f0f264Df2427ab3919 Amount: 1.000000 USDC Fee: 0.010000 USDC (100 basis points) Total debit: 1.010000 USDC Transaction: 0x37fd733a7f1854740bf702aa5bf59794f4ebab0f39d2a84fb2c231c29df622d9 Block: 88565097 Polygonscan: https://polygonscan.com/tx/0x37fd733a7f1854740bf702aa5bf59794f4ebab0f39d2a84fb2c231c29df622d9
| Flow | Expected | Result | Source |
|---|---|---|---|
| Sender deducted | 1.010000 USDC | Confirmed | Wallet balance delta |
| Recipient received | 1.000000 USDC | Confirmed | Polygonscan ERC-20 log |
| Treasury received | 0.010000 USDC | Confirmed | Polygonscan ERC-20 log |
| Contract retained | 0.000000 USDC | Confirmed | Polygonscan contract balance |
The Polygonscan ERC-20 token transfer log for this transaction shows exactly two transfers originating from the same sender address: 1.000000 USDC to the recipient and 0.010000 USDC to the treasury. No additional transfers are present.
Transfers were enabled for a first-user walkthrough on 2026-06-18. The walkthrough was halted at the USDC approval step (prompt 1 of 2) due to the Blockaid "deceptive request" classification. The transfer execution step (prompt 2 of 2) was not reached. No funds moved. Transfers were returned to disabled standby state on the same date.
The false-positive report was submitted to Blockaid on 2026-06-18 for both implicitex.com and implicitex-236f2.web.app.
The following limitations apply to the currently deployed version. They are stated here for completeness and accuracy.
| Item | Current status |
|---|---|
| Third-party security audit | Not yet completed. An independent audit is planned as the platform scales toward broader distribution. Internal test coverage is documented in Section 8 and is not a substitute for an external audit. |
| Transfer reversibility | Confirmed blockchain transactions cannot be reversed. ImplicitEx has no reversal, refund, or cancellation mechanism for executed transfers. |
| Network support | Polygon mainnet (chain ID 137) only. Other networks are not supported in the current deployment. |
| Transfer ceiling | 250.00 USDC per transaction. This is a soft launch cap enforced in the portal; it is not a contract-level constraint. |
| Mobile wallet compatibility | MetaMask browser extension (desktop) is confirmed. MetaMask Mobile in-app browser is under active testing. A provider-sequencing issue affecting the transfer execution prompt (prompt 2 of 2) has been diagnosed and a fix has been deployed; device verification is pending. |
| WalletConnect | Integration is implemented and active in the production codebase. Full regression testing against WalletConnect wallet providers is ongoing. |
| Per-transfer fee ceiling | The deployed contract does not enforce an absolute fee ceiling in USDC terms. The fee formula is a flat 1% percentage with no upper bound enforced in contract code. ImplicitEx has adopted a future policy under which fees will be capped at 10.00 USDC for transfers above 1,000 USDC, but that policy has not been deployed in the current contract. The production portal's 250.00 USDC transfer ceiling prevents any user of the supported interface from reaching the amount at which the uncapped 1% formula would exceed 2.50 USDC. A future contract revision will implement the 10.00 USDC ceiling on-chain before the portal transfer ceiling is raised above 1,000 USDC. |
| Wallet-provider classification | During the observed 2026-07-23 flow, MetaMask displayed a Blockaid warning indicating “This is a deceptive request” at the USDC spending-approval step (ticket #1290666 / #1290665). The approval requested an exact 5.05 USDC cap, and the workflow subsequently reached the separate transfer request and transaction broadcast. Final settlement for that transaction was not yet resolved in the captured proof packet. |
| Contract ownership | Single-key Ownable2Step. Multi-signature governance is on the planning roadmap but is not deployed. |
The following verification steps can be completed independently by a Blockaid analyst without wallet connection or access to the ImplicitEx codebase.
The deployed contract is at 0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0 on Polygon mainnet (chain ID 137).
The source is verified on Polygonscan. The matched Solidity source, compiler version, optimizer settings, ABI, and constructor arguments are publicly visible at:
https://polygonscan.com/address/0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0#code
The contract's verified-source status was confirmed during the deployment procedure on 2026-05-22. A Hardhat verify invocation returned that the contract had already been verified on the block explorer. Polygonscan reports that the published source compiles to bytecode matching the deployed contract, and publicly exposes the matched Solidity source, compiler configuration, ABI, and constructor arguments for the deployed address. A reviewer can inspect these directly on Polygonscan without any supplemental file attachment.
The Gate 4 controlled smoke transaction is publicly accessible:
https://polygonscan.com/tx/0x37fd733a7f1854740bf702aa5bf59794f4ebab0f39d2a84fb2c231c29df622d9
In the "ERC-20 Token Txns" tab on Polygonscan, two transfers are visible originating from the same sender:
0xe0B02A6d...796B — 1.000000 USDC (recipient)0xa7cE4232...3919 — 0.010000 USDC (treasury fee)The following state can be read from the deployed contract via Polygonscan "Read Contract" or any JSON-RPC client, without connecting a wallet:
| Function | Expected return |
|---|---|
feeBasisPoints() | 100 (1.00%) |
MAX_FEE_BPS() | 100 (hard-coded fee rate ceiling; owner cannot set feeBasisPoints above this value) |
minTransferAmount() | 1000000 (1.000000 USDC) |
treasury() | 0xa7cE4232811021d2Dd01f4f0f264Df2427ab3919 |
paused() | Current pause state |
owner() | 0x776A0D6b9F96445A38303F56d5B923e6d1FF8E97 |
Transfers are currently enabled on Polygon mainnet. The approval flow can be reproduced as follows:
https://portal.implicitex.comThe spending-cap field will display the exact total debit — not an unlimited amount, not a padded amount.
| Component | Address |
|---|---|
| ImplicitExTransfer contract | 0x5015841D6E665e63Ea174aD6b8FeF854026dE0C0 |
| USDC (Circle native, Polygon) | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 |
| Treasury (fee recipient) | 0xa7cE4232811021d2Dd01f4f0f264Df2427ab3919 |
| Contract owner | 0x776A0D6b9F96445A38303F56d5B923e6d1FF8E97 |
| Parameter | Value |
|---|---|
| Deployment date | 2026-05-22 |
| Deployment transaction: | 0x87593fdb3d256a4a94b3e73877ba0bc433c39e81eefc78334af6da79ff5ef1f3 |
| Ownership transfer TX: | 0xd84181dbffbd4f760cfa650b2a1edb1acc17713e66bb5d6d478376dc5202d777 |
| Ownership acceptance TX: | 0xd6bfb2876725391c956dbd17ec5f774f9246b50df5667e8b29e8c78305365e90 |
| ID | Item | Status |
|---|---|---|
| TF-01 | Ordered transaction-flow screenshot set (Figures 1–12) | Available — captured 2026-07-23 |
| PP-01 | proof-packet.v1 export for the 5.00 USDC flow | Available — submitted state; confirmation update pending |
| TX-02 | 2026-07-23 transaction record | Submitted-state hash and Polygonscan URL available |
| TX-01 | Gate 4 transfer transaction (Polygonscan) | Available — publicly verifiable |
| TC-01 | Contract test suite results (59/59) | Internal — available on request |
| TC-02 | Observability suite results (31/31) | Internal — available on request |
| TC-03 | Analytics suite results (24/24) | Internal — available on request |
| TC-04 | Static reference audit (631 references) | Internal — available on request |