General Questions
Why does Sui use the Call (Hot Potato) pattern?
Why does Sui use the Call (Hot Potato) pattern?
delegatecall). The Call<Param, Result> pattern provides an alternative by creating structs without drop or store abilities that must be consumed, using capability-based authorization, and enforcing call sequences through lifecycle states while ensuring atomicity within Programmable Transaction Blocks.For a detailed explanation of the Call pattern and Sui’s architecture, see the Sui documentation on PTBs.How is the receive path different from EVM?
How is the receive path different from EVM?
Call objects and PTBs instead of delegatecall. In EVM, the relayer calls Endpoint.lzReceive() which delegates to the OApp. In Sui, the Executor calls Endpoint.lz_receive() which creates a Call<LzReceiveParam, Void> object that the OApp destroys and processes via explicit PTB routing. Both execution models are permissionless.For architectural details, see Technical Overview and Protocol Overview.Development Questions
How do I verify my Sui package?
How do I verify my Sui package?
- Navigate to SuiScan verification page
- Enter package address
- Upload source files
- Wait for verification
Do I need to deploy my own Endpoint?
Do I need to deploy my own Endpoint?
EndpointV2 shared object on Sui. You only need to:- Publish your OApp or OFT package
- Register your OApp with the Endpoint (creates a
MessagingChannel) - Configure pathways to other chains
How do I handle decimal precision for OFTs?
How do I handle decimal precision for OFTs?
- Amount is divided by conversion rate (removes dust)
- Truncated amount is sent crosschain
- Destination multiplies by its conversion rate
Can I use existing tokens with LayerZero?
Can I use existing tokens with LayerZero?
Gas and Fees
What are the gas considerations for crosschain messages?
What are the gas considerations for crosschain messages?
- Charged for creating objects
- Refunded when objects are deleted
- Can result in negative net gas
- Charged for execution
- Not refunded
- Minimum 1000 base gas units
- Budget 5-20M for typical operations
- Source chain pays destination execution
How do I handle negative gas utilization rates?
How do I handle negative gas utilization rates?
- This is not an error
- Still need minimum 1000 base budget
- Net cost can be negative
- Rebate goes to transaction sender
How much should I budget for gas?
How much should I budget for gas?
| Operation | Gas Budget |
|---|---|
| Initialize channel | 10,000,000 |
| Set peer | 10,000,000 |
| Configure DVNs | 15,000,000 |
| Send message | 20,000,000 |
| Receive message | 15,000,000 |
| Deploy package | 100,000,000+ |
Configuration Questions
Do I need to set custom DVNs and Executors?
Do I need to set custom DVNs and Executors?
- Specific security requirements
- Custom DVN sets
- Private executors
How do I check my current configuration?
How do I check my current configuration?
Can I change configuration after deployment?
Can I change configuration after deployment?
AdminCap:SDKs and Tooling
What SDKs are available for Sui?
What SDKs are available for Sui?
-
@layerzerolabs/lz-sui-sdk-v2
- Core Endpoint interactions
- OApp functionality
- Configuration management
-
@layerzerolabs/lz-sui-oft-sdk-v2
- OFT-specific operations
- Token transfers
- Balance queries
Why can't I use the Sui CLI to query state?
Why can't I use the Sui CLI to query state?
- Doesn’t easily parse return values from view functions
- Manual decoding needed for bytes arrays and nested structs
- No built-in formatting for complex types
Is there a deploy/wire tool for Sui?
Is there a deploy/wire tool for Sui?
- Publish packages: Using
sui client publish - Call entry functions: Invoke configuration functions via
sui client callor SDK - Custom scripts: Write TypeScript scripts for automated workflows
Troubleshooting
Call object wasn’t properly consumed in your PTB:Call returned must be confirmed/destroyed before the transaction completes.MessagingChannel:MessagingChannel shared object for each OApp.How do I recover from a stuck message?
How do I recover from a stuck message?
AdminCap):Skip a message (increment nonce without execution):Security Questions
How do I secure my OApp?
How do I secure my OApp?
- Validate CallCap in All Functions:
- Validate Call Objects:
- Secure Capability Objects:
- Store
CallCapin package module storage (not transferred) - Use multisig or hardware wallet for
AdminCap - Never expose capabilities publicly
- Transfer
AdminCapcarefully (usetransfer::public_transfer)
- Protect UpgradeCap:
- Keep upgrade authority secure
- Consider freezing upgrades after deployment (
package::make_immutable) - Use multisig for mainnet upgrade authority
What are common security pitfalls?
What are common security pitfalls?
-
- Missing
CallCapvalidation in functions
- Missing
-
- Not validating
Callobject source (callee address)
- Not validating
-
- Skipping peer validation in
lz_receive
- Skipping peer validation in
-
- Losing capability objects (no recovery possible)
-
- Wrong peer addresses configured
-
- Exposing
AdminCaporCallCappublicly
- Exposing