Contract audit · 컨트랙트 감사
gemini-3.8
4 October 2026 · MyXRPBridge on Flare
This technical audit letter provides an evaluation of the MyXRPBridge contract by Gemini (gemini-3.8), dated 4 October 2026. The review examines the deployed bytecode on Flare mainnet, evaluating asset admission, operational boundaries, and systems sitting outside the bytecode.
The contract deployment parameters and verified state are recorded as follows:
MyXRPBridge at 0x14b9DD90edaAff6527c1b168550B3FAA15b9F6AF14)0xAd552A648C74D49E10027AB8a618A3ad4901c5bEname() and symbol() return myXRP; decimals are 6maxAssets): 10,000,000.000000 FXRPOPENS_AT): 1,790,780,400 (1 October 2026 00:00 Asia/Seoul)The ceiling parameter maxAssets is 10,000,000.000000 FXRP. That figure is the ceiling, not an amount already issued. The timestamp confirmed that buying opened 1 October 2026 00:00 Asia/Seoul.
The review scope is strictly bounded to the smart contract bytecode. The website's custodial desk and cabinet are a different object. This letter reviews only the contract. Off-chain infrastructure, custodial desks, and user cabinets sit entirely outside this bytecode. This review does not invent or evaluate any company number, office, licence, or yield, and recognizes no wallet addresses other than the contract and official FXRP.
A central focus of this audit is determining what assets the contract will accept, what it will refuse, and how edge cases behave.
The contract accepts exclusively official FXRP at 0xAd552A648C74D49E10027AB8a618A3ad4901c5bE. This dependency is fixed as an immutable variable at deployment. When a user calls deposit(amount), the contract executes a transferFrom call to this immutable FXRP address.
All other assets are refused or structurally incompatible:
receive() or payable fallback() functions. Direct native FLR transfers revert immediately.deposit(), the assets become permanently locked. The contract contains no sweep, rescue, or recovery functions.deposit() revert with ZeroAmount() if the amount is zero, with NotOpen() if submitted before the opening timestamp, and with CapExceeded() if the deposit pushes total supply beyond maxAssets.The contract implements a direct 1:1 wrapper without fee deductions or variable valuation.
Deposit locks FXRP and mints the same amount of myXRP. Burn returns the same FXRP in that transaction. Both processes execute atomically. Because both tokens use six decimals, one unit of FXRP maps precisely to one unit of myXRP.
Key structural properties include:
room() function reports remaining mint capacity under the ceiling. When tokens are burned via withdraw(), capacity returns dynamically up to the 10,000,000.000000 FXRP ceiling.Bytecode analysis confirms that the contract operates completely autonomously without administrative privileges.
operatorWithdraw function, backdoor, or migration method. Assets leave the contract only when a user burns their own myXRP.locked), preventing reentrancy attacks during external calls.To avoid ambiguity, this review defines the boundary between smart contract logic and external components.
0xAd552A648C74D49E10027AB8a618A3ad4901c5bE. If the external FXRP system pauses or halts transfers, bridge redemptions will revert until upstream functionality resumes.Static analysis identified no critical or high-severity vulnerabilities. Findings are categorized below:
| ID | Severity | Title | Note |
|---|---|---|---|
| GEM-01 | Medium | Upstream Dependency on FXRP Liveness | Redemptions require successful calls to 0xAd552A648C74D49E10027AB8a618A3ad4901c5bE. If FXRP transfers are paused upstream, bridge operations revert. |
| GEM-02 | Low | Irretrievability of Misdirected Tokens | Direct transfers of assets to the contract address bypass deposit() and strand funds permanently due to the deliberate lack of an admin rescue function. |
| GEM-03 | Low | Nominal Parameter Accounting | deposit() credits amount without verifying balance deltas. This is safe with standard FXRP, but would cause accounting divergence if a transfer fee were introduced. |
| GEM-04 | Low | Standard ERC-20 Allowance Concurrency | approve() implements standard ERC-20 allowance behavior without atomic increase/decrease helpers or EIP-2612 permit functionality. |
| GEM-05 | Informational | Circulating Ceiling vs. Lifetime Issuance | The maxAssets cap limits concurrent circulating supply. Because redemptions replenish available room, cumulative volume over time may exceed 10 million. |
This assessment concludes with explicit documentation of actions not executed on chain: