Ana içeriğe geç

Konser Biletleri Satış Akıllı Sözleşmesi

Bu akıllı sözleşme, etkinlik biletlerini yarı fungible bir varlık biçiminde, fungible olmayan tokenler (NFT) olarak basmak ve satmak için tasarlanmıştır. Bu örnekte üç kategori veya bilet sınıfı bulunmaktadır:

  • Ön sıra biletleri en pahalı olanlardır.
  • Orta sıra biletleri pahalı ve ucuz koltuklar arasında bir fiyat aralığına sahiptir.
  • Arka sıra biletleri en düşük fiyatlıdır.

Not: Bu sözleşme, geleneksel ticareti yani bir satıcı ile bir tüketici arasındaki etkileşimi simüle etmektedir.

Amaç

Bu eğitimin aşağıdaki hedefleri vardır:

  • Bir akıllı sözleşme kurma konusunda temel bir rehber.
  • Agoric ortamında varlık ticaretini başlatma sürecini açıklamak; bu, varlıkların listelenmesi, fiyatlarının belirlenmesi vb. işlemleri içerir.
  • Ticaretin arkasındaki iş mantığını yöneten bir ticaret yöneticisi geliştirmek.

Sözleşme Kurulumu

Öncelikle, çeşitli varlık türleri hakkında temel bilgileri tutan bir inventory nesnesini göz önünde bulunduralım. Bu durumda, bu nesne bilet kategorilerini temsil eder. Bu nesne, her bilet türü için tradePrice ve her kategori için mevcut en fazla miktarı belirten maxTickets gibi kritik bilgileri içerir. Örneğin:

const inventory = {
frontRow: {
tradePrice: AmountMath.make(istBrand, 3n),
maxTickets: 3n
},
middleRow: {
tradePrice: AmountMath.make(istBrand, 2n),
maxTickets: 5n
},
backRow: {
tradePrice: AmountMath.make(istBrand, n),
maxTickets: n
}
};

Sözleşmemiz, süreci başlatmak için sağlanan inventory nesnesini bir parametre olarak alır. Sözleşme başlatıldıktan sonra, "Bilet" varlığı için yeni bir oluşturulur.

Not: AssetKind varlık türlerini ifade eder

Üç tür vardır. belirlemek için sağlanan belgelere başvurabilirsiniz.

Bizim örneğimizde, biletler fungible değil ve kopyaları olabiliyor, yani bir türden birçok bilet olabilir. Bu nedenle AssetKind.COPY_BAG kullanıyoruz.

const ticketMint = await zcf.makeZCFMint('Ticket', AssetKind.COPY_BAG);
const { brand: ticketBrand } = ticketMint.getIssuerRecord();

Varlığımız tanımlandıktan sonra, akıllı sözleşmemizin başında envanterimizi basacak ve bunu inventorySeat nesnesine tahsis edeceğiz. Bu, kullanıcının satın alabileceğinden daha fazlasını alıp almayacağını kontrol etmemizi sağlar. Bu, kullanarak yapılabilir.

Kodu daha iyi anlamak için:

, , ve hakkında bir göz atın.

const inventoryBag = makeCopyBag(
Object.entries(inventory).map(([ticket, { maxTickets }], _i) => [
ticket,
maxTickets
])
);
const toMint = {
Tickets: {
brand: ticketBrand,
value: inventoryBag
}
};
const inventorySeat = ticketMint.mintGains(toMint);

Bilet Ticareti

Etkinlik biletleri satın almak isteyen müşteriler, makeTradeInvitation kullanarak bilet ticareti yapmak için önce .

const makeTradeInvitation = () =>
zcf.makeInvitation(tradeHandler, 'buy tickets', undefined, proposalShape);

Burada iki önemli parametre görebilirsiniz:

  • tradeHandler: tradeHandler fonksiyonu, bir alıcı teklif yaptığında çağrılır. Bu fonksiyon, her ticareti işlerken takip edilecek sözleşmenin mantığını içerir ve doğru prosedürlerin izlendiğinden emin olur.
const tradeHandler = buyerSeat => {
const { give, want } = buyerSeat.getProposal();
// ... kontroller ve transferler
};
  • proposalShape (Opsiyonel): Bu nesne, her gerekli ve izin verilen unsurlarını outline eder. İşte bu sözleşme için teklif şekli:
const proposalShape = harden({
give: { Price: AmountShape },
want: { Tickets: { brand: ticketBrand, value: M.bag() } },
exit: M.any()
});

Ticaret Yöneticisi

tradeHandler fonksiyonu, ticareti karşılamak için yeterli bilet olup olmadığını kontrol ederek başlar:

AmountMath.isGTE(inventorySeat.getCurrentAllocation().Tickets, want.Tickets) ||
Fail`Yeterli envanter yok, ${q(want.Tickets)} istendi`;

Sonra, toplam fiyat bagPrice kullanılarak hesaplanır:

const totalPrice = bagPrice(want.Tickets.value, inventory);

Ardından, teklif edilen fiyatın yeterli olup olmadığını kontrol ederiz:

AmountMath.isGTE(give.Price, totalPrice) ||
Fail`Toplam fiyat ${q(totalPrice)}, ancak ${q(give.Price)} teklif edildi`;

Son olarak, gerekli ödemeyi almak için atomicRearrange çağrılabilir:

atomicRearrange(
zcf,
harden([
// alıcıdan gelir
[buyerSeat, proceeds, { Price: totalPrice }],
// envanterden alıcıya bilet
[inventorySeat, buyerSeat, want]
])
);

Bu örnek kodun tamamını inceleyebilirsiniz.

Bu eğitimi takip ederken, bu video yürüyüşünü izlemeniz faydalı olabilir: