สัญญาสำหรับ GMX Synthetics
ส่วนนี้จะแสดงภาพรวมทั่วไปเกี่ยวกับวิธีการทำงานของระบบ
สำหรับภาพรวมด้านเทคนิค โปรดดูส่วนเพิ่มเติมด้านล่าง
ตลาดรองรับทั้งการซื้อขายแบบทันทีและแบบ Perp ซึ่งถูกสร้างขึ้นโดยการระบุโทเค็นหลักประกันแบบยาว โทเค็นหลักประกันแบบสั้น และโทเค็นดัชนี
ตัวอย่าง:
ผู้ให้บริการสภาพคล่องสามารถฝากโทเค็นหลักประกันแบบยาวหรือแบบสั้นหรือทั้งสองอย่างเพื่อสร้างโทเค็นสภาพคล่อง
โทเค็นหลักประกันแบบยาวใช้เพื่อสำรองตำแหน่งซื้อ ในขณะที่โทเค็นหลักประกันแบบสั้นใช้เพื่อสำรองตำแหน่งขาย
ผู้ให้บริการสภาพคล่องรับผลกำไรและขาดทุนของเทรดเดอร์ในตลาดที่พวกเขาจัดหาสภาพคล่องให้
การมีตลาดที่แยกจากกันทำให้สามารถแยกความเสี่ยงได้ ผู้ให้บริการสภาพคล่องจะเปิดเผยเฉพาะตลาดที่พวกเขาฝากเข้าไปเท่านั้น ซึ่งอาจอนุญาตให้มีรายการโดยไม่ได้รับอนุญาต
เทรดเดอร์สามารถใช้โทเค็นแบบยาวหรือแบบสั้นเป็นหลักประกันสำหรับตลาดได้
สัญญารองรับคุณสมบัติหลักดังต่อไปนี้:
เพื่อหลีกเลี่ยงปัญหาที่ต้องดำเนินการล่วงหน้า การดำเนินการส่วนใหญ่จำเป็นต้องมีสองขั้นตอนในการดำเนินการ:
ราคาจัดทำโดยระบบออราเคิลนอกเครือข่าย ซึ่งจะลงนามราคาอย่างต่อเนื่องตามเวลาที่มีการสอบถามราคา
มีการลงนามทั้งราคาขั้นต่ำและราคาสูงสุด ซึ่งช่วยให้สามารถรวมข้อมูลเกี่ยวกับสเปรดราคาเสนอซื้อ-ถามได้
ราคาที่จัดเก็บไว้ในสัญญาของ Oracle แสดงถึงราคาของโทเค็นหนึ่งหน่วยโดยใช้ค่าที่มีทศนิยม 30 ตำแหน่ง
การแสดงราคาในลักษณะนี้ช่วยให้การแปลงระหว่างจำนวนโทเค็นและมูลค่าคำสั่งทำได้ง่ายขึ้น เช่น ในการคำนวณมูลค่าคำสั่งของจำนวนโทเค็นที่กำหนด การคำนวณจะเป็นดังนี้: จำนวนโทเค็น * ราคาออราเคิล เพื่อคำนวณจำนวนโทเค็นสำหรับ มูลค่าคำสั่ง มันจะเป็น: มูลค่าคำสั่ง / ราคาออราเคิล
ค่าธรรมเนียมเงินทุนและผลกระทบด้านราคาทำให้ long / short สมดุลในขณะที่ลดความเสี่ยงจากการปั่นราคา
มีผู้ดูแลและโหนดไม่กี่ตัวในระบบ:
สัญญามีหลายประเภทหลัก:
สัญญาจะแยกออกเป็นประเภทเหล่านี้เพื่อให้สามารถอัปเกรดได้ทีละน้อย
ข้อมูลส่วนใหญ่ถูกจัดเก็บโดยใช้สัญญา DataStore
*สัญญา storeUtils จัดเก็บข้อมูลโครงสร้างโดยใช้ DataStore ซึ่งอนุญาตให้เพิ่มคีย์ใหม่ลงในโครงสร้าง
EnumberableSets ใช้เพื่ออนุญาตให้รายการคำสั่งซื้อและรายการตำแหน่งสามารถสอบถามได้อย่างง่ายดายโดยอินเทอร์เฟซหรือผู้ดูแล ซึ่งใช้กับตัวสร้างดัชนีเนื่องจากอาจมีความล่าช้าสำหรับผู้ทำดัชนีในการซิงค์บล็อกล่าสุด การมีรายการจัดเก็บไว้ในสัญญาโดยตรงยังช่วยให้แน่ใจว่าสามารถดึงและตรวจสอบข้อมูลที่ถูกต้องได้เมื่อจำเป็น
*สัญญา eventUtils ปล่อยเหตุการณ์โดยใช้ตัวปล่อยเหตุการณ์ เหตุการณ์ต่างๆ จะถูกทำให้เป็นลักษณะทั่วไปเพื่อให้สามารถเพิ่มคีย์-ค่าใหม่ลงในเหตุการณ์ได้โดยไม่จำเป็นต้องอัปเดต ABI
ย่อมาจาก GMX Liquidity Vault: wrapper ของหลายตลาดที่มีโทเค็นยาวและสั้นเท่ากัน สภาพคล่องจะถูกปรับสมดุลใหม่โดยอัตโนมัติระหว่างตลาดอ้างอิงตามการใช้ประโยชน์ของตลาด
ส่วนนี้ให้คำอธิบายทางเทคนิคของสัญญา
Markets ถูกสร้างขึ้นโดยใช้ MarketFactory.createMarket
ซึ่งจะสร้าง MarketToken และจัดเก็บโครงสร้าง Market.Props ใน MarketStore
MarketToken ใช้เพื่อติดตามส่วนแบ่งของผู้ให้บริการสภาพคล่องในกลุ่มตลาดและจัดเก็บโทเค็นสำหรับแต่ละตลาด
ณ เวลาใดก็ตาม ราคาของ MarketToken คือ (worth of market pool) / MarketToken.totalSupply()
ซึ่งฟังก์ชัน MarketUtils.getMarketTokenPrice
สามารถใช้เพื่อดึงค่านี้
มูลค่าของตลาดรวมคือผลรวมของ
การฝากเงินจะเพิ่มโทเค็นแบบยาว / สั้นให้กับกลุ่มของตลาด และโทเค็น MarketToken ให้กับผู้ฝาก
คำขอฝากเงินถูกสร้างขึ้นโดยการเรียก ExchangeRouter.createDeposit โดยระบุ:
คำขอการฝากเงินจะดำเนินการโดยใช้ DepositHandler.executeDeposit หากการฝากเงินถูกสร้างขึ้นที่การประทับเวลา n
ควรดำเนินการด้วยราคา oracle หลังจากการประทับเวลา n
จำนวน MarketToken ที่จะสร้างก่อนผลกระทบต่อค่าธรรมเนียมและราคา จะถูกคำนวณเป็น (worth of tokens deposited) / (worth of market pool) * MarketToken.totalSupply()
การถอนจะเผา MarketTokens เพื่อแลกกับโทเค็น long / short ของกลุ่มตลาด
คำขอถอนเงินถูกสร้างขึ้นโดยการเรียก ExchangeRouter.createWithdrawal โดยระบุ:
คำขอถอนเงินจะดำเนินการโดยใช้ WithdrawalHandler.executeWithdrawal หากการถอนถูกสร้างขึ้นที่การประทับเวลา n
ควรดำเนินการด้วยราคา oracle หลังจากการประทับเวลา n
จำนวนโทเค็นแบบยาวหรือแบบสั้นที่จะแลกก่อนค่าธรรมเนียมและราคาจะคำนวณเป็น (worth of market tokens) / (long / short token price)
โทเค็นแบบยาวและแบบสั้นของตลาดสามารถสลับกันได้
ตัวอย่างเช่น หากตลาด ETH / USD มี WETH เป็นโทเค็นแบบยาวและมี USDC เป็นโทเค็นแบบสั้น ก็สามารถส่ง WETH ไปยังตลาดเพื่อแลกเปลี่ยนเป็น USDC และ USDC สามารถส่งไปยังตลาดเพื่อแลกเปลี่ยนเป็น WETH ได้
คำขอคำสั่ง Swap ถูกสร้างขึ้นโดยการเรียก ExchangeRouter.createOrder โดยระบุ:
จำนวนเอาต์พุต Swap ก่อนค่าธรรมเนียมและราคาจะได้รับผลกระทบ (amount of tokens in) * (token in price) / (token out price)
คำขอคำสั่งซื้อ Swap ของตลาดจะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรดำเนินการด้วยราคาของ oracle หลังจากการประทับเวลา n
คำสั่ง Swap แบบพาสซีฟที่ควรดำเนินการเมื่อจำนวนเอาต์พุตตรงกับจำนวนเอาต์พุตขั้นต่ำที่ระบุโดยผู้ใช้
คำขอคำสั่งสลับขีดจำกัดจะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรดำเนินการด้วยราคาของ oracle หลังจากการประทับเวลา n
เปิดหรือเพิ่มตำแหน่ง perp ยาว/สั้น
คำขอคำสั่งซื้อเพิ่มตลาดถูกสร้างขึ้นโดยการเรียก ExchangeRouter.createOrder โดยระบุ:
คำขอคำสั่งซื้อเพิ่มตลาดจะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรดำเนินการด้วยราคา oracle หลังจากการประทับเวลา n
คำสั่งตำแหน่งที่เพิ่มขึ้นแบบพาสซีฟที่ควรดำเนินการเมื่อราคาโทเค็นดัชนีตรงกับราคาที่ยอมรับได้ที่ระบุโดยผู้ใช้
ตัวอย่างตำแหน่งซื้อ: หากราคาโทเค็นดัชนีปัจจุบันคือ $5,000 คุณสามารถสร้างคำสั่งเพิ่มขีดจำกัดด้วยราคาที่ยอมรับได้เป็น $4990 คำสั่งซื้อสามารถดำเนินการได้เมื่อราคาโทเค็นดัชนีคือ <= $4990
ตัวอย่างตำแหน่ง Short: หากราคาโทเค็นดัชนีปัจจุบันคือ $5,000 คุณสามารถสร้างคำสั่งเพิ่มขีดจำกัดด้วยราคาที่ยอมรับได้เป็น $5,010 คำสั่งซื้อสามารถดำเนินการได้เมื่อราคาโทเค็นดัชนีคือ >= $5,010
คำขอคำสั่งซื้อเพิ่มขีดจำกัดจะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรจะดำเนินการด้วยราคาของ oracle หลังจากการประทับเวลา n
ปิดหรือลดตำแหน่ง perp ยาว/สั้น
คำขอคำสั่งซื้อลดตลาดถูกสร้างขึ้นโดยการเรียก ExchangeRouter.createOrder โดยระบุ:
คำขอคำสั่งซื้อลดตลาดจะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรดำเนินการด้วยราคา oracle หลังจากการประทับเวลา n
คำสั่งตำแหน่งลดลงแบบพาสซีฟที่ควรดำเนินการเมื่อราคาโทเค็นดัชนีตรงกับราคาที่ยอมรับได้ที่ระบุโดยผู้ใช้
ตัวอย่างตำแหน่งซื้อ: หากราคาโทเค็นดัชนีปัจจุบันคือ $5,000 คุณสามารถสร้างคำสั่งลดขีดจำกัดด้วยราคาที่ยอมรับได้เป็น $5,010 คำสั่งซื้อสามารถดำเนินการได้เมื่อราคาโทเค็นดัชนีคือ >= $5,010
ตัวอย่างตำแหน่ง Short: หากราคาโทเค็นดัชนีปัจจุบันคือ $5,000 คุณสามารถสร้างคำสั่งลดขีดจำกัดด้วยราคาที่ยอมรับได้เป็น $4990 คำสั่งซื้อสามารถดำเนินการได้เมื่อราคาโทเค็นดัชนีคือ <= $4990
คำขอคำสั่งลดขีดจำกัดจะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรดำเนินการด้วยราคาของ oracle หลังจากการประทับเวลา n
คำสั่งตำแหน่งลดลงแบบพาสซีฟที่ควรดำเนินการเมื่อราคาโทเค็นดัชนีข้ามราคาที่ยอมรับได้ที่ระบุโดยผู้ใช้
ตัวอย่างตำแหน่งซื้อ: หากราคาโทเค็นดัชนีปัจจุบันคือ $5,000 คุณสามารถสร้างคำสั่งลดจุดหยุดการขาดทุนได้ในราคาที่ยอมรับได้เป็น $4990 คำสั่งซื้อสามารถดำเนินการได้เมื่อราคาโทเค็นดัชนีคือ <= $4990
ตัวอย่างตำแหน่ง Short: หากราคาโทเค็นดัชนีปัจจุบันคือ $5,000 คุณสามารถสร้างคำสั่งลด Stop Loss ได้ด้วยราคาที่ยอมรับได้เป็น $5,010 คำสั่งซื้อสามารถดำเนินการได้เมื่อราคาโทเค็นดัชนีคือ >= $5,010
คำขอคำสั่งลด Stop-Loss จะดำเนินการโดยใช้ OrderHandler.executeOrder หากคำสั่งซื้อถูกสร้างขึ้นที่การประทับเวลา n
ก็ควรดำเนินการด้วยราคา oracle หลังจากการประทับเวลา n
ราคาของ ETH คือ 5,000 และ ETH มีทศนิยม 18 ตำแหน่ง
ราคาหนึ่งหน่วยของ ETH คือ 5000 / (10 ^ 18), 5 * (10 ^ -15)
ในการจัดการกับทศนิยม ให้คูณค่าด้วย (10 ^ 30)
ราคาจะถูกเก็บไว้เป็น 5000 / (10 ^ 18) * (10 ^ 30) => 5000 * (10 ^ 12)
สำหรับการเพิ่มประสิทธิภาพของแก๊ส ราคาเหล่านี้จะถูกส่งไปยัง Oracle ในรูปแบบของค่าตัวคูณทศนิยม uint8 และมูลค่าราคา uint32
หากตั้งค่าตัวคูณทศนิยมเป็น 8 ค่า uint32 จะเป็น 5000 * (10 ^ 12) / (10 ^ 8) => 5000 * (10 ^ 4)
ด้วยการกำหนดค่านี้ ราคา ETH สามารถมีค่าสูงสุดได้ (2 ^ 32) / (10 ^ 4) => 4,294,967,296 / (10 ^ 4) => 429,496.7296
โดยมีทศนิยม 4 ตำแหน่ง
ราคาของ BTC คือ 60,000 และ BTC มีทศนิยม 8 ตำแหน่ง
ราคาหนึ่งหน่วยของ BTC คือ 60,000 / (10 ^ 8), 6 * (10 ^ -4)
ราคาจะถูกเก็บไว้เป็น 60,000 / (10 ^ 8) * (10 ^ 30) => 6 * (10 ^ 26) => 60,000 * (10 ^ 22)
มูลค่าสูงสุดของราคา BTC: (2 ^ 64) / (10 ^ 2) => 4,294,967,296 / (10 ^ 2) => 42,949,672.96
ทศนิยมของความแม่นยำ: 2
ราคาของ USDC คือ 1 และ USDC มีทศนิยม 6 ตำแหน่ง
ราคาหนึ่งหน่วยของ USDC คือ 1 / (10 ^ 6), 1 * (10 ^ -6)
ราคาจะถูกเก็บไว้เป็น 1 / (10 ^ 6) * (10 ^ 30) => 1 * (10 ^ 24)
ราคา USDC มูลค่าสูงสุด: (2 ^ 64) / (10 ^ 6) => 4,294,967,296 / (10 ^ 6) => 4294.967296
ทศนิยมความแม่นยำ: 6
ราคาของ DG คือ 0.00000001 และ DG มีทศนิยม 18 ตำแหน่ง
ราคาหนึ่งหน่วยของ DG คือ 0.00000001 / (10 ^ 18), 1 * (10 ^ -26)
ราคาจะถูกเก็บไว้เป็น 1 * (10 ^ -26) * (10 ^ 30) => 1 * (10 ^ 3)
ราคา DG มูลค่าสูงสุด: (2 ^ 64) / (10 ^ 11) => 4,294,967,296 / (10 ^ 11) => 0.04294967296
ทศนิยมความแม่นยำ: 11
สูตรคำนวณว่าควรตั้งค่าตัวคูณทศนิยมเป็นเท่าใด:
ทศนิยม: 30 - (ทศนิยมโทเค็น) - (จำนวนทศนิยมที่ต้องการเพื่อความแม่นยำ)
ตัวอย่างการคำนวณสำหรับ WNT:
dataStreamPrice / (10 ^ 8) / (10 ^ 18) * (10 ^ 30)
(5000 * (10 ^ 8)) / (10 ^ 8) / (10 ^ 18) * (10 ^ 30) = 5000 * (10 ^ 12)
dataStreamPrice * multiplier / (10 ^ 30)
(5000 * (10 ^ 8)) * (10 ^ 34) / (10 ^ 30) = 5000 * (10 ^ 12)
ตัวอย่างการคำนวณสำหรับ WBTC:
dataStreamPrice / (10 ^ 8) / (10 ^ 8) * (10 ^ 30)
(50,000 * (10 ^ 8)) / (10 ^ 8) / (10 ^ 8) * (10 ^ 30) = 50,000 * (10 ^ 22)
dataStreamPrice * multiplier / (10 ^ 30)
(50,000 * (10 ^ 8)) * (10 ^ 44) / (10 ^ 30) = 50,000 * (10 ^ 22)
สูตรสำหรับตัวคูณคือ: 10 ^ (60 - dataStreamDecimals - tokenDecimals)
ค่าธรรมเนียมการระดมทุนจะจูงใจให้เกิดความสมดุลของสถานะซื้อและขาย ฝั่งที่มีดอกเบี้ยเปิดมากกว่าจะจ่ายค่าธรรมเนียมเงินทุนให้กับฝั่งที่มีดอกเบี้ยเปิดน้อยกว่า
ค่าธรรมเนียมเงินทุนสำหรับฝั่งที่ใหญ่กว่าจะคำนวณเป็น (funding factor per second) * (open interest imbalance) ^ (funding exponent factor) / (total open interest)
ตัวอย่างเช่น หากปัจจัยเงินทุนต่อวินาทีคือ 1 / 50,000 และปัจจัยเงินทุนที่เป็นเลขชี้กำลังคือ 1 และดอกเบี้ยเปิดระยะยาวคือ $150,000 และดอกเบี้ยเปิดระยะสั้นคือ $50,000 ดังนั้นค่าธรรมเนียมเงินทุนต่อวินาทีสำหรับระยะยาวจะเป็น (1 / 50,000) * 100,000 / 200,000 => 0.00001 => 0.001%
.
ค่าธรรมเนียมเงินทุนต่อวินาทีสำหรับ Short จะเป็น -0.00001 * 150,000 / 50,000 => 0.00003 => -0.003%
นอกจากนี้ยังสามารถตั้งค่า fundingIncreaseFactorPerSecond ได้ ซึ่งจะส่งผลให้เกิดตรรกะการจัดหาเงินทุนต่อไปนี้:
longShortImbalance
คำนวณเป็น [abs(longOpenInterest - shortOpenInterest) / totalOpenInterest] ^ fundingExponentFactor
longShortImbalance
ปัจจุบันมากกว่า thresholdForStableFunding
อัตราเงินทุนจะเพิ่มขึ้นตาม longShortImbalance * fundingIncreaseFactorPerSecond
longShortImbalance
ปัจจุบันมากกว่า thresholdForDecreaseFunding
และน้อยกว่า thresholdForStableFunding
และความเบ้อยู่ในทิศทางเดียวกับการระดมทุน ดังนั้นอัตราการระดมทุนจะไม่เปลี่ยนแปลงlongShortImbalance
ปัจจุบันน้อยกว่า thresholdForDecreaseFunding
และความเบ้อยู่ในทิศทางเดียวกับการระดมทุน ดังนั้นอัตราการระดมทุนจะลดลงตาม fundingDecreaseFactorPerSecond
เนื่องจาก longShortImbalance > ThresholdForStableFunding, saveFundingFactorPerSecond ควรเพิ่มขึ้น 0.0001% * 6% * 600 = 0.0036%
เนื่องจาก longs จ่ายให้กับ short อยู่แล้ว ความเบ้ก็เหมือนเดิม และ longShortImbalance < ThresholdForStableFunding, saveFundingFactorPerSecond ไม่ควรเปลี่ยนแปลง
เนื่องจาก longShortImbalance < ThresholdForDecreaseFunding, saveFundingFactorPerSecond ควรลดลง 0.000002% * 600 = 0.0012%
เนื่องจากการเอียงไปในทิศทางอื่น saveFundingFactorPerSecond ควรลดลง 0.0001% * 1% * 600 = 0.0006%
โปรดทราบว่ามีวิธีที่เป็นไปได้ในการเล่นเกมค่าธรรมเนียมการระดมทุน ควรปรับเปลี่ยนปัจจัยการระดมทุนเพื่อลดความเป็นไปได้นี้:
หาก longOpenInterest > shortOpenInterest และ longShortImbalance อยู่ภายในเกณฑ์ ForStableFunding ผู้ใช้ที่ถือสถานะขายสามารถเปิดสถานะซื้อเพื่อเพิ่ม longShortImbalance และพยายามทำให้ค่าธรรมเนียมเงินทุนเพิ่มขึ้น ในตลาดที่มีการเคลื่อนไหว ควรเป็นเรื่องยากที่จะคาดเดาได้ว่าเมื่อใดที่ตำแหน่ง Short ของฝ่ายตรงข้ามจะถูกเปิดโดยบุคคลอื่นเพื่อรับค่าธรรมเนียมเงินทุนที่เพิ่มขึ้น ซึ่งจะทำให้การเล่นเกมนี้ยากขึ้น ปัจจัยด้านเงินทุนยังสามารถปรับเปลี่ยนเพื่อช่วยลดประโยชน์ของเกมนี้ได้ .
หาก longOpenInterest > shortOpenInterest และ longShortImbalance > ThresholdForStableFunding เทรดเดอร์ที่ถือสถานะ Long สามารถทำการซื้อขายเล็กๆ หลายครั้งในช่วงเวลานี้เพื่อให้แน่ใจว่าปัจจัยทางการเงินได้รับการอัปเดตอย่างต่อเนื่อง แทนที่จะใช้มูลค่าที่มากขึ้นตลอดระยะเวลา สิ่งนี้ควรลดขนาด ค่าธรรมเนียมการจัดหาเงินทุนสำหรับสถานะซื้อ แต่ไม่ควรลดค่าธรรมเนียมการจัดหาเงินทุนให้ต่ำกว่าอัตราที่คาดไว้
มีค่าธรรมเนียมการกู้ยืมที่จ่ายให้กับผู้ให้บริการสภาพคล่อง ซึ่งจะช่วยป้องกันผู้ใช้จากการเปิดทั้งสถานะซื้อและขายเพื่อรับความจุรวมโดยไม่ต้องจ่ายค่าธรรมเนียมใด ๆ
ค่าธรรมเนียมการกู้ยืมสามารถใช้แบบจำลองเส้นโค้งหรือแบบจำลองหงิกงอได้
หากต้องการใช้โมเดลเส้นโค้ง คีย์ในการกำหนดค่าจะเป็น BORROWING_FACTOR
และ BORROWING_EXPONENT_FACTOR
โดยจะคำนวณปัจจัยการยืมต่อวินาทีเป็น:
// reservedUsd is the total USD value reserved for positions
reservedUsd = MarketUtils.getReservedUsd(...)
// poolUsd is the USD value of the pool excluding pending trader PnL
poolUsd = MarketUtils.getPoolUsdWithoutPnl(...)
// reservedUsdAfterExponent is the reservedUsd after applying the borrowingExponentFactor for the market
reservedUsdAfterExponent = applyExponentFactor(reservedUsd, borrowingExponentFactor)
borrowingFactorPerSecond = borrowingFactor * reservedUsdAfterExponent / poolUsd
หากต้องการใช้โมเดล kink คีย์ในการกำหนดค่าจะเป็น OPTIMAL_USAGE_FACTOR
, BASE_BORROWING_FACTOR
และ ABOVE_OPTIMAL_USAGE_BORROWING_FACTOR
ปัจจัยการยืมต่อวินาทีจะถูกคำนวณเป็น:
// usageFactor is the ratio of value reserved for positions to available value that can be reserved
usageFactor = MarketUtils.getUsageFactor(...)
borrowingFactorPerSecond = baseBorrowingFactor * usageFactor
if (usageFactor > optimalUsageFactor) {
diff = usageFactor - optimalUsageFactor
additionalBorrowingFactorPerSecond = aboveOptimalUsageBorrowingFactor - baseBorrowingFactor
borrowingFactorPerSecond += additionalBorrowingFactorPerSecond * diff / (Precision.FLOAT_PRECISION - optimalUsageFactor)
}
นอกจากนี้ยังมีตัวเลือกในการตั้งค่าสถานะ skikBorrowingFeeForSmallerSide ซึ่งจะส่งผลให้ค่าธรรมเนียมการยืมสำหรับฝั่งที่เล็กกว่าถูกตั้งค่าเป็นศูนย์ ตัวอย่างเช่น หากมีความยาวมากกว่า Short และ SkipBorrowingFeeForSmallerSide เป็นจริง ค่าธรรมเนียมการยืมสำหรับ Short จะเป็นศูนย์
รหัสสำหรับผลกระทบด้านราคาสามารถพบได้ในสัญญา /pricing
ผลกระทบของราคาคำนวณได้ดังนี้:
(initial USD difference) ^ (price impact exponent) * (price impact factor) - (next USD difference) ^ (price impact exponent) * (price impact factor)
สำหรับค่าสวอป ความไม่สมดุลจะถูกคำนวณตามมูลค่าของโทเค็นแบบยาวและโทเค็นแบบสั้น
ตัวอย่างเช่น:
price impact exponent
ตั้งไว้ที่ 2 และ price impact factor
ตั้งไว้ที่ 0.01 / 50,000
0 ^ 2 * (0.01 / 50,000) - 50,000 ^ 2 * (0.01 / 50,000) => -$500
50,000 ^ 2 * (0.01 / 50,000) - 25,000 ^ 2 * (0.01 / 50,000) => $375
สำหรับการดำเนินการของตำแหน่ง (เพิ่ม / ลดตำแหน่ง) ความไม่สมดุลจะถูกคำนวณตามส่วนต่างของดอกเบี้ยเปิดระยะยาวและระยะสั้น
price impact exponents
และ price impact factors
ได้รับการกำหนดค่าตามตลาด และอาจแตกต่างกันไปสำหรับการดำเนินการแบบทันทีและแบบตำแหน่ง
โปรดทราบว่าการคำนวณนี้เป็นผลกระทบด้านราคาสำหรับการซื้อขายของผู้ใช้ ไม่ใช่ผลกระทบด้านราคาต่อพูล ตัวอย่างเช่น การซื้อขายของผู้ใช้อาจมีผลกระทบต่อราคา 0.25% การซื้อขายครั้งต่อไปในปริมาณที่น้อยมากอาจมีผลกระทบต่อราคา 0.5%
วัตถุประสงค์ของผลกระทบด้านราคาคือเพื่อ:
เนื่องจากสัญญาใช้ราคา oracle ซึ่งจะเป็นราคาเฉลี่ยหรือค่ากลางของการแลกเปลี่ยนอ้างอิงหลายรายการ หากไม่มีผลกระทบด้านราคา การควบคุมราคาจากการแลกเปลี่ยนอ้างอิงในขณะที่ดำเนินการตามคำสั่งซื้อในสัญญาอาจทำกำไรได้
ความเสี่ยงนี้จะเกิดขึ้นด้วยหากค่าผลกระทบด้านราคาเชิงบวกและเชิงลบใกล้เคียงกัน ด้วยเหตุนี้ ผลกระทบด้านราคาเชิงบวกจึงควรตั้งค่าเป็นค่าต่ำในช่วงเวลาที่มีความผันผวนหรือการเคลื่อนไหวของราคาที่ผิดปกติ
สำหรับผลกระทบของราคาต่อสถานะที่เพิ่มขึ้น / ลดลง หากผลกระทบด้านราคาเชิงลบถูกหักเป็นหลักประกันจากสถานะ สิ่งนี้อาจนำไปสู่สถานะที่มีเลเวอเรจที่แตกต่างจากที่ผู้ใช้ตั้งใจ ดังนั้น แทนที่จะหักหลักประกัน ราคาเข้า / ออกของสถานะคือ ปรับตามผลกระทบด้านราคา
ตัวอย่างเช่น:
หากโทเค็นดัชนีแตกต่างจากโทเค็นทั้งแบบยาวและแบบสั้นของตลาด ก็เป็นไปได้ว่ามูลค่ารวมจะได้รับผลกระทบอย่างมีนัยสำคัญจากกลุ่มผลกระทบตำแหน่ง หากกลุ่มผลกระทบตำแหน่งมีขนาดใหญ่มากและโทเค็นดัชนีมีราคาสูง เพิ่มขึ้น. ตัวเลือกในการค่อยๆ ลดขนาดของกลุ่มผลกระทบตำแหน่งอาจถูกเพิ่ม หากสิ่งนี้กลายเป็นปัญหา
ผลกระทบของราคายังถูกติดตามโดยใช้มูลค่าสินค้าคงคลังเสมือนสำหรับตำแหน่งและสวอป ซึ่งจะติดตามความไม่สมดุลของโทเค็นในตลาดที่คล้ายกัน เช่น ETH/USDC, ETH/USDT
ในกรณีที่ราคาเคลื่อนไหวมาก อาจเป็นไปได้ที่สถานะจำนวนมากจะลดลงหรือถูกชำระบัญชีในด้านหนึ่ง ทำให้เกิดความไม่สมดุลอย่างมีนัยสำคัญระหว่างดอกเบี้ยเปิดระยะยาวและระยะสั้น ซึ่งอาจนำไปสู่มูลค่าผลกระทบต่อราคาที่สูงมาก เพื่อบรรเทาปัญหานี้ คุณสามารถกำหนดค่าค่าตัวประกอบผลกระทบตำแหน่งสูงสุดได้ หากผลกระทบด้านราคาในปัจจุบันเกินกว่าผลกระทบด้านราคาที่เป็นลบสูงสุด หลักประกันส่วนเกินใดๆ ที่หักเกินกว่าผลกระทบด้านราคาที่เป็นลบสูงสุดจะถูกเก็บไว้ภายในสัญญา หากตรวจไม่พบการปั่นป่วนราคา หลักประกันนี้สามารถเผยแพร่ให้กับผู้ใช้ได้ เมื่อผลกระทบด้านราคาที่เป็นลบถูกจำกัดไว้ การเปิดและปิดตำแหน่งทันทีอาจทำกำไรได้ เนื่องจากผลกระทบด้านราคาที่เป็นบวกในขณะนี้อาจมีมากกว่าผลกระทบด้านลบต่อราคา เพื่อหลีกเลี่ยงปัญหานี้ ควรกำหนดค่าผลกระทบด้านราคาเชิงบวกสูงสุดให้ต่ำกว่าผลกระทบด้านราคาเชิงลบสูงสุด
มีค่าธรรมเนียมสวอปและค่าธรรมเนียมตำแหน่งและต่อตลาดที่สามารถกำหนดได้
ค่าธรรมเนียมการดำเนินการจะถูกประมาณและคิดตามการสร้างคำขอฝาก ถอน และสั่งซื้อ เพื่อให้ผู้ดูแลสามารถทำธุรกรรมได้ในราคาที่ใกล้เคียงกับต้นทุนสุทธิเป็นศูนย์
หากตลาดมี Stablecoins เป็นโทเค็นหลักประกัน Short ก็ควรจะสามารถจ่ายผลกำไร Short ได้เต็มจำนวน หากดอกเบี้ยเปิด Short สูงสุดไม่เกินจำนวน Stablecoins ในกลุ่ม
หากตลาดมีโทเค็นหลักประกันแบบยาวที่แตกต่างจากโทเค็นดัชนี กำไรระยะยาวอาจไม่ได้รับการจ่ายเต็มจำนวนหากราคาที่เพิ่มขึ้นของโทเค็นดัชนีเกินกว่าราคาที่เพิ่มขึ้นของโทเค็นหลักประกันแบบยาว
ตลาดมีปัจจัยสำรองที่อนุญาตให้จำกัดดอกเบี้ยแบบเปิดไว้ที่เปอร์เซ็นต์ของขนาดพูล ซึ่งจะช่วยลดผลกระทบของกำไรของสถานะขาย และลดความเสี่ยงที่สถานะซื้อไม่สามารถจ่ายได้เต็มจำนวน
ราคาของโทเค็นตลาดขึ้นอยู่กับมูลค่าของสินทรัพย์ในกลุ่ม และ PnL ที่รอดำเนินการสุทธิของสถานะที่เปิดของเทรดเดอร์
เป็นไปได้ที่ PnL ที่รอดำเนินการจะถูกจำกัดไว้ ปัจจัยที่ใช้ในการคำนวณราคาโทเค็นในตลาดอาจแตกต่างกันไปขึ้นอยู่กับกิจกรรม:
Keys.MAX_PNL_FACTOR_FOR_DEPOSITS: นี่คือขีดจำกัดของปัจจัย PnL เมื่อคำนวณราคาโทเค็นในตลาดสำหรับการฝากเงิน
Keys.MAX_PNL_FACTOR_FOR_WITHDRAWALS: นี่คือปัจจัย PnL สูงสุดเมื่อคำนวณราคาโทเค็นตลาดสำหรับการถอน
Keys.MAX_PNL_FACTOR_FOR_TRADERS: นี่คือปัจจัย PnL สูงสุดเมื่อคำนวณราคาโทเค็นตลาดสำหรับการปิดสถานะ
ปัจจัยต่างๆ เหล่านี้สามารถกำหนดค่าได้เพื่อช่วยให้ผู้ให้บริการสภาพคล่องจัดการความเสี่ยงและสร้างแรงจูงใจในการฝากเงินเมื่อจำเป็น เช่น การกำหนด PnL ของเทรดเดอร์จะช่วยจำกัดจำนวนที่ราคาโทเค็นในตลาดสามารถลดลงได้ เนื่องจาก PnL ของเทรดเดอร์ การกำหนด PnL สำหรับการฝากและถอนเงินอาจนำไปสู่ สู่ราคาโทเค็นในตลาดที่ต่ำกว่าสำหรับการฝากเมื่อเทียบกับการถอนเงินซึ่งสามารถจูงใจการฝากเงินได้เมื่อ PnL ที่รอดำเนินการอยู่ในระดับสูง
minCollateralFactor: สิ่งนี้จะกำหนดอัตราส่วนขั้นต่ำที่อนุญาตของ (หลักประกันตำแหน่ง) / (ขนาดตำแหน่ง)
maxPoolAmount: จำนวนโทเค็นสูงสุดที่สามารถฝากเข้าสู่ตลาดได้
maxOpenInterest: ดอกเบี้ยเปิดสูงสุดที่สามารถเปิดได้สำหรับตลาด
ReserveFactor: สิ่งนี้จะกำหนดอัตราส่วนสูงสุดที่อนุญาตของ (มูลค่าของโทเค็นที่สงวนไว้สำหรับตำแหน่ง) / (โทเค็นในกลุ่ม)
maxPnlFactor: อัตราส่วนสูงสุดของ (PnL / มูลค่าของโทเค็นในพูล)
PositionFeeFactor: สิ่งนี้กำหนดเปอร์เซ็นต์ของค่าธรรมเนียมที่จะหักสำหรับการเพิ่ม / ลดตำแหน่ง จำนวนค่าธรรมเนียมจะขึ้นอยู่กับการเปลี่ยนแปลงขนาดตำแหน่ง
PositionImpactFactor: นี่คือ "ปัจจัยผลกระทบด้านราคา" สำหรับตำแหน่งที่อธิบายไว้ในส่วน "ผลกระทบด้านราคา"
maxPositionImpactFactor: นี่คือ "ผลกระทบต่อราคาสูงสุด" สำหรับตำแหน่งที่อธิบายไว้ในส่วน "ผลกระทบด้านราคา"
PositionImpactExponentFactor: นี่คือค่า "เลขชี้กำลังผลกระทบของราคา" สำหรับการดำเนินการของตำแหน่ง ตามที่อธิบายไว้ในส่วน "ผลกระทบด้านราคา"
swapFeeFactor: สิ่งนี้จะกำหนดเปอร์เซ็นต์ของค่าธรรมเนียมที่จะหักสำหรับ Swap จำนวนค่าธรรมเนียมจะขึ้นอยู่กับจำนวน Swap
swapImpactFactor: นี่คือ "ปัจจัยผลกระทบด้านราคา" ที่อธิบายไว้ในส่วน "ผลกระทบด้านราคา"
swapImpactExponentFactor: นี่คือค่า "เลขชี้กำลังผลกระทบของราคา" สำหรับเงินฝากและค่าสวอป ตามที่อธิบายไว้ในส่วน "ผลกระทบด้านราคา" ด้านบน
fundingFactor: นี่คือค่า "ปัจจัยเงินทุนต่อวินาที" ที่อธิบายไว้ในส่วน "ค่าธรรมเนียมเงินทุน"
ปัจจัยการกู้ยืมสำหรับระยะยาว: นี่คือ "ปัจจัยการกู้ยืม" สำหรับตำแหน่งซื้อที่อธิบายไว้ในส่วน "ค่าธรรมเนียมการกู้ยืม"
การยืมปัจจัยForShorts: นี่คือ "ปัจจัยการยืม" สำหรับตำแหน่งขายที่อธิบายไว้ในส่วน "ค่าธรรมเนียมการยืม"
การยืมExponentFactorForLongs: นี่คือ "ปัจจัยเลขชี้กำลังการยืม" สำหรับตำแหน่งซื้อที่อธิบายไว้ในส่วน "ค่าธรรมเนียมการยืม"
การยืมExponentFactorForShorts: นี่คือ "ปัจจัยการยืมเลขชี้กำลัง" สำหรับตำแหน่งซื้อที่อธิบายไว้ในส่วน "ค่าธรรมเนียมการยืม"
บทบาทได้รับการจัดการใน RoleStore โดย RoleAdmin มีสิทธิ์เข้าถึงเพื่ออนุญาตและเพิกถอนบทบาทใดๆ
RoleAdmin จะเป็นผู้ปรับใช้ในขั้นต้น แต่ควรลบออกหลังจากตั้งค่าบทบาทแล้ว
หลังจากการตั้งค่าเริ่มต้น:
เฉพาะสัญญา Timelock เท่านั้นที่ควรมีบทบาท RoleAdmin
ผู้ดูแลระบบไทม์ล็อกสามารถมอบบทบาทใหม่ได้โดยมีการหน่วงเวลา
ค่าของระบบควรตั้งค่าโดยใช้สัญญา Config เท่านั้น
EOA ไม่ควรมีบทบาทผู้ควบคุม
ผู้รักษาการกำหนดค่าและผู้ดูแลระบบการล็อกเวลาอาจขัดขวางการดำเนินการปกติผ่านการปิดใช้งานคุณสมบัติ การตั้งค่าที่ไม่ถูกต้อง การอนุญาตพิเศษของโทเค็นที่เป็นอันตราย การใช้มูลค่าผลกระทบด้านราคาเชิงบวกในทางที่ผิด ฯลฯ
คาดว่า multisig ของ timelock ควรเพิกถอนสิทธิ์ของบัญชีที่เป็นอันตรายหรือถูกบุกรุก
ผู้รักษาคำสั่งซื้อและผู้รักษาคำสั่งซื้อที่ถูกระงับอาจดึงมูลค่าผ่านการสั่งธุรกรรม การดำเนินการธุรกรรมที่ล่าช้า การดำเนินการ ADL ฯลฯ ซึ่งจะลดลงบางส่วนด้วยเครือข่ายผู้รักษา
ผู้ลงนามของ Oracle จะต้องรายงานราคาโทเค็นอย่างถูกต้อง
โทเค็นหลักประกันต้องอยู่ในรายการที่อนุญาตพิเศษด้วย TOKEN_TRANSFER_GAS_LIMIT ที่กำหนดค่าไว้
โทเค็นการรีเบส โทเค็นที่เปลี่ยนยอดคงเหลือในการโอน ด้วยโทเค็นเบิร์น โทเค็นที่มีการเรียกกลับ เช่น โทเค็น ERC-777 ฯลฯ เข้ากันไม่ได้กับระบบ และไม่ควรอยู่ในรายการที่อนุญาตพิเศษ
ผู้ดูแลคำสั่งซื้อสามารถใช้ราคาจากการประทับเวลาที่ต่างกันสำหรับคำสั่งซื้อที่จำกัดด้วยค่าสวอป ซึ่งจะนำไปสู่จำนวนเอาต์พุตที่แตกต่างกัน
ผู้รักษาคำสั่งซื้อจะต้องตรวจสอบว่าธุรกรรมจะคืนกลับหรือไม่ก่อนที่จะส่งธุรกรรมเพื่อลดการสูญเสียก๊าซ
ผู้รักษาคำสั่งซื้ออาจทำให้คำขอถูกยกเลิกแทนที่จะดำเนินการโดยดำเนินการตามคำขอด้วยก๊าซไม่เพียงพอ
หากธุรกรรมที่ดำเนินการต้องใช้ก๊าซจำนวนมากซึ่งใกล้เคียงกับขีดจำกัดก๊าซบล็อกสูงสุด อาจเป็นไปได้ที่จะยัดบล็อกเพื่อป้องกันไม่ให้ธุรกรรมรวมอยู่ในบล็อก
ในบางบล็อคเชน เป็นไปได้ที่ผู้ดูแลจะสามารถควบคุม tx.gasprice ที่ใช้ในการทำธุรกรรม ซึ่งจะส่งผลต่อค่าธรรมเนียมการดำเนินการที่จ่ายให้กับผู้ดูแล
คำสั่งซื้ออาจถูกป้องกันจากการดำเนินการโดยผู้ใช้ที่เป็นอันตรายโดยจงใจทำให้ตลาดไม่สมดุล ส่งผลให้เกิดผลกระทบด้านราคาสูง ซึ่งควรจะมีค่าใช้จ่ายสูงและยากที่จะได้รับประโยชน์จาก
ผลกระทบของราคาสามารถลดลงได้โดยใช้ตำแหน่งและสวอป และการซื้อขายข้ามตลาด เชน ส้อม และโปรโตคอลอื่นๆ ซึ่งบรรเทาลงบางส่วนด้วยการติดตามสินค้าคงคลังเสมือน
ผู้ใช้สามารถลดผลกระทบของราคาได้โดยใช้ตำแหน่งที่มีเลเวอเรจสูง ซึ่งจะลดลงบางส่วนด้วยค่า MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER
การคำนวณค่าผลกระทบราคาไม่ได้บัญชีค่าธรรมเนียมและผลกระทบที่เกิดจากผลกระทบของราคาเองสำหรับกรณีส่วนใหญ่ผลกระทบต่อการคำนวณผลกระทบของราคาควรมีขนาดเล็ก
เป็นเรื่องยาก แต่เป็นไปได้ที่ค่าสระจะกลายเป็นลบสิ่งนี้สามารถเกิดขึ้นได้เนื่องจาก ImpactPoolamount และ PNL ที่รอดำเนินการถูกลบออกจากมูลค่าของโทเค็นในสระว่ายน้ำ
เนื่องจากความแตกต่างของผลกระทบของราคาบวกและลบตำแหน่งอาจมีการสะสมของจำนวนโทเค็นเสมือนจริงในตำแหน่งผลกระทบของตำแหน่งซึ่งจะส่งผลกระทบต่อการกำหนดราคาของโทเค็นตลาด
สินค้าคงคลังเสมือนจริงติดตามปริมาณโทเค็นในพูลจะต้องทำให้มั่นใจได้ว่าโทเค็นในแต่ละการจัดกลุ่มเป็นประเภทเดียวกันและมีทศนิยมเดียวกันเช่นโทเค็นยาวข้ามสระว่ายน้ำในกลุ่มควรมีทศนิยมเดียวกัน ในกลุ่มควรมีทศนิยมเดียวกันสมมติว่า USDC มีทศนิยม 6 ทศนิยมและไดมีทศนิยม 18 ทศนิยมตลาดเช่น ETH-USDC ไม่ควรจัดกลุ่ม eth-dai
ต้องมีการตั้งค่ารหัสเสมือนจริงก่อนที่จะมีการสร้างตลาด / โทเค็น whitelisting หากมีการตั้งค่าหลังจากการซื้อขายสำหรับโทเค็น / ตลาดเสร็จสิ้นการติดตามจะไม่ถูกต้องและอาจต้องปรับเปลี่ยน
สำหรับ L2S ที่มี Sequencers ไม่มีการตรวจสอบสัญญาเพื่อตรวจสอบว่า Sequencer L2 เปิดใช้งานหรือไม่ Oracle Keepers ควรหยุดการลงนามในราคาหากไม่มีการสร้างบล็อกโดย Sequencer หาก Sequencer ดำเนินการดำเนินการตามปกติ บล็อกล่าสุดโดยใช้ราคาที่ดึงมาล่าสุด
ในกรณีที่ Sequencer L2 ลดลงอาจป้องกันการฝากเข้าสู่ตำแหน่งเพื่อป้องกันการชำระบัญชี
สำหรับการทำธุรกรรมที่สามารถดำเนินการทั้งหมดโดยใช้ฟีดราคาบนห่วงโซ่มันอาจเป็นไปได้ที่จะใช้ประโยชน์จากการกำหนดราคาเก่าเนื่องจากเวลาแฝงราคาหรือโซ่ที่ลดลงการใช้ฟีดราคาโซ่ควรเป็นฟีดชั่วคราว ใช้แทนโทเค็นทั้งหมดได้รับการสนับสนุน
Block Re-Orgs อาจอนุญาตให้ผู้ใช้ยกเลิกคำสั่งซื้อย้อนหลังได้หลังจากดำเนินการหากราคาไม่เคลื่อนไหวอย่างเหมาะสมสำหรับผู้ใช้ควรใช้ความระมัดระวังเพื่อจัดการกรณีนี้หากใช้สัญญากับโซ่ที่เป็นไปได้
การอัปเดตและการยกเลิกคำสั่งซื้ออาจเป็นไปตามแนวหน้าเพื่อป้องกันการดำเนินการตามคำสั่งซื้อสิ่งนี้ไม่ควรเป็นปัญหาหากความน่าจะเป็นของการทำงานด้านหน้าที่ประสบความสำเร็จนั้นน้อยกว่าหรือเท่ากับ 50%หากความน่าจะเป็นสูงกว่า 50%ค่าธรรมเนียมและค่าธรรมเนียม ควรปรับผลกระทบด้านราคาเพื่อให้แน่ใจว่ากลยุทธ์ไม่ได้ทำกำไรสุทธิการปรับค่าธรรมเนียม UI หรือส่วนลดการอ้างอิงสามารถนำมาใช้ในทำนองเดียวกันเพื่อทำให้เกิดการยกเลิกคำสั่งซื้อ
ในกรณีที่หยุดทำงานของ blockchain หรือ Oracle คำสั่งซื้ออาจดำเนินการในราคาที่แตกต่างกันอย่างมีนัยสำคัญหรืออาจไม่ดำเนินการหากราคาที่ยอมรับได้ของคำสั่งไม่สามารถปฏิบัติตามได้
มีการพึ่งพาความถูกต้องของการประทับเวลาบล็อกเนื่องจากราคาของ Oracle ได้รับการตรวจสอบกับค่านี้สำหรับ blockchains ที่โหนด blockchain มีการควบคุมการประทับเวลาบางอย่างควรใช้ความระมัดระวังในการตั้งค่า oracletimestampadjustment เป็นค่า การประทับเวลาที่ไม่ได้ประโยชน์
คุณลักษณะการเปลี่ยนแปลง GLV สามารถใช้ประโยชน์ได้โดยการเพิ่มการใช้ประโยชน์ในตลาดที่มักจะมีการใช้ประโยชน์ต่ำ เมื่อผู้ดูแลดำเนินการกะผู้โจมตีสามารถลดการใช้ประโยชน์กลับสู่ระดับปกติได้ ค่าธรรมเนียมตำแหน่งและผลกระทบด้านราคาควรได้รับการกำหนดค่าในลักษณะที่ทำให้การโจมตีครั้งนี้มีราคาแพงพอที่จะครอบคลุมการสูญเสีย GLV
ใน GLV อาจมีตลาดจีเอ็มซึ่งสูงกว่า PnltopoolfactorTraders สูงสุด หาก MaxpnlFactorFordePosits ของตลาด GM สูงกว่า MaxpnlfactorTraders ตลาด GM จะมีมูลค่าต่ำกว่าในระหว่างการฝากเงินมากกว่าที่ผู้ค้าจะได้รับผลกำไรที่ต่อยอด ผู้ใช้ที่เป็นอันตรายอาจสังเกตเห็นตลาดจีเอ็มในสภาพเช่นนี้และฝากลงใน GLV ที่มีอยู่เพื่อให้ได้มาจาก ADL ซึ่งจะตามมาในไม่ช้า เพื่อหลีกเลี่ยง maxpnlfactorfordeposits นี้ควรน้อยกว่าหรือเท่ากับ maxpnlfactorTraders
เป็นไปได้ทางเทคนิคที่มูลค่าตลาดจะกลายเป็นลบ ในกรณีนี้ GLV จะไม่สามารถใช้งานได้จนกว่ามูลค่าตลาดจะเป็นบวก
โทเค็นจีเอ็มอาจกลายเป็นสภาพคล่องเนื่องจากปัจจัย PNL สูงหรือสำรอง USD สูง ผู้ใช้สามารถฝากโทเค็นจีเอ็มที่มีสภาพคล่องต่ำลงใน GVL และถอนสภาพคล่องออกจากตลาดที่แตกต่างกันทำให้ GLV มีโทเค็นที่มีสภาพคล่องต่ำ พารามิเตอร์ GLVMAXMARTOKENTOKENTANCED และ GLVMAXMARKETTOKENTOKENTOALMEANTOUNT ควรคำนึงถึงความเสี่ยงของตลาดเพื่อหลีกเลี่ยงการมีโทเค็นจีเอ็มมากเกินไปจากตลาดที่มีความเสี่ยง
scripts/verifyFallback.ts
สามารถใช้เพื่อตรวจสอบสัญญาnpx hardhat verify
หลังจากนั้นสัญญาตลาดทั้งหมดควรได้รับการตรวจสอบเนื่องจากซอร์สโค้ดจะเหมือนกัน หากมีการเพิ่มสัญญาใหม่ที่อาจนำไปสู่ความแตกต่างในการกำหนดราคาเช่นโทเค็นตลาดระหว่างสัญญาเก่าและใหม่ควรใช้การดูแลเพื่อปิดการใช้งานสัญญาเก่าก่อนที่จะเปิดใช้สัญญาใหม่
โปรโตคอลภายนอกใด ๆ ที่ใช้สัญญาผู้อ่านหรือการคำนวณที่ล้าสมัยสำหรับการกำหนดราคาควรได้รับการเตือนให้ใช้สัญญาและการคำนวณล่าสุดเช่นราคา chainlink ฟีดสำหรับโทเค็น GM
ขอแนะนำให้เผยแพร่ความพยายามที่ดีที่สุดในการจัดทำเอกสารการเปลี่ยนแปลงที่สำคัญที่การรวมเข้าด้วยกันควรตระหนักถึงเช่นหากมีการเพิ่มฟิลด์ลงในโครงสร้างที่ส่งผ่านไปยังฟังก์ชั่นการโทรกลับการเปลี่ยนแปลงนี้อาจไม่ชัดเจนสำหรับการรวม
หากสัญญาถูกใช้เพื่อสนับสนุนตลาดสังเคราะห์ทุนควรใช้ความระมัดระวังเพื่อให้แน่ใจว่าการแยกหุ้นและการเปลี่ยนแปลงที่คล้ายกันสามารถจัดการได้
สัญญากับบทบาท "คอนโทรลเลอร์" มีการเข้าถึงฟังก์ชั่นที่สำคัญเช่นการตั้งค่าค่าดาต้าสโตร์เนื่องจากสิ่งนี้ควรใช้ความระมัดระวังเพื่อให้แน่ใจว่าสัญญาดังกล่าวไม่มีฟังก์ชั่นหรือฟังก์ชั่นทั่วไปที่สามารถใช้ในการเปลี่ยนค่าที่สำคัญ
ควรเพิ่มการทดสอบสำหรับประเภทตลาดที่แตกต่างกันเช่นเฉพาะตลาดเฉพาะตลาดโทเค็นเดียว
การสั่งซื้อค่าใน EventData สำหรับการโทรกลับไม่ควรแก้ไขเว้นแต่จำเป็นอย่างเข้มงวดเนื่องจากสัญญาการโทรกลับอาจอ้างอิงค่าด้วยดัชนีคงที่
โปรดทราบว่าหากโครงสร้างที่ผ่านการโทรกลับมีการเปลี่ยนแปลงเช่นการฝากเงินการถอนการสั่งซื้อโครงสร้างสิ่งนี้จะทำให้ฟังก์ชั่นของสัญญาการโทรกลับคาดว่าโครงสร้างก่อนหน้านี้จะหยุดทำงานเนื่องจากสิ่งนี้การเปลี่ยนแปลงของโครงสร้างควรถูกเน้นไปที่การบูรณาการ
หากมีการใช้ระบบการอ้างอิง orderhandler ควรได้รับการเข้าถึงเพื่ออัปเดตรหัสการอ้างอิงสำหรับผู้ค้า
เงินฝากการถอนและคำสั่งซื้ออาจถูกยกเลิกหากข้อกำหนดที่ระบุในคำขอไม่สามารถปฏิบัติตามได้เช่นจำนวนเงินขั้นต่ำ ตรวจสอบว่าเงินและการคืนเงินของก๊าซจะถูกส่งไปยังการยกเลิกเพื่อให้แน่ใจว่าตรงกับความคาดหวัง
การลดคำสั่งซื้อตำแหน่งสามารถส่งออกโทเค็นสองโทแทนโทเค็นเดียวในกรณีที่การแลกเปลี่ยนตำแหน่งลดลงล้มเหลวอาจเป็นไปได้ว่าจำนวนเอาต์พุตและหลักประกันอาจไม่เพียงพอที่จะครอบคลุมค่าธรรมเนียมทำให้คำสั่งไม่ถูกดำเนินการ
หากมีการแพร่กระจายขนาดใหญ่เป็นไปได้ว่าการเปิด / ปิดตำแหน่งสามารถเปลี่ยนราคาขั้นต่ำและสูงสุดของโทเค็นตลาดได้อย่างมีนัยสำคัญสิ่งนี้ไม่ควรจัดการได้ในวิธีที่ทำกำไรได้
การเปลี่ยนแปลงค่ากำหนดค่าเช่น Funding_factor, Stable_funding_factor, ยืม _Factor, skip_borrowing_fee_for_smaller_side, ยืม _fee_receiver_factor อาจนำไปสู่ค่าใช้จ่ายเพิ่มเติมสำหรับผู้ใช้
หากผู้ค้า PNL ถูกต่อยอดเนื่องจาก MAX_PNL_FACTOR_FOR_TRADERS เปอร์เซ็นต์ของกำไรที่จ่ายให้กับผู้ค้าอาจแตกต่างกันไปขึ้นอยู่กับการสั่งซื้อเมื่อตำแหน่งลดลง / ปิด
ข้อมูลเหตุการณ์อาจถูกส่งผ่านไปยังสัญญาการโทรกลับการสั่งซื้อพารามิเตอร์ในเหตุการณ์ EventData จะถูกพยายามไม่เปลี่ยนแปลงดังนั้น params สามารถเข้าถึงได้โดยดัชนีเพื่อความปลอดภัยคีย์ของพารามิเตอร์ควรได้รับการตรวจสอบก่อนใช้เพื่อตรวจสอบว่าตรงกับ มูลค่าที่คาดหวัง
พารามิเตอร์บางอย่างเช่น order.sizedelta และ order.initialCollateraldeltaAmount อาจได้รับการปรับปรุงในระหว่างการดำเนินการค่าที่อัปเดตอาจไม่ถูกส่งผ่านไปยังสัญญาการโทรกลับ
เมื่อสร้างสัญญาการโทรกลับสัญญาการโทรกลับอาจจำเป็นต้องอนุญาตให้ผู้ใช้เงินฝากเงิน, orderhandler หรือถอนตัวก็ควรสังเกตว่าอาจมีการปรับใช้ตัวจัดการเวอร์ชันใหม่เหล่านี้เมื่อมีการเพิ่มรหัสใหม่ลงในตัวจัดการ มีอยู่ชั่วคราวในเวลาเดียวกันเช่น OrderHandler (1), OrderHandler (2) เนื่องจากสิ่งนี้สัญญาการโทรกลับควรจะสามารถอนุญาตและยอมรับการโทรกลับจากผู้ฝากเงินหลายรายพร้อมกัน orderhandlers และ daulbalhandlers
สำหรับสัญญาการโทรกลับแทนที่จะรักษาผู้ที่อนุญาตการอนุญาตแยกต่างหากสำหรับผู้ฝากเงิน, orderhandlers, ถอนตัว, วิธีแก้ปัญหาที่เป็นไปได้คือการตรวจสอบบทบาทของ msg.sender ใน rolestore เช่น RoleStore.hasRole(msg.sender, Role.CONTROLLER)
ตรวจสอบว่า msg.sender เป็นตัวจัดการที่ถูกต้อง
หากใช้สัญญาเช่น Exchangerouter, Oracle หรือ Reader โปรดทราบว่าที่อยู่ของพวกเขาจะเปลี่ยนเมื่อมีการเพิ่มตรรกะใหม่
หากสัญญาเช่น Exchangerouter, Oracle หรือ Reader ได้รับการอัปเดตควรใช้ความพยายามในการรักษาพารามิเตอร์ฟังก์ชันให้เหมือนกันอย่างไรก็ตามสิ่งนี้อาจเป็นไปไม่ได้เสมอไปเช่นหากมีการสนับสนุนคุณสมบัติการสั่งซื้อใหม่ จะต้องเปลี่ยนแปลง
Rolestore และ Datastore สำหรับการปรับใช้ไม่ควรเปลี่ยนแปลงหากมีการเปลี่ยนแปลงการย้ายเงินทุนจากสัญญาก่อนหน้านี้ไปยังสัญญาใหม่
ในขณะที่รหัสได้รับการจัดโครงสร้างเพื่อลดความเสี่ยงของการอ่านซ้ำอย่างเดียว แต่ควรใช้ความระมัดระวังเพื่อป้องกันความเป็นไปได้นี้
โทเค็น airdrops อาจเกิดขึ้นกับบัญชีของผู้ถือโทเค็นจีเอ็มการรวมสัญญาที่ถือโทเค็นจีเอ็มจะต้องสามารถเรียกร้องโทเค็นเหล่านี้มิฉะนั้นโทเค็นจะถูกล็อคการดำเนินการที่แน่นอนสำหรับสิ่งนี้จะแตกต่างกันไปขึ้นอยู่กับสัญญาบูรณาการ ของโทเค็นที่ไม่ใช่โทเค็นตลาดสามารถตรวจสอบได้โดยใช้ค่า Keys.MARKET_LIST
การถ่ายโอน ETH จะถูกส่งด้วย native_token_transfer_gas_limit สำหรับขีด จำกัด ของก๊าซหากการถ่ายโอนล้มเหลวเนื่องจากก๊าซไม่เพียงพอหรือข้อผิดพลาดอื่น ๆ
บัญชีอาจได้รับ ETH สำหรับ ADL / การชำระบัญชีหากบัญชีไม่สามารถรับ ETH ได้จะส่งไปแทนแทน
ผลกระทบราคาบวกถูกปกคลุมด้วยจำนวนโทเค็นในกลุ่มผลกระทบและขึ้นอยู่กับค่าที่กำหนดค่า
ผลกระทบด้านราคาติดลบอาจถูก จำกัด ด้วยค่าที่กำหนดค่า
หากผลกระทบของราคาติดลบถูก จำกัด จำนวนเงินเพิ่มเติมจะถูกเก็บไว้ในกลุ่มหลักประกันที่อ้างสิทธิ์ได้สิ่งนี้จะต้องอ้างสิทธิ์ด้วยตนเองโดยใช้ exchangerouter.claimcollateral
ค่าธรรมเนียมการระดมทุนเชิงบวกจะต้องได้รับการอ้างสิทธิ์ด้วยตนเองโดยใช้ฟังก์ชั่น Exchangerouter.ClaimfundingFees
รางวัลพันธมิตรจะต้องได้รับการอ้างสิทธิ์ด้วยตนเองโดยใช้ฟังก์ชั่น Exchangerouter.Claimaffiliaterewards
ตลาดหรือคุณสมบัติอาจปิดใช้งาน
การดำเนินการจะยังคงดำเนินต่อไปแม้ว่าการโทรกลับจะเปลี่ยนกลับ
ตรวจสอบให้แน่ใจว่าการโทรกลับมีก๊าซเพียงพอ
บัญชีย่อยสามารถสร้างอัปเดตและยกเลิกคำสั่งซื้อใด ๆ สำหรับบัญชี
บัญชีย่อยสามารถใช้จ่าย wnt และหลักประกันจากบัญชี
ค่าธรรมเนียม UI สามารถเปลี่ยนแปลงได้
ส่วนลดการอ้างอิงสามารถเปลี่ยนแปลงได้
เงินทุนสำหรับที่อยู่บัญชีดำจะถูกเก็บไว้ภายในโปรโตคอล
โทเค็นดัชนีไม่ได้รับประกันว่าจะเป็นโทเค็นยาวเสมอไป
อัตราค่าธรรมเนียมเปลี่ยนแปลงขึ้นอยู่กับว่ามีผลกระทบเชิงบวกหรือเชิงลบ
พิจารณาปัจจัย PNL เมื่อประมาณราคา GM
จัดการการยกเลิกการฝากเงิน
ตรวจสอบให้แน่ใจว่ามีเพียงตัวจัดการที่มีบทบาทคอนโทรลเลอร์เท่านั้นที่สามารถเรียกฟังก์ชั่นการโทรกลับ
ตรวจสอบให้แน่ใจว่าการดำเนินการฝากเงินที่ถูกต้องเท่านั้นที่สามารถเรียกใช้ฟังก์ชั่นการโทรกลับ
พิจารณาตลาดที่มีโทเค็นที่ยาวและสั้นเท่ากันการแลกเปลี่ยนไม่ได้รับการสนับสนุนสำหรับตลาดเหล่านี้
พิจารณาผลกระทบด้านบวกและลบ
มีระยะเวลาการยกเลิกคำขอสำหรับความล่าช้าที่กำหนดค่าซึ่งไม่สามารถยกเลิกคำขอฝากเงินได้
จำนวนเงินที่ส่งออกขึ้นอยู่กับผลกระทบด้านราคาและค่าธรรมเนียม
ไม่อนุญาตให้ฝากเงินไว้เหนือ max_pnl_factor_for_deposits
เงินฝากครั้งแรกในตลาดใด ๆ จะต้องไปที่ผู้รับ _for_first_deposit
ต้องใช้เอาต์พุตขั้นต่ำสองรายการสำหรับการถอน
จัดการการยกเลิกการถอนเงิน
ตรวจสอบให้แน่ใจว่ามีเพียงตัวจัดการที่มีบทบาทคอนโทรลเลอร์เท่านั้นที่สามารถเรียกฟังก์ชั่นการโทรกลับ
ตรวจสอบให้แน่ใจว่าการดำเนินการถอนที่ถูกต้องเท่านั้นสามารถเรียกใช้ฟังก์ชันการโทรกลับ
พิจารณาตลาดที่มีโทเค็นที่ยาวและสั้นเท่ากันการแลกเปลี่ยนไม่ได้รับการสนับสนุนสำหรับตลาดเหล่านี้
พิจารณาผลกระทบด้านบวกและลบ
มีระยะเวลาการยกเลิกคำขอสำหรับความล่าช้าที่กำหนดค่าซึ่งไม่สามารถยกเลิกคำขอถอนได้
จำนวนเงินที่ส่งออกขึ้นอยู่กับผลกระทบด้านราคาและค่าธรรมเนียม
ไม่อนุญาตให้ถอนออกไปเหนือ max_pnl_factor_for_withdrawals
จัดการการยกเลิกคำสั่งซื้อ
การชำระบัญชีและ ADL สามารถเรียกสัญญาการโทรกลับที่บันทึกไว้ได้
คำสั่งซื้อสามารถแช่แข็งได้
ตรวจสอบให้แน่ใจว่ามีเพียงตัวจัดการที่มีบทบาทคอนโทรลเลอร์เท่านั้นที่เรียกว่า AfterorderExecution, AferorderCancellation และฟังก์ชั่นการโทรกลับของ OforderFrozen
ตรวจสอบให้แน่ใจว่าการดำเนินการตามคำสั่งที่ถูกต้องเท่านั้นสามารถเรียกใช้ฟังก์ชั่นการโทรกลับ
พิจารณาตลาดที่มีโทเค็นที่ยาวและสั้นเท่ากันการแลกเปลี่ยนไม่ได้รับการสนับสนุนสำหรับตลาดเหล่านี้
พิจารณาผลกระทบด้านบวกและลบ
สัญญาการโทรกลับที่บันทึกไว้สามารถเปลี่ยนแปลงได้
มีระยะเวลาการยกเลิกคำขอสำหรับความล่าช้าที่กำหนดค่าซึ่งไม่สามารถยกเลิกคำขอคำสั่งซื้อได้
จำนวนเงินที่ส่งออกขึ้นอยู่กับผลกระทบด้านราคาและค่าธรรมเนียม
สระว่ายน้ำ Impact ตำแหน่งจะถูกแจกจ่ายให้กับผู้ให้บริการสภาพคล่องเมื่อเวลาผ่านไป
หากพยายามคำนวณผลกระทบด้านราคาควรพิจารณาสินค้าคงคลังเสมือนจริง
ผู้ซื้อขาย PNL ถูกปกคลุมเหนือ max_pnl_factor_for_traders
ผลกระทบด้านราคาติดลบสามารถต่อยอดในตำแหน่งที่ลดลง
ลดคำสั่ง Sizedelta และ Collateraldelta จะได้รับการอัพเดทอัตโนมัติหากมีมากกว่าตำแหน่งที่สามารถจัดการได้
พิจารณาการตรวจสอบความถูกต้อง
พิจารณาการลดลงของ swaptypes
พิจารณาจำนวนหลักประกันขั้นต่ำ
การอ้างอิงยังคงจ่ายเงินในระหว่างการชำระบัญชี
เป็นไปได้ที่ตำแหน่งจะมีหลักประกันเป็นศูนย์
ตำแหน่งที่มีขนาดศูนย์ไม่สามารถอยู่ได้
เพื่อรวบรวมสัญญา:
npx hardhat compile
หากต้องการรันการทดสอบทั้งหมด:
npx hardhat test
export NODE_OPTIONS=--max_old_space_size=4096
อาจจำเป็นต้องใช้การทดสอบ
ในการพิมพ์รหัสตัวชี้วัด:
npx ts-node metrics.ts
ในการพิมพ์ความครอบคลุมการทดสอบ:
npx hardhat coverage