Для разработчиков / SENDIT
SENDIT для разработчиков
SENDIT - это набор контрактов в Pickle Chain вокруг одного банка плюс два API для чтения. Всё, что делает трейдер, - это транзакция, которую вы можете отправить сами, с кошелька или с зарегистрированного торгового ключа.
Составные части
- SenditBank хранит pUSD, ETH и запущенные токены каждого аккаунта, а также его торговые ключи. Каждый другой контракт - это площадка, которая списывает с банка через
pullи зачисляет в него черезpush. - Движок бессрочных контрактов (PepperPerps VERSION 3), его книга ордеров для двухшаговых рынков и триггеров и LP-хранилище.
- Спот-роутер, обменник pUSD и копитрейдинг, плюс сам pUSD.
- HTTP API: dex-api для рынков, позиций, балансов, ленты и токенов; social-api для сессий.
- Как написать бота собирает всё вместе.
SENDIT работает в публичной тестовой сети (chain ID 78270). Приложение и API отдаются с https://sendit.picklechain.xyz; JSON-RPC принадлежит сети, по адресу https://rpc.picklechain.xyz.
Чтение манифеста
Читайте адреса во время работы. Обновление движка разворачивает новые контракты рядом со старыми и меняет все ключи, а вызов адреса без кода в EVM завершается успешно, поэтому зашитый в код адрес, который устарел, ломается молча.
const ORIGIN = "https://sendit.picklechain.xyz";
// The deployment, as the app itself reads it. Never cached (Cache-Control: no-store).
const manifest = await fetch(`${ORIGIN}/op-deployment/l2-perps.json`).then((r) => r.json());
const { bank, perps, perpOrders, perpVault, spotRouter, copyFactory, pusd, pusdExchange } = manifest;
// Or the same addresses, lower-cased and renamed, from the API:
// { engine, orders, vault, previous, bank, spotRouter, pusdExchange }
const deployment = await fetch(`${ORIGIN}/api/perp/deployment`).then((r) => r.json());Ключи манифеста
| Ключ | Тип |
|---|---|
| perps | addressThe perps engine, PepperPerps VERSION 3. /api/perp/deployment calls it `engine`. |
| perpOrders | addressThe two-step orders book, PepperPerpOrders. `orders` in /api/perp/deployment. |
| perpVault | addressThe LP vault, PepperPerpVault (pLP). `vault` in /api/perp/deployment. |
| bank | addressSenditBank: every trader's pUSD, ETH and launched tokens, and the trading keys. |
| spotRouter | addressSenditSpotRouter: buy, sell and launch tokens with bank money. |
| copyFactory | addressCopyFactory VERSION 3: one CopyAccount per copier and leader. |
| copyAccountImpl | addressThe CopyAccount implementation every copy account clones (EIP-1167). |
| pusd | addressPickleUSD (pUSD), six decimals. The test dollar every position is margined in. |
| pusdExchange | addressSenditPusdExchange: pUSD for ETH at one dollar. |
| perpsPrevious | arrayEngines that still hold positions: [{ engine, orders, vault, block, version }]. Legacy positions there are closed by the wallet. |
| copyFactoryPrevious | arrayEarlier copy factories: [{ factory, impl, block, version, engine }]. Stop and withdraw old copies there. |
| perpsBlock, bankBlock, copyFactoryBlock, pusdExchangeBlock | numberThe block each contract was deployed in: where an indexer starts reading logs. |
| pusdWethPool, feeRecipient, keeper | addressThe pool the protocol's fee share is sold through, the FeeRouter that receives it, and the keeper's wallet. |
idBase в манифесте нет: читайте idBase() у движка.
Текущие адреса
В том виде, в каком они отдавались на 2026-10-20. Сверяйте их с манифестом; не зашивайте их в код.
| Ключ | Адрес |
|---|---|
| bank | 0x3366f560DC1539B5Db4f889CB603C3BDd369298F |
| perps | 0x57c61D24BaE12D24100ac1FB20950B88904be971VERSION 3, idBase() 10000000: position and request ids start at 10,000,001 |
| perpOrders | 0xcb62fcb714f8aa69d2b2abC8Ba9cCEF2A1E02C84 |
| perpVault | 0x20F4E42E5f56E47e6e058fA137c698C86B0aF459 |
| spotRouter | 0xD6516A4720018AFa6c777F2D686247d715EDa04B |
| copyFactory | 0xf288A5F90Ea3b07b014f52110FC4C7f82206dd95 |
| pusd | 0x47091c58e34bDC4f32A05541C1243710249Dd777 |
| pusdExchange | 0x07b5E6fd6b5A86FBE3685B434988D3b5aFB4385F |
| perpsPrevious[0].engine | 0x8452242B9d7C453556E3a9b0556e48a25ced0ef2VERSION 1, ids from 1, wallet-signed only |
Идентификаторы и прежние движки
Текущий движок нумерует позиции начиная с idBase() + 1, то есть с 10,000,001, а его книга ордеров нумерует запросы от той же базы, так что идентификатор обозначает одну позицию или один запрос во всей сети, в каком бы движке они ни находились. Прежний движок (VERSION 1, в perpsPrevious) нумерует с 1, появился раньше банка и работает только с подписью кошелька: позиции, всё ещё открытые там, закрываются его собственным close с того кошелька, который их открыл. dex-api помечает каждую строку из него как legacy: true.
Манифест - единственный источник истины, которым пользуется само приложение. Если ключа нет (в сети нет банка, обменника ещё нет), функция там выключена; /api/perp/deployment просто опускает это поле.