مکانیزم برداشت سود فارم توسط کاربر و انتقال سود به کیف پول به صورت خودکار و بدون گس فی

سلام وقت بخیر
اگر با دکس هایی مثل پنکیک سواپ و امثالهم کار کرده باشید، مطلع هستید که بخشی به عنوان فارم دارن که با اینوست کردن دارایی سودی به کاربر تعلق میگیره. حالا وقتی کاربر میخواد سودش رو برداشت یا harvest کنه؛ مکانیزمی که من دیدم به این شکل هست که اگر فرضا کاربر با والت متامسکش کانکت شده باشه، بعد از کلیک بر روی دکمه برداشت، متامسکش باز میشه و کاربر باید یه گس پرداخت کنه. خب اینجا مشخصه که سیستم یک تابع از قرارداد هوشمند A رو فراخوانی کرده که مقداری رو منتقل نمیکنه و فقط یک وضعیت رو تغییر میده و گس اون رو کاربر پراخت میکنه. اینجا به نظر میرسه که اون تابع مقدار بالانس سود کاربر رو در فارم صفر میکنه و حالا باید اون n مقدار توکن به کیف پول کاربر منتقل بشه.
حالا سوال من اینجاست که برای انتقال n توکن از کیف پول مربوط به فارم به کیف پول کاربر به صورت خودکار، چه مکانیزمی انجام میگیره؟
مکانیزمی که من فکر میکنم انجام میشه به این شکل میتونه باشه که تابع فراخوانی شده در قرارداد هوشمند A توسط کاربر پس از پایان عملیاتش یک تابع از قرارداد B رو فراخوانی میکنه که همون مقدار توکن رو باید ترانسفر کنه. اگر این مکانیزم درسته مجوز لازم برای این انتقال چطوری به قرارداد B داده میشه و گس اون رو کی پرداخت میکنه؟

گس فی باید در هر صورت به شبکه پرداخت بشه، شبکه اجرای دستورات و محاسبات (opcodes) رو تنها با دریافت گس انجام میده. هر تغییری در state شبکه هم شامل پرداخت گس فی میشه.

دکس ها یا دپ ها هم دلیلی برای پرداخت گس فی برای کاربر ندارند و انتقال خودکار یک توکن در شبکه هم نیاز به ایجاد حلقه در کد قرارداد هوشمند داره و حتی اگر هم دکس بخواد گس فی رو پرداخت کنه، اجرای این حلقه در نهایت به دلیل block gas limit در مرحله ای متوقف میشه.

در کل بهترین شیوه به لحاظ امنیت قرارداد هوشمند هم برای عملیات های claim و harvest و عملیات های مشابه، این هست که کاربر تابع برداشت رو صدا بزنه و گس فی رو پرداخت کنه.

با تشکر از پاسخ شما.

سوال اصلی من اینجاست که کاربر چطور میتونه تابع برداشت رو اجرا کنه درحالی که نه owner قرارداد هست و نه بالانس داره.

فراخوانی تابع برداشت محدود به owner نمیشه.

در حالت خیلی ساده و مختصر ما یک مپینگ از آدرس به مقدار ریوارد داریم در قرارداد سالدیتی به این شکل:

mapping(address => uint256) public Rewards

مقدار ریوارد هر آدرس میتونه در این مپینگ ذخیره بشه و هر آدرس میتونه ریوارد مختص به خودش رو با فراخوانی تابع مربوطه claim کنه

1 پسندیده

ممنون از پاسخ و راهنمایی شما.
سوالی که برام مطرح شد الان اینه که این مپینگ و تابع مربوط به برداشت ریوارد در قرارداد هوشمند مربوط به توکن باید پیاده سازی بشه یا قرارداد جداگانه. در حالت واقعی ما یه توکن داریم فرضا xyz که طی یک قرارداد مربوط به خودش ایجاد شده و ما هم owner اون هستیم. حالا سود فارم هم به صورت توکن xyz باید محاسبه و پرداخت بشه. حالا این مپینگ و تابع ریوارد کجا باید پیاده سازی بشه؟ آیا میشه ما یه مقدار از توکن xyz رو به قرارداد فارم بدیم و ریواردها از اون محل پرداخت بشه؟

قراردادها جدا هستن. شما یه قرارداد برای توکن دارید که فقط یک توکن رو روی شبکه issure میکنه و وظیفه دیگه ای نداره و یک قرارداد یا یک سری قرارداد مربوط به فارم که شامل یک استخر از توکن شما هستن.
استخر در واقع یک قرارداد هست که مقادیری توکن رو در آدرس خودش نگه داری میکنه و قراردادهای فارم شما اجازه برداشت و واریز به استخر رو دارند.

برای درک بهتر میتونید قراردادهای فارم پنکیک سواپ رو در گیتهاب مطالعه کنید:

1 پسندیده

ممنون از شما دوست عزیز.
تا حد زیادی متوجه روابط بین قراردادها و طراحی سیستم شدم. به امید خدا میریم برای پیاده سازی اولیه و تست.