@theliem/xmarket-sdk 3.4.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +352 -28
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +352 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -563,6 +563,7 @@ declare class ClobClient {
|
|
|
563
563
|
ensureAlt(condition: PublicKey, collateralMint: PublicKey, takerSigned: SignedOrder, makers: SignedOrder[]): Promise<AddressLookupTableAccount>;
|
|
564
564
|
private _sendLegacyTxSig;
|
|
565
565
|
private _sendLegacyTx;
|
|
566
|
+
private _ensureClobOutcomeAtas;
|
|
566
567
|
/**
|
|
567
568
|
* Send a match transaction as versioned (v0) with optional ALT.
|
|
568
569
|
* Both operator wallet and payer (this.provider.wallet) sign.
|
|
@@ -602,6 +603,13 @@ declare class ClobClient {
|
|
|
602
603
|
* Phase 2: 1 atomic match tx.
|
|
603
604
|
*/
|
|
604
605
|
private matchComplementary;
|
|
606
|
+
/**
|
|
607
|
+
* 1 SELL taker vs N BUY makers.
|
|
608
|
+
* Rust program only supports BUY-as-taker, so we decompose into N instructions
|
|
609
|
+
* (BUY_i as taker, SELL as single maker) combined into one atomic transaction.
|
|
610
|
+
* Engine must use limitPrice for BUY.makerAmount to pass per-pair crossing check.
|
|
611
|
+
*/
|
|
612
|
+
private matchComplementarySellVsMultiBuy;
|
|
605
613
|
/**
|
|
606
614
|
* MINT: 1 YES buyer (taker) + N NO buyers (makers).
|
|
607
615
|
* Phase 1: register taker + all NO makers in parallel.
|
package/dist/index.d.ts
CHANGED
|
@@ -563,6 +563,7 @@ declare class ClobClient {
|
|
|
563
563
|
ensureAlt(condition: PublicKey, collateralMint: PublicKey, takerSigned: SignedOrder, makers: SignedOrder[]): Promise<AddressLookupTableAccount>;
|
|
564
564
|
private _sendLegacyTxSig;
|
|
565
565
|
private _sendLegacyTx;
|
|
566
|
+
private _ensureClobOutcomeAtas;
|
|
566
567
|
/**
|
|
567
568
|
* Send a match transaction as versioned (v0) with optional ALT.
|
|
568
569
|
* Both operator wallet and payer (this.provider.wallet) sign.
|
|
@@ -602,6 +603,13 @@ declare class ClobClient {
|
|
|
602
603
|
* Phase 2: 1 atomic match tx.
|
|
603
604
|
*/
|
|
604
605
|
private matchComplementary;
|
|
606
|
+
/**
|
|
607
|
+
* 1 SELL taker vs N BUY makers.
|
|
608
|
+
* Rust program only supports BUY-as-taker, so we decompose into N instructions
|
|
609
|
+
* (BUY_i as taker, SELL as single maker) combined into one atomic transaction.
|
|
610
|
+
* Engine must use limitPrice for BUY.makerAmount to pass per-pair crossing check.
|
|
611
|
+
*/
|
|
612
|
+
private matchComplementarySellVsMultiBuy;
|
|
605
613
|
/**
|
|
606
614
|
* MINT: 1 YES buyer (taker) + N NO buyers (makers).
|
|
607
615
|
* Phase 1: register taker + all NO makers in parallel.
|
package/dist/index.js
CHANGED
|
@@ -1407,15 +1407,39 @@ var ClobClient = class {
|
|
|
1407
1407
|
takerOrderRecord
|
|
1408
1408
|
];
|
|
1409
1409
|
if (feeRecipientAddr) addresses.push(feeRecipientAddr);
|
|
1410
|
+
const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);
|
|
1411
|
+
const [vaultToken] = PDA.vaultToken(collateralMint, this.programIds);
|
|
1412
|
+
const [mintAuth] = PDA.mintAuthority(condition, this.programIds);
|
|
1413
|
+
const [extraMetaNo] = PDA.extraAccountMetaList(noMint, this.programIds);
|
|
1414
|
+
const clobUsdcAta = splToken.getAssociatedTokenAddressSync(collateralMint, clobConfigPda, true);
|
|
1415
|
+
const clobYesAta = splToken.getAssociatedTokenAddressSync(yesMint, clobConfigPda, true, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1416
|
+
const clobNoAta = splToken.getAssociatedTokenAddressSync(noMint, clobConfigPda, true, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1417
|
+
const [clobYesPos] = PDA.position(condition, 1, clobConfigPda, this.programIds);
|
|
1418
|
+
const [clobNoPos] = PDA.position(condition, 0, clobConfigPda, this.programIds);
|
|
1419
|
+
addresses.push(
|
|
1420
|
+
collateralVault,
|
|
1421
|
+
vaultToken,
|
|
1422
|
+
mintAuth,
|
|
1423
|
+
extraMetaNo,
|
|
1424
|
+
clobUsdcAta,
|
|
1425
|
+
clobYesAta,
|
|
1426
|
+
clobNoAta,
|
|
1427
|
+
clobYesPos,
|
|
1428
|
+
clobNoPos,
|
|
1429
|
+
collateralMint,
|
|
1430
|
+
splToken.ASSOCIATED_TOKEN_PROGRAM_ID
|
|
1431
|
+
);
|
|
1410
1432
|
for (const m of makers) {
|
|
1411
1433
|
const seller = m.order.maker;
|
|
1412
|
-
const
|
|
1434
|
+
const makerTokenId = m.order.tokenId;
|
|
1435
|
+
const makerMint = makerTokenId === 1 ? yesMint : noMint;
|
|
1436
|
+
const [sellerPos] = PDA.position(condition, makerTokenId, seller, this.programIds);
|
|
1413
1437
|
const [sellerStatus] = PDA.orderStatus(seller, m.order.nonce, this.programIds);
|
|
1414
1438
|
const [sellerRecord] = PDA.orderRecord(seller, m.order.nonce, this.programIds);
|
|
1415
1439
|
addresses.push(
|
|
1416
1440
|
seller,
|
|
1417
1441
|
sellerRecord,
|
|
1418
|
-
splToken.getAssociatedTokenAddressSync(
|
|
1442
|
+
splToken.getAssociatedTokenAddressSync(makerMint, seller, false, splToken.TOKEN_2022_PROGRAM_ID),
|
|
1419
1443
|
splToken.getAssociatedTokenAddressSync(collateralMint, seller),
|
|
1420
1444
|
sellerPos,
|
|
1421
1445
|
sellerStatus
|
|
@@ -1487,6 +1511,36 @@ ${logs.join("\n")}`);
|
|
|
1487
1511
|
async _sendLegacyTx(instructions) {
|
|
1488
1512
|
await this._sendLegacyTxSig(instructions);
|
|
1489
1513
|
}
|
|
1514
|
+
async _ensureClobOutcomeAtas(yesMint, noMint, clobConfig, clobYesAta, clobNoAta) {
|
|
1515
|
+
const { connection } = this.provider;
|
|
1516
|
+
const [yesInfo, noInfo] = await Promise.all([
|
|
1517
|
+
connection.getAccountInfo(clobYesAta),
|
|
1518
|
+
connection.getAccountInfo(clobNoAta)
|
|
1519
|
+
]);
|
|
1520
|
+
const { createAssociatedTokenAccountIdempotentInstruction: createAssociatedTokenAccountIdempotentInstruction2 } = await import('@solana/spl-token');
|
|
1521
|
+
const ixs = [];
|
|
1522
|
+
if (!yesInfo) {
|
|
1523
|
+
ixs.push(createAssociatedTokenAccountIdempotentInstruction2(
|
|
1524
|
+
this.walletPubkey,
|
|
1525
|
+
clobYesAta,
|
|
1526
|
+
clobConfig,
|
|
1527
|
+
yesMint,
|
|
1528
|
+
splToken.TOKEN_2022_PROGRAM_ID
|
|
1529
|
+
));
|
|
1530
|
+
}
|
|
1531
|
+
if (!noInfo) {
|
|
1532
|
+
ixs.push(createAssociatedTokenAccountIdempotentInstruction2(
|
|
1533
|
+
this.walletPubkey,
|
|
1534
|
+
clobNoAta,
|
|
1535
|
+
clobConfig,
|
|
1536
|
+
noMint,
|
|
1537
|
+
splToken.TOKEN_2022_PROGRAM_ID
|
|
1538
|
+
));
|
|
1539
|
+
}
|
|
1540
|
+
if (ixs.length > 0) {
|
|
1541
|
+
await this._sendLegacyTx(ixs);
|
|
1542
|
+
}
|
|
1543
|
+
}
|
|
1490
1544
|
/**
|
|
1491
1545
|
* Send a match transaction as versioned (v0) with optional ALT.
|
|
1492
1546
|
* Both operator wallet and payer (this.provider.wallet) sign.
|
|
@@ -1494,11 +1548,12 @@ ${logs.join("\n")}`);
|
|
|
1494
1548
|
async sendMatchTx(instructions, lookupTable, whitelistedWallet) {
|
|
1495
1549
|
const { connection } = this.provider;
|
|
1496
1550
|
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();
|
|
1497
|
-
const cuLimit = web3_js.ComputeBudgetProgram.setComputeUnitLimit({ units:
|
|
1551
|
+
const cuLimit = web3_js.ComputeBudgetProgram.setComputeUnitLimit({ units: 14e5 });
|
|
1552
|
+
const heapFrame = web3_js.ComputeBudgetProgram.requestHeapFrame({ bytes: 262144 });
|
|
1498
1553
|
const message = new web3_js.TransactionMessage({
|
|
1499
1554
|
payerKey: this.walletPubkey,
|
|
1500
1555
|
recentBlockhash: blockhash,
|
|
1501
|
-
instructions: [cuLimit, ...instructions]
|
|
1556
|
+
instructions: [cuLimit, heapFrame, ...instructions]
|
|
1502
1557
|
}).compileToV0Message(lookupTable ? [lookupTable] : []);
|
|
1503
1558
|
const vtx = new web3_js.VersionedTransaction(message);
|
|
1504
1559
|
const signers = [this.provider.wallet.payer];
|
|
@@ -1507,7 +1562,7 @@ ${logs.join("\n")}`);
|
|
|
1507
1562
|
}
|
|
1508
1563
|
vtx.sign(signers);
|
|
1509
1564
|
const sig = await connection.sendRawTransaction(vtx.serialize(), {
|
|
1510
|
-
skipPreflight:
|
|
1565
|
+
skipPreflight: false
|
|
1511
1566
|
});
|
|
1512
1567
|
const result = await connection.confirmTransaction(
|
|
1513
1568
|
{ signature: sig, blockhash, lastValidBlockHeight },
|
|
@@ -1710,6 +1765,47 @@ ${logs.join("\n")}`);
|
|
|
1710
1765
|
const sig = await this.sendMatchTx(ixs, lookupTable, operatorWallet);
|
|
1711
1766
|
return { signature: sig };
|
|
1712
1767
|
}
|
|
1768
|
+
/**
|
|
1769
|
+
* 1 SELL taker vs N BUY makers.
|
|
1770
|
+
* Rust program only supports BUY-as-taker, so we decompose into N instructions
|
|
1771
|
+
* (BUY_i as taker, SELL as single maker) combined into one atomic transaction.
|
|
1772
|
+
* Engine must use limitPrice for BUY.makerAmount to pass per-pair crossing check.
|
|
1773
|
+
*/
|
|
1774
|
+
async matchComplementarySellVsMultiBuy(sellTaker, buyMakers, collateralMint, feeRecipient, operatorWallet, lookupTable, opts) {
|
|
1775
|
+
await Promise.all([
|
|
1776
|
+
this.registerOrderIfNeeded(sellTaker),
|
|
1777
|
+
...buyMakers.map((m) => this.registerOrderIfNeeded(m))
|
|
1778
|
+
]);
|
|
1779
|
+
const sell = sellTaker.order;
|
|
1780
|
+
const crossingBuys = buyMakers.filter((b) => {
|
|
1781
|
+
const buy = b.order;
|
|
1782
|
+
const lhs = BigInt(buy.makerAmount.toString()) * BigInt(sell.makerAmount.toString());
|
|
1783
|
+
const rhs = BigInt(buy.takerAmount.toString()) * BigInt(sell.takerAmount.toString());
|
|
1784
|
+
return lhs >= rhs;
|
|
1785
|
+
});
|
|
1786
|
+
if (crossingBuys.length === 0) {
|
|
1787
|
+
throw new InvalidParamError("COMPLEMENTARY: no BUY maker orders cross with the SELL taker");
|
|
1788
|
+
}
|
|
1789
|
+
if (crossingBuys.length < buyMakers.length) {
|
|
1790
|
+
console.warn(`[matchOrders] SELL+BUY: filtered ${buyMakers.length - crossingBuys.length} non-crossing BUY(s)`);
|
|
1791
|
+
}
|
|
1792
|
+
const allIxs = [];
|
|
1793
|
+
for (const buyMaker of crossingBuys) {
|
|
1794
|
+
const ixs = await this.buildMatchComplementaryIxs(
|
|
1795
|
+
buyMaker,
|
|
1796
|
+
// BUY as taker
|
|
1797
|
+
[sellTaker],
|
|
1798
|
+
// SELL as maker
|
|
1799
|
+
collateralMint,
|
|
1800
|
+
feeRecipient,
|
|
1801
|
+
operatorWallet.publicKey,
|
|
1802
|
+
opts
|
|
1803
|
+
);
|
|
1804
|
+
allIxs.push(...ixs);
|
|
1805
|
+
}
|
|
1806
|
+
const sig = await this.sendMatchTx(allIxs, lookupTable, operatorWallet);
|
|
1807
|
+
return { signature: sig };
|
|
1808
|
+
}
|
|
1713
1809
|
/**
|
|
1714
1810
|
* MINT: 1 YES buyer (taker) + N NO buyers (makers).
|
|
1715
1811
|
* Phase 1: register taker + all NO makers in parallel.
|
|
@@ -1727,6 +1823,7 @@ ${logs.join("\n")}`);
|
|
|
1727
1823
|
const taker = yesSigned.order.maker;
|
|
1728
1824
|
const takerNonce = yesSigned.order.nonce;
|
|
1729
1825
|
const fillAmount = new anchor5__namespace.BN("18446744073709551615");
|
|
1826
|
+
const clobConfig = this.configPda();
|
|
1730
1827
|
const [yesMint] = PDA.yesMint(condition, this.programIds);
|
|
1731
1828
|
const [noMint] = PDA.noMint(condition, this.programIds);
|
|
1732
1829
|
const [mintAuthority] = PDA.mintAuthority(condition, this.programIds);
|
|
@@ -1737,6 +1834,15 @@ ${logs.join("\n")}`);
|
|
|
1737
1834
|
const takerYesToken = splToken.getAssociatedTokenAddressSync(yesMint, taker, false, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1738
1835
|
const [takerYesPosition] = PDA.position(condition, 1, taker, this.programIds);
|
|
1739
1836
|
const [takerOrderStatus] = PDA.orderStatus(taker, takerNonce, this.programIds);
|
|
1837
|
+
const clobUsdcAta = splToken.getAssociatedTokenAddressSync(collateralMint, clobConfig, true);
|
|
1838
|
+
const clobYesAta = splToken.getAssociatedTokenAddressSync(yesMint, clobConfig, true, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1839
|
+
const clobNoAta = splToken.getAssociatedTokenAddressSync(noMint, clobConfig, true, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1840
|
+
const [clobYesPos] = PDA.position(condition, 1, clobConfig, this.programIds);
|
|
1841
|
+
const [clobNoPos] = PDA.position(condition, 0, clobConfig, this.programIds);
|
|
1842
|
+
const [extraMetaYes] = PDA.extraAccountMetaList(yesMint, this.programIds);
|
|
1843
|
+
const [extraMetaNo] = PDA.extraAccountMetaList(noMint, this.programIds);
|
|
1844
|
+
const [hookConfig] = PDA.hookConfig(this.programIds);
|
|
1845
|
+
const hookProgram = this.programIds.hook;
|
|
1740
1846
|
const remainingAccounts = [];
|
|
1741
1847
|
for (const nm of noMakers) {
|
|
1742
1848
|
const noMaker = nm.order.maker;
|
|
@@ -1746,6 +1852,7 @@ ${logs.join("\n")}`);
|
|
|
1746
1852
|
const [noPosition] = PDA.position(condition, 0, noMaker, this.programIds);
|
|
1747
1853
|
const [noStatus] = PDA.orderStatus(noMaker, nm.order.nonce, this.programIds);
|
|
1748
1854
|
remainingAccounts.push(
|
|
1855
|
+
{ pubkey: noMaker, isSigner: false, isWritable: false },
|
|
1749
1856
|
{ pubkey: noRecord, isSigner: false, isWritable: false },
|
|
1750
1857
|
{ pubkey: noToken, isSigner: false, isWritable: true },
|
|
1751
1858
|
{ pubkey: noCollateral, isSigner: false, isWritable: true },
|
|
@@ -1753,10 +1860,16 @@ ${logs.join("\n")}`);
|
|
|
1753
1860
|
{ pubkey: noStatus, isSigner: false, isWritable: true }
|
|
1754
1861
|
);
|
|
1755
1862
|
}
|
|
1863
|
+
remainingAccounts.push(
|
|
1864
|
+
{ pubkey: extraMetaYes, isSigner: false, isWritable: false },
|
|
1865
|
+
{ pubkey: extraMetaNo, isSigner: false, isWritable: false },
|
|
1866
|
+
{ pubkey: hookConfig, isSigner: false, isWritable: false },
|
|
1867
|
+
{ pubkey: hookProgram, isSigner: false, isWritable: false }
|
|
1868
|
+
);
|
|
1756
1869
|
const matchIx = await this.program.methods.matchMintOrders(takerNonce, fillAmount).accounts({
|
|
1757
1870
|
operator: operatorWallet.publicKey,
|
|
1758
1871
|
payer: this.walletPubkey,
|
|
1759
|
-
clobConfig
|
|
1872
|
+
clobConfig,
|
|
1760
1873
|
condition,
|
|
1761
1874
|
taker,
|
|
1762
1875
|
takerOrderRecord,
|
|
@@ -1764,16 +1877,25 @@ ${logs.join("\n")}`);
|
|
|
1764
1877
|
takerYesToken,
|
|
1765
1878
|
takerYesPosition,
|
|
1766
1879
|
takerOrderStatus,
|
|
1880
|
+
clobUsdcAta,
|
|
1881
|
+
clobYesAta,
|
|
1882
|
+
clobNoAta,
|
|
1883
|
+
clobYesPosition: clobYesPos,
|
|
1884
|
+
clobNoPosition: clobNoPos,
|
|
1767
1885
|
collateralVault,
|
|
1768
1886
|
vaultTokenAccount,
|
|
1887
|
+
collateralMint,
|
|
1769
1888
|
yesMint,
|
|
1770
1889
|
noMint,
|
|
1771
1890
|
mintAuthority,
|
|
1772
|
-
clobAuthority:
|
|
1891
|
+
clobAuthority: clobConfig,
|
|
1773
1892
|
conditionalTokensProgram: this.programIds.conditionalTokens,
|
|
1774
1893
|
collateralTokenProgram: splToken.TOKEN_PROGRAM_ID,
|
|
1894
|
+
token2022Program: splToken.TOKEN_2022_PROGRAM_ID,
|
|
1895
|
+
associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
1775
1896
|
systemProgram: web3_js.SystemProgram.programId
|
|
1776
1897
|
}).remainingAccounts(remainingAccounts).instruction();
|
|
1898
|
+
await this._ensureClobOutcomeAtas(yesMint, noMint, clobConfig, clobYesAta, clobNoAta);
|
|
1777
1899
|
const sig = await this.sendMatchTx([matchIx], lookupTable, operatorWallet);
|
|
1778
1900
|
return { signature: sig };
|
|
1779
1901
|
}
|
|
@@ -1795,9 +1917,9 @@ ${logs.join("\n")}`);
|
|
|
1795
1917
|
const sellerYes = yesSigned.order.maker;
|
|
1796
1918
|
const takerNonce = yesSigned.order.nonce;
|
|
1797
1919
|
const fillAmount = new anchor5__namespace.BN("18446744073709551615");
|
|
1920
|
+
const clobConfig = this.configPda();
|
|
1798
1921
|
const [yesMint] = PDA.yesMint(condition, this.programIds);
|
|
1799
1922
|
const [noMint] = PDA.noMint(condition, this.programIds);
|
|
1800
|
-
const [mintAuthority] = PDA.mintAuthority(condition, this.programIds);
|
|
1801
1923
|
const [collateralVault] = PDA.collateralVault(collateralMint, this.programIds);
|
|
1802
1924
|
const [vaultTokenAccount] = PDA.vaultToken(collateralMint, this.programIds);
|
|
1803
1925
|
const [takerOrderRecord] = PDA.orderRecord(sellerYes, takerNonce, this.programIds);
|
|
@@ -1805,6 +1927,15 @@ ${logs.join("\n")}`);
|
|
|
1805
1927
|
const [takerYesPosition] = PDA.position(condition, 1, sellerYes, this.programIds);
|
|
1806
1928
|
const takerCollateral = splToken.getAssociatedTokenAddressSync(collateralMint, sellerYes);
|
|
1807
1929
|
const [takerOrderStatus] = PDA.orderStatus(sellerYes, takerNonce, this.programIds);
|
|
1930
|
+
const clobUsdcAta = splToken.getAssociatedTokenAddressSync(collateralMint, clobConfig, true);
|
|
1931
|
+
const clobYesAta = splToken.getAssociatedTokenAddressSync(yesMint, clobConfig, true, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1932
|
+
const clobNoAta = splToken.getAssociatedTokenAddressSync(noMint, clobConfig, true, splToken.TOKEN_2022_PROGRAM_ID);
|
|
1933
|
+
const [clobYesPos] = PDA.position(condition, 1, clobConfig, this.programIds);
|
|
1934
|
+
const [clobNoPos] = PDA.position(condition, 0, clobConfig, this.programIds);
|
|
1935
|
+
const [extraMetaYes] = PDA.extraAccountMetaList(yesMint, this.programIds);
|
|
1936
|
+
const [extraMetaNo] = PDA.extraAccountMetaList(noMint, this.programIds);
|
|
1937
|
+
const [hookConfig] = PDA.hookConfig(this.programIds);
|
|
1938
|
+
const hookProgram = this.programIds.hook;
|
|
1808
1939
|
const remainingAccounts = [];
|
|
1809
1940
|
for (const nm of noMakers) {
|
|
1810
1941
|
const noMaker = nm.order.maker;
|
|
@@ -1814,6 +1945,7 @@ ${logs.join("\n")}`);
|
|
|
1814
1945
|
const [noPosition] = PDA.position(condition, 0, noMaker, this.programIds);
|
|
1815
1946
|
const [noStatus] = PDA.orderStatus(noMaker, nm.order.nonce, this.programIds);
|
|
1816
1947
|
remainingAccounts.push(
|
|
1948
|
+
{ pubkey: noMaker, isSigner: false, isWritable: false },
|
|
1817
1949
|
{ pubkey: noRecord, isSigner: false, isWritable: false },
|
|
1818
1950
|
{ pubkey: noToken, isSigner: false, isWritable: true },
|
|
1819
1951
|
{ pubkey: noCollateral, isSigner: false, isWritable: true },
|
|
@@ -1821,6 +1953,12 @@ ${logs.join("\n")}`);
|
|
|
1821
1953
|
{ pubkey: noStatus, isSigner: false, isWritable: true }
|
|
1822
1954
|
);
|
|
1823
1955
|
}
|
|
1956
|
+
remainingAccounts.push(
|
|
1957
|
+
{ pubkey: extraMetaYes, isSigner: false, isWritable: false },
|
|
1958
|
+
{ pubkey: extraMetaNo, isSigner: false, isWritable: false },
|
|
1959
|
+
{ pubkey: hookConfig, isSigner: false, isWritable: false },
|
|
1960
|
+
{ pubkey: hookProgram, isSigner: false, isWritable: false }
|
|
1961
|
+
);
|
|
1824
1962
|
if (yesSigned.order.fee.gtn(0) && this.programIds.feeManagement && this.feeConfigOwner) {
|
|
1825
1963
|
const companyAddr = await this.companyAddress();
|
|
1826
1964
|
if (companyAddr) {
|
|
@@ -1837,7 +1975,7 @@ ${logs.join("\n")}`);
|
|
|
1837
1975
|
const matchIx = await this.program.methods.matchMergeOrders(takerNonce, fillAmount).accounts({
|
|
1838
1976
|
operator: operatorWallet.publicKey,
|
|
1839
1977
|
payer: this.walletPubkey,
|
|
1840
|
-
clobConfig
|
|
1978
|
+
clobConfig,
|
|
1841
1979
|
condition,
|
|
1842
1980
|
taker: sellerYes,
|
|
1843
1981
|
takerOrderRecord,
|
|
@@ -1845,17 +1983,24 @@ ${logs.join("\n")}`);
|
|
|
1845
1983
|
takerYesPosition,
|
|
1846
1984
|
takerCollateral,
|
|
1847
1985
|
takerOrderStatus,
|
|
1986
|
+
clobUsdcAta,
|
|
1987
|
+
clobYesAta,
|
|
1988
|
+
clobNoAta,
|
|
1989
|
+
clobYesPosition: clobYesPos,
|
|
1990
|
+
clobNoPosition: clobNoPos,
|
|
1848
1991
|
collateralVault,
|
|
1849
1992
|
vaultTokenAccount,
|
|
1993
|
+
collateralMint,
|
|
1850
1994
|
yesMint,
|
|
1851
1995
|
noMint,
|
|
1852
|
-
|
|
1853
|
-
feeRecipient,
|
|
1854
|
-
clobAuthority: this.configPda(),
|
|
1996
|
+
clobAuthority: clobConfig,
|
|
1855
1997
|
conditionalTokensProgram: this.programIds.conditionalTokens,
|
|
1856
1998
|
collateralTokenProgram: splToken.TOKEN_PROGRAM_ID,
|
|
1999
|
+
token2022Program: splToken.TOKEN_2022_PROGRAM_ID,
|
|
2000
|
+
associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
1857
2001
|
systemProgram: web3_js.SystemProgram.programId
|
|
1858
2002
|
}).remainingAccounts(remainingAccounts).instruction();
|
|
2003
|
+
await this._ensureClobOutcomeAtas(yesMint, noMint, clobConfig, clobYesAta, clobNoAta);
|
|
1859
2004
|
const sig = await this.sendMatchTx([matchIx], lookupTable, operatorWallet);
|
|
1860
2005
|
return { signature: sig };
|
|
1861
2006
|
}
|
|
@@ -1896,25 +2041,24 @@ ${logs.join("\n")}`);
|
|
|
1896
2041
|
buySignedOrder = taker;
|
|
1897
2042
|
sellCandidates = makers;
|
|
1898
2043
|
} else if (t.side === SIDE_SELL && makers.every((m) => m.order.side === SIDE_BUY)) {
|
|
1899
|
-
|
|
1900
|
-
sellCandidates = [taker, ...makers.slice(1)];
|
|
2044
|
+
return this.matchComplementarySellVsMultiBuy(taker, makers, collateralMint, feeRecipient, operatorWallet, alt, opts);
|
|
1901
2045
|
} else {
|
|
1902
2046
|
throw new InvalidParamError("COMPLEMENTARY requires one BUY and one or more SELLs on same tokenId");
|
|
1903
2047
|
}
|
|
1904
|
-
const
|
|
1905
|
-
|
|
2048
|
+
const buy = buySignedOrder.order;
|
|
2049
|
+
const finalSells = sellCandidates.filter((s) => {
|
|
1906
2050
|
const sell = s.order;
|
|
1907
2051
|
const lhs = BigInt(buy.makerAmount.toString()) * BigInt(sell.makerAmount.toString());
|
|
1908
2052
|
const rhs = BigInt(buy.takerAmount.toString()) * BigInt(sell.takerAmount.toString());
|
|
1909
2053
|
return lhs >= rhs;
|
|
1910
2054
|
});
|
|
1911
|
-
if (
|
|
2055
|
+
if (finalSells.length === 0) {
|
|
1912
2056
|
throw new InvalidParamError("COMPLEMENTARY: no maker orders cross with the buy order");
|
|
1913
2057
|
}
|
|
1914
|
-
if (
|
|
1915
|
-
console.warn(`[matchOrders] filtered ${sellCandidates.length -
|
|
2058
|
+
if (finalSells.length < sellCandidates.length) {
|
|
2059
|
+
console.warn(`[matchOrders] filtered ${sellCandidates.length - finalSells.length} non-crossing maker(s)`);
|
|
1916
2060
|
}
|
|
1917
|
-
return this.matchComplementary(buySignedOrder,
|
|
2061
|
+
return this.matchComplementary(buySignedOrder, finalSells, collateralMint, feeRecipient, operatorWallet, alt, opts);
|
|
1918
2062
|
}
|
|
1919
2063
|
const allBuy = t.side === SIDE_BUY && makers.every((m) => m.order.side === SIDE_BUY);
|
|
1920
2064
|
const allSell = t.side === SIDE_SELL && makers.every((m) => m.order.side === SIDE_SELL);
|
|
@@ -8615,7 +8759,8 @@ var clob_exchange_default = {
|
|
|
8615
8759
|
}
|
|
8616
8760
|
},
|
|
8617
8761
|
{
|
|
8618
|
-
name: "condition"
|
|
8762
|
+
name: "condition",
|
|
8763
|
+
writable: true
|
|
8619
8764
|
},
|
|
8620
8765
|
{
|
|
8621
8766
|
name: "taker"
|
|
@@ -8691,27 +8836,98 @@ var clob_exchange_default = {
|
|
|
8691
8836
|
}
|
|
8692
8837
|
},
|
|
8693
8838
|
{
|
|
8694
|
-
name: "
|
|
8839
|
+
name: "clob_usdc_ata",
|
|
8840
|
+
docs: [
|
|
8841
|
+
"USDC ATA owned by clob_config \u2014 receives USDC from vault after merge"
|
|
8842
|
+
],
|
|
8843
|
+
writable: true,
|
|
8844
|
+
pda: {
|
|
8845
|
+
seeds: [
|
|
8846
|
+
{
|
|
8847
|
+
kind: "account",
|
|
8848
|
+
path: "clob_config"
|
|
8849
|
+
},
|
|
8850
|
+
{
|
|
8851
|
+
kind: "account",
|
|
8852
|
+
path: "collateral_token_program"
|
|
8853
|
+
},
|
|
8854
|
+
{
|
|
8855
|
+
kind: "account",
|
|
8856
|
+
path: "collateral_mint"
|
|
8857
|
+
}
|
|
8858
|
+
],
|
|
8859
|
+
program: {
|
|
8860
|
+
kind: "const",
|
|
8861
|
+
value: [
|
|
8862
|
+
140,
|
|
8863
|
+
151,
|
|
8864
|
+
37,
|
|
8865
|
+
143,
|
|
8866
|
+
78,
|
|
8867
|
+
36,
|
|
8868
|
+
137,
|
|
8869
|
+
241,
|
|
8870
|
+
187,
|
|
8871
|
+
61,
|
|
8872
|
+
16,
|
|
8873
|
+
41,
|
|
8874
|
+
20,
|
|
8875
|
+
142,
|
|
8876
|
+
13,
|
|
8877
|
+
131,
|
|
8878
|
+
11,
|
|
8879
|
+
90,
|
|
8880
|
+
19,
|
|
8881
|
+
153,
|
|
8882
|
+
218,
|
|
8883
|
+
255,
|
|
8884
|
+
16,
|
|
8885
|
+
132,
|
|
8886
|
+
4,
|
|
8887
|
+
142,
|
|
8888
|
+
123,
|
|
8889
|
+
216,
|
|
8890
|
+
219,
|
|
8891
|
+
233,
|
|
8892
|
+
248,
|
|
8893
|
+
89
|
|
8894
|
+
]
|
|
8895
|
+
}
|
|
8896
|
+
}
|
|
8897
|
+
},
|
|
8898
|
+
{
|
|
8899
|
+
name: "clob_yes_ata",
|
|
8695
8900
|
writable: true
|
|
8696
8901
|
},
|
|
8697
8902
|
{
|
|
8698
|
-
name: "
|
|
8903
|
+
name: "clob_no_ata",
|
|
8699
8904
|
writable: true
|
|
8700
8905
|
},
|
|
8701
8906
|
{
|
|
8702
|
-
name: "
|
|
8907
|
+
name: "clob_yes_position",
|
|
8703
8908
|
writable: true
|
|
8704
8909
|
},
|
|
8705
8910
|
{
|
|
8706
|
-
name: "
|
|
8911
|
+
name: "clob_no_position",
|
|
8707
8912
|
writable: true
|
|
8708
8913
|
},
|
|
8709
8914
|
{
|
|
8710
|
-
name: "
|
|
8915
|
+
name: "collateral_vault",
|
|
8711
8916
|
writable: true
|
|
8712
8917
|
},
|
|
8713
8918
|
{
|
|
8714
|
-
name: "
|
|
8919
|
+
name: "vault_token_account",
|
|
8920
|
+
writable: true
|
|
8921
|
+
},
|
|
8922
|
+
{
|
|
8923
|
+
name: "collateral_mint"
|
|
8924
|
+
},
|
|
8925
|
+
{
|
|
8926
|
+
name: "yes_mint",
|
|
8927
|
+
writable: true
|
|
8928
|
+
},
|
|
8929
|
+
{
|
|
8930
|
+
name: "no_mint",
|
|
8715
8931
|
writable: true
|
|
8716
8932
|
},
|
|
8717
8933
|
{
|
|
@@ -8745,6 +8961,14 @@ var clob_exchange_default = {
|
|
|
8745
8961
|
name: "collateral_token_program",
|
|
8746
8962
|
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
|
|
8747
8963
|
},
|
|
8964
|
+
{
|
|
8965
|
+
name: "token_2022_program",
|
|
8966
|
+
address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"
|
|
8967
|
+
},
|
|
8968
|
+
{
|
|
8969
|
+
name: "associated_token_program",
|
|
8970
|
+
address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
|
|
8971
|
+
},
|
|
8748
8972
|
{
|
|
8749
8973
|
name: "system_program",
|
|
8750
8974
|
address: "11111111111111111111111111111111"
|
|
@@ -8810,7 +9034,8 @@ var clob_exchange_default = {
|
|
|
8810
9034
|
}
|
|
8811
9035
|
},
|
|
8812
9036
|
{
|
|
8813
|
-
name: "condition"
|
|
9037
|
+
name: "condition",
|
|
9038
|
+
writable: true
|
|
8814
9039
|
},
|
|
8815
9040
|
{
|
|
8816
9041
|
name: "taker"
|
|
@@ -8885,6 +9110,94 @@ var clob_exchange_default = {
|
|
|
8885
9110
|
]
|
|
8886
9111
|
}
|
|
8887
9112
|
},
|
|
9113
|
+
{
|
|
9114
|
+
name: "clob_usdc_ata",
|
|
9115
|
+
docs: [
|
|
9116
|
+
"USDC ATA owned by clob_config \u2014 receives combined USDC, then split_position pulls from here"
|
|
9117
|
+
],
|
|
9118
|
+
writable: true,
|
|
9119
|
+
pda: {
|
|
9120
|
+
seeds: [
|
|
9121
|
+
{
|
|
9122
|
+
kind: "account",
|
|
9123
|
+
path: "clob_config"
|
|
9124
|
+
},
|
|
9125
|
+
{
|
|
9126
|
+
kind: "account",
|
|
9127
|
+
path: "collateral_token_program"
|
|
9128
|
+
},
|
|
9129
|
+
{
|
|
9130
|
+
kind: "account",
|
|
9131
|
+
path: "collateral_mint"
|
|
9132
|
+
}
|
|
9133
|
+
],
|
|
9134
|
+
program: {
|
|
9135
|
+
kind: "const",
|
|
9136
|
+
value: [
|
|
9137
|
+
140,
|
|
9138
|
+
151,
|
|
9139
|
+
37,
|
|
9140
|
+
143,
|
|
9141
|
+
78,
|
|
9142
|
+
36,
|
|
9143
|
+
137,
|
|
9144
|
+
241,
|
|
9145
|
+
187,
|
|
9146
|
+
61,
|
|
9147
|
+
16,
|
|
9148
|
+
41,
|
|
9149
|
+
20,
|
|
9150
|
+
142,
|
|
9151
|
+
13,
|
|
9152
|
+
131,
|
|
9153
|
+
11,
|
|
9154
|
+
90,
|
|
9155
|
+
19,
|
|
9156
|
+
153,
|
|
9157
|
+
218,
|
|
9158
|
+
255,
|
|
9159
|
+
16,
|
|
9160
|
+
132,
|
|
9161
|
+
4,
|
|
9162
|
+
142,
|
|
9163
|
+
123,
|
|
9164
|
+
216,
|
|
9165
|
+
219,
|
|
9166
|
+
233,
|
|
9167
|
+
248,
|
|
9168
|
+
89
|
|
9169
|
+
]
|
|
9170
|
+
}
|
|
9171
|
+
}
|
|
9172
|
+
},
|
|
9173
|
+
{
|
|
9174
|
+
name: "clob_yes_ata",
|
|
9175
|
+
docs: [
|
|
9176
|
+
"YES Token-2022 ATA owned by clob_config \u2014 receives YES from split, then transferred to taker"
|
|
9177
|
+
],
|
|
9178
|
+
writable: true
|
|
9179
|
+
},
|
|
9180
|
+
{
|
|
9181
|
+
name: "clob_no_ata",
|
|
9182
|
+
docs: [
|
|
9183
|
+
"NO Token-2022 ATA owned by clob_config \u2014 receives NO from split, then transferred to makers"
|
|
9184
|
+
],
|
|
9185
|
+
writable: true
|
|
9186
|
+
},
|
|
9187
|
+
{
|
|
9188
|
+
name: "clob_yes_position",
|
|
9189
|
+
docs: [
|
|
9190
|
+
"YES Position PDA for clob_config (set by CTF split_position init_if_needed)"
|
|
9191
|
+
],
|
|
9192
|
+
writable: true
|
|
9193
|
+
},
|
|
9194
|
+
{
|
|
9195
|
+
name: "clob_no_position",
|
|
9196
|
+
docs: [
|
|
9197
|
+
"NO Position PDA for clob_config (set by CTF split_position init_if_needed)"
|
|
9198
|
+
],
|
|
9199
|
+
writable: true
|
|
9200
|
+
},
|
|
8888
9201
|
{
|
|
8889
9202
|
name: "collateral_vault",
|
|
8890
9203
|
writable: true
|
|
@@ -8893,6 +9206,9 @@ var clob_exchange_default = {
|
|
|
8893
9206
|
name: "vault_token_account",
|
|
8894
9207
|
writable: true
|
|
8895
9208
|
},
|
|
9209
|
+
{
|
|
9210
|
+
name: "collateral_mint"
|
|
9211
|
+
},
|
|
8896
9212
|
{
|
|
8897
9213
|
name: "yes_mint",
|
|
8898
9214
|
writable: true
|
|
@@ -8936,6 +9252,14 @@ var clob_exchange_default = {
|
|
|
8936
9252
|
name: "collateral_token_program",
|
|
8937
9253
|
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
|
|
8938
9254
|
},
|
|
9255
|
+
{
|
|
9256
|
+
name: "token_2022_program",
|
|
9257
|
+
address: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"
|
|
9258
|
+
},
|
|
9259
|
+
{
|
|
9260
|
+
name: "associated_token_program",
|
|
9261
|
+
address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
|
|
9262
|
+
},
|
|
8939
9263
|
{
|
|
8940
9264
|
name: "system_program",
|
|
8941
9265
|
address: "11111111111111111111111111111111"
|