Ana içeriğe geç

Swaparoo Sözleşmesi

Bu akıllı sözleşme, iki tarafın karşılıklı olarak varlıklarını değiştirmesine olanak tanır ve bu süreçte bir tarafın belirlenen bir ücret ödemesi gerekmektedir. Sözleşme, feeAmount ve namesByAddressAdmin nesnesi ile başlatılır ve bu nesne, ikinci taraf için bir depozito yöneticisi almak amacıyla kullanılır.

NOT: namesByAddressAdmin, bu senaryoda aslında gereksiz bir yetki sunmaktadır. Normalde yalnızca okunabilir erişim namesByAddress üzerinden sağlanabilir. Bu örnekte namesByAddressAdmin kullanımının sebebi, yaklaşan bir güncellemeyle giderilecek olan bir hatadır.

Sözleşmenin nasıl çalıştığına bir göz atalım:

Ücret Yönetimini Ayarlama

Sözleşme, ücretler için kullanılan stabilize tokenin vericisidir ve bunu Zoe hizmetinden feeIssuer olarak alır. Sözleşme şartlarında belirtilen feeAmount temel alınarak bir feeSeat ve feeShape oluşturur.

const stableIssuer = await E(zcf.getZoeService()).getFeeIssuer();
const feeBrand = await E(stableIssuer).getBrand();
const { zcfSeat: feeSeat } = zcf.makeEmptySeatKit();
const feeShape = makeNatAmountShape(feeBrand, feeAmount.value);

İlk Davetiye Oluşturma

makeFirstInvitation fonksiyonu, bir dizi verici ile çağrılır. Bu vericilerin sözleşme şartlarının bir parçası olduğunu doğrular ve yeni vericileri sözleşmeye kaydeder. Ardından, feeShape'i içeren bir teklif şekli ile davetiye oluşturur.

const makeFirstInvitation = issuers => {
mustMatch(issuers, M.arrayOf(IssuerShape));
for (const i of issuers) {
if (!Object.values(zcf.getTerms().issuers).includes(i)) {
zcf.saveIssuer(i, `Issuer${(issuerNumber += 1)}`);
}
}
const proposalShape = M.splitRecord({
give: M.splitRecord({ Fee: feeShape })
});

const firstInvitation = zcf.makeInvitation(
makeSecondInvitation,
'swap oluştur',
undefined,
proposalShape
);
return firstInvitation;
};

İkinci Davetiye Oluşturma

Birinci taraf davetiyeyi kabul ettiğinde, makeSecondInvitation fonksiyonu çağrılır. Bu fonksiyon, namesByAddressAdmin nesnesini ve sağlanan adresi kullanarak ikinci taraf için depozito yöneticisini alır.

const makeSecondInvitation = async (firstSeat, offerArgs) => {
mustMatch(offerArgs, harden({ addr: M.string() }));
const { addr: secondPartyAddress } = offerArgs;

const secondDepositFacet = await E(depositFacetFromAddr).lookup(
secondPartyAddress,
'depositFacet'
);
// ...
};

Buradan itibaren, ikinci bir davetiye, ikinci tarafın teklifi birinci tarafın talepleriyle eşleşip eşleşmediğini kontrol eden bir teklif yöneticisi ile oluşturulur. Eğer eşleşiyorsa, swapWithFee fonksiyonu çağrılarak varlık takası gerçekleştirilir ve ücret toplanır.

const secondSeatOfferHandler = secondSeat => {
if (!matches(secondSeat.getProposal(), makeSecondProposalShape(want1))) {
// Uyuşmayan teklifler için işlem yap
return;
}

return swapWithFee(zcf, firstSeat, secondSeat, feeSeat, feeAmount);
};

const secondSeatInvitation = await zcf.makeInvitation(
secondSeatOfferHandler,
'teklifi eşleştir',
{ give: give1, want: want1 }
);

Takasın Gerçekleştirilmesi

swapWithFee fonksiyonu, varlık takası gerçekleştirmek ve ücreti toplamak için Zoe'den atomicRearrange fonksiyonunu kullanır. Varlıkları birinci koltuk, ikinci koltuk ve feeSeat arasında yeniden düzenler.

export const swapWithFee = (zcf, firstSeat, secondSeat, feeSeat, feeAmount) => {
const { Fee: _, ...firstGive } = firstSeat.getProposal().give;

atomicRearrange(
zcf,
harden([
[firstSeat, secondSeat, firstGive],
[secondSeat, firstSeat, secondSeat.getProposal().give],
[firstSeat, feeSeat, { Fee: feeAmount }]
])
);

firstSeat.exit();
secondSeat.exit();
return 'başarılı';
};

Ücretlerin Toplanması

Sözleşme ayrıca, feeSeat'de biriken ücretleri toplamak için bir makeCollectFeesInvitation yöntemi olan bir creatorFacet sağlar.

const creatorFacet = Far('Yaratıcı', {
makeCollectFeesInvitation() {
return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Ücret');
}
});

Video Geçişi

Herhangi iki tarafın dijital varlıkları minimum riskle takas etmesine olanak tanıyan tam Swaparoo Akıllı Sözleşmesi'nin kısa video geçişini izleyin.