Create your Omniasset
Give holders a way to move your existing token across enabled chains without deploying a bridge for each destination.
Use the deployment registry to check availability before attempting a transaction.
Decide once, before signing
| Decision | Why it matters |
|---|---|
| Original token and origin chain | All representations redeem against this token's backing |
| Creator wallet | The caller becomes the permanent asset owner; it cannot transfer or renounce that role |
| Issuer compliance contract | Decide at creation; a contract cannot be added later if you start without one |
| Token metadata | Name, symbol and decimals are captured in the descriptor, not refreshed on demand |
| Existing peers | An asset without an issuer compliance contract snapshots them as pre-enabled destinations |
Use a wallet whose long-term control matches your team, such as your intended multisig. If an intermediary contract calls createAsset, that contract, not its caller, becomes the creator. Creation does not transfer ownership of the underlying ERC-20 and does not require that token's owner permission.
Official teams and communities may each create an asset for the same original token. Publish your canonical token page and asset ID so holders can identify yours. Read Choose the right asset.
Create in the app
Building your own issuer flow? Use omnisea.createAsset() in the TypeScript SDK or the direct contract example below. Both call the same router, and the signing account becomes the issuer.
Choose the origin chain and original token, connect the intended issuer wallet, and confirm creation. The app resolves the identity for that wallet. On the created asset's page, holders choose an enabled destination and transfer; the first successful message creates its destination representation automatically.
When a later-supported chain is not enabled yet, the issuer can select it and use Enable {chain}. Other holders see only enabled destinations. See Enable chains and manage fees.
Create programmatically
Use the runnable starter with ACTION=create. It reads assetOf(originalToken, creator) first, simulates createAsset(originalToken, zeroAddress) without an issuer compliance contract, and verifies AssetCreated in the confirmed router receipt. No token approval or deposit is needed for creation; source gas is still paid.
The result is an asset ID and an OFTAdapter address on the origin. The adapter is the spender for subsequent token approvals. Holders keep their original ERC-20 until they transfer it.
Confirm the result
Check getAsset(assetId) and descriptorOf(assetId) on the router. Confirm the creator, token, issuer-compliance requirement and pre-enabled EIDs before publishing your integration. The canonical page is /{locale}/tokens/{originChainId}/{originToken}/{creator}; the creator-free page is discovery, not an unambiguous asset identity.
Next: enable a new destination and configure revenue, or run your first transfer.