Ana içeriğe geç
Change page

ERC-1363 Ödenebilir Jeton Standardı

Sayfanın son güncellenmesi: 4 Nisan 2025

Giriş

ERC-1363 nedir?

ERC-1363, transferlerden sonra alıcı bir sözleşmede veya onaylardan sonra harcayan bir sözleşmede, tümü tek bir işlemde olmak üzere özel mantık yürütmeyi destekleyen ERC-20 jetonları için bir genişletme arayüzüdür.

ERC-20'den farkları

transfer, transferFrom ve approve gibi standart ERC-20 işlemleri, ayrı bir işlem olmaksızın alıcı veya harcayan sözleşmesinde kod yürütülmesine izin vermez. Bu durum, kullanıcı arayüzü geliştirmede karmaşıklığa ve benimsenmesinde zorluğa neden olur çünkü kullanıcıların ilk işlemin yürütülmesini beklemesi ve ardından ikinci işlemi göndermesi gerekir. Ayrıca iki kez GAZ ödemeleri gerekir.

ERC-1363, misli jetonların eylemleri daha kolay gerçekleştirmesini ve herhangi bir zincir dışı dinleyici kullanmadan çalışmasını sağlar. Tek bir işlemde, bir transferden veya onaydan sonra bir alıcı veya harcayan sözleşmesinde geri arama yapılmasına olanak tanır.

Ön Koşullar

Bu sayfayı daha iyi anlamak için önce şunları okumanızı öneririz:

Gövde

ERC-1363, ERC-20 jetonlarının transfer, transferFrom veya approve işlemlerinden sonra akıllı sözleşmelerle etkileşime girmesi için standart bir API sunar.

Bu standart, jetonları transfer etmek için temel işlevsellik sağlar, ayrıca jetonların zincir üzerindeki başka bir üçüncü tarafça harcanabilmesi için onaylanmasına ve ardından alıcı veya harcayan sözleşmesinde bir geri arama yapılmasına olanak tanır.

ERC-20 geri aramalarını kabul edebilen akıllı sözleşmeler için önerilen birçok kullanım alanı vardır.

Örneğin:

  • Kitle satışları: gönderilen jetonlar anında ödül dağıtımını tetikler.
  • Hizmetler: ödeme, hizmet erişimini tek adımda etkinleştirir.
  • Faturalar: jetonlar faturaları otomatik olarak öder.
  • Abonelikler: yıllık ücretin onaylanması, ilk ayın ödemesi dahilinde aboneliği etkinleştirir.

Bu nedenlerle başlangıçta "Ödenebilir Jeton" olarak adlandırılmıştır.

Geri arama davranışı, kullanım alanını daha da genişleterek şunlar gibi sorunsuz etkileşimleri mümkün kılar:

  • Hisseleme: transfer edilen jetonlar bir hisseleme sözleşmesinde otomatik kilitlemeyi tetikler.
  • Oylama: alınan jetonlar bir yönetişim sisteminde oyları kaydeder.
  • Takas: jeton onayları, takas mantığını tek adımda etkinleştirir.

ERC-1363 jetonları, alınan bir transfer veya onaydan sonra bir geri aramanın yürütülmesini gerektiren tüm durumlarda belirli yardımcı programlar için kullanılabilir. ERC-1363, alıcının jetonları işleme yeteneğini doğrulayarak akıllı sözleşmelerde jeton kaybını veya jeton kilitlenmesini önlemek için de kullanışlıdır.

Diğer ERC-20 genişletme önerilerinin aksine ERC-1363, ERC-20 transfer ve transferFrom yöntemlerini geçersiz kılmaz ve ERC-20 ile geriye dönük uyumluluğu koruyarak uygulanacak arayüz kimliklerini tanımlar.

EIP-1363'den (opens in a new tab):

Yöntemler

ERC-1363 standardını uygulayan akıllı sözleşmeler, ERC1363 arayüzündeki tüm fonksiyonların yanı sıra ERC20 ve ERC165 arayüzlerini de MUTLAKA uygulamalıdır.

1pragma solidity ^0.8.0;
2
3/**
4 * @title ERC1363
5 * @dev Tek bir işlemde, `transfer` veya `transferFrom` sonrası alıcı bir sözleşmede kod yürütmeyi veya `approve` sonrası harcayan bir sözleşmede kod yürütmeyi destekleyen ERC-20 jetonları için bir genişletme arayüzü.
6 */
7interface ERC1363 is ERC20, ERC165 {
8 /*
9 * NOT: bu arayüz için ERC-165 tanımlayıcısı 0xb0202a11'dir.
10 * 0xb0202a11 ===
11 * bytes4(keccak256('transferAndCall(address,uint256)')) ^
12 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
13 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
14 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
15 * bytes4(keccak256('approveAndCall(address,uint256)')) ^
16 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
17 */
18
19 /**
20 * @dev Çağıranın hesabından `to` adresine `value` miktarında jeton taşır
21 * ve ardından `to` üzerinde `ERC1363Receiver::onTransferReceived` fonksiyonunu çağırır.
22 * @param to Jetonların transfer edildiği adres.
23 * @param value Transfer edilecek jeton miktarı.
24 * @return Bir hata oluşmadığı sürece işlemin başarılı olduğunu gösteren bir boole değeri.
25 */
26 function transferAndCall(address to, uint256 value) external returns (bool);
27
28 /**
29 * @dev Çağıranın hesabından `to` adresine `value` miktarında jeton taşır
30 * ve ardından `to` üzerinde `ERC1363Receiver::onTransferReceived` fonksiyonunu çağırır.
31 * @param to Jetonların transfer edildiği adres.
32 * @param value Transfer edilecek jeton miktarı.
33 * @param data Belirtilen bir formatı olmayan, `to` adresine yapılan çağrıda gönderilen ek veriler.
34 * @return Bir hata oluşmadığı sürece işlemin başarılı olduğunu gösteren bir boole değeri.
35 */
36 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
37
38 /**
39 * @dev Ödenek mekanizmasını kullanarak `from` adresinden `to` adresine `value` miktarında jeton taşır
40 * ve ardından `to` üzerinde `ERC1363Receiver::onTransferReceived` fonksiyonunu çağırır.
41 * @param from Jetonların gönderileceği adres.
42 * @param to Jetonların transfer edildiği adres.
43 * @param value Transfer edilecek jeton miktarı.
44 * @return Bir hata oluşmadığı sürece işlemin başarılı olduğunu gösteren bir boole değeri.
45 */
46 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
47
48 /**
49 * @dev Ödenek mekanizmasını kullanarak `from` adresinden `to` adresine `value` miktarında jeton taşır
50 * ve ardından `to` üzerinde `ERC1363Receiver::onTransferReceived` fonksiyonunu çağırır.
51 * @param from Jetonların gönderileceği adres.
52 * @param to Jetonların transfer edildiği adres.
53 * @param value Transfer edilecek jeton miktarı.
54 * @param data Belirtilen bir formatı olmayan, `to` adresine yapılan çağrıda gönderilen ek veriler.
55 * @return Bir hata oluşmadığı sürece işlemin başarılı olduğunu gösteren bir boole değeri.
56 */
57 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
58
59 /**
60 * @dev Çağıranın jetonları üzerinde `spender` için `value` miktarında jetonu ödenek olarak ayarlar
61 * ve ardından `spender` üzerinde `ERC1363Spender::onApprovalReceived` fonksiyonunu çağırır.
62 * @param spender Fonları harcayacak adres.
63 * @param value Harcanacak jeton miktarı.
64 * @return Bir hata oluşmadığı sürece işlemin başarılı olduğunu gösteren bir boole değeri.
65 */
66 function approveAndCall(address spender, uint256 value) external returns (bool);
67
68 /**
69 * @dev Çağıranın jetonları üzerinde `spender` için `value` miktarında jetonu ödenek olarak ayarlar
70 * ve ardından `spender` üzerinde `ERC1363Spender::onApprovalReceived` fonksiyonunu çağırır.
71 * @param spender Fonları harcayacak adres.
72 * @param value Harcanacak jeton miktarı.
73 * @param data Belirtilen bir formatı olmayan, `spender` adresine yapılan çağrıda gönderilen ek veriler.
74 * @return Bir hata oluşmadığı sürece işlemin başarılı olduğunu gösteren bir boole değeri.
75 */
76 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
77}
78
79interface ERC20 {
80 event Transfer(address indexed from, address indexed to, uint256 value);
81 event Approval(address indexed owner, address indexed spender, uint256 value);
82 function transfer(address to, uint256 value) external returns (bool);
83 function transferFrom(address from, address to, uint256 value) external returns (bool);
84 function approve(address spender, uint256 value) external returns (bool);
85 function totalSupply() external view returns (uint256);
86 function balanceOf(address account) external view returns (uint256);
87 function allowance(address owner, address spender) external view returns (uint256);
88}
89
90interface ERC165 {
91 function supportsInterface(bytes4 interfaceId) external view returns (bool);
92}
Tümünü göster

transferAndCall veya transferFromAndCall aracılığıyla ERC-1363 jetonlarını kabul etmek isteyen bir akıllı sözleşme, ERC1363Receiver arayüzünü MUTLAKA uygulamalıdır:

1/**
2 * @başlık ERC1363Receiver
3 * @dev ERC-1363 jeton sözleşmelerinden `transferAndCall` veya `transferFromAndCall` desteklemek isteyen herhangi bir sözleşme için arayüz.
4 */
5interface ERC1363Receiver {
6 /**
7 * @dev ERC-1363 jetonları bu sözleşmeye `ERC1363::transferAndCall` veya `ERC1363::transferFromAndCall` aracılığıyla
8 * `operator` tarafından `from` adresinden transfer edildiğinde bu fonksiyon çağrılır.
9 *
10 * NOT: Transferi kabul etmek için bu,
11 * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))`
12 * (yani 0x88a7ca5c veya kendi fonksiyon seçicisi) döndürmelidir.
13 *
14 * @param operator `transferAndCall` veya `transferFromAndCall` fonksiyonunu çağıran adres.
15 * @param from Jetonların transfer edildiği adres.
16 * @param value Transfer edilen jeton miktarı.
17 * @param data Belirtilen bir formatı olmayan ek veriler.
18 * @return Bir hata oluşmadığı sürece transfere izin verilirse `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` döndürür.
19 */
20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);
21}
Tümünü göster

approveAndCall aracılığıyla ERC-1363 jetonlarını kabul etmek isteyen bir akıllı sözleşme, ERC1363Spender arayüzünü MUTLAKA uygulamalıdır:

1/**
2 * @başlık ERC1363Spender
3 * @dev ERC-1363 jeton sözleşmelerinden `approveAndCall` desteklemek isteyen herhangi bir sözleşme için arayüz.
4 */
5interface ERC1363Spender {
6 /**
7 * @dev Bir ERC-1363 jeton `sahibi` bu sözleşmeyi `ERC1363::approveAndCall` aracılığıyla
8 * jetonlarını harcamak için onayladığında bu fonksiyon çağrılır.
9 *
10 * NOT: Onayı kabul etmek için bu,
11 * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))`
12 * (yani 0x7b04a2d0 veya kendi fonksiyon seçicisi) döndürmelidir.
13 *
14 * @param owner `approveAndCall` fonksiyonunu çağıran ve daha önce jetonlara sahip olan adres.
15 * @param value Harcanacak jeton miktarı.
16 * @param data Belirtilen bir formatı olmayan ek veriler.
17 * @return Bir hata oluşmadığı sürece onaya izin verilirse `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` döndürür.
18 */
19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
20}
Tümünü göster

Daha fazla kaynak

Bu makale yararlı oldu mu?