top of page

Product Manager - IDX Wallet

Lead the development of our flagship IDX Wallet product, focusing on user experience, feature prioritization, and market fit. The ideal candidate will have a passion for Web3 technology and a track record of bringing successful digital products to market.

Location

New York, NY or Remote

Employment Type

Full-time

Location Type

Optional Remote

Department

Product

Years of Experience

3-5

Responsibilities

- Define product vision, strategy, and roadmap for IDX Wallet\n- Gather and prioritize product requirements\n- Work closely with design and engineering teams\n- Analyze user feedback and usage metrics\n- Stay current on Web3 wallet technologies and market trends\n- Lead user testing and feature validation\n- Create compelling product documentation and specifications

Qualifications

- 3+ years of product management experience\n- Previous experience with crypto wallets or fintech products\n- Understanding of blockchain technology and tokenomics\n- Excellent communication and stakeholder management skills\n- Data-driven decision making experience\n- Experience with product analytics tools\n- Strong understanding of user-centered design

Preferred Skills

- Experience with mobile app product management\n- Knowledge of DeFi protocols and NFT standards\n- Background in UX research\n- Experience with hardware wallets

Technologies

Jira, Figma, Amplitude, Mixpanel, Blockchain Wallets

Interview Process

Product Case Study, Stakeholder Panel, Technical Discussion, Culture Fit

Benefits

- Competitive salary plus performance bonus\n- Stock options and token grants\n- Comprehensive health benefits\n- Remote work options\n- Professional development budget\n- Wellness program\n- Generous PTO policy

Application Start Date

15 июня 2025 г. в 00:00:00

Application Deadline

20 мая 2025 г. в 00:00:00

bottom of page
/** * Wix Custom Code — paste into Settings → Custom Code → Body end (All pages) * on https://www.idxsolana.io/ * * Requires a hidden Wix Subscribe form on the site (same page or any page * loaded by the docs iframe bridge). Pair with docs.idxsolana.io footer. */ (function () { var ALLOWED = [ "https://docs.idxsolana.io", "http://localhost:3000", "http://localhost:3010", ]; function isAllowedOrigin(origin) { if (!origin) return false; if (ALLOWED.indexOf(origin) !== -1) return true; if (/^https:\/\/docs\.idxsolana\.io$/.test(origin)) return true; if (/^http:\/\/localhost:\d+$/.test(origin)) return true; if (origin === window.location.origin) return true; return false; } function reply(event, payload) { if (!event.source) return; try { event.source.postMessage(payload, event.origin || "*"); } catch (e) {} } function findSubscribeForm() { var candidates = document.querySelectorAll("form"); for (var i = 0; i < candidates.length; i++) { var form = candidates[i]; if (form.querySelector('input[type="email"]')) return form; } return null; } function findSubmitControl(form) { return ( form.querySelector('[data-hook="submit-button"]') || form.querySelector('button[type="submit"]') || form.querySelector('input[type="submit"]') || form.querySelector("button") ); } function watchSubmitResult(form, event) { var root = form.closest('[data-hook="form-root"]') || form.parentElement || document.body; var settled = false; function finish(ok, message) { if (settled) return; settled = true; observer.disconnect(); clearTimeout(timer); reply(event, ok ? { type: "idx-footer-newsletter-ok" } : { type: "idx-footer-newsletter-error", message: message || "Could not subscribe. Try again." }); } var observer = new MutationObserver(function () { var success = root.querySelector('[data-hook="success-message"], [data-testid="successMessage"]'); if (success) finish(true); var error = root.querySelector('[data-hook="error-message"], [data-testid="errorMessage"]'); if (error && error.textContent && error.textContent.trim()) { finish(false, error.textContent.trim()); } }); observer.observe(root, { childList: true, subtree: true, characterData: true }); var timer = setTimeout(function () { finish(true); }, 4000); } function submitEmail(email, event) { var form = findSubscribeForm(); if (!form) { reply(event, { type: "idx-footer-newsletter-error", message: "Subscribe form not found. Add a hidden Wix Subscribe form to this site.", }); return; } var input = form.querySelector('input[type="email"]'); if (!input) { reply(event, { type: "idx-footer-newsletter-error", message: "Email field not found." }); return; } var submit = findSubmitControl(form); if (!submit) { reply(event, { type: "idx-footer-newsletter-error", message: "Submit button not found." }); return; } input.focus(); input.value = email; input.dispatchEvent(new Event("input", { bubbles: true })); input.dispatchEvent(new Event("change", { bubbles: true })); watchSubmitResult(form, event); try { if (typeof form.requestSubmit === "function") { form.requestSubmit(submit); } else { submit.click(); } } catch (e) { reply(event, { type: "idx-footer-newsletter-error", message: "Could not submit form." }); } } window.addEventListener("message", function (event) { if (!isAllowedOrigin(event.origin)) return; var data = event.data; if (!data || data.type !== "idx-footer-newsletter") return; var email = String(data.email || "").trim(); if (!email) { reply(event, { type: "idx-footer-newsletter-error", message: "Email is required." }); return; } submitEmail(email, event); }); })(); /** * Wix Velo — paste into Backend → http-functions.js on https://www.idxsolana.io/ * Publish the site after saving. * * Endpoint: POST https://www.idxsolana.io/_functions/newsletter_subscribe * * Only enable browser fetch after this is deployed AND working: * NEXT_PUBLIC_WIX_NEWSLETTER_USE_HTTP=true * * Until then, docs uses postMessage bridge (wix-footer-form-bridge.js) — no CORS. */ import { ok, badRequest, response } from "wix-http-functions"; import { contacts } from "wix-crm-backend"; const ALLOWED_ORIGINS = [ "https://docs.idxsolana.io", "http://localhost:3000", "http://localhost:3010", ]; function resolveOrigin(origin) { if (!origin) return null; if (ALLOWED_ORIGINS.indexOf(origin) !== -1) return origin; if (/^http:\/\/localhost:\d+$/.test(origin)) return origin; return null; } function corsHeaders(origin) { const headers = { "Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type", "Content-Type": "application/json", }; if (origin) { headers["Access-Control-Allow-Origin"] = origin; } return headers; } export function options_newsletter_subscribe(request) { const origin = resolveOrigin(request.headers.origin); return response({ status: 204, headers: corsHeaders(origin), }); } export function post_newsletter_subscribe(request) { const origin = resolveOrigin(request.headers.origin); const headers = corsHeaders(origin); if (!origin) { return response({ status: 403, headers: { "Content-Type": "application/json" }, body: { error: "Forbidden" }, }); } return request.body .text() .then(function (text) { var body = {}; try { body = JSON.parse(text || "{}"); } catch (e) { return badRequest({ body: { error: "Invalid JSON body." }, headers: headers }); } var email = String(body.email || "").trim(); if (!email) { return badRequest({ body: { error: "Email is required." }, headers: headers }); } return contacts .findOrCreateLabel("Subscriber") .then(function (label) { return contacts.appendOrCreateContact({ emails: [{ email: email, tag: "MAIN", primary: true }], labelKeys: [label.key], }); }) .then(function () { return ok({ body: { success: true }, headers: headers }); }); }) .catch(function (error) { return badRequest({ body: { error: error.message || "Could not subscribe." }, headers: headers, }); }); } /** * Wix Custom Code — paste into Settings → Custom Code → Body end (All pages) * on https://www.idxsolana.io/ * * Requires a hidden Wix Subscribe form on the site (same page or any page * loaded by the docs iframe bridge). Pair with docs.idxsolana.io footer. */ (function () { var ALLOWED = [ "https://docs.idxsolana.io", "http://localhost:3000", "http://localhost:3010", ]; function isAllowedOrigin(origin) { if (!origin) return false; if (ALLOWED.indexOf(origin) !== -1) return true; if (/^https:\/\/docs\.idxsolana\.io$/.test(origin)) return true; if (/^https:\/\/[a-z0-9-]+\.idxsolana\.io$/.test(origin)) return true; if (/^http:\/\/localhost:\d+$/.test(origin)) return true; if (origin === window.location.origin) return true; return false; } function reply(event, payload) { if (!event.source) return; try { event.source.postMessage(payload, event.origin || "*"); } catch (e) {} } function findSubscribeForm() { var candidates = document.querySelectorAll("form"); for (var i = 0; i < candidates.length; i++) { var form = candidates[i]; if (form.querySelector('input[type="email"]')) return form; } return null; } function findSubmitControl(form) { return ( form.querySelector('[data-hook="submit-button"]') || form.querySelector('button[type="submit"]') || form.querySelector('input[type="submit"]') || form.querySelector("button") ); } function watchSubmitResult(form, event) { var root = form.closest('[data-hook="form-root"]') || form.parentElement || document.body; var settled = false; function finish(ok, message) { if (settled) return; settled = true; observer.disconnect(); clearTimeout(timer); reply(event, ok ? { type: "idx-footer-newsletter-ok" } : { type: "idx-footer-newsletter-error", message: message || "Could not subscribe. Try again." }); } var observer = new MutationObserver(function () { var success = root.querySelector('[data-hook="success-message"], [data-testid="successMessage"]'); if (success) finish(true); var error = root.querySelector('[data-hook="error-message"], [data-testid="errorMessage"]'); if (error && error.textContent && error.textContent.trim()) { finish(false, error.textContent.trim()); } }); observer.observe(root, { childList: true, subtree: true, characterData: true }); var timer = setTimeout(function () { finish(true); }, 4000); } function submitEmail(email, event) { var form = findSubscribeForm(); if (!form) { reply(event, { type: "idx-footer-newsletter-error", message: "Subscribe form not found. Add a hidden Wix Subscribe form to this site.", }); return; } var input = form.querySelector('input[type="email"]'); if (!input) { reply(event, { type: "idx-footer-newsletter-error", message: "Email field not found." }); return; } var submit = findSubmitControl(form); if (!submit) { reply(event, { type: "idx-footer-newsletter-error", message: "Submit button not found." }); return; } input.focus(); input.value = email; input.dispatchEvent(new Event("input", { bubbles: true })); input.dispatchEvent(new Event("change", { bubbles: true })); watchSubmitResult(form, event); try { if (typeof form.requestSubmit === "function") { form.requestSubmit(submit); } else { submit.click(); } } catch (e) { reply(event, { type: "idx-footer-newsletter-error", message: "Could not submit form." }); } } window.addEventListener("message", function (event) { if (!isAllowedOrigin(event.origin)) return; var data = event.data; if (!data || data.type !== "idx-footer-newsletter") return; var email = String(data.email || "").trim(); if (!email) { reply(event, { type: "idx-footer-newsletter-error", message: "Email is required." }); return; } submitEmail(email, event); }); })();