No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Quedan menos de 24 hrs para aprender Inglés, AI y más a precio especial.

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
0 Hrs
17 Min
5 Seg

Métodos payables y promises

20/24
Recursos

Aportes 5

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Solución equivalente un poquito más concisa :3

pub fn obtener_memes_museo(&self, nombre_museo: String) -> Vec<Meme> {
    // con map_or_else evitamos alojar un nuevo vector de no ser necesario
    self.museos.get(&nombre_museo).map_or_else(Vec::new, |m| {
        // filtramos y mapeamos en una sola llamada los memes existentes
        // es decir, si self.memes.get(...) devuelve None, esto no se incluye
        m.iter().filter_map(|id| self.memes.get(id)).collect()
    })
}

yoctonear 1a la 24

Un vector para añadir datos usamos el push

28/01/2024 Bueno bebés hermosos, presten atención, para aquellos compas que les esté dando problema el cargo build, mas específicamente lo siguiente: error: no matching package named `parity-secp256k1` found location searched: registry `crates-io` required by package `near-crypto v0.14.0` `` ... which satisfies dependency `near-crypto = "^0.14"` of package `near-sdk v4.1.1` `` Deben agregar lo siguiente al `cargo.toml` \[package] name = "museo\_memes" version = "0.1.0" edition = "2021" \# See more keys and their definitions at <https://doc.rust-lang.org/cargo/reference/manifest.html> \[lib] crate-type = \["cdylib", "rlib"] # más para rust que para near \[dependencies] near-sdk = "3.1.0" \[patch.crates-io] parity-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1/", version = "0.7.0" } y para el `lib.rs:` use near\_sdk::borsh::{self, BorshDeserialize, BorshSerialize};use near\_sdk::collections::UnorderedMap;use near\_sdk::serde::{Deserialize, Serialize};use near\_sdk::{env, near\_bindgen, setup\_alloc, Promise}; setup\_alloc!(); //alocar dirección de memoria /\*Clases necesarias para el contratoimplementamos serde cuando necesitamos retornar la estructuracli y frontend. En este caso se usan ambas serializaciones yaque la serialización y desearializacipon del contrato en la blockchain de near usar los borsh para optimizacion y los normales para parsear jsons\*/ \#\[derive(Serialize, Deserialize, BorshSerialize, BorshDeserialize)]#\[serde(crate = "near\_sdk::serde")]pub struct Meme {    pub id: u64,    pub creado\_por: String,    pub titulo: String,    pub museo: String,    pub url: String,    pub donaciones: u128,} //implementación del trait Default para inicializar la estructuraimpl Default for Meme {    fn default() -> Self {        Meme {            id: 0,            creado\_por: String::from(""),            titulo: String::from(""),            museo: String::from(""),            url: String::from(""),            donaciones: 0,        }    }} //implementación del método new que permitirá crear nuevos memesimpl Meme {    pub fn new(titulo: String, url: String, museo: String) -> Self {        Self {            id: env::block\_index(), // env::block\_height(), //env::block\_index(), //id:0            creado\_por: env::signer\_account\_id().to\_string(),            titulo,            museo,            url,            donaciones: 0,        }    }} //1. estructura, state del contrato e inicialización de variables#\[near\_bindgen]#\[derive(BorshDeserialize, BorshSerialize)] pub struct SimpleMemeMuseum {    //Guardamos solo los ID para evitar tener que editar en ambos    museos: UnorderedMap\<String, Vec\<u64>>,    memes: UnorderedMap\<u64, Meme>,} //inicializamos el state del contratoimpl Default for SimpleMemeMuseum {    fn default() -> Self {        Self {            //Inicializamos las colecciones            museos: UnorderedMap::new(b"u".to\_vec()),            memes: UnorderedMap::new(b"e".to\_vec()),        }    }} //Métodos impl SimpleMemeMuseum {    pub fn <u>crear\_meme</u>(\&mut <u>self</u>, titulo: String, url: String, nombre\_museo: String) {        //crear el objeto meme:        let meme = Meme::new(            String::from(\&titulo),            String::from(\&url),            String::from(\&nombre\_museo),        );         //Lo guardamos en la colección de memes        <u>self</u>.memes.<u>insert</u>(\&meme.id, \&meme);         //Buscamos si el museo eiste para despues añadir el meme en el. La función get        //El valor de un key dado como un Option\<Vec\<u64>> como el vector de museos         let museo = <u>self</u>.museos.get(\&nombre\_museo);        //si eiste el museo entonces is\_some() retornará true  y agregamos el nuevo Id de ese museo         if museo.is\_some() {            //m almacena el valor del some() del option<> o da un panic en caso de ser nulo            let mut <u>m</u> = museo.unwrap();            //m al ser un vector hacemos un push para almacenar el dato            <u>m</u>.<u>push</u>(meme.id);             //insertamos en la colección de museos el museo y el meme ligado a él.            <u>self</u>.museos.<u>insert</u>(\&nombre\_museo, &<u>m</u>);        }        //si no existe, creamos un nuevo museo, le agregamos el meme y lo guardamos.        else {            let mut <u>nuevo\_museo</u> = Vec::new();            <u>nuevo\_museo</u>.<u>push</u>(meme.id);            <u>self</u>.museos.<u>insert</u>(\&nombre\_museo, &<u>nuevo\_museo</u>);        }         //Manda un mensaje a la terminal al ejecutar el método:        env::log(            format!(                "Nuevo meme añadido con éito, Museo: {}, Id Meme: {}",                \&nombre\_museo, meme.id            )            .as\_bytes(),        );    }    pub fn obtener\_meme(\&self, id: u64) -> Option\<Meme> {        //el option retorna un some o null, entonces con este método veremos si eiste o no        self.memes.get(\&id)    }    pub fn obtener\_lista\_memes(\&self) -> Vec<(u64, Meme)> {        self.memes.to\_vec()    }    pub fn obtener\_lista\_museos(\&self) -> Vec\<String> {        self.museos.keys\_as\_vector().to\_vec()    }    pub fn obtener\_memes\_museo(\&self, nombre\_museo: String) -> Vec\<Meme> {        let museo = self.museos.get(\&nombre\_museo);        //Si el museo existe:        if museo.is\_some() {            let mut <u>lista\_memes</u> = Vec::new();             //el for recorre cada elemento en el museo:            for meme in \&museo.unwrap() {                //obtenemos el meme mediante su id                let m = self.memes.get(meme);                 //si el meme existe                if m.is\_some() {                    //mandamos el meme al vector de la lista de memes                    <u>lista\_memes</u>.<u>push</u>(m.unwrap());                }            }            //retornamos la lista de memes            <u>lista\_memes</u>            //si no existe el museo        } else {            //creamos el vector vacio de memes            Vec::new()        }    }     //#\[payable]    pub fn <u>donar\_a\_meme</u>(\&mut <u>self</u>, id: u64) -> bool {        assert!(            env::attached\_deposit() > 0,            "Debes agregar NEAR para hacer una donación."        );         //Buscamos el meme        match <u>self</u>.memes.get(\&id) {            //analizamos si el meme eiste y mandamos el valor mutable de la colección            Some(mut <u>meme</u>) => {                //si eiste guardamos la donación en el registro                <u>meme</u>.donaciones <u>+=</u> env::attached\_deposit();                <u>self</u>.memes.<u>insert</u>(&<u>meme</u>.id, &<u>meme</u>);                //y le transferimos al creador del meme lo que donaron                Promise::new(String::from(&<u>meme</u>.creado\_por)).transfer(env::attached\_deposit());                true            }            None => false,        }    }} y voila, salu2.
const NEAR: u128 = 10u128.pow(24); // Yocto-near