Introduksjon til ERC-721: CryptoKitty Token

Cryptokitties viste oss at det å lage ERC-721-kompatible kryptokollektiver er kanskje veien å gå fremover når det gjelder utbredt mainstream-adopsjon. I denne guiden, la oss se på hva ERC-721 betyr og hvordan den fungerer.

For omtrent 10 måneder siden kom alle i kryptorommet inn i en av de merkeligste overskriftene noensinne.

Introduksjon til ERC-721: The CryptoKitty Token

Ideen om kryptokattunger er veldig enkel. Du lager din egen digitale katt på toppen av Ethereum blockchain, og så kan du ta vare på dem, avle dem, auksjonere dem osv. Folk tok til cryptokitties av flokkene, og snart begynte vanlige nyhetspublikasjoner å snakke om cryptokitties og ethereum.

Opprette tokenstandarder

I følge Ethereums nettsted, “Ethereum er en desentralisert plattform som kjører smarte kontrakter: applikasjoner som kjører akkurat som programmert uten mulighet for nedetid, sensur, svindel eller tredjepartsinnblanding. Disse appene kjører på en spesialbygd blockchain, en enorm kraftig delt global infrastruktur som kan flytte verdi og representere eierskapet til eiendom. ”

For å si det enkelt, Ethereum kommer til å bli en desentralisert super-datamaskin hvor alle, hvor som helst, kan leie litt beregningskraft og lage desentraliserte applikasjoner (Dapps) som kan kjøre på toppen av Ethereum-plattformen..

Disse Dappene drives av smarte kontrakter som er kodet ved hjelp av soliditetsprogrammeringsspråket. Disse smarte kontraktene kommer til å være selvutførende med spesifikke instruksjoner skrevet på koden, som blir utført når visse forhold er gjort.

Det er en annen ting som må redegjøres for når det gjelder funksjonen til disse desentraliserte applikasjonene.

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

Dapps er finansiert av ICO. ICO-er eller første mynttilbud er kryptovalutaversjonen av de første offentlige tilbudene eller børsnoteringene. Imidlertid, sammenlignet med børsnoteringer, er ICO-er mye mer gründervennlige. Så for å holde det kort når det gjelder ICO-er, gir utviklerne ut tokens i bytte for midler.

Et token er en representasjon av noe i dets spesielle økosystem. Det kan være verdi, innsats, stemmerett eller noe. Et symbol er ikke begrenset til en bestemt rolle; det kan oppfylle mange roller i sitt opprinnelige økosystem, for eksempel:

  • Bompenger: Et token kan fungere som en inngangsport til Dapp. I utgangspunktet, for å få tilgang til Dapp, må du holde tokens.

  • Stemmerettigheter: Tokene kan også kvalifisere innehaverne til å ha viss stemmerett. Tenk på EOS, hvis du holder EOS-tokens, kan du stemme på blokkprodusenter.

  • Verdibytte: Dette er en av de vanligste rollene til tokens i økosystemet. Tokens kan bidra til å skape et internt økonomisk system i applikasjonen.

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second
  • Forbedring av brukeropplevelse: Tokenet kan også gjøre det mulig for innehaverne å berike brukeropplevelsen innenfor rammen av det bestemte miljøet. F.eks. I Brave (en nettleser) vil innehavere av BAT (tokens brukt i Brave) få rettighetene til å berike kundeopplevelsen ved å bruke tokens til å legge til annonser eller andre oppmerksomhetsbaserte tjenester på Brave-plattformen..

  • Valuta: Kan brukes som en verdilager som kan brukes til å gjennomføre transaksjoner både innenfor og utenfor det gitte økosystemet.

Så nå vet vi viktigheten av tokens, men alle ICO-ene i de tidlige dagene sto overfor noen alvorlige hindringer.

Token Hindringer

I de første dagene virket det som om hvert eneste ICO-token prøvde å “gjenoppfinne hjulet” så langt som henrettelsen gjaldt. Hver og en av disse tokens hadde sin egen liste over funksjoner. Dette førte til en hel rekke nye problemer.

For å skape et sunt økosystem på toppen av Ethereum, er det helt essensielt at Dapps bygget på toppen av det kan samhandle med hverandre sømløst. Men hva vil skje hvis vi har to tokens, sier Token Alpha og Token Beta, og begge har forskjellige smarte kontraktsstrukturer?

For at de to tokens skal samhandle, må utviklerne nøye studere begge kontraktene sine og kartlegge nøyaktig hvordan disse tokens skal fungere med hverandre..

Nå lover dette ikke bra for skalerbarhet nå, gjør det?

Hvis det er 100 forskjellige tokens med 100 forskjellige kontrakter, vil det trenge en enorm mengde komplekse beregninger for å begrense alle kvalifikasjoner og betingelser som kreves for å sikre at overføringer kan gå gjennom mellom alle disse tokens. Dette er ikke et ideelt scenario i det hele tatt.

Noe måtte gjøres og 19. november 2015 kom Fabian Vogelsteller med en genial løsning.

I følge Wikipedia er ERC-20 en “liste over regler som et Ethereum-token må implementere, noe som gir utviklere muligheten til å programmere hvordan nye tokens vil fungere i Ethereum-økosystemet. ERC-20-tokenstandarden ble populær blant crowdfunding-selskaper som jobbet med ICO-saker (Initial Coin Offering) på grunn av enkel distribusjon, sammen med potensialet for interoperabilitet med andre Ethereum-tokenstandarder..”

For å holde det enkelt, er ERC-20 en guide med regler og forskrifter som vil bidra til å lage en plan for Ethereum-baserte smarte kontrakter for å lage tokens. “ERC” står for “Ethereum Request for Comment”, mens tallet ’20’ er nummeret som er tildelt denne forespørselen..

La oss se på hva som bygger grunnlaget for ERC20:

  • totalforsyning
  • balanse av
  • overføre
  • Overfør fra
  • vedta
  • godtgjørelse

Dette er reglene og funksjonene som ERC20-tokens obligatorisk må ha. Imidlertid kan de også ha følgende 3 valgfrie egenskaper.

  • Token Navn
  • Symbol
  • Desimal (opptil 18)

ERC-20-tokens er ansvarlige for tokenstandarder for alle ICO-ene der ute. Men siden de hovedsakelig brukes som betalingssystem, må ERC-20-tokens også ha en annen funksjon … .fungibility.

Hva er soppbarhet?

Mangel på soppbarhet er et stort problem som kryptokurver må løse.

I følge Investopedia, “Fungibility er en vare eller eiendels utskiftbarhet med andre individuelle varer eller eiendeler av samme type.

Så, hva er soppbart og hva som ikke er soppbart.

Hvis du låner 100 USD fra vennen din, og du returnerer dem en annen 100 dollar-seddel, er det helt greit. Faktisk kan du gi vennen din 2 50-dollar-sedler eller til og med 10 10-dollar-sedler. Det vil være helt greit fordi dollar (eller papirvalutaer generelt) for det meste er fungible.

På den annen side, hva med … et samleobjekt?

F.eks. Anta at du av en eller annen grunn tok Picasso-maleriet til vennen din for en dag? Nå, hva vil skje hvis du gir henne tilbake noe annet Picasso-maleri når du må returnere det? Enda verre, hva hvis du i stedet for å gi tilbake maleriet, gir du tilbake maleriet i mindre biter?

Uansett vil du være heldig hvis hun ikke ser deg ut.

Hvorfor er det slik??

I motsetning til valuta er malerier og alle slags samleobjekter ikke soppbare.

Valuta får faktisk mer verdi av sin soppbarhet. Jo mer ansett og akseptert en valuta er, jo flere mennesker vil bruke den, og dermed vil dens oppfattede verdi være mer.

Denne ligningen endres imidlertid fullstendig når du bytter ut valuta med samleobjekter. En samlerobjekt får bare verdien av sin unike og sjeldenhet.

Introduksjon til ERC-721: CryptoKitty Token

Dette baseballkortet fra 1952 til den legendariske Mickey Mantle gikk for hele 1,13 millioner dollar i en auksjon. Nå, ville det virkelig gått så mye om det var som 100 andre “Mickey Mantle 1952” -kort tilgjengelig?

Dette er her den grunnleggende grunnleggende forskjellen mellom ERC-20 og ERC-721.

ERC-721

ERC-721-tokenstandarden hjelper til med å lage ikke-fungible tokens. På mange måter er det ganske likt ERC-20 i funksjonalitet. Denne likheten eksisterer av to grunner:

  • For det første er det lettere for utviklere å gjøre overgangen. Siden alle etereumutviklere allerede er kjent med ERC-20, trenger de ikke å lære en rekke nye ting
  • Det gjør livet mye enklere for brukere som kan lagre disse tokens i vanlige lommebøker og bytte dem på børser.

ERC-721 får sine ikke-soppbare egenskaper ved å fange eierskapet til det aktuelle tokenet. Dette er grunnen til at takeOwnership-funksjoner er inkludert i ERC-721-standarden.

ERC-721 Funksjoner

ERC-721-standarden definerer følgende funksjoner: navn, symbol, totalforsyning, balansering av, eier av, godkjennelse, overtakelse, overføring, tokenOfOwnerByIndex og tokenMetadata. Den definerer også to hendelser: Overføring og godkjenning.

Før vi går inn i individuelle funksjonsdiskusjoner, må du vite hva vi mener med Token Ownership og Token Creation av ERC-721-funksjonene

Token Eierskap

Når du kjøper ERC-20-tokens, blir eierrettighetene dine skrevet i smarte kontrakter. Den smarte kontrakten har også data om hvor mye tokens hver adresse vil ha etter avtalen … og det er det. Saken er at disse kontraktene ikke trenger å bekymre seg for spesifikke tokens fordi de er soppbare, så de er de samme.

Verdien til ett ERC-721-token er imidlertid ikke den samme som et annet ERC-721-token på grunn av dets ikke-soppbarhet. Det vil ikke være nok å legge til en adresse og en saldo i kontrakten, et tokens unike eierinformasjon må også legges til.

Token Creation

Token Creation i ERC-20 tokens handler om balansen mellom tokens. Så alt du trenger å gjøre er å sette en øvre grense og sørge for at folk ikke kan opprette flere tokens enn den øvre grensen. Sammenlignet med det er ERC-721 tokenoppretting mye mer komplisert. ERC-721-standarden opprettholder en rekke tokens, og hvert eneste token blir lagt til arrayet hver for seg.

Kontrakten er definert slik:

kontrakt ERC721 {

// ERC20-kompatible funksjoner

funksjonsnavn () konstant retur (strengnavn);

funksjonssymbol () konstant retur (strengesymbol);

funksjon totalSupply () konstant retur (uint256 totalSupply);

funksjonsbalanseOf (adresse _eier) konstant retur (uint saldo);

// Funksjoner som definerer eierskap

funksjon ownerOf (uint256 _tokenId) konstant retur (adresse eier);

funksjon godkjenne (adresse _til, uint256 _tokenId);

funksjon takeOwnership (uint256 _tokenId);

funksjonsoverføring (adresse _to, uint256 _tokenId);

funksjon tokenOfOwnerByIndex (adresse _ eier, uint256 _index) konstant retur (uint tokenId);

// Token-metadata

funksjon tokenMetadata (uint256 _tokenId) konstant retur (streng infoUrl);

// Arrangementer

hendelse Overføring (adresseindeksert _fra, adresseindeksert _til, uint256 _tokenId);

hendelsesgodkjenning (adresseindeksert _eier, adresseindeksert _ godkjent, uint256 _tokenId);

}

La oss nå se på hver av disse funksjonene. Rop til Gerald Nash for dataen.

Nr. 1 navn ()

Denne funksjonen brukes til å definere navnet på tokenet til eksterne kontrakter og applikasjoner. La oss se hvordan dette fungerer.

kontrakt Blockgeeks {

funksjonsnavn () konstant returnerer (strengnavn) {

komme tilbake "Les Blockgeeks";

}

}

# 2 symbol ()

Symbol () -funksjonen hjelper med tokenidentifikasjon ved å opprette stenografi og symbol. Funksjonen gir også kompatibilitet med ERC20-tokenstandarden.

kontrakt Blockgeeks {

funksjonssymbol () konstant retur (strengesymbol) {

komme tilbake "BG";

}

}

# 3 totaltSupply ()

TotalSupply () -funksjonen definerer det totale antallet poletter som er tilgjengelige i kontrakten, og den returnerer også det totale antallet mynter som er tilgjengelige på blockchain. Tilgangen trenger ikke å være konstant.

kontrakt Blockgeeks {

// Dette kan være et vilkårlig nummer

uint256 private totalSupply = 1000000000;

funksjon totalSupply () konstant retur (uint256 supply) {

return totalSupply;

}

}

# 4 balanceOf ()

Denne funksjonen brukes til å finne antall tokens som en gitt adresse eier.

kontrakt Blockgeeks {

kartlegging (adresse => uint) private saldoer;

funksjonsbalanseOf (adresse _eier) konstant retur (uint saldo)

{

returbalanser [_eier];

}

}

Eierskap Funksjoner

Nå kommer vi til eierfunksjonene til ERC-721-tokens. De to spesielle områdene der ERC-721-tokens viser sin unike kvalitet, er eierskap og opprettelse. La oss se på begge disse områdene og hvordan både ERC-20 og ERC-721 gjør det i disse kategoriene.

Eierfunksjonene er som følger:

  • ownerOf ()
  • vedta()
  • ta eierskap()
  • overføre()
  • tokenOfOwnerByIndex ()

# 1 eier av ()

Hensikten med denne funksjonen er å returnere adressen til tokeneieren. Siden hvert ERC721-token ikke er soppbart og unikt, refereres det til blockchain via sin unike ID.

Man kan enkelt bestemme tokeneieren ved hjelp av IDen.

kontrakt Blockgeeks {

kartlegging (uint256 => adresse) private tokenEiere;

kartlegging (uint256 => bool) private tokenExists;

funksjons eierOf (uint256 _tokenId)

konstant retur (adresseeier) {

krever (tokenExists [_tokenId]);

returner tokenOwners [_tokenId];

}

}

# 2 godkjenner ()

Denne funksjonen godkjenner eller gir en annen enhet tillatelse til å overføre et token på eierens vegne.

La oss forstå dette med et eksempel.

Hvis Alice eier 1 BG, kan hun ringe godkjenningsfunksjonen til venninnen Bob. Når samtalen er vellykket, vil Bob ta fullt eierskap for å utføre operasjoner på tokenet på et senere tidspunkt på vegne av Alice.

kontrakt Blockgeeks {

kartlegging (adresse => kartlegging (adresse => uint256)) tillatt;

funksjon godkjenne (adresse _to, uint256 _tokenId) {

krever (msg.sender == ownerOf (_tokenId));

krever (msg.sender! = _to);

tillatt [msg.sender] [_ to] = _tokenId;

Godkjenning (msg.sender, _to, _tokenId);

}

}

# 3 takeOwnership ()

Ideen med takeOwnership () -funksjonen er å fungere som en tilbaketrekningsfunksjon. En ekstern part kan ringe den for å ta tokens ut av en annen brukers konto. Så hvis Alice tillater Bob å eie en viss mengde tokens og ønsker at han trekker disse tokens fra en annen brukers saldo, vil hun bruke takeOwnership () -funksjonen.

kontrakt Blockgeeks {

function takeOwnership (uint256 _tokenId) {

krever (tokenExists [_tokenId]);

adresse oldOwner = ownerOf (_tokenId);

adresse newOwner = msg.sender;

krever (newOwner! = oldOwner);

krever (tillatt [oldOwner] [newOwner] == _tokenId);

saldoer [oldOwner] – = 1;

tokenOwners [_tokenId] = newOwner;

saldi [newOwner] + = 1;

Overføring (oldOwner, newOwner, _tokenId);

}

}

# 4 overføring ()

Transfer () -funksjonen er en annen metode som brukes til å overføre tokens. Det lar eieren av tokenet sende det til en annen bruker, i likhet med en frittstående kryptovaluta. Denne overføringen kan bare igangsettes hvis mottakerkontoen tidligere er godkjent for å eie tokenet av den sendende kontoen.

kontrakt Blockgeeks {

kartlegging (adresse => kartlegging (uint256 => uint256)) privat eierTokens;

funksjon removeFromTokenList (adresseeier, uint256 _tokenId) privat {

for (uint256 i = 0; ownerTokens [eier] [i]! = _tokenId; i ++) {

ownerTokens [eier] [i] = 0;

}

}

funksjonsoverføring (adresse _to, uint256 _tokenId) {

adresse currentOwner = msg.sender;

adresse newOwner = _to;

krever (tokenExists [_tokenId]);

krever (currentOwner == ownerOf (_tokenId));

krever (currentOwner! = newOwner);

krever (newOwner! = adresse (0));

removeFromTokenList (_tokenId);

saldoer [oldOwner] – = 1;

tokenOwners [_tokenId] = newOwner;

saldi [newOwner] + = 1;

Overføring (oldOwner, newOwner, _tokenId);

}

}

# 5 tokenOfOwnerByIndex () [Valgfritt]

Hver ikke-fungible tokeneier kan eie mer enn ett token om gangen. Som vi har sagt, blir hvert eneste token referert til av sin unike ID, så det kan være veldig vanskelig for hver bruker å holde rede på de enkelte tokens de kan eie.

For å effektivisere denne prosessen og gjøre det mye enklere, holder kontrakten oversikt over IDene til hvert token hver bruker eier. På grunn av dette kan hvert enkelt token som eies av en bruker hentes av indeksen i listen (matrise) av tokens som eies av brukeren.

Funksjonen tokenOfOwnerByIndex lar oss hente et token i denne metoden.

kontrakt Blockgeeks {

kartlegging (adresse => kartlegging (uint256 => uint256)) privat eierTokens;

funksjon tokenOfOwnerByIndex (adresse _ eier, uint256 _index) konstant retur (uint tokenId) {

returnere eierTokens [_eier] [_ indeks];

}

}

Metadata

Metadata er et datasett som gir mer karakter og personlighet til hoveddataene. Metadata tjener mange viktige formål som databeskrivelse, datasurfing, dataoverføring, metadata har en viktig rolle i digital ressursadministrasjon. Metadata spiller en nøkkelrolle i det digitale informasjonssystemet.

I ERC-721 hjelper tokenMetada () -funksjonen med å definere tokens metadata.

kontrakt Blockgeeks {

kartlegging (uint256 => string) tokenLinks;

funksjon tokenMetadata (uint256 _tokenId) konstant retur (streng infoUrl) {

returner tokenLinks [_tokenId];

}

}

arrangementer

Arrangementer avfyres hver gang en kontrakt ringer dem, og de sendes til alle lytterprogrammer når de er sparket.

Programmer utenfor kontrakten lytter til hendelsene slik at de kan utføre koden i den så snart den er avfyrt. ERC-721-standarden tar for seg to hendelser:

  • Overføre()
  • Godkjenning()

# 1 Overføring

Hver gang et token skifter hender, blir denne hendelsen avfyrt. Hver gang et tokenes eierskap flytter fra en person til en annen, blir denne hendelsen avfyrt. Det beskriver følgende:

  • Hvilken konto sendte tokenet
  • Hvilken konto mottok token
  • Hvilket token ble overført (ved ID-kontroll)

<div stil ="bakgrunn: #ffffff; overflow: auto; width: auto; border: solid grey; border-width: .1em .1em .1em .8em; padding: .2em .6em;"><pre style ="margin: 0; linjehøyde: 125%">kontrakt Blockgeeks {

hendelsesgodkjenning (adresseindeksert _eier, adresseindeksert _ godkjent, uint256 _tokenId);

}

pre>div>

# 2 Godkjenning

Denne andre hendelsen utløses når en bruker tillater en annen bruker å ta eierskap til et bestemt token. Hendelsen beskriver hvilken konto som for øyeblikket eier tokenet og hvilken konto som får tillatelse til å eie det i fremtiden. Det sjekker også token ID for å vite hvilket bestemt token som er godkjent for å få eierskapet overført.

kontrakt Blockgeeks {

hendelsesgodkjenning (adresseindeksert _eier, adresseindeksert _ godkjent, uint256 _tokenId);

}

ERC-271 og fremtiden

Cryptokitties på sitt høydepunkt ble vel og viral. Faktisk var det på et tidspunkt den tredje mest gasssultne kontrakten på Ethereum.

Introduksjon til ERC-721: CryptoKitty Token

Imidlertid ble den for populær for sitt eget beste. Før lenge tilstoppet det Ethereum-nettverket helt, som rett og slett ikke var klar til å håndtere den enorme etterspørselen

Introduksjon til ERC-721: CryptoKitty Token

Ting ble så ille at Axiom, aka selskapet bak cryptokitties, ble tvunget til å øke fødselsgebyret. Dette sa de i sin mediumartikkel:

Spenningen og adopsjonen vi har sett denne uken har vært overveldende, og vi kunne ikke vært lykkeligere! Ethereum-nettverket er imidlertid fullstendig. Den eneste måten å hindre CryptoKitties i å halte, er å øke bensinprisene slik at alle transaksjoner kan fullføres raskt. Vi vet at økte priser vil bety at noen av dere må bremse avlsprogrammet, og det er vi utrolig skuffet over. Men hvem vet? Kanskje denne nedgangen vil bare bety at du vil elske kattungene du allerede har så mye mer.

Vi lærte to uvurderlige leksjoner fra hele denne episoden:

  • Ethereum er ikke klar for store Dapps (ennå)
  • Det er stor etterspørsel etter kryptosamleobjekter.

La oss utvide det andre punktet.

Vanlig adopsjon via ERC-721

La oss ikke glemme at Cryptokitties, en av de mest suksessfulle Dappene gjennom tidene, ikke løste noen problemer i økosystemet, og det førte heller ikke til revolusjonerende verktøy i systemet. Det er en enkel rekreasjonsapp som tillot brukere å vokse og avle sine egne kattunger.

Kanskje, dette der den sanne veien til vanlig adopsjon ligger.

Historien har lært oss at folk gjentatte ganger har omfavnet og tatt i bruk en ny teknologi via et kjøretøy som kanskje ikke hadde vært det tiltenkte målet (av disse teknologiene) i utgangspunktet.

La oss ta et ganske relevant eksempel.

Jeff Bezos, den rikeste mannen i verden, har en nettoverdi som overstiger $ 150 milliarder dollar. Han har skaffet seg sin rikdom ved å etablere Amazon, lett det største netthandelsnettstedet i verden.

Spillkonsollmarkedet er verdt $ 50 milliarder dollar og Sonys Playstation eier 53% av markedet dele. PlayStation bruker berømt Blu Blu-plater.

Den store populariteten til Amazon og PS4 skyldes alt det latterlige mainstream-vedtaket.

Kan du imidlertid gjette hva som gjorde e-handel og Blu Ray allment akseptert i utgangspunktet?

Pornografiindustrien.

Alvor. Slå det opp.

Vi er ganske sikre på at pornografibransjen ikke var det tiltenkte markedet for e-handel og Blu Ray da de begge startet.

ERC721 – Konklusjon

erc 721 og cryptokitties

ERC-721 samleobjekter har vist oss en bevist måte å få mainstream kryptoverføring. Det er imidlertid mye arbeid som må gjøres før vi kan gjøre det. Når det er sagt, har ideen om å lage ikke-soppbare samleobjekter på blockchain mye løfte, og det kommer til å bli mer og mer sofistikert over tid.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me