Altın Lira (XAL), değeri gram altına endekslenmiş, Ethereum tabanlı, ERC20 Standartlarında bir Token Kontratıdır. Temel yapısı ve transfer protokolü, Ethereum blokzinciri içerisindeki Akıllı Kontrat (Smart Contract) protokolüne göre oluşturulmuştur. Ve Ethereum tabanlı cüzdanlarda saklanır.
https://github.com/AltinLiraXAL/xal-contracts/blob/master/xal-whitepaper-v1.pdf
Kontratın abi dosyası AltinLiraXAL.abi
dir. Bu proxy kontratına entegre edilmiş bir ERC20 kontratıdır. Proxy kontratı 0x61561529350276b2d44227a078b248d52c67b1dc
adresinde tanımlıdır. Bytecode verifikasyonu alınmış bu kontratın tüm detaylarına ve bütün transaction bilgilerine, https://etherscan.io/address/0x61561529350276b2d44227a078b248d52c67b1dc adresinden ulaşabilirsiniz.
Altın Lira (XAL), Merkezi yönetimli,dondurulabilen, arzı kontrol edilebilen bir ERC20 Tokendır.
Genel arayüzü, EIP-20 tarafından belirtilen arayüzüdür.
name()
symbol()
decimals()
totalSupply()
balanceOf(address who)
transfer(address to, uint256 value)
approve(address spender, uint256 value)
allowance(address owner, address spender)
transferFrom(address from, address to, uint256 value)
Temel Eventler
event Transfer(address indexed from, address indexed to, uint256 value)
event Approval(address indexed owner, address indexed spender, uint256 value)
Bu kontratta, transfer
medotundaki temel olay, tokenın ödeme olarak gönderilmesidir. İlaveten transferFrom
ve approve
metodları ise, diğer bir hesabın, vekalet verilecek 3.bir tarafa ihtiyaç duyulmadan, hesaptaki tokenları, sanki 0x protocol gibi, adresinizden taşımasına, ödeme olarak göndermesine izin vermek için kullanılmaktadır.
Altın Lira (XAL) Kontratında,tokenın satın alınmasına, takas edilmesine ve itfa edilmesine yönelik taleplere ve gereksinimlere dayanarak, token basabilen ve yakabilen tek bir supplyController
adresi vardır. Bu adres başlangıçta owner
adresidir ve owner tarafından setSupplyController
fonksiyonu ile bu yetkiler başka bir adrese devredilebilir.
supplyController()
Arz Kontrol Eventleri
SupplyIncreased(address indexed to, uint256 value)
SupplyDecreased(address indexed from, uint256 value)
SupplyControllerSet(address indexed oldSupplyController, address indexed newSupplyController)
Kritik bir güvenlik tehdidi durumunda owner
, Altın Lira (XAL) kontratının tüm transferlerini ve onaylarını duraklatma yeteneğine sahiptir. Duraklatma yetkisi sadece ona aittir.
Bunun için OpenZeppelin sisteminde hazır bulunan, Ownable ve Pausable modelleri kullanılmıştır.
Altın Lira (XAL) Kontratında, Ethereum Ağındaki işlem ücretlerini dengelemek için, tüm Altın Lira (XAL) zincir üstü transferleri için belirli bir ücret uygulama özelliği de bulunmaktadır.
Ücret kontrolörü, ücret alıcısını ve ücret oranını ayarlama yetkisine sahiptir. Temel işlem ücreti başlangıç ayarların da 0 (Sıfır) olarak belirlenmiştir.
Başlangıçta ücret kontrolörü owner
dır. İşlem ücretlerini setFeeRate
fonksiyonu ile düzenler.
Gerekirse setFeeController
fonksiyonuyla yeni bir yetkili atanabilir. Normalde işlem ücretleri owner hesabına aktarılır. Ve setFeeRecipient
fonksiyonuyla, işlem ücretlerinin toplanacağı ayrı bir hesap tanımlanabilir.
Eğer yetkili merciler tarafından, kontrat sahibine, yasadışı bir aktivite, para aklama yada birine ait bir hesabın kötü niyetli kişilerce ele geçirilmesi gibi bir olayla ilgili, mahkeme emri veya yasal bir uyarı yapılırsa, yönetici, bahsi geçen hesabı dondurabilir.
Bu yetki başlangıçta kimseye ait değildir. Yönetici yani owner
, setAssetProtectionRole
fonksiyonu ile bu yetkiyi kendisine yada başka bir adrese devredilebilir. Varlık koruma yetkisi özellikleri, Kontratta bulunan freeze
ve unfreeze
fonksiyonlarıyla kontrol edilir.
Bu yetki sadece yasal bir emir ve uyarı sonucunda uygulanacaktır.
Kontrat yöneticisi başlangıçta, kontratı migrate eden hesaptır. Bu owner
hesabı ,eğer isterse tüm yönetim yetkilerini başka bir hesaba devredebilir. Bunun için proposeOwner
fonksiyonu ile ilgili hesaba yöneticilik teklifini başlatır. İlgili hesap, kontratı interact edip claimOwnership
fonksiyonunu calıştırarak bunu kabul edebilir. Yada disregardProposeOwner
fonksiyonunu çalıştırıp red eder.
Yeni hesap teklifi onayladıktan hemen sonra owner olacaktır. Eğer bu yeni owner, token yaratma ve silme yetkilerini de almak isterse, önce setSupplyController
fonksiyonuyla bu yetkiyi kendi hesabına aktarmak zorundadır. Çünkü bu yetki, başlangıçta kontratı migrate eden hesaba aittir. Bu özelliğide aldıktan sonra, yeni hesap tam anlamıyla tüm yetkilerin sahibi olur.
Değişmez blokzincir yapısı içinde, güncellenebilir bir kontrat oluşturabilmek için, İki Sözleşmeli Yöntem kullanılmıştır. Bu yapı dahilinde, proxy storage içindeki temel kontrat kodu çalıştırılır.
Çalıştırılan yeni kontratın içindeki eski metod ve yapılar korunur ve değiştirilen yapı ve fonksiyonlar ise güncellenir. Bu sayede proxy kontrat bazında, esas kontrat adresi değişmeden, aynı ayarlara sahip ama daha güncel, hatalardan arındırılmış yeni bir entegre kontrat aktive edilebilir. Sonuçta, Blokzincir üzerinde hiçbir hata ve aksama olmadan güncelleme yapılmış olur.
Bunun için ZeppelinOS Framework içinde hazır halde bulunan AdminUpgradeabilityProxy
modeli kullanılmıştır.
https://github.com/OpenZeppelin/openzeppelin-sdk/tree/master/packages/lib/contracts/upgradeability
Entegre edilen kontrat non-admin mantığıyla kullanılmaktadır. Yeni entegre edilecek kontrat, proxy kontratındaki upgradeTo()
metodu çağrılarak tamamen yeni yada kısmen güncellenmiş olarak eskisiyle birleştirilir.
Bytecode onayı almış; Proxy kontrat ve entegre edilmiş kontrat, https://etherscan.io/address/0x61561529350276b2d44227a078b248d52c67b1dc adresindeki Contract
butonunun altındadır.
İlk olarak lokal Ethereum ağı olan Ganache çalıştırılır.
ganache-cli
Başka bir terminal penceresi açılır.
Ve aşağıdaki kod çalıştırılır
yarn test
Coverage Raporu için, ayrıca yarn coverage
kodu çalıştırılabilir.