Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos
La mayoría de sus jugadores no tendrán criptomonedas en sus wallets. Ingresar fondos a criptomonedas usando métodos tradicionales puede ser complicado para los jugadores y puede ser demasiado estresante para usuarios con menos experiencia técnica. En cualquier caso, minimizar la fricción en los pagos siempre ha sido un requisito muy importante para una estrategia de monetización efectiva. El método más sencillo para realizar microtransacciones para la mayoría de los usuarios en móviles será con el método de compra dentro de la app al que ya están acostumbrados: IAP a través de la App Store de iOS y Google Play Store de Android. Esto es especialmente cierto si está usando Embedded Wallets y construyendo juegos donde la blockchain es invisible.Esta guía explicará cómo actualizamos Jelly Forest, nuestro juego de demostración de Embedded Wallet hecho con Unity, para agregar una compra IAP que mintear un divertido sombrero de hot dog para su Jelly.
El primer paso, si aún no lo ha hecho, es desplegar un smart contract que definirá y representará los NFT que desea vender a sus jugadores y mostrar en su juego.Una vez que haya desplegado su smart contract, no olvide agregar la dirección de su contrato como una Sponsored Address en la página de “Gas Sponsoring” dentro del Builder Console. Así, las comisiones de gas de sus usuarios serán patrocinadas automáticamente usando sus créditos de cómputo al interactuar con los smart contracts de su juego.
Por defecto, los contratos ERC1155/721 desplegados a través del Builder Console requieren que quienes llamen tengan los permisos apropiados para mintear un token. Aunque esto pueda parecer una molestia a primera vista, ¡es algo bueno! Sin esto, cualquiera podría llamar al método de minteo en su contrato y darse a sí mismo ítems infinitos en el juego.Querrá implementar un servidor con un wallet de Sequence (u otro) y darle permisos de minteo en el Builder Console.
Asigne un nombre a su servidor cambiando el valor de name
Cree un nuevo wallet EOA y exporte la clave privada. Cualquier wallet EOA funciona. Puede usar Metamask para configurar un wallet fácilmente y exportar la clave privada. ¡Tenga mucho cuidado con la clave privada y no la guarde en texto plano en su computadora ni la suba a control de versiones! Establezca esto en PKEY
Establezca el CONTRACT_ADDRESS
Establezca el PROJECT_ACCESS_KEY – esta es su clave API de producción del Builder Console que obtuvo antes al configurar el objeto scriptable SequenceConfig
Establezca el CHAIN_HANDLE – si no está seguro de cuál es, puede ver el CHAIN_HANDLE de cada red respectiva en la página Node Gateway del Builder Console.
pnpm dev – esto implementará el servidor localmente. Debería ver en la línea de comandos a qué localhost se implementó
Abra otra ventana de línea de comandos
curl http://localhost:8787 – sustituya el localhost que le hayan asignado. Esto enviará un ping al servidor.
En la línea de comandos donde está corriendo el servidor localhost, debería ver que la dirección del wallet del minter ha sido registrada
Otorgue permisos de minteo a esta dirección en el Builder Console
Busque el contrato bajo Contracts y haga clic para abrirlo
Haga clic en Write Contract
Expanda grantRole
En role ingrese 0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6 – este es el hash Keccak-256 de MINTER_ROLE
En account pegue la dirección del wallet del minter
wrangler deploy – esto implementará el código en un Cloudflare Worker y le dará una URL de minteo
¡Listo! Ahora, cuando enviamos una solicitud POST a nuestro servidor con un cuerpo definido en C#, donde el proof es generado por el cliente que envía la solicitud de minteo. En el Unity SDK esto se implementa mediante el MintingRequestProver.
Manejar los tokens comprados por IAP con el Remote Minter
Arriba, desplegamos un remote minter que es útil para mintear tokens que pueden ganarse mediante acciones dentro del juego. Veamos cómo podemos aprovechar este servidor para también mintear tokens que se pueden comprar vía IAP.Notará que también se puede incluir un recibo en el payload enviado al remote minter. Aquí es donde incluirá el recibo IAP de Google/Apple. Unity recomienda usar el proyecto IAP de Nobuyori Takahashi para verificar los recibos IAP recibidos vía Unity IAP en el servidor.Una vez que haya validado el recibo en el servidor, puede continuar con su lógica de minteo, usando el código de ejemplo provisto arriba como referencia.
En el lado de Unity, el primer paso es integrar Unity IAP en su proyecto.En sus métodos ProcessPurchase en su IStoreListener del proceso de integración, querrá iniciar el proceso de minteo. En Jelly Forest, esto se hace a través de los scripts UnityIAP y PremiumItem.En cuanto al payload, puede ver en la implementación de PremiumItem que estoy agregando una PermissionedMintTransaction a un TransactionQueuer.
public void AddToPremiumTransactionQueue(PermissionedMintTransaction payload, string iapReceipt){ PremiumIAPMinter minter = new PremiumIAPMinter(new MintingRequestProver(Wallet, Chain), _mintEndpoint, ContractAddress, iapReceipt); _permissionedMinterTransactionQueuer.Enqueue((payload, minter));}
donde _permissionedMinterTransactionQueuer es un PermissionedMinterTransactionQueuer.Esto enviará un payload en este formato:
ProofPayload: { "app": "Made with Sequence Unity SDK App", "iat": (uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds(), // issued at time "exp": (uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 300, // expiry time "ogn": "Sequence Unity SDK", "payload": { "contractAddress": "0xabc123...", "tokenId": "11", "amount": 5, "receipt": <IAP Receipt String here> }}This JSON get stringified and included in the MintingRequestProof:{ "Proof": "{\"app\": \"Made with Sequence Unity SDK App\", \"iat\": ...}", "SignedProof": "0x123def...", // proof signed by the player's embedded wallet "SigningAddress": "0xa1b2c3..." // the player's embedded wallet address}
Para más información sobre los TransactionQueuer, consulte este documento.
Apple y Google permiten a los usuarios la opción de hacer un contracargo de una compra IAP hecha por error. En este caso, su usuario aún tendrá el/los token(s) minteados. Aunque puede manejar esto por medios tradicionales (por ejemplo, prohibiendo a jugadores que frecuentemente hacen contracargos), debe tener cuidado de no vender NFT de alto valor por este método debido al riesgo de contracargos fraudulentos.
¿Esta página le ayudó?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Sequence Docs","colors":{"primary":"#B1A9FF","light":"#B1A9FF","dark":"#111111"},"logo":{"light":"https://mintcdn.com/sequence-0fb8d9e6/9rKTa07iWJtIbdn7/logo/sequence-composite-light.svg?fit=max\u0026auto=format\u0026n=9rKTa07iWJtIbdn7\u0026q=85\u0026s=18750aafea1146db72d2e3b695536390","dark":"https://mintcdn.com/sequence-0fb8d9e6/9rKTa07iWJtIbdn7/logo/sequence-composite-dark.svg?fit=max\u0026auto=format\u0026n=9rKTa07iWJtIbdn7\u0026q=85\u0026s=6efde0d56c8457026275cc8f3e34f0a4"},"favicon":"https://mintcdn.com/sequence-0fb8d9e6/Trdl1z4HOb4QxorB/favicon.png?fit=max\u0026auto=format\u0026n=Trdl1z4HOb4QxorB\u0026q=85\u0026s=d076be8f12c5eccec147aaca12dad634","appearance":{"default":"light","strict":false},"background":{"decoration":"gradient"},"navbar":{"primary":{"type":"button","label":"Sign In","href":"https://sequence.build"}},"footer":{"socials":{"x":"https://twitter.com/0xsequence","github":"https://github.com/0xsequence","discord":"https://discord.com/invite/YnGKP7d3vS"}},"fonts":{"heading":{"family":"Inter"},"body":{"family":"Inter"}},"integrations":{"gtm":{"tagId":"GTM-MJL772VN"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Supported Chains","icon":"heart-pulse","href":"https://status.sequence.info/"},{"anchor":"Changelog","icon":"map","href":"https://0xsequence.featurebase.app/changelog"}]},"languages":[{"language":"en","href":"home"},{"language":"ja","href":"ja/home"},{"language":"es","href":"es/home"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"sequence-0fb8d9e6","hasAudioNarration":false,"actualSubdomain":"sequence-0fb8d9e6","customDomains":["docs.sequence.xyz"],"gitSource":{"type":"github","owner":"0xsequence","repo":"docs","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae9253b7669ca8a6a0b3aaa:success","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"en","tag":"SDKs","count":193},{"language":"en","tag":"APIs","count":184},{"language":"ja","tag":"API","count":181},{"language":"en","tag":"Endpoints","count":150},{"language":"ja","tag":"エンドポイント","count":147},{"language":"en","tag":"Web SDKs","count":107},{"language":"ja","tag":"SDK","count":97},{"language":"en","tag":"Hooks","count":83},{"language":"en","tag":"Solutions","count":81},{"language":"en","tag":"Game Engine SDKs","count":71},{"language":"en","tag":"secret","count":70},{"language":"ja","tag":"シークレット","count":70},{"language":"en","tag":"Marketplace","count":59},{"language":"es","tag":"SDKs","count":54},{"language":"ja","tag":"ソリューション","count":52},{"language":"en","tag":"Wallets","count":49},{"language":"ja","tag":"アナリティクス","count":46},{"language":"ja","tag":"メタデータ","count":44},{"language":"ja","tag":"ゲームエンジンSDK","count":44},{"language":"es","tag":"SDKs Web","count":38},{"language":"ja","tag":"インデクサー","count":38},{"language":"ja","tag":"Web SDK","count":38},{"language":"es","tag":"Hooks","count":27},{"language":"es","tag":"Connect","count":27},{"language":"es","tag":"Soluciones","count":23},{"language":"es","tag":"Cartera del Ecosistema (v6)","count":14},{"language":"es","tag":"Cartera Incrustada (v5)","count":13},{"language":"es","tag":"SDKs de Motor de Juego","count":10},{"language":"es","tag":"Plataforma de Desarrollador","count":8},{"language":"es","tag":"Carteras","count":8}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".bg-matrix-dark{background:linear-gradient(0deg, rgba(13, 13, 15, 1) 0%, rgba(13, 13, 15, 0.95) 5%, rgba(13, 13, 15, 0.8) 15%, rgba(17, 17, 17, 0.1) 30%, rgba(17, 17, 17, 0.1) 70%, rgba(13, 13, 15, 0.8) 85%, rgba(13, 13, 15, 0.95) 95%, rgba(13, 13, 15, 1) 100%),\n linear-gradient(\n 90deg,\n transparent 0%,\n rgba(17, 17, 17, 0.6) 40%,\n rgba(17, 17, 17, 0.6) 60%,\n transparent 100%\n ), url(https://pub-f048362b915448c9b012a2e03c189024.r2.dev/matrix-bg-dark.svg);background-size:cover;background-position:center center}img[alt=\"US\"]{display:none!important}div.relative.w-4.h-4.rounded-full:has(img[alt=\"US\"]){display:none!important}.bg-matrix-light{background:linear-gradient(\n 0deg,\n #ffffff 0%,\n rgba(240, 240, 240, 0.6) 30%,\n rgba(240, 240, 240, 0.6) 70%,\n #ffffff 100%\n ),\n linear-gradient(\n 90deg,\n transparent 0%,\n rgba(240, 240, 240, 0.6) 40%,\n rgba(240, 240, 240, 0.6) 60%,\n transparent 100%\n ), url(https://pub-f048362b915448c9b012a2e03c189024.r2.dev/matrix-bg-light.svg);background-size:cover;background-position:center center}.dark .bg-matrix-light{background:linear-gradient(0deg, rgba(13, 13, 15, 1) 0%, rgba(13, 13, 15, 0.95) 5%, rgba(13, 13, 15, 0.8) 15%, rgba(17, 17, 17, 0.1) 30%, rgba(17, 17, 17, 0.1) 70%, rgba(13, 13, 15, 0.8) 85%, rgba(13, 13, 15, 0.95) 95%, rgba(13, 13, 15, 1) 100%),\n linear-gradient(\n 90deg,\n transparent 0%,\n rgba(17, 17, 17, 0.6) 40%,\n rgba(17, 17, 17, 0.6) 60%,\n transparent 100%\n ), url(https://pub-f048362b915448c9b012a2e03c189024.r2.dev/matrix-bg-dark.svg);background-size:cover;background-position:center center}.bg-gradient-dark{background:linear-gradient(\n 90deg,\n rgba(17, 17, 17, 0) 0%,\n rgba(17, 17, 17, 0.75) 50%,\n rgba(17, 17, 17, 0) 100%\n ),\n linear-gradient(180deg, #111 0%, rgba(17, 17, 17, 0) 40%, rgba(17, 17, 17, 0) 60%, #111 100%),\n linear-gradient(270deg, rgba(11, 106, 249, 0.25) 0%, rgba(29, 146, 255, 0.3) 100%)}.bg-gradient-light{background:linear-gradient(180deg, #f0f0f0 0%, rgba(255, 255, 255, 0) 49.83%, #f0f0f0 100%),\n linear-gradient(\n 90deg,\n #d2e4ff 0%,\n rgba(210, 228, 255, 0.5) 25.3%,\n rgba(255, 255, 255, 0) 49.83%,\n rgba(210, 228, 255, 0.5) 75.47%,\n #d2e4ff 100%\n )}"}],"page":{"pagePath":"es/guides/using-unity-iap-to-sell-nfts","slug":"/es/guides/using-unity-iap-to-sell-nfts","pageMetadata":{"title":"Usando Unity IAP para vender NFTs","description":"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos","sidebarTitle":"Usando Unity IAP para vender NFTs","href":"/es/guides/using-unity-iap-to-sell-nfts"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`La mayoría de sus jugadores no tendrán criptomonedas en sus wallets. Ingresar fondos a criptomonedas usando métodos tradicionales puede ser complicado para los jugadores y puede ser demasiado estresante para usuarios con menos experiencia técnica. En cualquier caso, minimizar la fricción en los pagos siempre ha sido un requisito muy importante para una estrategia de monetización efectiva. El método más sencillo para realizar microtransacciones para la mayoría de los usuarios en móviles será con el método de compra dentro de la app al que ya están acostumbrados: IAP a través de la App Store de iOS y Google Play Store de Android. Esto es especialmente cierto si está usando Embedded Wallets y construyendo juegos donde la blockchain es invisible.`}),`\n`,_jsxs(_components.p,{children:[`Esta guía explicará cómo actualizamos `,_jsx(_components.a,{href:`/guides/jelly-forest-unity-guide`,children:`Jelly Forest, nuestro juego de demostración de Embedded Wallet hecho con Unity`}),`, para agregar una compra IAP que mintear un divertido sombrero de hot dog para su Jelly.`]}),`\n`,_jsx(Heading,{level:`2`,id:`desplegar-un-smart-contract`,children:`Desplegar un Smart Contract`}),`\n`,_jsxs(_components.p,{children:[`El primer paso, si aún no lo ha hecho, es `,_jsx(_components.a,{href:`/solutions/builder/contracts/deploy-an-item-collection`,children:`desplegar un smart contract`}),` que definirá y representará los NFT que desea vender a sus jugadores y mostrar en su juego.`]}),`\n`,_jsxs(_components.p,{children:[`Una vez que haya desplegado su smart contract, no olvide `,_jsx(_components.a,{href:`/solutions/builder/gas-sponsorship#gas-sponsorship-in-builder`,children:`agregar la dirección de su contrato como una Sponsored Address en la página de “Gas Sponsoring”`}),` dentro del Builder Console. Así, las comisiones de gas de sus usuarios serán patrocinadas automáticamente usando sus créditos de cómputo al interactuar con los smart contracts de su juego.`]}),`\n`,_jsx(Heading,{level:`2`,id:`desplegar-un-remote-minter`,children:`Desplegar un Remote Minter`}),`\n`,_jsx(_components.p,{children:`Por defecto, los contratos ERC1155/721 desplegados a través del Builder Console requieren que quienes llamen tengan los permisos apropiados para mintear un token. Aunque esto pueda parecer una molestia a primera vista, ¡es algo bueno! Sin esto, cualquiera podría llamar al método de minteo en su contrato y darse a sí mismo ítems infinitos en el juego.`}),`\n`,_jsx(_components.p,{children:`Querrá implementar un servidor con un wallet de Sequence (u otro) y darle permisos de minteo en el Builder Console.`}),`\n`,_jsx(Heading,{level:`3`,id:`cómo-lo-hicimos-en-jelly-forest`,children:`Cómo lo hicimos en Jelly Forest`}),`\n`,_jsx(_components.p,{children:`En Jelly Forest, todas las monedas que recolecta durante el juego se mintean como tokens ERC1155. Así es como lo hicimos:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Regístrese en `,_jsx(_components.a,{href:`https://www.cloudflare.com/`,children:`Cloudflare`}),` – aquí es donde alojamos el código del servicio de minteo; si lo prefiere, puede usar cualquier otro método`]}),`\n`,_jsx(_components.li,{children:`Abra la terminal u otra línea de comandos`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`git clone https://github.com/0xsequence-demos/cloudflare-worker-sequence-relayer.git`}),` luego `,_jsx(_components.code,{children:`cd cloudflare-worker-sequence-relayer`})]}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`git checkout permissionedMinter`})}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`pnpm install`}),` – para instalar las dependencias`]}),`\n`,_jsx(_components.li,{children:`Instale wrangler`}),`\n`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`pnpm install wrangler --save-dev`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`alias wrangler='./node_modules/.bin/wrangler'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`inicie sesión`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`wrangler login`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.ol,{start:`7`,children:[`\n`,_jsxs(_components.li,{children:[`Abra `,_jsx(_components.code,{children:`wrangler.toml`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Asigne un nombre a su servidor cambiando el valor de `,_jsx(_components.code,{children:`name`})]}),`\n`,_jsxs(_components.li,{children:[`Cree un nuevo `,_jsx(_components.a,{href:`https://ethereum.stackexchange.com/questions/5828/what-is-an-eoa-account`,children:`wallet EOA`}),` y exporte la clave privada. Cualquier wallet EOA funciona. Puede usar Metamask para `,_jsx(_components.a,{href:`https://support.metamask.io/hc/en-us/articles/360015489531-Getting-started-with-MetaMask`,children:`configurar un wallet fácilmente`}),` y `,_jsx(_components.a,{href:`https://support.metamask.io/hc/en-us/articles/360015289632-How-to-export-an-account-s-private-key`,children:`exportar la clave privada`}),`. ¡Tenga mucho cuidado con la clave privada y no la guarde en texto plano en su computadora ni la suba a control de versiones! Establezca esto en `,_jsx(_components.code,{children:`PKEY`})]}),`\n`,_jsxs(_components.li,{children:[`Establezca el `,_jsx(_components.code,{children:`CONTRACT_ADDRESS`})]}),`\n`,_jsxs(_components.li,{children:[`Establezca el `,_jsx(_components.code,{children:`PROJECT_ACCESS_KEY`}),` – esta es su clave API de producción del Builder Console que obtuvo antes al configurar el objeto scriptable `,_jsx(_components.code,{children:`SequenceConfig`})]}),`\n`,_jsxs(_components.li,{children:[`Establezca el `,_jsx(_components.code,{children:`CHAIN_HANDLE`}),` – si no está seguro de cuál es, puede ver el `,_jsx(_components.code,{children:`CHAIN_HANDLE`}),` de cada red respectiva en la página Node Gateway del Builder Console.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`pnpm dev`}),` – esto implementará el servidor localmente. Debería ver en la línea de comandos a qué localhost se implementó`]}),`\n`,_jsx(_components.li,{children:`Abra otra ventana de línea de comandos`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`curl http://localhost:8787`}),` – sustituya el localhost que le hayan asignado. Esto enviará un ping al servidor.`]}),`\n`,_jsx(_components.li,{children:`En la línea de comandos donde está corriendo el servidor localhost, debería ver que la dirección del wallet del minter ha sido registrada`}),`\n`,_jsxs(_components.li,{children:[`Otorgue permisos de minteo a esta dirección en el Builder Console`,`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Busque el contrato bajo `,_jsx(_components.code,{children:`Contracts`}),` y haga clic para abrirlo`]}),`\n`,_jsxs(_components.li,{children:[`Haga clic en `,_jsx(_components.code,{children:`Write Contract`})]}),`\n`,_jsxs(_components.li,{children:[`Expanda `,_jsx(_components.code,{children:`grantRole`})]}),`\n`,_jsxs(_components.li,{children:[`En `,_jsx(_components.code,{children:`role`}),` ingrese `,_jsx(_components.code,{children:`0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6`}),` – este es el hash Keccak-256 de `,_jsx(_components.code,{children:`MINTER_ROLE`})]}),`\n`,_jsxs(_components.li,{children:[`En `,_jsx(_components.code,{children:`account`}),` pegue la dirección del wallet del minter`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`wrangler deploy`}),` – esto implementará el código en un `,_jsx(_components.a,{href:`https://developers.cloudflare.com/workers/`,children:`Cloudflare Worker`}),` y le dará una URL de minteo`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`¡Listo! Ahora, cuando enviamos una solicitud POST a nuestro servidor con un cuerpo `,_jsx(_components.a,{href:`https://github.com/0xsequence/sequence-unity/blob/master/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/MintingRequestProver.cs#L103`,children:`definido en C#`}),`, donde el `,_jsx(_components.code,{children:`proof`}),` es generado por el cliente que envía la solicitud de minteo. En el Unity SDK esto se implementa mediante el `,_jsx(_components.a,{href:`https://github.com/0xsequence/sequence-unity/blob/master/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/MintingRequestProver.cs#L27`,children:`MintingRequestProver`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`manejar-los-tokens-comprados-por-iap-con-el-remote-minter`,children:`Manejar los tokens comprados por IAP con el Remote Minter`}),`\n`,_jsx(_components.p,{children:`Arriba, desplegamos un remote minter que es útil para mintear tokens que pueden ganarse mediante acciones dentro del juego. Veamos cómo podemos aprovechar este servidor para también mintear tokens que se pueden comprar vía IAP.`}),`\n`,_jsxs(_components.p,{children:[`Notará que también se puede incluir un recibo en el payload enviado al remote minter. Aquí es donde incluirá el recibo IAP de Google/Apple. `,_jsx(_components.a,{href:`https://docs.unity3d.com/Packages/com.unity.purchasing@4.0/manual/BackendReceiptValidation.html`,children:`Unity recomienda`}),` usar el `,_jsx(_components.a,{href:`https://github.com/voltrue2/in-app-purchase`,children:`proyecto IAP de Nobuyori Takahashi`}),` para verificar los recibos IAP recibidos vía Unity IAP en el servidor.`]}),`\n`,_jsx(_components.p,{children:`Una vez que haya validado el recibo en el servidor, puede continuar con su lógica de minteo, usando el código de ejemplo provisto arriba como referencia.`}),`\n`,_jsx(Heading,{level:`2`,id:`implementación-en-unity`,children:`Implementación en Unity`}),`\n`,_jsxs(_components.p,{children:[`En el lado de Unity, el primer paso es integrar `,_jsx(_components.a,{href:`https://docs.unity3d.com/Manual/UnityIAP.html`,children:`Unity IAP`}),` en su proyecto.`]}),`\n`,_jsxs(_components.p,{children:[`En sus métodos `,_jsx(_components.code,{children:`ProcessPurchase`}),` en su `,_jsx(_components.code,{children:`IStoreListener`}),` del proceso de integración, querrá iniciar el proceso de minteo. En Jelly Forest, esto se hace a través de los scripts `,_jsx(_components.a,{href:`https://github.com/0xsequence/sequence-unity-demo/blob/JellyForest/Scripts/UnityIAP.cs`,children:`UnityIAP`}),` y `,_jsx(_components.a,{href:`https://github.com/0xsequence/sequence-unity-demo/blob/JellyForest/Scripts/Items/PremiumItem.cs`,children:`PremiumItem`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`En cuanto al payload, puede ver en la implementación de `,_jsx(_components.code,{children:`PremiumItem`}),` que estoy agregando una PermissionedMintTransaction a un `,_jsx(_components.code,{children:`TransactionQueuer`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`csharp`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`csharp`,children:_jsxs(_components.code,{language:`csharp`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` AddToPremiumTransactionQueue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:`PermissionedMintTransaction`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` payload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`string`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` iapReceipt`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` PremiumIAPMinter`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` minter`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` PremiumIAPMinter`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` MintingRequestProver`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Wallet`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Chain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` _mintEndpoint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ContractAddress`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`iapReceipt`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` _permissionedMinterTransactionQueuer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`Enqueue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`minter`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`donde `,_jsx(_components.code,{children:`_permissionedMinterTransactionQueuer`}),` es un `,_jsx(_components.code,{children:`PermissionedMinterTransactionQueuer`}),`.`]}),`\n`,_jsx(_components.p,{children:`Esto enviará un payload en este formato:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`20`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`20`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`ProofPayload: `})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"app\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Made with Sequence Unity SDK App\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"iat\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:`(uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds()`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// issued at time `})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"exp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:`(uint)DateTimeOffset.UtcNow.ToUnixTimeSeconds()`}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:` +`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 300`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// expiry time `})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"ogn\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Sequence Unity SDK\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"payload\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"contractAddress\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0xabc123...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tokenId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"11\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"amount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`5`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"receipt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:`\u003cIAP`}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:` Receipt`}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:` String`}),_jsx(_components.span,{style:{color:`#82071E`,\"--shiki-light-font-style\":`italic`,\"--shiki-dark\":`#F44747`,\"--shiki-dark-font-style\":`inherit`},children:` here>`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`This JSON get stringified and included in the MintingRequestProof:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Proof\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`app`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Made with Sequence Unity SDK App`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`iat`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`: ...}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"SignedProof\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0x123def...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// proof signed by the player's embedded wallet`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"SigningAddress\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0xa1b2c3...\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // the player's embedded wallet address`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Para más información sobre los `,_jsx(_components.code,{children:`TransactionQueuer`}),`, consulte `,_jsx(_components.a,{href:`/sdk/unity/wallets/embedded-wallet/blockchain-interactions#transaction-queuers`,children:`este documento`}),`.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Apple y Google permiten a los usuarios la opción de hacer un contracargo de una compra IAP hecha por error. En este caso, su usuario aún tendrá el/los token(s) minteados. Aunque puede manejar esto por medios tradicionales (por ejemplo, prohibiendo a jugadores que frecuentemente hacen contracargos), debe tener cuidado de no vender NFT de alto valor por este método debido al riesgo de contracargos fraudulentos.`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Usando Unity IAP para vender NFTs","description":"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos","sidebarTitle":"Usando Unity IAP para vender NFTs","href":"/es/guides/using-unity-iap-to-sell-nfts"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Desplegar un Smart Contract","slug":"desplegar-un-smart-contract","depth":2,"children":[]},{"title":"Desplegar un Remote Minter","slug":"desplegar-un-remote-minter","depth":2,"children":[{"title":"Cómo lo hicimos en Jelly Forest","slug":"cómo-lo-hicimos-en-jelly-forest","depth":3,"children":[]},{"title":"Manejar los tokens comprados por IAP con el Remote Minter","slug":"manejar-los-tokens-comprados-por-iap-con-el-remote-minter","depth":3,"children":[]}]},{"title":"Implementación en Unity","slug":"implementación-en-unity","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/sequence-0fb8d9e6/5928f07079c865a1/scripts/update_security_schemas.js","/_mintlify/custom/sequence-0fb8d9e6/b206a90082858d4a/snippets/databeat-tracker.js","/_mintlify/custom/sequence-0fb8d9e6/0281ffbe15eb5584/snippets/dist/databeat-tracker.umd.js"],"subdomain":"sequence-0fb8d9e6","siteName":"Sequence Docs","title":"Usando Unity IAP para vender NFTs - Sequence Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/guides/using-unity-iap-to-sell-nfts","matchLevel":1},"ja":{"href":"/ja/guides/using-unity-iap-to-sell-nfts","matchLevel":1},"es":{"href":"/es/guides/using-unity-iap-to-sell-nfts","matchLevel":0}}},"originalFileLocation":"es/guides/using-unity-iap-to-sell-nfts.mdx","locale":"es"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos\">\u003cmeta data-mint-head name=\"application-name\" content=\"Sequence Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Usando Unity IAP para vender NFTs - Sequence Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Sequence Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://sequence-0fb8d9e6.mintlify.site/_mintlify/api/og/v2?division=Desarrolladores+de+Juegos\u0026amp;title=Usando+Unity+IAP+para+vender+NFTs\u0026amp;description=C%C3%B3mo+agregamos+NFTs+comprables+v%C3%ADa+IAP+%28compra+dentro+de+la+app%29+en+la+App+Store+de+iOS+y+Google+Play+Store+a+Jelly+Forest+y+c%C3%B3mo+hacer+algo+similar+en+sus+prop\u0026amp;theme=24de08c14e77b48a0ce7d6fd\u0026amp;signature=f96f76053c5eaf36bce321cbf4918811a98bc5a2361cbe9d200a553683f443d5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Usando Unity IAP para vender NFTs - Sequence Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://sequence-0fb8d9e6.mintlify.site/_mintlify/api/og/v2?division=Desarrolladores+de+Juegos\u0026amp;title=Usando+Unity+IAP+para+vender+NFTs\u0026amp;description=C%C3%B3mo+agregamos+NFTs+comprables+v%C3%ADa+IAP+%28compra+dentro+de+la+app%29+en+la+App+Store+de+iOS+y+Google+Play+Store+a+Jelly+Forest+y+c%C3%B3mo+hacer+algo+similar+en+sus+prop\u0026amp;theme=24de08c14e77b48a0ce7d6fd\u0026amp;signature=f96f76053c5eaf36bce321cbf4918811a98bc5a2361cbe9d200a553683f443d5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/sequence-0fb8d9e6/WZ0nVbE4CcPhWh5d/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Sequence Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#B1A9FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/es/guides/using-unity-iap-to-sell-nfts.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.sequence.xyz/guides/using-unity-iap-to-sell-nfts\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.sequence.xyz/ja/guides/using-unity-iap-to-sell-nfts\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.sequence.xyz/guides/using-unity-iap-to-sell-nfts\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.sequence.xyz/#organization\",\"name\":\"Sequence Docs\",\"url\":\"https://docs.sequence.xyz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/sequence-0fb8d9e6/9rKTa07iWJtIbdn7/logo/sequence-composite-light.svg?fit=max\u0026auto=format\u0026n=9rKTa07iWJtIbdn7\u0026q=85\u0026s=18750aafea1146db72d2e3b695536390\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.sequence.xyz#website\",\"name\":\"Sequence Docs\",\"url\":\"https://docs.sequence.xyz\",\"publisher\":{\"@id\":\"https://docs.sequence.xyz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts#webpage\",\"url\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts\",\"name\":\"Usando Unity IAP para vender NFTs\",\"description\":\"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos\",\"isPartOf\":{\"@id\":\"https://docs.sequence.xyz#website\"},\"breadcrumb\":{\"@id\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guías\",\"item\":\"https://docs.sequence.xyz/es/guides/guide-overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desarrolladores de Juegos\",\"item\":\"https://docs.sequence.xyz/es/guides/webgl-guide\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Usando Unity IAP para vender NFTs\",\"item\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts#article\",\"headline\":\"Usando Unity IAP para vender NFTs\",\"name\":\"Usando Unity IAP para vender NFTs\",\"description\":\"Cómo agregamos NFTs comprables vía IAP (compra dentro de la app) en la App Store de iOS y Google Play Store a Jelly Forest y cómo hacer algo similar en sus propios juegos\",\"url\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts\",\"mainEntityOfPage\":{\"@id\":\"https://docs.sequence.xyz/es/guides/using-unity-iap-to-sell-nfts#webpage\"},\"publisher\":{\"@id\":\"https://docs.sequence.xyz/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.sequence.xyz#website\"}}]}\u003c/script>","siteName":"Sequence Docs","nav":{"global":{"anchors":[{"anchor":"Supported Chains","icon":"heart-pulse","href":"https://status.sequence.info/"},{"anchor":"Changelog","icon":"map","href":"https://0xsequence.featurebase.app/changelog"}]},"languages":[{"language":"en","pages":[{"title":"en","href":"/guides/using-unity-iap-to-sell-nfts"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/guides/using-unity-iap-to-sell-nfts"}]},{"language":"es","tabs":[{"tab":"Inicio","pages":[{"title":"Inicio","href":"/es/home"}]},{"tab":"Soluciones","pages":[{"title":"Soluciones","href":"/es/solutions/overview"}]},{"tab":"SDKs","pages":[{"title":"SDKs","href":"/es/sdk/overview"}]},{"tab":"APIs","pages":[{"title":"APIs","href":"/es/api-references/overview"}]},{"tab":"Resources","groups":[{"group":"Guías","pages":[{"title":"Guías","mode":"wide","sidebarTitle":"Descripción general","href":"/es/guides/guide-overview"},{"group":"Desarrolladores de Juegos","pages":[{"title":"Webgl guide","href":"/es/guides/webgl-guide"},{"title":"Introducción a Jelly Forest - Guía de juego en Unity","sidebarTitle":"Cree un juego en Unity","href":"/es/guides/jelly-forest-unity-guide"},{"title":"Creando juegos con muchas transacciones en Unity","sidebarTitle":"Creando juegos con muchas transacciones en Unity","href":"/es/guides/building-transaction-heavy-games-with-unity"},{"title":"Unreal ew guide","href":"/es/guides/unreal-ew-guide"},{"title":"Usando Unity IAP para vender NFTs","sidebarTitle":"Usando Unity IAP para vender NFTs","href":"/es/guides/using-unity-iap-to-sell-nfts"},{"title":"Unity primary sales","href":"/es/guides/unity-primary-sales"},{"title":"Unity webgl telegram","href":"/es/guides/unity-webgl-telegram"},{"title":"Telegram integration","href":"/es/guides/telegram-integration"}]},{"group":"Integraciones Blockchain","pages":[{"title":"Mint collectibles serverless","href":"/es/guides/mint-collectibles-serverless"},{"title":"Metadata guide","href":"/es/guides/metadata-guide"},{"title":"Treasure chest guide","href":"/es/guides/treasure-chest-guide"},{"title":"Typed on chain signatures","href":"/es/guides/typed-on-chain-signatures"},{"title":"Building relaying server","href":"/es/guides/building-relaying-server"},{"title":"Analytics guide","href":"/es/guides/analytics-guide"},{"title":"Build embedding wallet","href":"/es/guides/build-embedding-wallet"}]},{"group":"Marketplaces y Ventas Primarias","pages":[{"title":"Cree un Marketplace Personalizado","sidebarTitle":"Cree un Marketplace Personalizado","href":"/es/guides/custom-marketplace"},{"title":"Primary sales","href":"/es/guides/primary-sales"},{"title":"Primary drop sales erc721","href":"/es/guides/primary-drop-sales-erc721"}]}]},{"group":"Plantillas Base","pages":[{"title":"Template overview","href":"/es/guides/template-overview"}]}]},{"tab":"Support","pages":[{"title":"Support","href":"/es/support"}]}]}]},"basePath":"","title":"Usando Unity IAP para vender NFTs - Sequence Docs","buildId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","deploymentId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","dynamics":[],"chunks":[]}