Skip to main content
Version: v1

Migrate to zkEVM

Migration is the process of moving assets from one blockchain to another. With custom smart contract functionality and a more open ecosystem on Immutable zkEVM, many game studios find the increased flexibility and liquidity of Immutable zkEVM more attractive and would like to migrate their Immutable X assets. This guide aims to show what this process could look like for a game building on Immutable X.

Understanding key differences

In migrating to Immutable zkEVM, it’s important to understand its key differences from Immutable X:

Immutable XImmutable zkEVM
Custom contractsNot availableAvailable
GasZero gas for all transactionsZero gas for end user for all Passport transactions. Gas for all other transactions.
EcosystemClosed ecosystem (no DeFi, minimal number of integrations with other partners).Open ecosystem (swaps, staking, bridging)

Migration step-by-step

When migrating from Immutable X to zkEVM, the exact process will vary based on your specific requirements, migration strategy, and how you plan to transition your users and assets. Below is a general guide to help you structure your migration process.

1. Create a new project on zkEVM

Follow this guide to set up a project on Immutable zkEVM.

2. Set up Passport

Follow this guide to create a Passport client and integrate into your application.

Passport is Immutable’s authentication and wallet product that allows for gas-free transactions for your players!

Please see the below for recommended wallet migration paths for your users with their benefits.

Immutable X walletImmutable zkEVM walletHow-to
MetamaskMetamask (optional upgrade to Passport)No change necessary. Assets will be airdropped to the same wallet address.
If you would like gas-free transactions, please sign up for a Passport wallet and link your Metamask to get (read-only) access to your assets.
Email (includes Kyo wallet)MetamaskPlease go to https://reveal.magic.link/immutable to export your private key and import this wallet into Metamask.
PassportPassport No change necessary. Wallet addresses between Immutable X and Immutable zkEVM are the same.

3. Decide asset migration strategy

With ERC1155s supported on zkEVM, a subset of ERC721s can be converted to ERC1155s. This is optional and up to the discretion of the collection’s owner. Please use the table below for a short recommendation of approaches.

Immutable XImmutable zkEVMReasoningBenefit
ERC721Maintain as ERC721All assets are unique from each other and have different metadata (e.g. PFPs).Simple to migrate and maintains same functionality.
ERC721Upgrade to ERC1155Some assets are indistinguishable from another and have identical metadata (e.g. trading cards).More gas efficient and better UX on marketplaces in some cases.
ERC20Maintain as ERC20 Assets are intended to be traded as currencies (e.g. $GOG).Simple to migrate and maintains same functionality.

Please note that developing the migration tools to upgrade from ERC721s to ERC1155s will need to be done by the collection owner themselves as metadata will need to be reconfigured and updated.

4. Deploy asset contracts on zkEVM

ERC721 contracts

  • Deploy your collections directly through the Hub or using the Immutable contracts repository. Follow this guide for more information.

ERC20 contracts

  • On Immutable X, ERC20 contracts were deployed on L1 and registered with the API for L2 usage.
  • If you would like to use the same ERC20 tokens, you will need to map these tokens to Immutable zkEVM using this guide. This will allow those tokens to be bridgeable and usable on Immutable zkEVM.
  • If you would like to deploy new ERC20 tokens native to zkEVM, please follow this guide.

ERC1155 contracts (if applicable)

  • Use ERC1155 for assets like consumables or semi-fungible tokens. Refer to the table above to determine the right standard for your assets.

5. Update your code and integrations

Environment Variables

  • Update your code to include the new Passport Client ID and zkEVM contract addresses.

Function calls

  • Replace any Immutable X-specific SDK function calls with their zkEVM equivalents (e.g., connectEvm instead of connectImx).

Contract calls

  • With zkEVM supporting smart contract functionality, you will be able to enable contract calls in your Unity or Unreal SDKs. This will allow your players to perform transactions like NFT transfers or staking from inside your game.

Webhooks

  • Our guide explains how to integrate with our webhooks on zkEVM.
  • If you would like to ingest webhook events from custom contracts on zkEVM, please use either Goldsky or Subquery’s product as described here.

6. Migrate your assets

Inform your community

Announce your plans with timelines and expected downtime. Provide clear instructions on how to interact with the migration process and address any concerns.

Transition your assets from Immutable X to Immutable zkEVM

  • Burn assets on Immutable X and mint equivalent assets on zkEVM.
  • Use the provided sample migration app for a reference implementation.

Key considerations

  • Downtime vs. Dual Operation: Decide if you will pause operations during migration or run Immutable X and zkEVM simultaneously for a period.
  • Migration strategy: Tailor your approach based on user impact, asset types, and metadata reuse.
  • Communication: Inform your players about the migration process and its impact on their assets and gameplay.

Asset migration

Migration process

While the exact implementation may vary based on your game’s requirements, all asset migrations share a common principle: invalidating the asset on Immutable X and minting it on zkEVM.

Example of a typical migration approach

1. Deploy an asset contract on zkEVM

Decide whether to deploy your collection as an ERC721 or ERC1155, based on your use case:

  • Use ERC721 for unique, non-fungible assets.
  • Use ERC1155 for semi-fungible assets or assets that benefit from batch operations (e.g. consumables or crafting materials).
2. Burn the asset on Immutable X
  • Have the user burn the asset on Immutable X by transferring it to a designated burn address (0x0000000000000000000000000000000000000000).
  • This transfer serves as a trigger for minting the equivalent asset on zkEVM.
3. Mint the asset on zkEVM
  • Mint the equivalent asset on the previously deployed zkEVM collection.
  • Preserve the wallet address of the user who burned the asset on Immutable X.
Please note: As Immutable X and Immutable zkEVM are separate applications, transaction history on Immutable X will not be preserved on Immutable zkEVM.

Metadata compatibnility on zkEVM

Reusing metadata from Immutable X

zkEVM is backward-compatible with Immutable X metadata. If token IDs are preserved, the same off-chain metadata can be reused without modification by configuring the same metadata URL.

Re-hosting metadata

If token IDs are mapped differently or you convert between token standards (ERC721 to ERC1155), re-hosting the metadata may be necessary to align with the updated token configuration. See here for more information.

Reference: Sample migration application

To assist with the migration process, we provide a sample migration application that integrates with the Immutable Unified SDK and implements the above flow. The application demonstrates:

  • Connecting Passport.
  • Burning NFTs on Immutable X.
  • Listening for burn and mint events via webhooks.
  • Minting equivalent NFTs on zkEVM.

Use this application as a starting point to design and implement your migration process.

Access the sample application here


Typescript SDK Migration

Unified SDK Migration

This guide provides an overview of the key workflows and their differences when migrating from Immutable X to Immutable zkEVM using the unified @imtbl/sdk.

To illustrate examples of differences, three key functions have been outlined with code sample:

  • Passport Login
  • NFT Minting
  • NFT Transferring

Other function differences can be found in the table below

Passport Login

Key differences:

  • Immutable X: Connects to the IMX environment via connectImx().
  • Immutable zkEVM: Connects to the zkEVM environment via connectEvm() and uses eth_requestAccounts to obtain wallet addresses.

Immutable X

import { config, passport } from '@imtbl/sdk';
import { IMXProvider } from '@imtbl/sdk/x';
const passportInstance = new passport.Passport({
baseConfig: {
environment: config.Environment.SANDBOX, // or config.Environment.SANDBOX
},
clientId: process.env.NEXT_PUBLIC_CLIENT_ID || '<YOUR_CLIENT_ID>', // replace with your client ID from Hub
redirectUri: 'http://localhost:3000/redirect', // replace with one of your redirect URIs from Hub
logoutRedirectUri: 'http://localhost:3000/logout', // replace with one of your logout URIs from Hub
audience: 'platform_api',
scope: 'openid offline_access email transact',
});
// Connect to IMX
const provider: IMXProvider = await passportInstance.connectImx();
const walletAddress = await provider.getAddress();

Immutable zkEVM

import { config, passport } from '@imtbl/sdk';
import { Provider } from '@imtbl/sdk/passport';
const passportInstance = new passport.Passport({
baseConfig: {
environment: config.Environment.SANDBOX, // or config.Environment.SANDBOX
},
clientId: process.env.NEXT_PUBLIC_CLIENT_ID || '<YOUR_CLIENT_ID>', // replace with your client ID from Hub
redirectUri: 'http://localhost:3000/redirect', // replace with one of your redirect URIs from Hub
logoutRedirectUri: 'http://localhost:3000/logout', // replace with one of your logout URIs from Hub
audience: 'platform_api',
scope: 'openid offline_access email transact',
});
// Connect to zkEVM
const provider: Provider = await passportInstance.connectEvm();
const accounts = await provider.request({ method: 'eth_requestAccounts' });
const walletAddress = accounts[0];

Minting

Key differences:

  • Immutable X: Minting is a synchronous process, and the token is minted immediately.
  • Immutable zkEVM: Minting is an asynchronous request process, and you'll need webhooks or polling to track the status of the minting. Refer to webhooks section.

Immutable X

import { keccak256 } from '@ethersproject/keccak256';
import { toUtf8Bytes } from '@ethersproject/strings';
import { ethers } from 'ethers';
import { arrayify } from 'ethers/lib/utils';
import { config, x } from '@imtbl/sdk';
// Set up IMXClient
const client = new x.IMXClient(x.imxClientConfig({ environment: config.Environment.SANDBOX }));
// Set up signer
const provider = new ethers.providers.JsonRpcProvider('https://eth-sepolia.g.alchemy.com/v2/' + process.env.NEXT_PUBLIC_ALCHEMY_API_KEY);
const signer = new ethers.Wallet(process.env.NEXT_PUBLIC_PRIVATE_KEY || '', provider);
// Set up request
let mintRequest = {
auth_signature: '',
contract_address: '<CONTRACT_ADDRESS>',
users: [
{
user: <USER_ADDRESS>,
tokens: [
{
id: <TOKEN_ID>,
blueprint: <BLUEPRINT>,
},
],
},
],
};
const message = keccak256(toUtf8Bytes(JSON.stringify(mintRequest)));
const authSignature = await signer.signMessage(arrayify(message));
mintRequest.auth_signature = authSignature;
// Mint
const mintResponse = await client.mint(signer, mintRequest);

Immutable zkEVM

import { blockchainData, config } from '@imtbl/sdk';
// Set up BlockchainData client
const client = new blockchainData.BlockchainData({
baseConfig: {
environment: config.Environment.SANDBOX,
apiKey: process.env.NEXT_PUBLIC_API_KEY,
},
});
// Create a mint request
const chainName = 'imtbl-zkevm-testnet';
const contractAddress = '<CONTRACT_ADDRESS>';
const referenceId = `mint-${Date.now()}`;
const mintRequest = await client.createMintRequest({
chainName,
contractAddress,
createMintRequestRequest: {
assets: [
{
owner_address: userAddress,
reference_id: referenceId,
// token_id: tokenId,
metadata: {
name: 'Brown Dog Green Car',
description: 'This NFT is a Brown Dog in a Green Car',
image: 'https://mt-test-2.s3.ap-southeast-2.amazonaws.com/BDGC.png',
external_url: null,
animation_url: null,
youtube_url: null,
attributes: [
{
trait_type: 'Pet',
value: 'Dog',
},
{
trait_type: 'Pet Colour',
value: 'Brown',
},
{
trait_type: 'Vehicle',
value: 'Car',
},
{
trait_type: 'Vehicle Colour',
value: 'Green',
},
],
},
},
],
},
});
console.log('mint: Minting request created', mintRequest);

Transfers

Key differences:

  • Immutable X: Transfers are managed via API using batchNftTransfer.
  • Immutable zkEVM: Transfers are performed by calling the chain directly using smart contract methods (e.g. safeTransferFrom).

Immutable X

// Provider from passport
const provider: IMXProvider = await passportInstance.connectImx();
// Do batch transfer
await provider.batchNftTransfer(
nfts.map((nft) => ({
receiver: '<RECIEVER_ADDRESS',
tokenId: nft.tokenId,
tokenAddress: nft.tokenAddress,
}))
);

Immutable zkEVM

import { Provider } from '@imtbl/sdk/passport';
import { ethers } from 'ethers';
// Provider from passport
const provider: Provider = await passportInstance.connectEvm();
// Set up signer and abi
const web3Provider = new ethers.providers.Web3Provider(provider);
const signer = web3Provider.getSigner();
const abi = [
'function safeTransferFrom(address from, address to, uint256 tokenId)',
];
// Do multiple transfers
nfts.forEach(async (nft) => {
const contract = new ethers.Contract(nft.tokenAddress, abi, signer);
let tx = await contract.safeTransferFrom(
signer.getAddress(),
'<RECIEVER_ADDRESS',
nft.tokenId
);
console.log('transfer: Transaction sent', tx);
tx.wait();
});

SDK differences between Immutable X and Immutable zkEVM

A table explaining additional SDK differences between Immutable X and Immutable zkEVM is outlined below.

ActionImmutable XNew implementation (assuming Passport)
Connecting walletlink.setup()Checkout Connect Widget (docs; sandbox demo)
Onramping fundslink.fiatToCrypto()Checkout Connect Widget (docs; sandbox demo)
Offramping fundslink.cryptoToFiat()Not available yet on Immutable zkEVM
Listing orderslink.sell()Orderbook SDK - Orders (docs)
Cancelling orderslink.cancel()Orderbook SDK - Orders (docs)
Filling orderslink.buy()Orderbook SDK - Orders (docs)
Creating offerslink.createOffer()Orderbook SDK - Offers (docs)
Cancelling offerslink.cancelOffer()Orderbook SDK - Offers (docs)
Accepting offerslink.acceptOffer()Orderbook SDK - Offers (docs)
Transferring ERC20slink.transfer()ERC20 contract interaction (similar to docs)
Transferring NFTslink.transfer()
link.batchNftTransfer()
ERC721 contract interaction (docs)
Getting transaction historylink.history()Removed
Depositing NFTs and ERC20slink.deposit()Removed
Withdrawing NFTs and ERC20slink.prepareWithdrawal()
link.completeWithdrawal()
Removed

API differences between Immutable X and Immutable zkEVM

A table explaining API differences between Immutable X and Immutable zkEVM is outlined below.

Immutable X
API Reference
Immutable zkEVM
API Reference
Comments
/assets/nfts
/nft-owners
/collections/collections
/metadata/metadataNew concept of metadata_id and metadata stacks for NFTs (ERC721; ERC1155).
/metadata-refreshes/metadata
/mints/activitiesAggregated into /activities endpoint
/transfers/activitiesAggregated into /activities endpoint
/orders/activitiesAggregated into /activities endpoint
/trades/activitiesAggregated into /activities endpoint
/balancesRemovedUse Checkout Balances widget (docs; demo)
Direct contract call of relevant ERC20
/encodingRemovedNo longer necessary
/usersRemovedNo longer necessary
/projectsRemovedNo longer necessary
/depositsRemovedNo longer necessary
/withdrawalsRemovedNo longer necessary
/exchangesRemovedNo longer necessary
/nft-checkout-primaryRemovedNo longer necessary

Webhook migration

Please see below for webhook differences between Immutable X and Immutable zkEVM.

Immutable XImmutable zkEVMNotes
imtbl_x_nft_createdimtbl_x_nft_created
imtbl_zkevm_activity_mint
  • Both events are published when NFT is minted. The difference is that imtbl_zkevm_nft_updated can also be updates about the NFT.
  • Unlike in Immutable X, minting is async in zkEVM. To find out if a mint succeeded, use the minting API or subscribe toimtbl_zkevm_activity_mint events using webhooks.
imtbl_x_nft_updatedimtbl_zkevm_nft_updated
imtbl_x_transfer_createdimtbl_zkevm_activity_transfer
imtbl_zkevm_activity_burn
  • imtbl_zkevm_activity_burn is published for burn of ERC-721 and ERC-1155 tokens, but not ERC-20 tokens.
imtbl_x_order_acceptedimtbl_zkevm_order_updated
imtbl_x_order_filledimtbl_zkevm_order_updated
imtbl_x_order_canceledimtbl_zkevm_order_updated

When there is a transfer of NFT, imtbl_x_nft_updated and imtbl_x_transfer_created are both published, and both events contain information on sender and receiver. In zkEVM, imtbl_zkevm_nft_updated does not carry information about the owner address. To stay updated on the ownership changes, use imtbl_zkevm_activity_transfer and imtbl_zkevm_activity_burn events.

Documentation on zkEVM events

Payload examples

imtbl_x_nft_created
{
"Type": "Notification",
"MessageId": "e2ff97e6-d3f5-5641-b58d-c874b800944a",
"TopicArn": "arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox",
"Message": "{\"event_name\":\"imtbl_x_nft_created\",\"event_id\":\"0192b75c-ec31-b5ef-fd38-f0eeba4b2fb3\",\"chain\":\"imtbl-x-testnet\",\"data\":{\"token_address\":\"0xcf77af96b269169f149b3c23230e103bda67fd0c\",\"token_id\":\"55\",\"id\":\"0x3955cd771121158a38198bb3cbbad150655a2c6722ece838a37e7beb63551ad9\",\"user\":\"0xaa02e02919c2f37246c3372478709ec746bb366f\",\"status\":\"imx\",\"uri\":null,\"name\":null,\"description\":null,\"image_url\":null,\"metadata\":null,\"collection\":{\"name\":\"Immutable Runner Fox\",\"icon_url\":\"https://rose-ministerial-termite-701.mypinata.cloud/ipfs/Qmd3oT99HypRHaPfiY6JWokxADR5TzR1stgonFy1rMZAUy\"},\"created_at\":\"2024-10-23T03:12:53.2971Z\",\"updated_at\":\"2024-10-23T03:12:53.2971Z\",\"fees\":[{\"type\":\"royalty\",\"address\":\"0xaa02e02919c2f37246c3372478709ec746bb366f\",\"percentage\":1},{\"type\":\"protocol\",\"address\":\"0xa6c368164eb270c31592c1830ed25c2bf5d34bae\",\"percentage\":2}]}}",
"Timestamp": "2024-10-23T03:12:53.764Z",
"SignatureVersion": "1",
"Signature": "F2CfA4+r7ozofVSfAnbxKbMzvqgICqxc+IDREzzdhoNMmuwn2FdV1d8vKVhdQYtVyXadLeqJ5w98iqb3whLEAO3F7nAealjrn+fFAKEQz4jthcH/mVck+AJCiWi1k2ouNOR438nIZ0nk2HT7cnPwB0q29UCizxj0w6nDcQUXKs1jKckcxMyANEeJPsZFnP2VMOT6sH+rvFuWbM6WfWlvk7Z1VAF/nVPe8+F/xems/6yPORz8eMu55pEQUINTP73WezBqYtPA4JVQxjsKI62+mYQh+qDSzRp9tbqcN5HQRWiMxFTIR5nRZxzglEYHDWCMlF+Jb7KBERFGNNFYrkxY1Q==",
"SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",
"UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox:d5c06be9-4128-43f1-bee9-b34c1e284386",
"MessageAttributes": {
"chain": {
"Type": "String",
"Value": "imtbl-x-testnet"
},
"collection_address": {
"Type": "String",
"Value": "0xcf77af96b269169f149b3c23230e103bda67fd0c"
},
"event": {
"Type": "String",
"Value": "imtbl_x_nft_created"
}
}
}
imtbl_zkevm_activity_mint
{
"Type": "Notification",
"MessageId": "19f1705d-cb21-5de2-931f-2fcf90f2890e",
"TopicArn": "arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox",
"Message": "{\"event_name\":\"imtbl_zkevm_activity_mint\",\"event_id\":\"0192b71d-e7a5-cdfe-212c-92bdfd022c8e\",\"chain\":\"imtbl-zkevm-testnet\",\"data\":{\"id\":\"0192b71d-e779-d4f9-c90f-fbd8abc397b8\",\"chain\":{\"id\":\"eip155:13473\",\"name\":\"imtbl-zkevm-testnet\"},\"details\":{\"to\":\"0xb5b2c092445f9bd09d8e451755ba53931157e583\",\"asset\":{\"token_id\":\"340282366920938463463374607431768211461\",\"contract_type\":\"erc721\",\"contract_address\":\"0x88fdf543da96c938582faf54b3e6c8b89f77470e\"},\"amount\":\"1\"},\"indexed_at\":\"2024-10-23 02:04:03.322529\",\"activity_type\":\"mint\",\"blockchain_metadata\":{\"log_index\":\"0\",\"block_number\":\"15330625\",\"transaction_hash\":\"0xeb80d7d51aba99cd126973cc386a2d62db5acfc1e6708b260dc1324f7d0627e2\",\"transaction_index\":\"0\"}}}",
"Timestamp": "2024-10-23T02:04:03.565Z",
"SignatureVersion": "1",
"Signature": "GJkPq7xkgq+CMkGcfJWHJIpofYotqo45SciGKYA0w8MbYH3J2bfKXOeiso/WpLFuuLDeGeiI4/45pT5FTOpxt5Uk5WavrHLfnc5LmHO+SAWwn9sals5s3u2lu7zviEjhe5c4WlXg0HXT0JiULFmP//44dE6iLAvPW+cwh6UVmpyfrrt5O+Xhac9pqKqdAsJX6sx1DrrtsTlJHMC/mBBxNzrSzqdAMjciTEkg1ay/x/R/6H7SQo0w2kguWEWJgYGBSD3yK50Y4NGmdeiDuoOVV/9+Hxx6tOit9ceUtWJGcXKGX+oByEq+PPhUTvd/Exeb7B7SNnyQ3sTg9/auVR9dQQ==",
"SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",
"UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox:7871bfd6-bf6c-47a1-9fcd-f8b39e347827",
"MessageAttributes": {
"chain": {
"Type": "String",
"Value": "imtbl-zkevm-testnet"
},
"collection_address": {
"Type": "String",
"Value": "0x88fdf543da96c938582faf54b3e6c8b89f77470e"
},
"event": {
"Type": "String",
"Value": "imtbl_zkevm_activity_mint"
}
}
}
imtbl_x_nft_updated
{
"Type": "Notification",
"MessageId": "1f43f57f-4f95-58fa-bf5e-aaed23d23bbd",
"TopicArn": "arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox",
"Message": "{\"event_name\":\"imtbl_x_nft_updated\",\"event_id\":\"0192b75e-2e10-ee32-6641-0a844a9b2f18\",\"chain\":\"imtbl-x-testnet\",\"data\":{\"token_address\":\"0xcf77af96b269169f149b3c23230e103bda67fd0c\",\"token_id\":\"55\",\"id\":\"0x3955cd771121158a38198bb3cbbad150655a2c6722ece838a37e7beb63551ad9\",\"user\":\"0xb5b2c092445f9bd09d8e451755ba53931157e583\",\"status\":\"imx\",\"uri\":null,\"name\":\"Fox #55\",\"description\":\"This is the description of Fox #55\",\"image_url\":\"https://rose-ministerial-termite-701.mypinata.cloud/ipfs/Qmd3oT99HypRHaPfiY6JWokxADR5TzR1stgonFy1rMZAUy\",\"metadata\":{\"id\":55,\"name\":\"Fox #55\",\"class\":\"animal55\",\"attack\":550,\"image_url\":\"https://rose-ministerial-termite-701.mypinata.cloud/ipfs/Qmd3oT99HypRHaPfiY6JWokxADR5TzR1stgonFy1rMZAUy\",\"collectible\":true,\"description\":\"This is the description of Fox #55\"},\"collection\":{\"name\":\"Immutable Runner Fox\",\"icon_url\":\"https://rose-ministerial-termite-701.mypinata.cloud/ipfs/Qmd3oT99HypRHaPfiY6JWokxADR5TzR1stgonFy1rMZAUy\"},\"created_at\":\"2024-10-23T03:12:53.2971Z\",\"updated_at\":\"2024-10-23T03:14:15.696524Z\",\"fees\":[{\"type\":\"royalty\",\"address\":\"0xaa02e02919c2f37246c3372478709ec746bb366f\",\"percentage\":1},{\"type\":\"protocol\",\"address\":\"0xa6c368164eb270c31592c1830ed25c2bf5d34bae\",\"percentage\":2}]}}",
"Timestamp": "2024-10-23T03:14:15.890Z",
"SignatureVersion": "1",
"Signature": "f4dAIOAeiUr56fKHBNE/MAYN6JXufysEGdchpdRhMN3TMftdonwhl82orrMiRnzWF84klh0YpmC3TedMHe6XeWkzFJc78ilxuU4GDDLsrQ1fvDxBPGfZTRkDm1dZYVwux4DSZBJxIRv2fCW+KWbj3HhH8MmtIkZNRP7EKkEfMNG5MLtEbdOoKtlR6iq1Wexd8aHXIRHvRWR5Uofb0wqR2w6omK7esg8z1LSqBavr4jRym49bivd3JDfFDiyVp5IV4IfLcnJoIwJbeXr2FZ+TZFyNSRKZrB7kf+uAMKVOLDQPBVY9DGP5qW/t+mC/Wo/yIi/cpdAn+TTRPOAPEBCRqA==",
"SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",
"UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox:d5c06be9-4128-43f1-bee9-b34c1e284386",
"MessageAttributes": {
"chain": {
"Type": "String",
"Value": "imtbl-x-testnet"
},
"collection_address": {
"Type": "String",
"Value": "0xcf77af96b269169f149b3c23230e103bda67fd0c"
},
"event": {
"Type": "String",
"Value": "imtbl_x_nft_updated"
}
}
}
imtbl_zkevm_nft_updated
{
"Type": "Notification",
"MessageId": "e291a4a9-54fb-5c37-82d1-fb3b0f2f7091",
"TopicArn": "arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox",
"Message": "{\"event_name\":\"imtbl_zkevm_nft_updated\",\"event_id\":\"0192b71d-e9cf-f8e7-5856-9046eb60de23\",\"chain\":\"imtbl-zkevm-testnet\",\"data\":{\"chain\":{\"id\":\"eip155:13473\",\"name\":\"imtbl-zkevm-testnet\"},\"contract_address\":\"0x88fdf543da96c938582faf54b3e6c8b89f77470e\",\"indexed_at\":\"2024-10-23T02:04:03.322529Z\",\"metadata_synced_at\":\"2024-10-23T02:04:03.897793Z\",\"token_id\":\"340282366920938463463374607431768211461\",\"metadata_id\":\"0192b71d-e9bd-54e0-98b5-8ecc0fbd9746\",\"updated_at\":\"2024-10-23T02:04:03.897793Z\"}}",
"Timestamp": "2024-10-23T02:04:04.068Z",
"SignatureVersion": "1",
"Signature": "TMgdlBmhoQANUJm8uei4p8623TNC+TZQnZDJ4jR04ksPdLd0GckyhjDUbN57UzOe7PwnMlbxWlJnNSiI/1sIAcqj7UW5uKHUe/hjtVaumpQC9LaCloqFV/E8JAwzNfaRwEwyaQP8ztst1Id0U/xXHE4ieNZQpeGapyXhGE+XIEbLtcIdX4Xh6Fx2OBfBsFORUSUhfTaqXPTng8KMqoGmpq58mKcKXhtv0QWa3DDVTRfIXMTfIyDO7p0/LbzywKkGeM48EOZklS5Hzn0LYKHWJSDEXFaDk8uUKMFbHoiT2FgIZvsHHKMgE8bnWb0C0m1YcaIdr7M/t+kToiaAWvIeNQ==",
"SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",
"UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox:7871bfd6-bf6c-47a1-9fcd-f8b39e347827",
"MessageAttributes": {
"chain": {
"Type": "String",
"Value": "imtbl-zkevm-testnet"
},
"collection_address": {
"Type": "String",
"Value": "0x88fdf543da96c938582faf54b3e6c8b89f77470e"
},
"event": {
"Type": "String",
"Value": "imtbl_zkevm_nft_updated"
}
}
}
imtbl_x_transfer_created
{
"Type": "Notification",
"MessageId": "82bf9ed7-1037-59ec-b505-c1457c3c97e1",
"TopicArn": "arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox",
"Message": "{\"event_name\":\"imtbl_x_transfer_created\",\"event_id\":\"0192b75d-413f-dfe9-7781-356ee145cd04\",\"chain\":\"imtbl-x-testnet\",\"data\":{\"transaction_id\":164067879,\"status\":\"success\",\"user\":\"0xb5b2c092445f9bd09d8e451755ba53931157e583\",\"receiver\":\"0x0000000000000000000000000000000000000000\",\"token\":{\"type\":\"ERC721\",\"data\":{\"token_id\":\"49\",\"id\":\"0xee67a90746fd394b1a2862939416d52da042729d50216a6d96076ad9246fa022\",\"token_address\":\"0xcf77af96b269169f149b3c23230e103bda67fd0c\",\"decimals\":0,\"quantity\":\"1\",\"quantity_with_fees\":\"\"}},\"timestamp\":\"2024-10-23T03:13:15.071872Z\"}}",
"Timestamp": "2024-10-23T03:13:15.492Z",
"SignatureVersion": "1",
"Signature": "HhP3nsM8BfADDtL8qaY49aBH8/4u3aP1S1EUDWJpcEVFaKR5DpTezIC/vfxWqbsR4MG5kUdCmqOICWGMmroan90NPY8U3O4vp4KylGPfKuv3x8zygaNc9Tt1lXADFv+P582Ji9Q0ecwKr+DGIfGk5eO1Z4Yhbb/NtLZZA/NXtI0NtrIHQetuk75KHAjUXzE7KQbO9quKT+4eHei6bOt8UrfNVhEjwm3TZ3/KHsCw3E9Mi1+JqNw3u7eVAlvHhpM6lGoq5zV4uinDU9ARG9F9N1wQ8EFXj9JagXt8iweBeQraL2sfzF0L7RUbxLXIc+KDpE1PW90jh7WfZw3IpnamAw==",
"SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",
"UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox:d5c06be9-4128-43f1-bee9-b34c1e284386",
"MessageAttributes": {
"chain": {
"Type": "String",
"Value": "imtbl-x-testnet"
},
"collection_address": {
"Type": "String",
"Value": "0xcf77af96b269169f149b3c23230e103bda67fd0c"
},
"event": {
"Type": "String",
"Value": "imtbl_x_transfer_created"
}
}
}
imtbl_zkevm_activity_burn
{
"Type": "Notification",
"MessageId": "ac907815-42d2-5eb0-a833-278721edeca1",
"TopicArn": "arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox",
"Message": "{\"event_name\":\"imtbl_zkevm_activity_burn\",\"event_id\":\"0192b73a-e5ea-5206-f600-5d64d904d6fc\",\"chain\":\"imtbl-zkevm-testnet\",\"data\":{\"id\":\"0192b73a-e5b1-4831-f1fa-5fbfcae9e60d\",\"chain\":{\"id\":\"eip155:13473\",\"name\":\"imtbl-zkevm-testnet\"},\"details\":{\"from\":\"0xb5b2c092445f9bd09d8e451755ba53931157e583\",\"asset\":{\"token_id\":\"2\",\"contract_type\":\"erc1155\",\"contract_address\":\"0x3b28c82a6e5e3d6023e2a440b2b1b3480d4c6fd3\"},\"amount\":\"3\"},\"indexed_at\":\"2024-10-23 02:35:43.417743\",\"activity_type\":\"burn\",\"blockchain_metadata\":{\"log_index\":\"1\",\"block_number\":\"15331575\",\"transaction_hash\":\"0xd1062c99ee8792af0914409c28569c17eb2c10a1c6db0b8a75d404c17c800192\",\"transaction_index\":\"0\"}}}",
"Timestamp": "2024-10-23T02:35:43.622Z",
"SignatureVersion": "1",
"Signature": "XJIpMaPj4yc/cvTFeEacJvERlGJaGFqebgRcerBwYd6GI8anVKVrDco6vymFyZwXjE+rbcYSFDIIgG9/i3jXlc9dnnRqgJ7sfG3piILJw8jkxUvaynuSrxj6lBPiuJ+R6IqFl2FORmaFBf4NAjvQkpN7vtr4kmv1HpNCaw2VqUm47prbPBZ66Yo4vYvkzXvY9RfHnRvCVnPoscT8JH9wLjM08Bi8Yocj+bK8U71pXmhLDesc1VH0jfgnqcCgw7E6+OK+3bZtXt79Dt4hVS/UuY7nZO+EDWIPRtMZSeqdrzJoVU+aT7ddqOklEuNQNbEFQduEJEvEzaTRSNXh6j8DcQ==",
"SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-60eadc530605d63b8e62a523676ef735.pem",
"UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:783421985614:webhook-outbound-sandbox:7871bfd6-bf6c-47a1-9fcd-f8b39e347827",
"MessageAttributes": {
"chain": {
"Type": "String",
"Value": "imtbl-zkevm-testnet"
},
"collection_address": {
"Type": "String",
"Value": "0x3b28c82a6e5e3d6023e2a440b2b1b3480d4c6fd3"
},
"event": {
"Type": "String",
"Value": "imtbl_zkevm_activity_burn"
}
}
}

If you need further assistance or have any queries, join our community of builders on Discord.


Related content