Reading from NEAR testnet…
Reading from NEAR testnet…
HBUkx2nRykx6yMtJraHDMmK4kQobZeFJ43pAxTFxQAzD
web4go.testnet to web4go.testnet · failed
fs_store()
<!doctype html>
<html lang="en">
<head>
<title>WEB4GO</title>
<!-- Essential Meta Tags -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description"
content="WEB4GO - Your gateway to Web4 content on NEAR blockchain. Browse and discover decentralized web applications across master accounts and subaccounts.">
<meta name="keywords"
content="web4, NEAR blockchain, IPFS, decentralized web, web4 browser, NEAR protocol, blockchain apps, dapps, web3">
<meta name="author" content="sleet.near">
<!-- Robots Meta Tag -->
<meta name="robots" content="index, follow">
<meta name="googlebot" content="index, follow">
<!-- Language and Region -->
<meta name="language" content="English">
<!-- Theme Color for Browser -->
<meta name="theme-color" content="#000000">
<link rel="stylesheet" href="./css/main.css">
<link rel="icon" href="./img/web_icon.png" type="image/x-icon">
</head>
<body>
<button id="near_web4_login">LOGIN</button>
<h1>web4 go</h1>
submit a near account
<form class="search-bar"><input placeholder="enter .near account..." class="search-input" type="text"
value=""><button type="submit" class="search-button">SUBMIT</button></form>
<p class="footer">
/ your gateway to web4
<br />
<a href="./">discover</a>
<a href="./submit.html">submit</a>
</p>
</body>
<!-- <footer></footer> -->
<!-- <script src=""></script> -->
<script src="./js/hello.js"></script>
<script type="module" src="./js/on_your_mark_login.js"></script>
</html>fs_store()
.search-bar {
width: 100%;
max-width: 800px;
margin: 20px auto;
display: flex;
gap: 10px;
flex-direction: row;
}
@media (max-width: 768px) {
.search-bar {
flex-direction: column;
padding: 0 20px;
}
}
.search-input {
flex: 1;
padding: 12px 16px;
font-size: 1rem;
border: 2px solid #8CA2F5;
border-radius: 4px;
background-color: #ffffff;
color: #313638;
font-family: 'Ubuntu', sans-serif;
}
.search-input::placeholder {
color: #C9A8F4;
}
.search-input:focus {
outline: none;
border-color: #95D58D;
box-shadow: 0 0 0 2px rgba(149, 213, 141, 0.2);
}
.search-button {
padding: 12px 24px;
font-size: 1rem;
background-color: #8CA2F5;
color: #ffffff;
border: none;
border-radius: 4px;
cursor: pointer;
font-family: 'Ubuntu', sans-serif;
transition: all 0.2s;
min-width: 100px;
}
.search-button:hover {
background-color: #95D58D;
transform: translateY(-1px);
}
.search-button:active {
background-color: #C9A8F4;
transform: translateY(0);
}fs_store()
// search.js
// Function to get the network ID from localStorage
function getNetworkId() {
return localStorage.getItem('networkId') || 'testnet';
}
// Function to determine the RPC endpoint base URL
function getRpcEndpoint(networkId) {
if (networkId === 'mainnet') {
return 'https://rpc.web4.near.page/account/';
} else {
return 'https://rpc.web4.testnet.page/account/';
}
}
// Function to determine the IPFS gateway
function getIpfsGateway(networkId) {
if (networkId === 'mainnet') {
return 'https://ipfs.web4.near.page/ipfs/';
} else {
return 'https://ipfs.web4.testnet.page/ipfs/';
}
}
// Function to fetch IPFS hash using web4_get
async function fetchIpfsHash(accountId, networkId) {
try {
const rpcBase = getRpcEndpoint(networkId);
const response = await fetch(`${rpcBase}${accountId}/view/web4_get`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ request: {} })
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
if (result.status === 200 && result.bodyUrl && result.bodyUrl.startsWith('ipfs://')) {
return result.bodyUrl.replace('ipfs://', ''); // Extract CID
}
return null;
} catch (error) {
console.error(`Error fetching IPFS hash for ${accountId}:`, error);
return null;
}
}
// Function to handle search form submission
async function handleSearch(event) {
event.preventDefault();
const searchInput = document.querySelector('.search-input').value.trim().toLowerCase();
if (!searchInput) {
alert('Please enter an account or command.');
return;
}
const networkId = getNetworkId();
let redirectUrl = '';
// Parse input: account/command or just account
const [account, command] = searchInput.split('/');
if (!account || (!account.endsWith('.near') && !account.endsWith('.testnet'))) {
alert('Please provide a valid .near or .testnet account.');
return;
}
if (command) {
if (command === 'page') {
redirectUrl = `http://${account}.page`;
} else if (command === 'ipfs') {
let ipfsHash = await fetchIpfsHash(account, networkId);
if (!ipfsHash) {
// Check subaccount web4.<account> for both mainnet and testnet
const subAccount = `web4.${account}`;
ipfsHash = await fetchIpfsHash(subAccount, networkId);
}
if (ipfsHash) {
const ipfsGateway = getIpfsGateway(networkId);
redirectUrl = `${ipfsGateway}${ipfsHash}`;
} else {
alert(`Could not retrieve IPFS hash for ${account} or its web4 subaccount.`);
return;
}
} else if (command === 'social') {
if (networkId === 'mainnet' && account.endsWith('.near')) {
redirectUrl = `http://${account}.social`;
} else {
alert('/social is only supported for .near accounts on mainnet.');
return;
}
} else {
alert('Invalid command. Use /page, /ipfs, or /social.');
return;
}
} else {
// Default to /page for valid accounts
redirectUrl = `http://${account}.page`;
}
const link = document.createElement('a');
link.href = redirectUrl;
link.target = '_blank';
link.click();
}
// Function to setup autocomplete
function setupAutocomplete(accounts) {
const input = document.querySelector('.search-input');
const commands = ['page', 'ipfs', 'social'];
// Combine accounts and commands for suggestions
const suggestions = [
...accounts.map(account => account.account_id),
...accounts.map(account => `${account.account_id}/page`),
...accounts.map(account => `${account.account_id}/ipfs`),
...accounts.filter(account => account.account_id.endsWith('.near')).map(account => `${account.account_id}/social`)
];
const dataList = document.createElement('datalist');
dataList.id = 'suggestions';
input.setAttribute('list', 'suggestions');
document.body.appendChild(dataList);
suggestions.forEach(suggestion => {
const option = document.createElement('option');
option.value = suggestion;
dataList.appendChild(option);
});
}
// Initialize search functionality
document.addEventListener('DOMContentLoaded', async () => {
// Load accounts from localStorage for autocomplete
let accounts = JSON.parse(localStorage.getItem('web4Accounts') || '[]');
// Setup autocomplete
setupAutocomplete(accounts);
// Add event listener for search form
const searchForm = document.querySelector('.search-bar');
searchForm.addEventListener('submit', handleSearch);
});fs_store()
<!doctype html>
<html lang="en">
<head>
<title>WEB4GO</title>
<!-- Essential Meta Tags -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description"
content="WEB4GO - Your gateway to Web4 content on NEAR blockchain. Browse and discover decentralized web applications across master accounts and subaccounts.">
<meta name="keywords"
content="web4, NEAR blockchain, IPFS, decentralized web, web4 browser, NEAR protocol, blockchain apps, dapps, web3">
<meta name="author" content="sleet.near">
<!-- Robots Meta Tag -->
<meta name="robots" content="index, follow">
<meta name="googlebot" content="index, follow">
<!-- Language and Region -->
<meta name="language" content="English">
<!-- Theme Color for Browser -->
<meta name="theme-color" content="#000000">
<link rel="stylesheet" href="./css/main.css">
<link rel="icon" href="./img/web_icon.png" type="image/x-icon">
<base target="_blank">
</head>
<body>
<h1>web4 go</h1>
<form class="search-bar"><input placeholder="enter .near account... /" class="search-input" type="text"
value=""><button type="submit" class="search-button">GO</button></form>
<div class="web4list">
<!--
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
<button>sleet.near</button>
-->
</div>
<p class="footer">
/ your gateway to web4
<br />
<a href="./" target="_parent">discover</a>
<a href="./submit.html" target="_parent">submit</a>
</p>
</body>
<!-- <footer></footer> -->
<!-- <script src=""></script> -->
<script src="./js/hello.js"></script>
<script src="./js/get_and_go.js"></script>
<script src="./js/go_bar.js"></script>
</html>fs_store()
/* main css */
@import url('./index.css');
@import url('./gobar.css');
fs_store()
// Initial console log
console.log('🌐 / your gateway to web4');
// Function to check and update network based on URL
function checkAndUpdateNetwork() {
const currentUrl = window.location.hostname;
console.log('Checking URL:', currentUrl);
// Check if URL contains .near.page or .testnet.page
if (currentUrl.endsWith('.near.page')) {
console.log('Detected mainnet URL');
localStorage.setItem('networkId', 'mainnet');
console.log('Network set to mainnet in localStorage');
} else if (currentUrl.endsWith('.testnet.page')) {
console.log('Detected testnet URL');
localStorage.setItem('networkId', 'testnet');
console.log('Network set to testnet in localStorage');
} else {
console.log('Non-NEAR account URL detected, defaulting to testnet');
localStorage.setItem('networkId', 'testnet');
console.log('Network set to testnet in localStorage');
}
}
// Run the check when the page loads
document.addEventListener('DOMContentLoaded', () => {
console.log('Page loaded, running network check');
checkAndUpdateNetwork();
});fs_store()
// script.js
// Function to get the network ID from localStorage
function getNetworkId() {
return localStorage.getItem('networkId') || 'testnet'; // Default to testnet if not set
}
// Function to determine the accounts list RPC endpoint
function getAccountsRpcEndpoint(networkId) {
if (networkId === 'mainnet') {
return 'https://rpc.web4.near.page/account/web4go.sleet.near/view/get_accounts';
} else {
return 'https://rpc.web4.testnet.page/account/web4go.sleet.testnet/view/get_accounts';
}
}
// Function to render accounts to the web4list div
function renderAccounts(accounts) {
const web4ListDiv = document.querySelector('.web4list');
web4ListDiv.innerHTML = ''; // Clear existing buttons
accounts.forEach(account => {
const button = document.createElement('button');
button.textContent = account.account_id; // e.g., sleet.testnet or sleet.near
const link = document.createElement('a');
link.href = `http://${account.account_id}.page`; // e.g., http://sleet.near.page
link.target = '_blank'; // Open in a new tab
link.appendChild(button);
web4ListDiv.appendChild(link);
});
}
// Function to load accounts from localStorage
function loadAccountsFromStorage() {
const storedAccounts = localStorage.getItem('web4Accounts');
if (storedAccounts) {
try {
const accounts = JSON.parse(storedAccounts);
renderAccounts(accounts);
return accounts;
} catch (error) {
console.error('Error parsing stored accounts:', error);
}
}
return [];
}
// Function to fetch accounts and update the web4list div
async function fetchAndRenderAccounts() {
try {
const networkId = getNetworkId();
const rpcEndpoint = getAccountsRpcEndpoint(networkId);
const response = await fetch(rpcEndpoint);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const accounts = await response.json();
console.log('Fetched accounts:', accounts);
localStorage.setItem('web4Accounts', JSON.stringify(accounts));
renderAccounts(accounts);
return accounts;
} catch (error) {
console.error('Error fetching accounts:', error);
const web4ListDiv = document.querySelector('.web4list');
web4ListDiv.innerHTML = '<p>Error loading accounts. Please try again later.</p>';
return [];
}
}
// Initialize the page
document.addEventListener('DOMContentLoaded', async () => {
loadAccountsFromStorage();
await fetchAndRenderAccounts();
});{"ActionError":{"index":0,"kind":{"FunctionCallError":{"MethodResolveError":"MethodNotFound"}}}}
1 automatic refund step from the network not shown.
This page reads FastNEAR's public transaction index and stores nothing. This command asks a NEAR archival node for the same transaction and needs no keys.
curl -s https://archival-rpc.testnet.fastnear.com -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tx","params":{"tx_hash":"HBUkx2nRykx6yMtJraHDMmK4kQobZeFJ43pAxTFxQAzD","sender_account_id":"web4go.testnet","wait_until":"FINAL"}}'Vouch has its own page because testnet.nearblocks.io stopped indexing on 27 Sep 2026, so it can't show newer transactions.