-
Notifications
You must be signed in to change notification settings - Fork 31
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #107 from PavitraAgarwal21/main
implement get_token_uri in ProfileTokenUri module - issue #98
- Loading branch information
Showing
2 changed files
with
127 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |