February 2, 2026

The Technology Stack powering Forgotten Artifacts – Forgotten Artifacts

The Technology Stack powering Forgotten Artifacts – Forgotten Artifacts

The Technology Stack powering Forgotten Artifacts – Forgotten Artifacts

The Technology Stack powering Forgotten Artifacts – Forgotten Artifacts

Use a server

You never want your client (be that native Windows, Mac, Android, iOS, Web) to be executing GraphQL calls directly because it allows anyone with enough knowledge to do those calls themselves outside of your client/game.

Queue your items and send them out in batches

This worked fine and I sent thousands of items out very rapidly.

That is until the Ethereum network got congested.

I discovered that you can have about 16 pending transactions on your account (waiting to be mined) before any of Enjin’s blockchain related calls would start returning an error. (I.e. Send, Mint, Create, etc)

If you didn’t track which items you were attempting to manipulate you now have no record to fall back on.

Items lost during this time in Forgotten Artifacts are understood to have been lost in the lava of the dungeons.

It also costs gas for each transaction and the amount of gas you pay increases with the amount of data.

Back then I was sending a single item to a target wallet in a single transaction using a standard send. I spent a lot of ETH back then just sending out items 😅

Instead, I recommend using Advanced send for all your sending purposes. You can send multiple items to multiple addresses, all in the one transaction.

There are limits because the size of the transaction itself has a limit but a rough guide is no more than 100 items in the transfer array.

Store the returned transactionId

For example if you issue a send, you can use this transactionId to determine if the send was successful, still pending on the blockchain, or if it failed.

A common graphQL query I use when investigating a transaction is:

query 
retryState
}
}

This query returns enough information in the one call to determine the cause of an error or the state if there was no error.

Most of my server processes use the above query in order to determine state.

For example to determine if someone successfully completed a Quest, I use this query to determine if the transactionId that I issued to the player for the requirements for a Quest were successfully sent to the game wallet.

I describe more about the Send Queue under the “Enjin Blockchain Send Queue” section.

Advanced send is awesome

In the example here, I’m sending 20,000 FTs of TOKENID1 and 10,000 FTs of TOKENID2 from myself to 2 different wallets in the one transaction.

mutation advancedSend ,

]})

}

You can add more items into the transfers array to transfer more at once. Just make sure that you don’t add more than about 100.

To request items, just use the identity_id of the user you’re requesting from.

The identity_id of a user is specific to your platform and they must have linked their wallet and approved ENJ spend

Ensure you allow for Blockchain Congestion

Congestion and inreased gas prices is something you should plan for.

Common issues I’ve encountered are:

  1. Ethereum is congested and the gas price has risen so that transactions you or your player have signed are no longer being picked up by the miners (because they were signed with the lower gas fee)
  2. Bugs within Enjin’s systems have resulted in transactions not updating within their GraphQL system, even though they’ve successfully processed on the blockchain

Either design your blockchain interactions so that they’re less in the moment or ensure you have a way to manually override processing in the event that the processing time is exceeding what’s acceptable.

You will definitely want to ensure any blockchain interactions can be interrupted and resumed later in the event that gas prices have caused delays.

For example if you allow your players to craft an item, ensure that the crafting process gives enough information of the progress and then allow the player to interrupt the process and resume later if they deem they’ve waited too long.

You can see how this works in Forgotten Artifacts by completing a Quest or opening a Storage Trunk.

In addition, ensure you’ve designed your server logic to allow you to override the state checking of a blockchain transaction.

In my Admin panel I provide a button that allows me to force the blockchain state to successful. I’ve used this quite often over the last couple of months when the blockchain transaction correctly processed, but wasn’t being seen by Enjin. (Just make sure you don’t approve transactions that haven’t successfully processed, which you can do by checking the transaction hash on EnjinX)

Providing this fallback has allowed me to manually verify the transaction was successful and then push the Quest into the ‘Ready to claim reward’ state so that my players can continue.

Published at Sun, 05 Jan 2020 23:08:30 +0000

{flickr|100|campaign}

Previous Article

Secure & Sovereign Bitcoin (BTC) in 25 Easy Steps – 6102

Next Article

Here’s What Altcoins’ Rally Means for Where the Crypto Markets are Heading Next

You might be interested in …