CursosEmpresasBlogLiveConfPrecios

Transferencias de ether desde un contrato

Clase 14 de 21 • Curso de Introducción a Solidity

Contenido del curso

Por qué debes aprender Solidity

  • 1
    Curso de Solidity: Fundamentos y Desarrollo en Blockchain

    Curso de Solidity: Fundamentos y Desarrollo en Blockchain

    01:24 min
  • 2
    Programación en Solidity para Contratos Inteligentes en Blockchain

    Programación en Solidity para Contratos Inteligentes en Blockchain

    03:23 min

Introducción a la programación con Solidity

  • 3
    Estructura Básica de Contratos en Solidity

    Estructura Básica de Contratos en Solidity

    10:29 min
  • 4
    Tipos de datos y variables en Solidity: enteros, booleanos y direcciones

    Tipos de datos y variables en Solidity: enteros, booleanos y direcciones

    12:38 min
  • 5
    Estructuras y Arrays en Contratos Inteligentes

    Estructuras y Arrays en Contratos Inteligentes

    09:20 min
  • 6
    Estructuras de datos en Solidity: Mappings y enums

    Estructuras de datos en Solidity: Mappings y enums

    11:53 min
  • 7
    Estructuras de control en Solidity

    Estructuras de control en Solidity

    10:48 min
  • 8
    Manejo de Eventos con Solidity

    Manejo de Eventos con Solidity

    05:29 min

Programación de Funciones en Solidity

  • 9
    Cómo implementar funciones en Solidity

    Cómo implementar funciones en Solidity

    09:13 min
  • 10
    Uso de Modificadores en Solidity

    Uso de Modificadores en Solidity

    08:41 min
  • 11
    Manejo de errores

    Manejo de errores

    07:35 min

Gestionando costos de gas y comisiones

  • 12
    Tipos de almacenamiento

    Tipos de almacenamiento

    05:17 min
  • 13
    Manejo del gas y comisiones

    Manejo del gas y comisiones

    08:37 min
  • 14
    Transferencias de ether desde un contrato

    Transferencias de ether desde un contrato

    Viendo ahora
  • 15
    Recibir ether desde un contrato

    Recibir ether desde un contrato

    11:50 min

Conceptos avanzados de Solidity

  • 16
    Manejo de dependencias y librerías

    Manejo de dependencias y librerías

    08:12 min
  • 17
    Uso de la herencia en Solidity

    Uso de la herencia en Solidity

    14:41 min
  • 18
    Polimorfismo en contratos inteligentes

    Polimorfismo en contratos inteligentes

    09:05 min
  • 19
    Tokens

    Tokens

    13:34 min
  • 20
    Application Binary Interface (ABI)

    Application Binary Interface (ABI)

    06:50 min

Cómo continuar mi camino desarrollando en Blockchain

  • 21
    Cómo continuar mi camino con Solidity

    Cómo continuar mi camino con Solidity

    01:58 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads
        Ernesto García

        Ernesto García

        teacher•
        hace 4 años

        Transferencia de ether desde un contrato

        • send: Envía un monto a una dirección y retorna false si la transferencia no se realiza
        • transfer: Envía un monto y revierte si no se puede realizar
        • call: Esta es más complicada, pero básicamente realiza una llamada hacia una dirección. Incluso se pueden llamar funciones de otro contrato si se le pasa un address válido y la llamada dentro del parámetro data. No obstante, al ser un mensaje, puede llevar ether, y por eso se usa para envíos. Retorna el resultado de la función llamada (si es que fué el caso)
        Nahuel Brandan

        Nahuel Brandan

        student•
        hace 4 años

        Un wei es la unidad más pequeña de Ether.

        1 ETH == 10^18 WEI == 1,000,000,000,000,000,000 WEI

        Pepe Sosa

        Pepe Sosa

        student•
        hace 4 años

        No tengo el dato concreto (no he encontrado algo claro al respecto) pero el cast de la dirección en el método send, no creo que sea recomendable, tal vez dar de alta como payable en el argumento de la dirección sea lo más conveniente:

        function transferenciaPorSend( address payable _destino, uint _monto ) public returns (bool) { bool salida = _destino.send( _monto ); return salida; }

        Esto porque en otros lenguajes el cast corre el riesgo de perder datos, por ejemplo al castear un float a un int. Con el tipo de datos que maneja Solidity no sé si estemos corriendo el riesgo de castear esa dirección que podría ser (por ejemplo) de un contrato (porque la copiamos equivocadamente) y al enviarle el saldo lo vamos a perder. Bueno espero el profe nos dé más luz, eso es lo que pensé así de primeras y tal vez estoy diciendo un disparate.

        Pepe Sosa

        Pepe Sosa

        student•
        hace 4 años

        En caso de que no quieras usar el parámetro que da el warning, puedes dejar el parámetro vacío:

        function transferenciaPorCall( address _destino, uint _monto ) public returns (bool) { ( bool salida, ) = _destino.call{ value:_monto }(""); return salida; }

        En este caso no lo vamos a usar y es una forma válida de que Remix no nos dé el warning.

        Jorge Fidel Zubieta Choque

        Jorge Fidel Zubieta Choque

        student•
        hace 4 años
        Captura de Pantalla 2022-08-20 a la(s) 09.48.13.png
        Pepe Sosa

        Pepe Sosa

        student•
        hace 4 años

        ++call++ es una función de bajo nivel para interactuar con otros contratos. Es el método recomendado a usar cuando solo estás enviando ether vía una llamada a una función ++fallback++. Sin embargo, no es una forma recomendada de llamar a funciones existentes. Fuente: Solidity by example.

        Abidan Triguero Calle

        Abidan Triguero Calle

        student•
        hace 4 años

        RESUMEN CLASE 14: TRANSFERENCIA DE ETHER DESDE UN CONTRATO

        I.- FUNCIONES

        • Send: envía un monto de Ether a una dirección y retorna “false” si no se puede realizar la acción.

        • Transfer: envía un monto de Ether a una dirección e interrumpe la ejecución de la función si no se puede realizar la acción.

        • Call: envía un monto de Ether a una dirección y retorna el resultado de la operación.

        II.- DIFERENCIAS:

        • Send y transfer requieren que las direcciones sean de tipo payable.

        Call no lo requiere.

        • Send y transfer tienen un límite de gas fijo de 2300 de gas.

        Call no tiene límite de gas por defecto, pero se puede configurar.

        • Call permite llamar a funciones si la dirección especificada es un contrato.

        REMIX:

        CLASE 14 Imagen1TransferenciaDeEtherDesdeUnContrato.png

        Transferencia.sol

        // SPDX-License-Identifier: GLP-3.0 pragma solidity >=0.7.0 <0.9.0; contract Transferencia { constructor() payable { } function transferenciaPorSend(address destino, uint monto) public returns(bool) { bool salida = payable(destino).send(monto); return salida; } function transferenciaPorTransfer(address destino, uint monto) public { payable(destino).transfer(monto); } function transferenciaPorCall(address destino, uint monto) public returns (bool) { (bool salida, bytes memory respuesta) = destino.call{value:monto}(""); return salida; } }
        Sandro Jaramillo

        Sandro Jaramillo

        student•
        hace 4 años

        Cuando queremos enviar todo el saldo de nuestro contrato una forma puede ser accediendo a la propiedad "balance"

        function transferenciaPorSend(address _address) external onlyOwner returns (bool){ return payable(_address).send(address(this).balance); }
        Pepe Sosa

        Pepe Sosa

        student•
        hace 4 años

        Hola profe, he buscado la definición de la función "call" y no encuentro más que breves ejemplos del uso, pero no la definición, mi mayor duda es en el parámetro que se envía en call, en nuestro ejemplo va vacío ("") usted me podría ayudar con algún enlace?

        Muchas gracias de antemano! Saludos!

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          Hola Pepe, el parámetro vacío ("") indica que no se le envía ningún argumento y por lo tanto se convierte en una transferencia de ethers directa hacia la cuenta destino. Respecto a un enlace de ayuda, puedes consultar: https://solidity-by-example.org/call/ que te muestra cómo hacer la llamada con parámetros

        Edgar Oswaldo Vargas Jara

        Edgar Oswaldo Vargas Jara

        student•
        hace 4 años

        La direccion que colocamos al hacer el ejercicio es la que envía o recibe?

        Porque noto que su saldo va disminuyendo cada que ejecuto una transferencia en vez de aumentar

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          Hola Edgar, si es el ejercicio de transferir, la dirección que se ingresa es la que recibe. Debes considerar dos factores: 1 - El monto que ingresas está en unidad "wei", por lo tanto si pones 100, es 0,000000000000000100 ethers. 2 - Cuando realizas una transacción, debes pagar por el gas y la comisión. Por lo tanto, cada transacción que realices disminuirá el saldo de la cuenta que llame a la función.

          Tal vez sea alguno o ambos puntos los que hacen que lo veas disminuir

        Guido Batan

        Guido Batan

        student•
        hace 14 días

        Desde EIP-1884, 1000 gas no alcanza ni para ejecutar el receive() del contrato destino. Por eso send() y transfer() están considerados obsoletos en diseño moderno.

        Daniel Cueto

        Daniel Cueto

        student•
        hace 5 meses

        Un wei es la unidad más pequeña de medida en la blockchain de Ethereum, equivalente a 10^(-18) Ether. Se utiliza para realizar transacciones y calcular costos de gas de manera precisa en la red. Dado que las transacciones pueden tener costos muy bajos, el uso de wei permite manejar cifras pequeñas sin perder precisión. En comparación, un Ether se refiere a la cantidad más comúnmente utilizada en las transacciones, pero en el fondo, todo se traduce a wei.

        Hernando Villa

        Hernando Villa

        student•
        hace 3 años

        Si despues de un tiempo de desplegar el contrato, se queda sin saldo, hay alguna forma de hacer una recarga de saldo al contrato?

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 3 años

          Hola Hernando, correcto, se puede simplemente enviandole una transferencia al contrato. Recuerda que los contratos poseen direcciones con el mismo formato que las direcciones de cuentas de usuario, por lo tanto pueden recibir transferencias normalmente

        Patricia Calisto Gutierrez

        Patricia Calisto Gutierrez

        student•
        hace 4 años

        No logro que me compile por las “” de la línea 21. Cómo se colocan?

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          Son dos comillas dobles consecutivas (""). Creo que en tu comentario, las comillas que tienes son las que se utilizan para citar frases y que tienen una leve inclinación. Tienen que ser de las comillas que no tienen inclinación. Puedes copiar y pegar las que acabo de utilizar en el comentario que son las correctas

        Jorge Fidel Zubieta Choque

        Jorge Fidel Zubieta Choque

        student•
        hace 4 años

        Porque me produce el revert? intente varias veces pero me sigue dando el mismo resultado?

        Captura de Pantalla 2022-08-21 a la(s) 09.12.12.png
          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          Hola Jorge, fijate si el contrato desde el que estás llamando a esa función tiene saldo en Ether. Recuerda que no es el usuario el que está haciendo la transferencia sino el contrato, entonces antes de podes ejecutar esa operación debes de darle fondos al contrato.

          Jorge Fidel Zubieta Choque

          Jorge Fidel Zubieta Choque

          student•
          hace 4 años

          ya entendi! gracias era eso!

        Johan Muñoz

        Johan Muñoz

        student•
        hace 4 años

        Tengo una pequeña duda, en el curso de CrowdFunding, en la que una persona podía contribuir a un proyecto enviando, se utiliza esta funcion con .transfer

        function fundProyect(uint index) public payable sendFounds(index){ Proyect memory proyect=proyects[index]; // 0 is open && 1 is closed require(proyect.state == FundraisingState.Opened , "This project is already closed, you cant send founds"); require(msg.value> 0 , "You need to give a value greater than zero"); proyect.author.transfer(msg.value); proyect.founds += msg.value; proyects[index]=proyect; contributions[proyect.id].push(Contributtion(msg.sender, msg.value)); emit FundProyect(proyect.id, msg.value, proyect.founds); }

        Esta función cuando yo la ejecuto desde una cuenta distinta a la del creador de el proyecto y coloco 1 wei como valor, el .transfer me descuenta el valor de 1 wei (msg.value) directamente de la cuenta donde llame la función y no de el contrato como se explico en la clase, algo así como si el .transfer tomara el address from de la dirección que ejecuta la función y no de la dirección de el contrato. No se si esto sucederá por la distinta implementación de el payable, o por otro factor que desconozco.

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          Hola Johan, lo que está sucediendo es que al ser la función de tipo payable, tu contrato recibe los fondos efectivamente y luego en el transfer se lo envía a la dirección de proyect.author. Por lo tanto sirve como intermediario entre el usuario inicial y el usuario final que recibe. A fin de cuentas se le descuenta al usuario inicial para enviarselo al contrato y el contrato se lo da al usuario final, por lo que pareciera que lo hace directamente.

        Alejandra

        Alejandra

        student•
        hace 3 años

        ¿Esto se puede hacer con otras criptomonedas o es exclusivo con ether?

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 3 años

          hola Alejandra, este código puntualmente muestra como transferir Ethers. Para las criptomonedas deberías ver cómo se transfieren los tokens (ERC-20 y compatibles)

        Rodrigo Ramos Xochiteotzin

        Rodrigo Ramos Xochiteotzin

        student•
        hace 4 años

        ¿La función que se le puede pasar como parámetro es un callback?

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          Hola Rodrigo, la función que se envía por parámetro no es un callback en sí, si no que le indicas cuál es la función por la que vas a estar ingresando los ethers. Esto siempre y cuando envíes value, si no envías value puedes usar call para hacer una llamada externa a esa función. Es decir:

          direccion.call{value:10}(abi.encodeWithSignature("prueba()")) => envía ethers al contrato entrando por la función "prueba" (debe ser payable)

          direccion.call(abi.encodeWithSignature("prueba()")) => realiza una llamada externa a prueba

        Leonardo Jose Jimenez Ortiz

        Leonardo Jose Jimenez Ortiz

        student•
        hace 4 años

        Entonces en resumen "transfer" es como un send con revert?, o no exactamente asi?, porque?...

          Sebastian Perez

          Sebastian Perez

          teacher•
          hace 4 años

          hola Leonardo, exactamente ! Es como dices. Transfer es una evolución del send, antes se usaba el send pero para dar más seguridad (por el hecho de revertir) se agregó la alternativa con transfer con la misma estructura del send.

        Paul Rodas

        Paul Rodas

        student•
        hace 3 años

        Estimados compañeros, en esta URL están disponibles mis apuntes: https://github.com/prodasl/solidity-learning/

        Espero que sean de ayuda!