From 1734bba5f0dd1210416213e3a350399e4200b419 Mon Sep 17 00:00:00 2001 From: Adam Dean Date: Tue, 18 Nov 2025 21:30:23 -0700 Subject: [PATCH 1/2] Small Quality of Life Improvements - Fix a few display quirks on the event details page such as: - Better support for CIP-68 token names - Remove the "fake txn" hardware compatibility mode as all hardware wallets now support signData - Add a localStorage variable to remember and connect to the last connected wallet to minimize pain across page refreshes - Fix an isue with the demo seeder that had mislabelled the $handles policy ID as the Spacebudz policy ID. --- database/seeders/DemoEventSeeder.php | 2 +- resources/js/Pages/Event/Show.vue | 137 ++++----------------------- 2 files changed, 22 insertions(+), 117 deletions(-) diff --git a/database/seeders/DemoEventSeeder.php b/database/seeders/DemoEventSeeder.php index a689bfd..37d00e5 100644 --- a/database/seeders/DemoEventSeeder.php +++ b/database/seeders/DemoEventSeeder.php @@ -43,7 +43,7 @@ public function run(): void 'hash' => '40fa2aa67258b4ce7b5782f74831d46a84c59a0ff0c28262fab21728', ], [ - 'name' => 'SpaceBudz (NFT)', + 'name' => '$Handles (NFT)', 'hash' => 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a', ], [ diff --git a/resources/js/Pages/Event/Show.vue b/resources/js/Pages/Event/Show.vue index 1cb2de1..8d73dbb 100644 --- a/resources/js/Pages/Event/Show.vue +++ b/resources/js/Pages/Event/Show.vue @@ -103,6 +103,7 @@ const format_wallet_name = (wallet) => { } const find_wallets = () => { + const target_wallet = localStorage.getItem('connected_wallet'); let loop = setInterval(() => { if (cardano.value.attempts <= 0) { if (cardano.value.wallets.length) { @@ -119,7 +120,7 @@ const find_wallets = () => { cardano.value.hasCardano = true; Object.keys(window.cardano) - .forEach((name) => { + .forEach(async (name) => { if (!is_valid_wallet(name)) { @@ -127,6 +128,9 @@ const find_wallets = () => { } const wallet = window.cardano[name]; + if (wallet.name === target_wallet && !cardano.value.connected) { + await connect(wallet); + } if (!cardano.value.wallets.includes(wallet)) { cardano.value.wallets.push(wallet); @@ -147,17 +151,19 @@ const connect = async (wallet) => { wallet.busy = false; return; } + localStorage.setItem('connected_wallet', wallet.name); cardano.value.connected = wallet; wallet.busy = false; modal.value.connectWallet = false; cardano.value.network_mode = await cardano.value.connection.getNetworkId(); - check_balance(); + await check_balance(); } const disconnect = () => { cardano.value.connected = null; cardano.value.connection = null; cardano.value.network_mode = null; + localStorage.removeItem('connected_wallet'); } const check_balance = async () => { @@ -190,11 +196,19 @@ const check_balance = async () => { .len(); i++) { const Asset = policy_assets.keys() .get(i); - const AssetName = toAscii(Asset.name()); + let asset_id, asset_ascii; + if (toHex(Asset.name()).startsWith('000de140')) { + asset_id = toHex(Asset.name()); + asset_ascii = toAscii(Buffer.from(asset_id.substring(8), "hex")); + } else { + asset_id = toHex(Asset.name()); + asset_ascii = toAscii(Asset.name()); + } + const AssetName = asset_ascii; const asset = { name: AssetName, policy_id: policy.hash, - asset_id: toHex(Asset.name()), + asset_id: asset_id, }; make_fingerprint(asset); wallet.assets[policy.hash].push(asset); @@ -257,35 +271,7 @@ const generate_ticket = async (asset) => { let signature; try { - if (!cardano.value.hardware_mode) { - signature = await signData(stake_address_cbor, nonce, asset.policy_id, asset.asset_id); - } else { - const txn = await createTxn(stake_key, nonce); - const witness = await cardano.value.connection.signTx(txn.to_hex(), true); - - const witnessSet = TransactionWitnessSet.new(); - const totalVkeys = Vkeywitnesses.new(); - const addWitness = TransactionWitnessSet.from_bytes(Buffer.from(witness, 'hex')); - const addVkeys = addWitness.vkeys(); - if (addVkeys) { - for (let i = 0; i < addVkeys.len(); i++) { - totalVkeys.add(addVkeys.get(i)); - } - } - - witnessSet.set_vkeys(totalVkeys); - const signedTx = Transaction.new( - txn.body(), - witnessSet, - txn.auxiliary_data() - ); - - - signature = { - txn: signedTx.to_hex(), - witness - }; - } + signature = await signData(stake_address_cbor, nonce, asset.policy_id, asset.asset_id); } catch (e) { console.error(`Ticket Signing Error!`, e); } @@ -320,55 +306,7 @@ const generate_ticket = async (asset) => { let qr_code_value = null; let qr_image_value = ''; -const createTxn = async (stake_key, nonce) => { - const params = await Koios.getParameters({ - project_id: koios_token - }); - const txBuilder = CardanoTxn.prepare({parameters: params}); - - try { - const metadata_list = MetadataList.new(); - while (nonce) { - if (nonce.length < 64) { - metadata_list.add(TransactionMetadatum.new_text(nonce)); - break; - } else { - metadata_list.add(TransactionMetadatum.new_text(nonce.substring(0, 64))); - nonce = nonce.substring(64); - } - } - txBuilder.add_metadatum( - BigNum.from_str('8'), - TransactionMetadatum.new_list( - metadata_list - ) - ); - } catch (e) { - console.error(`Couldn't add metadata?`, e, nonce); - } - - const reward_address = RewardAddress.from_address(stake_key); - const reward_keyhash = reward_address.payment_cred() - .to_keyhash(); - - const tx_certs = Certificates.new(); - tx_certs.add( - Certificate.new_stake_delegation( - StakeDelegation.new( - StakeCredential.from_keyhash(reward_keyhash), - Ed25519KeyHash.from_bech32(`pool14wk2m2af7y4gk5uzlsmsunn7d9ppldvcxxa5an9r5ywek8330fg`) - ) - ) - ); - - txBuilder.set_certs(tx_certs); - txBuilder.set_fee(BigNum.from_str('0')); - txBuilder.set_ttl(1); - - return txBuilder.build_tx(); -} - -const signData = async (stake_address, nonce, policy_id, asset_id) => { +const signData = async (stake_address, nonce) => { const payload = cardano.value.connection.signData(stake_address, nonce); console.log(`Sign Data Payload`, payload); return payload; @@ -376,20 +314,6 @@ const signData = async (stake_address, nonce, policy_id, asset_id) => { onMounted(async () => { find_wallets(); - localTheme.value = localStorage.getItem('gatekeeper:theme') ?? 'light'; - theme.global.name.value = localTheme.value; -}); - -const theme = useTheme() - -const toggleTheme = () => { - const theme_value = theme.global.current.value.dark ? 'light' : 'dark' - localStorage.setItem('gatekeeper:theme', theme_value); - theme.global.name.value = theme_value; -} - -const localTheme = ref({ - value: null }); const bg_image = 'url(' + props.event.bg_image_url + ')'; @@ -409,16 +333,7 @@ header { From 320dc3734fd6b8e7ae926843c5c1d3c30ae32e65 Mon Sep 17 00:00:00 2001 From: Adam Dean Date: Tue, 18 Nov 2025 21:48:27 -0700 Subject: [PATCH 2/2] Small Quality of Life Improvements - Compress some of the logic around parsing CIP-68 style asset names to remove the identifier byte at the beginning which does not translate well into ASCII representation --- resources/js/Pages/Event/Show.vue | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/resources/js/Pages/Event/Show.vue b/resources/js/Pages/Event/Show.vue index 8d73dbb..713602b 100644 --- a/resources/js/Pages/Event/Show.vue +++ b/resources/js/Pages/Event/Show.vue @@ -196,17 +196,15 @@ const check_balance = async () => { .len(); i++) { const Asset = policy_assets.keys() .get(i); - let asset_id, asset_ascii; - if (toHex(Asset.name()).startsWith('000de140')) { - asset_id = toHex(Asset.name()); - asset_ascii = toAscii(Buffer.from(asset_id.substring(8), "hex")); - } else { - asset_id = toHex(Asset.name()); - asset_ascii = toAscii(Asset.name()); - } - const AssetName = asset_ascii; + const asset_id = toHex(Asset.name()); + const asset_ascii = toAscii(Buffer.from( + asset_id.startsWith('000de140') + ? asset_id.substring(8) + : asset_id, + "hex" + )); const asset = { - name: AssetName, + name: asset_ascii, policy_id: policy.hash, asset_id: asset_id, };