build strategy · onchain
Real onchain, five secrets, one build.
Every mega-prompt in this repo uses the same pattern, because it's the only pattern that lets a Lovable account ship a verifiable ZKsync Sepolia demo in one shot.
Why ZKsync Sepolia and not mainnet?
ZKsync Sepolia is a real ZK-rollup L2 testnet (chain id 300) — the same tooling, real block explorer, same wallets — but funded by a free faucet. Every contract you deploy is publicly inspectable, but you never spend real ETH and your demo can't accidentally drain a user. Move to mainnet after the hackathon by swapping the RPC.
The recipe
recipe
# 1. In your Lovable project, add five secrets (Settings -> Secrets): METAMASK_PRIVATE_KEY=0x... ETHERSCAN_API_KEY=... PRIVY_APP_ID=... PINATA_JWT=eyJhbGciOi... ZKSYNC_SEPOLIA_RPC_URL=https://... # optional, a public RPC is used otherwise # 2. Fund the MetaMask account on ZKsync Sepolia: open https://faucet.chainstack.com/zksync-testnet-faucet # 3. Copy a mega-prompt from this repo into Lovable. One paste: # - scaffolds the React app # - writes the Solidity contract (with hackathon credit in NatSpec) # - deploys to ZKsync Sepolia and verifies on ZKsync Explorer # - wires Privy social login + sponsored tx # - pins generated assets to IPFS via Pinata # - exposes the contract address + ZKsync Explorer link in the UI # 4. Open the live ZKsync Explorer link. Your demo is provably onchain.
1. The contract — credit baked in
Every Solidity file deployed from a Creative Blockchain prompt MUST carry the hackathon credit in NatSpec, so provenance lives onchain alongside the bytecode.
contracts/Provenance.sol
// contracts/Provenance.sol — every contract carries the hackathon credit in NatSpec
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
/// @title Provenance
/// @notice Built during the Creative AI & Quantum Hackathon
/// @notice organised by StreetKode Fam during Indian Krump Festival 14
contract Provenance {
event Logged(address indexed author, string cid, uint256 at);
function log(string calldata cid) external {
emit Logged(msg.sender, cid, block.timestamp);
}
}
2. Deploy + verify on ZKsync Explorer
scripts/deploy.ts
// deploy/deploy.ts — hardhat-zksync (zksolc); reads METAMASK_PRIVATE_KEY
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";
import { Wallet } from "zksync-ethers";
import * as hre from "hardhat";
async function main() {
const wallet = new Wallet(process.env.METAMASK_PRIVATE_KEY!);
const deployer = new Deployer(hre, wallet);
const artifact = await deployer.loadArtifact("Provenance");
const contract = await deployer.deploy(artifact, []);
const addr = await contract.getAddress();
console.log("deployed:", addr);
// verify via ZKsync's matterlabs verifier
await hre.run("verify:verify", { address: addr, constructorArguments: [] });
}
main();
3. Pin assets to IPFS via Pinata
src/lib/pinata.ts
// src/lib/pinata.ts — pin a Blob to IPFS via Pinata JWT
export async function pinToIPFS(file: Blob, name = "artifact") {
const fd = new FormData();
fd.append("file", file, name);
const r = await fetch("https://api.pinata.cloud/pinning/pinFileToIPFS", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PINATA_JWT}` },
body: fd,
});
const { IpfsHash } = await r.json();
return IpfsHash as string; // the CID
}
4. Sign in with Google via Privy
src/main.tsx
// privy-client-entry.tsx — Privy social login, ZKsync paymaster pays gas
import { PrivyProvider } from "@privy-io/react-auth";
<PrivyProvider
appId={import.meta.env.VITE_PRIVY_APP_ID}
config={{
loginMethods: ["google", "email"],
embeddedWallets: { ethereum: { createOnLogin: "users-without-wallets" } },
appearance: { theme: "dark" },
// No defaultChain — chainId (300) is passed per zksync-ethers tx.
// Gas is paid by the GaslessPaymaster contract on ZKsync Sepolia,
// NOT by Privy sponsorship (that is Ethereum-only).
}}
>
<App />
</PrivyProvider>
Hackathon rules of thumb
- · One mega-prompt = one build message. Don't iterate the architecture, iterate the UI.
- · Always show the live ZKsync Explorer link in the UI — that's your proof.
- · Use Privy sponsored tx so judges don't need a wallet to try the demo.
- · Pin every user-generated asset to IPFS the moment it's created.
- · Add a "Built during the Creative AI & Quantum Hackathon — StreetKode Fam · Indian Krump Festival 14" line to your footer.