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 X | Immutable zkEVM | |
---|---|---|
Custom contracts | Not available | Available |
Gas | Zero gas for all transactions | Zero gas for end user for all Passport transactions. Gas for all other transactions. |
Ecosystem | Closed 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 wallet | Immutable zkEVM wallet | How-to |
---|---|---|
Metamask | Metamask (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) | Metamask | Please go to https://reveal.magic.link/immutable to export your private key and import this wallet into Metamask. |
Passport | Passport | 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 X | Immutable zkEVM | Reasoning | Benefit |
---|---|---|---|
ERC721 | Maintain as ERC721 | All assets are unique from each other and have different metadata (e.g. PFPs). | Simple to migrate and maintains same functionality. |
ERC721 | Upgrade to ERC1155 | Some assets are indistinguishable from another and have identical metadata (e.g. trading cards). | More gas efficient and better UX on marketplaces in some cases. |
ERC20 | Maintain 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 ofconnectImx
).
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:
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.
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 useseth_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 { JsonRpcProvider, Wallet, Contract, keccak256, toUtf8Bytes, arrayify, BrowserProvider } from 'ethers';
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 JsonRpcProvider('https://eth-sepolia.g.alchemy.com/v2/' + process.env.NEXT_PUBLIC_ALCHEMY_API_KEY);
const signer = new 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 browserProvider = new BrowserProvider(provider);
const signer = await browserProvider.getSigner();
const abi = [
'function safeTransferFrom(address from, address to, uint256 tokenId)',
];
// Do multiple transfers
nfts.forEach(async (nft) => {
const contract = new Contract(nft.tokenAddress, abi, signer);
let tx = await contract.safeTransferFrom(
await 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.
Action | Immutable X | New implementation (assuming Passport) |
---|---|---|
Connecting wallet | link.setup() | Checkout Connect Widget (docs; sandbox demo) |
Onramping funds | link.fiatToCrypto() | Checkout Connect Widget (docs; sandbox demo) |
Offramping funds | link.cryptoToFiat() | Not available yet on Immutable zkEVM |
Listing orders | link.sell() | Orderbook SDK - Orders (docs) |
Cancelling orders | link.cancel() | Orderbook SDK - Orders (docs) |
Filling orders | link.buy() | Orderbook SDK - Orders (docs) |
Creating offers | link.createOffer() | Orderbook SDK - Offers (docs) |
Cancelling offers | link.cancelOffer() | Orderbook SDK - Offers (docs) |
Accepting offers | link.acceptOffer() | Orderbook SDK - Offers (docs) |
Transferring ERC20s | link.transfer() | ERC20 contract interaction (similar to docs) |
Transferring NFTs | link.transfer() link.batchNftTransfer() | ERC721 contract interaction (docs) |
Getting transaction history | link.history() | Removed |
Depositing NFTs and ERC20s | link.deposit() | Removed |
Withdrawing NFTs and ERC20s | link.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 | /metadata | New concept of metadata_id and metadata stacks for NFTs (ERC721; ERC1155). |
/metadata-refreshes | /metadata | |
/mints | /activities | Aggregated into /activities endpoint |
/transfers | /activities | Aggregated into /activities endpoint |
/orders | /activities | Aggregated into /activities endpoint |
/trades | /activities | Aggregated into /activities endpoint |
/balances | Removed | Use Checkout Balances widget (docs; demo) Direct contract call of relevant ERC20 |
/encoding | Removed | No longer necessary |
/users | Removed | No longer necessary |
/projects | Removed | No longer necessary |
/deposits | Removed | No longer necessary |
/withdrawals | Removed | No longer necessary |
/exchanges | Removed | No longer necessary |
/nft-checkout-primary | Removed | No longer necessary |
Webhook migration
Please see below for webhook differences between Immutable X and Immutable zkEVM.
Immutable X | Immutable zkEVM | Notes |
---|---|---|
imtbl_x_nft_created | imtbl_x_nft_created imtbl_zkevm_activity_mint |
|
imtbl_x_nft_updated | imtbl_zkevm_nft_updated | |
imtbl_x_transfer_created | imtbl_zkevm_activity_transfer imtbl_zkevm_activity_burn |
|
imtbl_x_order_accepted | imtbl_zkevm_order_updated | |
imtbl_x_order_filled | imtbl_zkevm_order_updated | |
imtbl_x_order_canceled | imtbl_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.