Skip to content

Commit

Permalink
Merge pull request #107 from PavitraAgarwal21/main
Browse files Browse the repository at this point in the history
implement get_token_uri in ProfileTokenUri module - issue #98
  • Loading branch information
Darlington02 authored Aug 10, 2024
2 parents 8654830 + ac9d607 commit 46c6d5a
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 1 deletion.
111 changes: 110 additions & 1 deletion src/base/token_uris/profile_token_uri.cairo
Original file line number Diff line number Diff line change
@@ -1,10 +1,119 @@
// TODO: https://github.com/lens-protocol/core/blob/master/contracts/misc/token-uris/ProfileTokenURI.sol

pub mod ProfileTokenUri {
use core::array::ArrayTrait;
use alexandria_bytes::{Bytes, BytesTrait};
use karst::base::utils::byte_array_extra::FeltTryIntoByteArray;
use alexandria_encoding::base64::{Base64UrlEncoder};

// get svg according to the token id and mint timestamp
fn get_svg(token_id: u256, mint_timestamp: u64) -> Array<felt252> {
let mut svg = ArrayTrait::<felt252>::new();
svg.append('<svg width="200" height="200" x');
svg.append('mlns="http://www.w3.org/2000/sv');
svg.append('g"><circle cx="100" cy="100" r=');
svg.append('"80" fill="red"/></svg>');
svg
}

fn get_attributes(token_id: u256, mint_timestamp: u64) -> Array<felt252> {
let token_id_felt: felt252 = token_id.try_into().unwrap();
let timestamp_felt: felt252 = mint_timestamp.try_into().unwrap();
let token_id_byte: ByteArray = token_id_felt.try_into().unwrap();
let token_id_byte_len: felt252 = token_id_byte.len().try_into().unwrap();
let mut attributes = ArrayTrait::<felt252>::new();
let sample_traits = 'pavitra';
attributes.append('","attributes":[{"display');
attributes.append('_type":"number","trait_');
attributes.append('type":"ID","value":"');
attributes.append(token_id_felt);
attributes.append('"},{"trait_type":"HEX ');
attributes.append('ID","value":"');
attributes.append(token_id_felt); // TODO to hex string
attributes.append('"},{"trait_type":"DIGITS"');
attributes.append(',"value":"');
attributes.append(token_id_byte_len);
attributes.append('"},{"display_type":"date","trai');
attributes.append('t_type":"MINTED AT","value":"');
attributes.append(timestamp_felt);
attributes.append('"},');
attributes.append(sample_traits);
attributes.append(']}');
attributes
}

fn get_json(token_id: u256, mint_timestamp: u64) -> Array<felt252> {
let token_id_felt: felt252 = token_id.try_into().unwrap();
let timestamp_felt: felt252 = mint_timestamp.try_into().unwrap();
let mut json = ArrayTrait::<felt252>::new();
json.append('{"name":"Profile #');
json.append(token_id_felt);
json.append('","description":"Profile #');
json.append(timestamp_felt);
json.append('","image":"data:image/svg');
json.append('+xml;base64,');
json
}

fn convert_into_byteArray(ref svg: Array<felt252>) -> ByteArray {
let mut res: ByteArray = Default::default();
// converting felt252 array to byte array
while (!svg.is_empty()) {
let each_felt: felt252 = svg.pop_front().unwrap();
let word: ByteArray = each_felt.try_into().unwrap();
res.append(@word);
};
res
}

fn get_base64_encode(res: ByteArray) -> ByteArray {
let mut res_arr_u8 = ArrayTrait::<u8>::new();
let mut i = 0;
while i < res
.len() {
let mut res_data = res.at(i);
res_arr_u8.append(res_data.unwrap());
i += 1;
};
// encoding the array of u8 to base64url
let mut encoded_val = Base64UrlEncoder::encode(res_arr_u8);
// converting array of u8 to byte array
let mut res_final: ByteArray = Default::default();
let mut j = 0;
while j < encoded_val
.len() {
let encoded_val_data = encoded_val.at(j);
res_final.append_byte(*encoded_val_data);
j += 1;
};
res_final
}

pub fn get_token_uri(token_id: u256, mint_timestamp: u64) -> ByteArray {
"TODO"
let baseuri = 'data:image/svg+xml;base64,';
let mut svg = get_svg(token_id, mint_timestamp);
let mut svg_byte_array: ByteArray = convert_into_byteArray(ref svg);
let svg_encoded: ByteArray = get_base64_encode(svg_byte_array);
// getting json byte array
// json - json + svg_base64_encoded
let mut json = get_json(token_id, mint_timestamp);
let mut json_byte_array: ByteArray = convert_into_byteArray(ref json);
json_byte_array.append(@svg_encoded);
// getting attributes
let mut attribute = get_attributes(token_id, mint_timestamp);
let mut attribute_byte_array: ByteArray = convert_into_byteArray(ref attribute);
// tokenuri_to_encode = json + attribute
let mut tokenuri_to_encode: ByteArray = Default::default();
// concat json ,
tokenuri_to_encode.append(@json_byte_array);
// concat attribute
tokenuri_to_encode.append(@attribute_byte_array);
// ecoding the encode
let encoded_token_uri = get_base64_encode(tokenuri_to_encode);
// baseuri + base64_encoded(json,attribute)
let mut token_uri: ByteArray = baseuri.try_into().unwrap();
// concat the base uri and the encoded token uri
token_uri.append(@encoded_token_uri);
token_uri
}
}
17 changes: 17 additions & 0 deletions tests/test_profile_token_uri.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
use karst::base::token_uris::profile_token_uri::ProfileTokenUri::get_token_uri;

#[test]
fn test_profile_token_uri() {
let token_uri_1_3: ByteArray = get_token_uri(1, 3);
let token_uri_10_99: ByteArray = get_token_uri(10, 99);
let token_uri_100_990: ByteArray = get_token_uri(100, 990);
let check_token_uri_1_3: ByteArray =
"data:image/svg+xml;base64,eyJuYW1lIjoiUHJvZmlsZSAjASIsImRlc2NyaXB0aW9uIjoiUHJvZmlsZSAjAyIsImltYWdlIjoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpBd0lpQm9aV2xuYUhROUlqSXdNQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajQ4WTJseVkyeGxJR040UFNJeE1EQWlJR041UFNJeE1EQWlJSEk5SWpnd0lpQm1hV3hzUFNKeVpXUWlMejQ4TDNOMlp6ND0iLCJhdHRyaWJ1dGVzIjpbeyJkaXNwbGF5X3R5cGUiOiJudW1iZXIiLCJ0cmFpdF90eXBlIjoiSUQiLCJ2YWx1ZSI6IgEifSx7InRyYWl0X3R5cGUiOiJIRVggSUQiLCJ2YWx1ZSI6IgEifSx7InRyYWl0X3R5cGUiOiJESUdJVFMiLCJ2YWx1ZSI6IgEifSx7ImRpc3BsYXlfdHlwZSI6ImRhdGUiLCJ0cmFpdF90eXBlIjoiTUlOVEVEIEFUIiwidmFsdWUiOiIDIn0scGF2aXRyYV19";
let check_token_uri_10_99: ByteArray =
"data:image/svg+xml;base64,eyJuYW1lIjoiUHJvZmlsZSAjCiIsImRlc2NyaXB0aW9uIjoiUHJvZmlsZSAjYyIsImltYWdlIjoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpBd0lpQm9aV2xuYUhROUlqSXdNQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajQ4WTJseVkyeGxJR040UFNJeE1EQWlJR041UFNJeE1EQWlJSEk5SWpnd0lpQm1hV3hzUFNKeVpXUWlMejQ4TDNOMlp6ND0iLCJhdHRyaWJ1dGVzIjpbeyJkaXNwbGF5X3R5cGUiOiJudW1iZXIiLCJ0cmFpdF90eXBlIjoiSUQiLCJ2YWx1ZSI6IgoifSx7InRyYWl0X3R5cGUiOiJIRVggSUQiLCJ2YWx1ZSI6IgoifSx7InRyYWl0X3R5cGUiOiJESUdJVFMiLCJ2YWx1ZSI6IgEifSx7ImRpc3BsYXlfdHlwZSI6ImRhdGUiLCJ0cmFpdF90eXBlIjoiTUlOVEVEIEFUIiwidmFsdWUiOiJjIn0scGF2aXRyYV19";
let check_token_uri_100_990: ByteArray =
"data:image/svg+xml;base64,eyJuYW1lIjoiUHJvZmlsZSAjZCIsImRlc2NyaXB0aW9uIjoiUHJvZmlsZSAjA94iLCJpbWFnZSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1qQXdJaUJvWldsbmFIUTlJakl3TUNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWo0OFkybHlZMnhsSUdONFBTSXhNREFpSUdONVBTSXhNREFpSUhJOUlqZ3dJaUJtYVd4c1BTSnlaV1FpTHo0OEwzTjJaejQ9IiwiYXR0cmlidXRlcyI6W3siZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6IklEIiwidmFsdWUiOiJkIn0seyJ0cmFpdF90eXBlIjoiSEVYIElEIiwidmFsdWUiOiJkIn0seyJ0cmFpdF90eXBlIjoiRElHSVRTIiwidmFsdWUiOiIBIn0seyJkaXNwbGF5X3R5cGUiOiJkYXRlIiwidHJhaXRfdHlwZSI6Ik1JTlRFRCBBVCIsInZhbHVlIjoiA94ifSxwYXZpdHJhXX0=";
assert_eq!(token_uri_1_3, check_token_uri_1_3);
assert_eq!(token_uri_10_99, check_token_uri_10_99);
assert_eq!(token_uri_100_990, check_token_uri_100_990);
}

0 comments on commit 46c6d5a

Please sign in to comment.