Introduce AMM support (XLS-30d): (#4294)

Add AMM functionality:
- InstanceCreate
- Deposit
- Withdraw
- Governance
- Auctioning
- payment engine integration

To support this functionality, add:
- New RPC method, `amm_info`, to fetch pool and LPT balances
- AMM Root Account
- trust line for each IOU AMM token
- trust line to track Liquidity Provider Tokens (LPT)
- `ltAMM` object

The `ltAMM` object tracks:
- fee votes
- auction slot bids
- AMM tokens pair
- total outstanding tokens balance
- `AMMID` to AMM `RootAccountID` mapping

Add new classes to facilitate AMM integration into the payment engine.
`BookStep` uses these classes to infer if AMM liquidity can be consumed.

The AMM formula implementation uses the new Number class added in #4192.
IOUAmount and STAmount use Number arithmetic.

Add AMM unit tests for all features.

AMM requires the following amendments:
- featureAMM
- fixUniversalNumber
- featureFlowCross

Notes:
- Current trading fee threshold is 1%
- AMM currency is generated by: 0x03 + 152 bits of sha256{cur1, cur2}
- Current max AMM Offers is 30

---------

Co-authored-by: Howard Hinnant <howard.hinnant@gmail.com>
This commit is contained in:
Gregory Tsipenyuk
2023-07-12 13:52:50 -04:00
committed by tequ
parent 6edded0e21
commit 5ea0c2cbdc
108 changed files with 19083 additions and 1717 deletions

View File

@@ -102,6 +102,8 @@ CONSTRUCT_TYPED_SFIELD(sfLedgerEntryType, "LedgerEntryType", UINT16,
CONSTRUCT_TYPED_SFIELD(sfTransactionType, "TransactionType", UINT16, 2);
CONSTRUCT_TYPED_SFIELD(sfSignerWeight, "SignerWeight", UINT16, 3);
CONSTRUCT_TYPED_SFIELD(sfTransferFee, "TransferFee", UINT16, 4);
CONSTRUCT_TYPED_SFIELD(sfTradingFee, "TradingFee", UINT16, 5);
CONSTRUCT_TYPED_SFIELD(sfDiscountedFee, "DiscountedFee", UINT16, 6);
// 16-bit integers (uncommon)
CONSTRUCT_TYPED_SFIELD(sfVersion, "Version", UINT16, 16);
@@ -158,8 +160,8 @@ CONSTRUCT_TYPED_SFIELD(sfMintedNFTokens, "MintedNFTokens", UINT32,
CONSTRUCT_TYPED_SFIELD(sfBurnedNFTokens, "BurnedNFTokens", UINT32, 44);
CONSTRUCT_TYPED_SFIELD(sfHookStateCount, "HookStateCount", UINT32, 45);
CONSTRUCT_TYPED_SFIELD(sfEmitGeneration, "EmitGeneration", UINT32, 46);
// 47: RESERVED FOR AMM
// 48: RESERVED FOR AMM
// 47: RESERVED FOR AMM or LockCount(Hooks)
CONSTRUCT_TYPED_SFIELD(sfVoteWeight, "VoteWeight", UINT32, 48);
CONSTRUCT_TYPED_SFIELD(sfLockCount, "LockCount", UINT32, 49);
CONSTRUCT_TYPED_SFIELD(sfFirstNFTokenSequence, "FirstNFTokenSequence", UINT32, 50);
@@ -219,6 +221,7 @@ CONSTRUCT_TYPED_SFIELD(sfEmitParentTxnID, "EmitParentTxnID", UINT256,
CONSTRUCT_TYPED_SFIELD(sfEmitNonce, "EmitNonce", UINT256, 12);
CONSTRUCT_TYPED_SFIELD(sfEmitHookHash, "EmitHookHash", UINT256, 13);
CONSTRUCT_TYPED_SFIELD(sfObjectID, "ObjectID", UINT256, 14);
CONSTRUCT_TYPED_SFIELD(sfAMMID, "AMMID", UINT256, 15);
// 256-bit (uncommon)
CONSTRUCT_TYPED_SFIELD(sfBookDirectory, "BookDirectory", UINT256, 16);
@@ -258,6 +261,9 @@ CONSTRUCT_TYPED_SFIELD(sfHighLimit, "HighLimit", AMOUNT,
CONSTRUCT_TYPED_SFIELD(sfFee, "Fee", AMOUNT, 8);
CONSTRUCT_TYPED_SFIELD(sfSendMax, "SendMax", AMOUNT, 9);
CONSTRUCT_TYPED_SFIELD(sfDeliverMin, "DeliverMin", AMOUNT, 10);
CONSTRUCT_TYPED_SFIELD(sfAmount2, "Amount2", AMOUNT, 11);
CONSTRUCT_TYPED_SFIELD(sfBidMin, "BidMin", AMOUNT, 12);
CONSTRUCT_TYPED_SFIELD(sfBidMax, "BidMax", AMOUNT, 13);
// currency amount (uncommon)
CONSTRUCT_TYPED_SFIELD(sfMinimumOffer, "MinimumOffer", AMOUNT, 16);
@@ -272,6 +278,14 @@ CONSTRUCT_TYPED_SFIELD(sfBaseFeeDrops, "BaseFeeDrops", AMOU
CONSTRUCT_TYPED_SFIELD(sfReserveBaseDrops, "ReserveBaseDrops", AMOUNT, 23);
CONSTRUCT_TYPED_SFIELD(sfReserveIncrementDrops, "ReserveIncrementDrops", AMOUNT, 24);
// currency amount (AMM)
CONSTRUCT_TYPED_SFIELD(sfLPTokenOut, "LPTokenOut", AMOUNT, 25);
CONSTRUCT_TYPED_SFIELD(sfLPTokenIn, "LPTokenIn", AMOUNT, 26);
CONSTRUCT_TYPED_SFIELD(sfEPrice, "EPrice", AMOUNT, 27);
CONSTRUCT_TYPED_SFIELD(sfPrice, "Price", AMOUNT, 28);
// 29 and 30 are reserved for side-chains
CONSTRUCT_TYPED_SFIELD(sfLPTokenBalance, "LPTokenBalance", AMOUNT, 31);
// variable length (common)
CONSTRUCT_TYPED_SFIELD(sfPublicKey, "PublicKey", VL, 1);
CONSTRUCT_TYPED_SFIELD(sfMessageKey, "MessageKey", VL, 2);
@@ -330,6 +344,10 @@ CONSTRUCT_TYPED_SFIELD(sfURITokenIDs, "URITokenIDs", VECTOR25
// path set
CONSTRUCT_UNTYPED_SFIELD(sfPaths, "Paths", PATHSET, 1);
// issue
CONSTRUCT_TYPED_SFIELD(sfAsset, "Asset", ISSUE, 3);
CONSTRUCT_TYPED_SFIELD(sfAsset2, "Asset2", ISSUE, 4);
// inner object
// OBJECT/1 is reserved for end of object
CONSTRUCT_UNTYPED_SFIELD(sfTransactionMetaData, "TransactionMetaData", OBJECT, 2);
@@ -356,6 +374,9 @@ CONSTRUCT_UNTYPED_SFIELD(sfHookExecution, "HookExecution", OBJECT,
CONSTRUCT_UNTYPED_SFIELD(sfHookDefinition, "HookDefinition", OBJECT, 22);
CONSTRUCT_UNTYPED_SFIELD(sfHookParameter, "HookParameter", OBJECT, 23);
CONSTRUCT_UNTYPED_SFIELD(sfHookGrant, "HookGrant", OBJECT, 24);
CONSTRUCT_UNTYPED_SFIELD(sfVoteEntry, "VoteEntry", OBJECT, 25);
CONSTRUCT_UNTYPED_SFIELD(sfAuctionSlot, "AuctionSlot", OBJECT, 26);
CONSTRUCT_UNTYPED_SFIELD(sfAuthAccount, "AuthAccount", OBJECT, 27);
CONSTRUCT_UNTYPED_SFIELD(sfRemark, "Remark", OBJECT, 97);
CONSTRUCT_UNTYPED_SFIELD(sfGenesisMint, "GenesisMint", OBJECT, 96);
CONSTRUCT_UNTYPED_SFIELD(sfActiveValidator, "ActiveValidator", OBJECT, 95);
@@ -376,6 +397,7 @@ CONSTRUCT_UNTYPED_SFIELD(sfAffectedNodes, "AffectedNodes", ARRAY,
CONSTRUCT_UNTYPED_SFIELD(sfMemos, "Memos", ARRAY, 9);
CONSTRUCT_UNTYPED_SFIELD(sfNFTokens, "NFTokens", ARRAY, 10);
CONSTRUCT_UNTYPED_SFIELD(sfHooks, "Hooks", ARRAY, 11);
CONSTRUCT_UNTYPED_SFIELD(sfVoteSlots, "VoteSlots", ARRAY, 12);
// array of objects (uncommon)
CONSTRUCT_UNTYPED_SFIELD(sfMajorities, "Majorities", ARRAY, 16);
@@ -383,6 +405,8 @@ CONSTRUCT_UNTYPED_SFIELD(sfDisabledValidators, "DisabledValidators", ARRAY,
CONSTRUCT_UNTYPED_SFIELD(sfHookExecutions, "HookExecutions", ARRAY, 18);
CONSTRUCT_UNTYPED_SFIELD(sfHookParameters, "HookParameters", ARRAY, 19);
CONSTRUCT_UNTYPED_SFIELD(sfHookGrants, "HookGrants", ARRAY, 20);
// 21-24 is reserved for side-chains
CONSTRUCT_UNTYPED_SFIELD(sfAuthAccounts, "AuthAccounts", ARRAY, 25);
CONSTRUCT_UNTYPED_SFIELD(sfRemarks, "Remarks", ARRAY, 97);
CONSTRUCT_UNTYPED_SFIELD(sfGenesisMints, "GenesisMints", ARRAY, 96);
CONSTRUCT_UNTYPED_SFIELD(sfActiveValidators, "ActiveValidators", ARRAY, 95);