Skip to content

Instantly share code, notes, and snippets.

@rgottleber
Last active May 6, 2022 16:21
Show Gist options
  • Save rgottleber/7485cd73a356eb1d543730eb677e006e to your computer and use it in GitHub Desktop.
Save rgottleber/7485cd73a356eb1d543730eb677e006e to your computer and use it in GitHub Desktop.
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract EmojiGotchi is ERC721, ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor() ERC721("EmojiGotchi", "emg") {}
function safeMint(address to) public {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
_setTokenURI(tokenId, tokenURI(tokenId));
}
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId)
internal
override(ERC721, ERC721URIStorage)
{
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
}
data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzEwMCUnIHZpZXdCb3g9JzAgMCA4MDAgODAwJz48cmVjdCBmaWxsPScjZmZmZmZmJyB3aWR0aD0nODAwJyBoZWlnaHQ9JzgwMCcvPjxkZWZzPjxyYWRpYWxHcmFkaWVudCBpZD0nYScgY3g9JzQwMCcgY3k9JzQwMCcgcj0nNTAuMSUnIGdyYWRpZW50VW5pdHM9J3VzZXJTcGFjZU9uVXNlJz48c3RvcCAgb2Zmc2V0PScwJyBzdG9wLWNvbG9yPScjZmZmZmZmJy8+PHN0b3AgIG9mZnNldD0nMScgc3RvcC1jb2xvcj0nIzBFRicvPjwvcmFkaWFsR3JhZGllbnQ+PHJhZGlhbEdyYWRpZW50IGlkPSdiJyBjeD0nNDAwJyBjeT0nNDAwJyByPSc1MC40JScgZ3JhZGllbnRVbml0cz0ndXNlclNwYWNlT25Vc2UnPjxzdG9wICBvZmZzZXQ9JzAnIHN0b3AtY29sb3I9JyNmZmZmZmYnLz48c3RvcCAgb2Zmc2V0PScxJyBzdG9wLWNvbG9yPScjMEZGJy8+PC9yYWRpYWxHcmFkaWVudD48L2RlZnM+PHJlY3QgZmlsbD0ndXJsKCNhKScgd2lkdGg9JzgwMCcgaGVpZ2h0PSc4MDAnLz48ZyBmaWxsLW9wYWNpdHk9JzAuNSc+PHBhdGggZmlsbD0ndXJsKCNiKScgZD0nTTk5OC43IDQzOS4yYzEuNy0yNi41IDEuNy01Mi43IDAuMS03OC41TDQwMSAzOTkuOWMwIDAgMC0wLjEgMC0wLjFsNTg3LjYtMTE2LjljLTUuMS0yNS45LTExLjktNTEuMi0yMC4zLTc1LjhMNDAwLjkgMzk5LjdjMCAwIDAtMC4xIDAtMC4xbDUzNy4zLTI2NWMtMTEuNi0yMy41LTI0LjgtNDYuMi0zOS4zLTY3LjlMNDAwLjggMzk5LjVjMCAwIDAtMC4xLTAuMS0wLjFsNDUwLjQtMzk1Yy0xNy4zLTE5LjctMzUuOC0zOC4yLTU1LjUtNTUuNWwtMzk1IDQ1MC40YzAgMC0wLjEgMC0wLjEtMC4xTDczMy40LTk5Yy0yMS43LTE0LjUtNDQuNC0yNy42LTY4LTM5LjNsLTI2NSA1MzcuNGMwIDAtMC4xIDAtMC4xIDBsMTkyLjYtNTY3LjRjLTI0LjYtOC4zLTQ5LjktMTUuMS03NS44LTIwLjJMNDAwLjIgMzk5YzAgMC0wLjEgMC0wLjEgMGwzOS4yLTU5Ny43Yy0yNi41LTEuNy01Mi43LTEuNy03OC41LTAuMUwzOTkuOSAzOTljMCAwLTAuMSAwLTAuMSAwTDI4Mi45LTE4OC42Yy0yNS45IDUuMS01MS4yIDExLjktNzUuOCAyMC4zbDE5Mi42IDU2Ny40YzAgMC0wLjEgMC0wLjEgMGwtMjY1LTUzNy4zYy0yMy41IDExLjYtNDYuMiAyNC44LTY3LjkgMzkuM2wzMzIuOCA0OTguMWMwIDAtMC4xIDAtMC4xIDAuMUw0LjQtNTEuMUMtMTUuMy0zMy45LTMzLjgtMTUuMy01MS4xIDQuNGw0NTAuNCAzOTVjMCAwIDAgMC4xLTAuMSAwLjFMLTk5IDY2LjZjLTE0LjUgMjEuNy0yNy42IDQ0LjQtMzkuMyA2OGw1MzcuNCAyNjVjMCAwIDAgMC4xIDAgMC4xbC01NjcuNC0xOTIuNmMtOC4zIDI0LjYtMTUuMSA0OS45LTIwLjIgNzUuOEwzOTkgMzk5LjhjMCAwIDAgMC4xIDAgMC4xbC01OTcuNy0zOS4yYy0xLjcgMjYuNS0xLjcgNTIuNy0wLjEgNzguNUwzOTkgNDAwLjFjMCAwIDAgMC4xIDAgMC4xbC01ODcuNiAxMTYuOWM1LjEgMjUuOSAxMS45IDUxLjIgMjAuMyA3NS44bDU2Ny40LTE5Mi42YzAgMCAwIDAuMSAwIDAuMWwtNTM3LjMgMjY1YzExLjYgMjMuNSAyNC44IDQ2LjIgMzkuMyA2Ny45bDQ5OC4xLTMzMi44YzAgMCAwIDAuMSAwLjEgMC4xbC00NTAuNCAzOTVjMTcuMyAxOS43IDM1LjggMzguMiA1NS41IDU1LjVsMzk1LTQ1MC40YzAgMCAwLjEgMCAwLjEgMC4xTDY2LjYgODk5YzIxLjcgMTQuNSA0NC40IDI3LjYgNjggMzkuM2wyNjUtNTM3LjRjMCAwIDAuMSAwIDAuMSAwTDIwNy4xIDk2OC4zYzI0LjYgOC4zIDQ5LjkgMTUuMSA3NS44IDIwLjJMMzk5LjggNDAxYzAgMCAwLjEgMCAwLjEgMGwtMzkuMiA1OTcuN2MyNi41IDEuNyA1Mi43IDEuNyA3OC41IDAuMUw0MDAuMSA0MDFjMCAwIDAuMSAwIDAuMSAwbDExNi45IDU4Ny42YzI1LjktNS4xIDUxLjItMTEuOSA3NS44LTIwLjNMNDAwLjMgNDAwLjljMCAwIDAuMSAwIDAuMSAwbDI2NSA1MzcuM2MyMy41LTExLjYgNDYuMi0yNC44IDY3LjktMzkuM0w0MDAuNSA0MDAuOGMwIDAgMC4xIDAgMC4xLTAuMWwzOTUgNDUwLjRjMTkuNy0xNy4zIDM4LjItMzUuOCA1NS41LTU1LjVsLTQ1MC40LTM5NWMwIDAgMC0wLjEgMC4xLTAuMUw4OTkgNzMzLjRjMTQuNS0yMS43IDI3LjYtNDQuNCAzOS4zLTY4bC01MzcuNC0yNjVjMCAwIDAtMC4xIDAtMC4xbDU2Ny40IDE5Mi42YzguMy0yNC42IDE1LjEtNDkuOSAyMC4yLTc1LjhMNDAxIDQwMC4yYzAgMCAwLTAuMSAwLTAuMUw5OTguNyA0MzkuMnonLz48L2c+PHRleHQgeD0nNTAlJyB5PSc1MCUnIGNsYXNzPSdiYXNlJyBkb21pbmFudC1iYXNlbGluZT0nbWlkZGxlJyB0ZXh0LWFuY2hvcj0nbWlkZGxlJyBmb250LXNpemU9JzhlbSc+8J+
'kqTwvdGV4dD48L3N2Zz4=',
'YgTwvdGV4dD48L3N2Zz4=',
'YkDwvdGV4dD48L3N2Zz4=',
'YoTwvdGV4dD48L3N2Zz4=',
'SgDwvdGV4dD48L3N2Zz4='
@tippi-fifestarr
Copy link

great flexibility and sharing tool, 👯 !

@maestroh1git
Copy link

Actually!

@0xsha1man
Copy link

0xsha1man commented May 6, 2022

This workshop inspired me to start learning in-depth how the SVG XML is structured tonight. It felt like the emojis really should be in an "egg". So I grabbed Richard's original starburst background and threw an egg-shaped ellipse on top, shaded it around the edges, and then threw the emojis back on top. The sunburst gradient effect got shifted around due to making the sizes different to accommodate the egg... I figured out what happened but by then I already put too much time into this haha. Since it is SVG, there are many JS libraries out there that can let you manipulate the XML during runtime. You could in theory do something like

  • Recreate the whole thing dynamically with the attributes so no storing of the images at all on the blockchain...
  • Store a default copy of the image, such as the egg shape and the sunburst (its really just a mask over the background to give the illusion of the rays. So change the solid background to gray if it is dead, and switch out to the skull emoji
  • You could animate the whole thing by rotating the sunburst
  • Make the emoji pace and hop around when happy or fed

It really leads to many different things. Thank you for the inspiration!

Anyways for those who would like the base64 encoding for it here it is.

PHN2Zw0KICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDQogIHdpZHRoPSI1MDAiDQogIGhlaWdodD0iNTAwIg0KICB2aWV3Ym94PSIwIDAgODAwIDgwMCINCiAgbWltZS10eXBlPSJpbWFnZS9zdmcreG1sIg0KPg0KICA8ZGVmcz4NCiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImVnZ0dyYWRpZW50Ij4NCiAgICAgIDxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiAvPg0KICAgICAgPHN0b3Agb2Zmc2V0PSI5NSUiIHN0b3AtY29sb3I9IiNlZGVkZWQiIC8+DQogICAgPC9yYWRpYWxHcmFkaWVudD4NCiAgICA8cmFkaWFsR3JhZGllbnQgaWQ9ImEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgLz4NCiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzBFRiIgLz4NCiAgICA8L3JhZGlhbEdyYWRpZW50Pg0KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iYiIgcng9IjEwMCUiIHJ5PSIxMDAlIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiIC8+DQogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwRkYiIC8+DQogICAgPC9yYWRpYWxHcmFkaWVudD4NCiAgICA8Y2xpcFBhdGggaWQ9ImVnZyI+DQogICAgICA8ZWxsaXBzZSBjeD0iNTAlIiBjeT0iNTAlIiByeD0iNDAlIiByeT0iNDglIiBmaWxsPSJ1cmwoI2VnZ0dyYWRpZW50KSIgLz4NCiAgICA8L2NsaXBQYXRoPg0KICA8L2RlZnM+DQogIDxyZWN0IGZpbGw9InVybCgjYSkiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIC8+DQogIDxnIGZpbGwtb3BhY2l0eT0iMC44Ij4NCiAgICA8cGF0aA0KICAgICAgZmlsbD0idXJsKCNiKSINCiAgICAgIGQ9Ik05OTguNyA0MzkuMmMxLjctMjYuNSAxLjctNTIuNyAwLjEtNzguNUw0MDEgMzk5LjljMCAwIDAtMC4xIDAtMC4xbDU4Ny42LTExNi45Yy01LjEtMjUuOS0xMS45LTUxLjItMjAuMy03NS44TDQwMC45IDM5OS43YzAgMCAwLTAuMSAwLTAuMWw1MzcuMy0yNjVjLTExLjYtMjMuNS0yNC44LTQ2LjItMzkuMy02Ny45TDQwMC44IDM5OS41YzAgMCAwLTAuMS0wLjEtMC4xbDQ1MC40LTM5NWMtMTcuMy0xOS43LTM1LjgtMzguMi01NS41LTU1LjVsLTM5NSA0NTAuNGMwIDAtMC4xIDAtMC4xLTAuMUw3MzMuNC05OWMtMjEuNy0xNC41LTQ0LjQtMjcuNi02OC0zOS4zbC0yNjUgNTM3LjRjMCAwLTAuMSAwLTAuMSAwbDE5Mi42LTU2Ny40Yy0yNC42LTguMy00OS45LTE1LjEtNzUuOC0yMC4yTDQwMC4yIDM5OWMwIDAtMC4xIDAtMC4xIDBsMzkuMi01OTcuN2MtMjYuNS0xLjctNTIuNy0xLjctNzguNS0wLjFMMzk5LjkgMzk5YzAgMC0wLjEgMC0wLjEgMEwyODIuOS0xODguNmMtMjUuOSA1LjEtNTEuMiAxMS45LTc1LjggMjAuM2wxOTIuNiA1NjcuNGMwIDAtMC4xIDAtMC4xIDBsLTI2NS01MzcuM2MtMjMuNSAxMS42LTQ2LjIgMjQuOC02Ny45IDM5LjNsMzMyLjggNDk4LjFjMCAwLTAuMSAwLTAuMSAwLjFMNC40LTUxLjFDLTE1LjMtMzMuOS0zMy44LTE1LjMtNTEuMSA0LjRsNDUwLjQgMzk1YzAgMCAwIDAuMS0wLjEgMC4xTC05OSA2Ni42Yy0xNC41IDIxLjctMjcuNiA0NC40LTM5LjMgNjhsNTM3LjQgMjY1YzAgMCAwIDAuMSAwIDAuMWwtNTY3LjQtMTkyLjZjLTguMyAyNC42LTE1LjEgNDkuOS0yMC4yIDc1LjhMMzk5IDM5OS44YzAgMCAwIDAuMSAwIDAuMWwtNTk3LjctMzkuMmMtMS43IDI2LjUtMS43IDUyLjctMC4xIDc4LjVMMzk5IDQwMC4xYzAgMCAwIDAuMSAwIDAuMWwtNTg3LjYgMTE2LjljNS4xIDI1LjkgMTEuOSA1MS4yIDIwLjMgNzUuOGw1NjcuNC0xOTIuNmMwIDAgMCAwLjEgMCAwLjFsLTUzNy4zIDI2NWMxMS42IDIzLjUgMjQuOCA0Ni4yIDM5LjMgNjcuOWw0OTguMS0zMzIuOGMwIDAgMCAwLjEgMC4xIDAuMWwtNDUwLjQgMzk1YzE3LjMgMTkuNyAzNS44IDM4LjIgNTUuNSA1NS41bDM5NS00NTAuNGMwIDAgMC4xIDAgMC4xIDAuMUw2Ni42IDg5OWMyMS43IDE0LjUgNDQuNCAyNy42IDY4IDM5LjNsMjY1LTUzNy40YzAgMCAwLjEgMCAwLjEgMEwyMDcuMSA5NjguM2MyNC42IDguMyA0OS45IDE1LjEgNzUuOCAyMC4yTDM5OS44IDQwMWMwIDAgMC4xIDAgMC4xIDBsLTM5LjIgNTk3LjdjMjYuNSAxLjcgNTIuNyAxLjcgNzguNSAwLjFMNDAwLjEgNDAxYzAgMCAwLjEgMCAwLjEgMGwxMTYuOSA1ODcuNmMyNS45LTUuMSA1MS4yLTExLjkgNzUuOC0yMC4zTDQwMC4zIDQwMC45YzAgMCAwLjEgMCAwLjEgMGwyNjUgNTM3LjNjMjMuNS0xMS42IDQ2LjItMjQuOCA2Ny45LTM5LjNMNDAwLjUgNDAwLjhjMCAwIDAuMSAwIDAuMS0wLjFsMzk1IDQ1MC40YzE5LjctMTcuMyAzOC4yLTM1LjggNTUuNS01NS41bC00NTAuNC0zOTVjMCAwIDAtMC4xIDAuMS0wLjFMODk5IDczMy40YzE0LjUtMjEuNyAyNy42LTQ0LjQgMzkuMy02OGwtNTM3LjQtMjY1YzAgMCAwLTAuMSAwLTAuMWw1NjcuNCAxOTIuNmM4LjMtMjQuNiAxNS4xLTQ5LjkgMjAuMi03NS44TDQwMSA0MDAuMmMwIDAgMC0wLjEgMC0wLjFMOTk4LjcgNDM5LjJ6Ig0KICAgIC8+DQogIDwvZz4NCiAgPHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgY2xpcC1wYXRoPSJ1cmwoI2VnZykiIC8+DQogIDxlbGxpcHNlDQogICAgY3g9IjUwJSINCiAgICBjeT0iNTAlIg0KICAgIHJ4PSI0MCUiDQogICAgcnk9IjQ4JSINCiAgICBmaWxsPSJ1cmwoI2VnZ0dyYWRpZW50KSINCiAgICBzdHlsZT0ic3Ryb2tlOiAjOGQ4ZDhkOyBzdHJva2Utd2lkdGg6IDI7Ig0KICAvPg0KICBTb3JyeSwgeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lIFNWRy4NCg0KICA8dGV4dA0KICAgIHg9IjUwJSINCiAgICB5PSI1MCUiDQogICAgY2xhc3M9ImJhc2UiDQogICAgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSINCiAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIg0KICAgIGZvbnQtc2l6ZT0iOGVtIg0KICA+DQogICAg8J+

Then add to the end of it the following base64 strings for the different emojis...

💀
SgA0KICA8L3RleHQ+DQo8L3N2Zz4=

😡
YoQ0KICA8L3RleHQ+DQo8L3N2Zz4=

😐
YkA0KICA8L3RleHQ+DQo8L3N2Zz4=

😁
YgQ0KICA8L3RleHQ+DQo8L3N2Zz4=

🤩
kqQ0KICA8L3RleHQ+DQo8L3N2Zz4=

Example:

@tippi-fifestarr
Copy link

🤩🤩🤩🤩🤩

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment