Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
7103b79
Merge pull request #35 from tylermalin/hex-explorer
tylermalin May 21, 2026
21416bc
Merge pull request #36 from tylermalin/hex-explorer
tylermalin May 23, 2026
52c3745
Merge pull request #38 from tylermalin/hex-explorer
tylermalin May 24, 2026
66d2158
feat(partners): admin-approved USDC payout engine (Base)
tylermalin Jun 7, 2026
8ea38d9
feat(evm): single-switch Base mainnet/testnet network (ready to go)
tylermalin Jun 8, 2026
7ea07ab
feat(checkout): cheap-test support — $1 env override + promo codes + …
tylermalin Jun 8, 2026
32281cb
fix(presale): labeled progress stepper bound to real wizard step
tylermalin Jun 8, 2026
1a47dd3
feat(dashboard): post-ownership hardware status — order/customization…
tylermalin Jun 8, 2026
0cfb3e6
chore: add .claude/settings.json allowlist to canonical branch
tylermalin Jun 8, 2026
58ff4c0
fix(presale): re-entrancy guard on pay flow — stop /api/nft/claim 409…
tylermalin Jun 8, 2026
38d8dbf
feat(brand): favicon + SVG logo, and User Docs footer link
tylermalin Jun 8, 2026
46589e4
feat(brand): add app icon.png + apple-icon.png (force past .gitignore…
tylermalin Jun 8, 2026
bda8c9d
feat(footer): trust-anchor tagline + social links
tylermalin Jun 8, 2026
2b03785
fix(copy): say "Base" in mint prose instead of network label (no "Sep…
tylermalin Jun 8, 2026
c1c9eb1
feat(partners): account-linked applications + Amplify push toolkit
tylermalin Jun 8, 2026
f095e22
fix: partner dashboard pending-state crash, Lace late-connect, footer…
tylermalin Jun 8, 2026
bc94ebd
feat(admin): Amplify messaging management + partner activity overview
tylermalin Jun 8, 2026
badfb2b
merge: promote ready-to-go to main (backup production)
tylermalin Jun 8, 2026
78030a0
fix(proxy): bypass password gate for static assets (fixes broken logo)
tylermalin Jun 8, 2026
a796c2d
merge: static-asset gate fix to main
tylermalin Jun 8, 2026
3d959f7
fix(mint): resilient tx confirmation wait (no false 'failed' on slow …
tylermalin Jun 8, 2026
d09f3f1
merge: resilient mint confirmation wait to main
tylermalin Jun 8, 2026
4fdd916
build(evm): add missing LayerZero protocol dep + Blockscout verify co…
tylermalin Jun 8, 2026
2914474
merge: evm compile fix + Blockscout verify config
tylermalin Jun 8, 2026
c05e599
feat(security): multisig + timelock hardening for LayerZero OFT & admin
tylermalin Jun 8, 2026
a5d5cc0
merge: multisig+timelock contract hardening to main
tylermalin Jun 8, 2026
1cd3467
fix(build): sync root package-lock with new EVM deps (unblocks Vercel…
tylermalin Jun 8, 2026
3bae369
merge: lockfile sync for Vercel build
tylermalin Jun 8, 2026
24f86c5
fix(claims): self-heal orphaned hex reservations + admin release (sto…
tylermalin Jun 8, 2026
9d828c1
merge: orphaned-claim self-heal + admin release
tylermalin Jun 8, 2026
c62e378
feat(genesis): regenerate 200-hex inventory — water-excluded + native…
tylermalin Jun 8, 2026
bddc7e2
feat(genesis): enforce native-reserved carve-out in purchase + claim …
tylermalin Jun 8, 2026
66027dd
merge: genesis inventory regen + native carve-out enforcement
tylermalin Jun 8, 2026
63c1adb
fix(wallet): drop standalone coinbaseWallet connector (kills chain-pr…
tylermalin Jun 8, 2026
c93c6a0
merge: wallet connector cleanup
tylermalin Jun 8, 2026
f9d2bb6
fix(mint): fail the UI when a tx reverts (no more "success" on failed…
tylermalin Jun 8, 2026
0412c3e
merge: reverted-tx UI fix
tylermalin Jun 8, 2026
71392fc
feat(sensors): /sensors landing — phase 1 (frame + hero + ticker)
tylermalin Jun 8, 2026
827d2ff
merge: sensors landing phase 1
tylermalin Jun 8, 2026
f756a25
fix(admin): call admin logic directly — no self-fetch (fixes partners…
tylermalin Jun 8, 2026
41bc7df
merge: admin direct-call fix (no self-fetch)
tylermalin Jun 8, 2026
99798e7
feat(sensors): vendor product images first-party (public/sensors)
tylermalin Jun 8, 2026
004a466
feat(sensors): phase 2 — all 11 sections (full /sensors landing)
tylermalin Jun 8, 2026
33d6472
merge: sensors landing phase 2 (complete)
tylermalin Jun 8, 2026
7597bd6
feat(sensors): wire quote form to /api/sensors/quote + footer nav link
tylermalin Jun 8, 2026
1460501
merge: sensors quote form + nav link
tylermalin Jun 8, 2026
c13ee6a
feat(sensors): brand styling, real Mapbox, in-development settlement …
tylermalin Jun 8, 2026
923bc70
merge: sensors brand + mapbox + in-development messaging
tylermalin Jun 8, 2026
189e3e1
feat(partners): conversion-optimized Amplify copy + recruitment templ…
tylermalin Jun 8, 2026
e55fd68
merge: optimized partner copy
tylermalin Jun 8, 2026
6a51ab8
feat(email): wire Resend so the platform actually sends mail
tylermalin Jun 8, 2026
2e8317b
merge: Resend email integration
tylermalin Jun 8, 2026
22b43c4
feat(sensors): swap in real on-brand imagery (dark-bg product shots +…
tylermalin Jun 8, 2026
7650d52
merge: real sensor imagery
tylermalin Jun 8, 2026
c07438a
feat(admin): one-click "Send Onboarding Email" + route forms to Info@…
tylermalin Jun 8, 2026
dbe9813
merge: admin send-email + Info@ routing
tylermalin Jun 8, 2026
3442f4d
feat(sensors): cinematic field hero — Mālama node in the taro field
tylermalin Jun 8, 2026
35dcf35
merge: cinematic field hero
tylermalin Jun 8, 2026
03fa4ed
fix(partners): registry list resilient — stop intermittent 500s wipin…
tylermalin Jun 8, 2026
4714408
merge: partner registry resilience fix
tylermalin Jun 8, 2026
ea461a2
feat(admin): add dagwell@ and jeffrey@malamalabs.com to partner-admin…
tylermalin Jun 8, 2026
ee94625
merge: admin allowlist + dagwell/jeffrey
tylermalin Jun 8, 2026
e16613a
feat(admin): click-to-send tracked outreach emails from the partner d…
tylermalin Jun 8, 2026
8716002
merge: click-to-send tracked outreach
tylermalin Jun 8, 2026
f5ec32a
feat(data-solutions): add /data-solutions page from the Mālama design…
tylermalin Jun 8, 2026
2617964
merge: data solutions page
tylermalin Jun 8, 2026
748e34e
feat(data-solutions): wire CTA to Resend (buyer-request form) instead…
tylermalin Jun 8, 2026
94d3ba8
merge: data-solutions CTA → Resend
tylermalin Jun 8, 2026
81b75b6
feat(nav): add Data Solutions to the top nav
tylermalin Jun 8, 2026
3c81384
merge: data solutions in top nav
tylermalin Jun 8, 2026
7c60b50
fix(magic-claim): release reservation on mint failure (stops 409 retr…
tylermalin Jun 8, 2026
6bb0699
merge: magic-claim release-on-failure
tylermalin Jun 8, 2026
c20a299
fix(admin-mint): cap receipt wait (30s) + tolerate timeout, keep reve…
tylermalin Jun 8, 2026
36c4b39
merge: admin-mint receipt-wait hardening
tylermalin Jun 8, 2026
6826392
ci: disable auto-triggers (Actions not executing on this account)
tylermalin Jun 11, 2026
0c22fec
ci: disable deploy-testnet auto-trigger (Actions not executing on thi…
tylermalin Jun 11, 2026
bb34c1b
nav: trim top nav to 5 + add mobile hamburger (parity with malamalabs…
tylermalin Jun 11, 2026
3479611
merge: nav overhaul (5-item top nav + mobile hamburger)
tylermalin Jun 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{
"permissions": {
"allow": [
"Bash(npm install:*)",
"Bash(npm ci:*)",
"Bash(npm run:*)",
"Bash(npm test:*)",
"Bash(pnpm install:*)",
"Bash(pnpm run:*)",
"Bash(pnpm test:*)",
"Bash(pnpm lint:*)",
"Bash(pnpm build:*)",
"Bash(pnpm dev:*)",
"Bash(pnpm typecheck:*)",
"Bash(npx hardhat:*)",
"Bash(aiken:*)",
"Bash(pytest:*)",
"Bash(python -m pytest:*)",
"Bash(git status:*)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(git show:*)",
"Bash(git branch:*)",
"Bash(git fetch:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(git checkout:*)",
"Bash(git switch:*)",
"Bash(git restore:*)",
"Bash(git stash:*)",
"Bash(ls:*)",
"Bash(cat:*)",
"Bash(rg:*)",
"Bash(grep:*)",
"Bash(find:*)",
"Bash(head:*)",
"Bash(tail:*)",
"Bash(wc:*)",
"Bash(tree:*)",
"Bash(echo:*)",
"Bash(which:*)",
"Bash(pwd)"
],
"deny": [
"Bash(rm -rf:*)",
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git reset --hard:*)"
]
}
}
43 changes: 39 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,23 @@ KAFKA_BOOTSTRAP=localhost:9092
# Cardano (Blockfrost API for Pre-Prod)
BLOCKFROST_PROJECT_ID=preprodYourProjectId

# EVM (Base Sepolia RPC)
# ── EVM network switch (lib/evm-network.ts) ──────────────────────────────────
# THE go-live switch. "base" = Base mainnet (real USDC/NFTs); "base-sepolia" =
# testnet (default). Governs chain, RPC, USDC token, explorer + OpenSea links,
# and which network the mint/transfer flows enforce in the wallet.
NEXT_PUBLIC_EVM_NETWORK=base-sepolia

# RPCs (public defaults work but are rate-limited; set dedicated RPCs for prod).
BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
NEXT_PUBLIC_BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
# Used when NEXT_PUBLIC_EVM_NETWORK=base
BASE_RPC_URL=https://mainnet.base.org
NEXT_PUBLIC_BASE_RPC_URL=https://mainnet.base.org

# Genesis ERC-721 for the ACTIVE network. Mainnet (Base 8453):
# 0x93c26c9B9fe702D7944aE62fc54e451d4470F21D
# Set this to match NEXT_PUBLIC_EVM_NETWORK (mainnet address when on "base").
NEXT_PUBLIC_GENESIS_CONTRACT_ADDRESS=0x93c26c9B9fe702D7944aE62fc54e451d4470F21D

# Contract deployment keys (use test keys only)
AI_VALIDATOR_KEY=0x_your_test_private_key
Expand All @@ -36,14 +51,13 @@ AUTH0_SECRET=
# Optional API audience (resource identifier) for access tokens / Magic IDP alignment
AUTH0_AUDIENCE=

# Genesis NFT (EVM) — used by web mint + card/custodial flow
NEXT_PUBLIC_GENESIS_CONTRACT_ADDRESS=0x_your_genesis_validator
# (Genesis contract address + Base RPCs are configured in the EVM network switch
# section near the top of this file — see NEXT_PUBLIC_EVM_NETWORK.)

# Card checkout (Stripe) + custodial wallet — default `magic` (Magic Email OTP → embedded wallet).
# Use `server` for legacy server-generated keys + transfer link only.
MALAMA_CARD_CUSTODY=magic
NEXT_PUBLIC_MAGIC_API_KEY=pk_live_or_test_your_magic_publishable_key
NEXT_PUBLIC_BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
# Magic Secret API key (server) — validates DID tokens from /launch; same key family as Magic Express if applicable
MAGIC_SECRET_KEY=

Expand Down Expand Up @@ -75,3 +89,24 @@ MAGIC_IDP_AUDIENCE=your-app-audience
MAGIC_IDP_JWKS_URI=https://your-auth-provider.com/.well-known/jwks.json
# Protects admin Magic routes (x-malama-ops-key or Authorization: Bearer)
MALAMA_OPS_KEY=change_me_long_random_secret

# ── Partner referral payouts (USDC on Base) ──────────────────────────────────
# Admin-approved, system-sent commissions. SAFE BY DEFAULT: dry-run ON and
# testnet selected until you explicitly opt in. See lib/usdc-payout.ts.
#
# Dedicated payout HOT WALLET key — fund with operating float ONLY, never a
# treasury/multisig. Server env only; never commit. Needs USDC + a little ETH
# for gas on the selected network.
PAYOUT_WALLET_PRIVATE_KEY=0x_dedicated_payout_wallet_key
# "base-sepolia" (default, testnet) | "base" (mainnet, real money)
PAYOUT_NETWORK=base-sepolia
# Base mainnet RPC (used only when PAYOUT_NETWORK=base)
BASE_RPC_URL=https://mainnet.base.org
# Must be exactly "false" to send real USDC. Anything else = dry run (no chain tx).
PAYOUT_DRY_RUN=true
# Hard ceiling per payout batch in USD — batches above this are rejected.
PAYOUT_MAX_BATCH_USD=5000
# Admin API secret (x-admin-secret) — required for /api/admin/* including payouts.
ADMIN_SECRET=change_me_long_random_secret
# Comma-separated admin emails allowed into the admin dashboard.
ADMIN_EMAILS=tyler@malamaproject.org
12 changes: 8 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
name: Continuous Integration

on:
push:
branches: [ "main", "develop" ]
pull_request:
branches: [ "main", "develop" ]
# Auto-triggers disabled. GitHub Actions is not executing jobs on this account
# (every run fails at startup in ~2s with no steps/logs). Re-enable CI by
# restoring the push/pull_request triggers below once Actions/billing is resolved:
# push:
# branches: [ "main", "develop" ]
# pull_request:
# branches: [ "main", "develop" ]
workflow_dispatch:

jobs:
cardano-contracts:
Expand Down
9 changes: 6 additions & 3 deletions .github/workflows/deploy-testnet.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
name: Deploy to Testnet

on:
push:
branches:
- develop
# Auto-trigger disabled (Actions not executing on this account). Re-enable by
# restoring the develop push trigger below once Actions/billing is resolved:
# push:
# branches:
# - develop
workflow_dispatch:

permissions:
contents: read
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,9 @@ docker-volumes/
.env*.local

*.tsbuildinfo

# Geo seed data cache (large GeoJSON)
scripts/.cache/
apps/web/src/data/regions.json.bak
!apps/web/public/sensors/*.png
!apps/web/public/sensors/*.jpg
9 changes: 9 additions & 0 deletions apps/web/public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/1_1f6a1ba6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/2_c58834b3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/3_b0588513.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/4_deda1c38.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/5_8e682334.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/field-hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/sensor-hub.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/sensor-kit.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/sensors/sign-the-measurement.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading