From 820fc5a732972c388b7d7b2b33c9e30965bcac86 Mon Sep 17 00:00:00 2001 From: dvcpull <132333831+dvcpull@users.noreply.github.com> Date: Fri, 20 Sep 2024 03:13:10 +0100 Subject: [PATCH] fixes --- deploy/index.js | 51 +++++++++++++++++++++++++++++ deploy/utils/fungible.js | 70 ++++++++++++++++++++++++++-------------- deploy/utils/nft.js | 22 +++++++++---- 3 files changed, 111 insertions(+), 32 deletions(-) diff --git a/deploy/index.js b/deploy/index.js index d8e7744..cbb1470 100644 --- a/deploy/index.js +++ b/deploy/index.js @@ -6,6 +6,7 @@ const path = require('path'); const { create_app_agent } = require('./utils/app_agent'); const { create_fungible_token } = require('./utils/fungible'); const { create_nft_collection, create_nft_token } = require('./utils/nft'); +const { retryOperation, maxWaitTime } = require('./utils/utils'); const aws_s3_assets_path = path.join(__dirname, '..', 'aws_s3_assets'); const game_a_path = path.join(aws_s3_assets_path, 'game-a/'); @@ -102,6 +103,9 @@ async function main() { .catch(reject); }); + await create_balance_transfers(api, demo_user_one, demo_user_two); + await create_balance_transfers(api, demo_user_three, demo_user_one); + console.log("Traverse the game folders and create app-agents and assets for each game"); for (const [game_index, game_folder] of game_folders.entries()) { console.log("Game folder:", game_folder); @@ -209,6 +213,53 @@ function getObjectMetadataURL(directory) { return null; } +async function create_balance_transfers(api, token_recipient, token_recipient_two) { + console.log("Generate free transfers between the two users"); + + for (let i = 0; i < 5; i++) { + await retryOperation(async () => { + return new Promise(async (resolve, reject) => { + const timeout = setTimeout(() => { + reject(new Error(`Timeout: Transfer took too long`)); + }, maxWaitTime); + + + const unsubscribe = await api.tx.playerTransfers.submitTransferBalances( + token_recipient_two.address, + 1000000 + ).signAndSend(token_recipient, { nonce: -1 }, ({ status, events }) => { + if (status.isInBlock) { + let extrinsicSuccess = false; + events.forEach(({ event }) => { + if (api.events.system.ExtrinsicSuccess.is(event)) { + extrinsicSuccess = true; + } + }); + + if (extrinsicSuccess) { + console.log(`Transfer is in block and successful`); + clearTimeout(timeout); + unsubscribe(); + resolve(); + } else { + clearTimeout(timeout); + unsubscribe(); + reject(new Error(`Transfer failed: ExtrinsicSuccess event not found`)); + } + } else if (status.isError) { + clearTimeout(timeout); + // unsubscribe(); + // reject(new Error(`Transfer failed with error status`)); + } + }); + }); + }, `creating free transfer`); + } + + console.log(`Free transfer created and confirmed`); + +} + main() .catch(console.error) .finally(() => process.exit()); diff --git a/deploy/utils/fungible.js b/deploy/utils/fungible.js index b0f3526..903a4ad 100644 --- a/deploy/utils/fungible.js +++ b/deploy/utils/fungible.js @@ -88,6 +88,8 @@ async function create_fungible_token(api, appAgentOwner, appAgentId, token_recip await retryOperation(sendConfigureFungibleTokenTx, "configuring Fungible Token"); + // wait 12 secs + await new Promise(resolve => setTimeout(resolve, 12000)); await create_token_transfers(api, token_id, token_recipient, token_recipient_two); } @@ -104,37 +106,55 @@ async function create_token_transfers(api, token_id, token_recipient, token_reci reject(new Error(`Timeout: Transfer ${i + 1} took too long`)); }, maxWaitTime); - const unsubscribe = await api.tx.playerTransfers.submitTransferAssets( - token_id, - token_recipient_two.address, - 10 - ).signAndSend(token_recipient, { nonce: -1 }, ({ status, events }) => { - if (status.isInBlock) { - let extrinsicSuccess = false; - events.forEach(({ event }) => { - if (api.events.system.ExtrinsicSuccess.is(event)) { - extrinsicSuccess = true; + try { + const unsubscribe = await api.tx.playerTransfers.submitTransferAssets( + token_id, + token_recipient_two.address, + 10 + ).signAndSend(token_recipient, { nonce: -1 }, ({ status, events }) => { + if (status.isInBlock) { + let extrinsicSuccess = false; + events.forEach(({ event }) => { + if (api.events.system.ExtrinsicSuccess.is(event)) { + extrinsicSuccess = true; + } + }); + + if (extrinsicSuccess) { + console.log(`Transfer ${i + 1} is in block and successful`); + clearTimeout(timeout); + unsubscribe(); + resolve(); + } else { + clearTimeout(timeout); + unsubscribe(); + reject(new Error(`Transfer ${i + 1} failed: ExtrinsicSuccess event not found`)); } - }); - - if (extrinsicSuccess) { - console.log(`Transfer ${i + 1} is in block and successful`); + } else if (status.isError) { clearTimeout(timeout); unsubscribe(); - resolve(); - } else { - clearTimeout(timeout); - unsubscribe(); - reject(new Error(`Transfer ${i + 1} failed: ExtrinsicSuccess event not found`)); + reject(new Error(`Transfer ${i + 1} failed with error status`)); } - } else if (status.isError) { - clearTimeout(timeout); - unsubscribe(); - reject(new Error(`Transfer ${i + 1} failed with error status`)); + }); + } catch (error) { + clearTimeout(timeout); + if (error.message.includes("Priority is too low")) { + console.log("Priority too low. Retrying with increased delay."); + await new Promise(resolve => setTimeout(resolve, 5000)); // Additional delay } - }); + reject(error); + } }); - }, `creating free transfer ${i + 1}`); + }, `creating free transfer ${i + 1}`, { + retryInterval: (attempt) => Math.min(2000 * Math.pow(2, attempt), 30000), // Exponential backoff + shouldRetry: (error) => { + if (error.message.includes("Priority is too low")) { + console.log("Priority too low. Will retry with increased delay."); + return true; + } + return error.message.includes("Timeout") || error.message.includes("failed"); + } + }); console.log(`Free transfer ${i + 1} created and in block`); } diff --git a/deploy/utils/nft.js b/deploy/utils/nft.js index 55b6f9d..57e8769 100644 --- a/deploy/utils/nft.js +++ b/deploy/utils/nft.js @@ -318,10 +318,10 @@ async function create_nft_transfers(api, token_recipient, token_recipient_two, c await retryOperation(async () => { return new Promise(async (resolve, reject) => { const timeout = setTimeout(() => { - reject(new Error(`Timeout: Transfer took too long`)); - }, maxWaitTime); - + reject(new Error(`Timeout: Transfer took too long`)); + }, maxWaitTime); + try { const unsubscribe = await api.tx.playerTransfers.submitTransferNfts( collection_id, token_id, @@ -347,12 +347,20 @@ async function create_nft_transfers(api, token_recipient, token_recipient_two, c } } else if (status.isError) { clearTimeout(timeout); - unsubscribe(); - reject(new Error(`Transfer failed with error status`)); + // unsubscribe(); + // reject(new Error(`Transfer failed with error status`)); } }); - }); - }, `creating free transfer`); + } catch (error) { + clearTimeout(timeout); + if (error.message.includes("Priority is too low")) { + console.log("Priority too low. Retrying with increased delay."); + await new Promise(resolve => setTimeout(resolve, 5000)); // Additional delay + } + reject(error); + } + }); + }, `creating free transfer`); console.log(`Free transfer created and confirmed`);