Make some v2 hooks api preparations

This commit is contained in:
Valtteri Karesto
2022-03-11 16:08:16 +02:00
parent f8fdeaf9ce
commit 723602ebdc
8 changed files with 1839 additions and 435 deletions

View File

@@ -19,6 +19,7 @@ import {
} from "./Dialog";
import { css } from "../stitches.config";
import { Input } from "./Input";
import truncate from "../utils/truncate";
const labelStyle = css({
color: "$mauve10",
@@ -201,7 +202,9 @@ export const AccountDialog = ({
fontFamily: "$monospace",
}}
>
{activeAccount && activeAccount.hooks.length}
{activeAccount && console.log(activeAccount.hooks)}
{activeAccount &&
activeAccount.hooks.map((i) => truncate(i, 6)).join(",")}
</Text>
</Flex>
</Flex>
@@ -265,9 +268,10 @@ const Accounts: FC<AccountProps> = (props) => {
(acc) => acc.address === address
);
if (accountToUpdate) {
accountToUpdate.hooks = res.account_objects
.filter((ac: any) => ac?.LedgerEntryType === "Hook")
.map((oo: any) => oo.HookHash);
accountToUpdate.hooks =
res.account_objects
.find((ac: any) => ac?.LedgerEntryType === "Hook")
?.Hooks?.map((oo: any) => oo.Hook.HookHash) || [];
}
});
}

View File

@@ -20,7 +20,7 @@ const DebugStream = () => {
const { selectedAccount, logs, socket } = useSnapshot(streamState);
const { accounts } = useSnapshot(state);
const accountOptions = accounts.map(acc => ({
const accountOptions = accounts.map((acc) => ({
label: acc.name,
value: acc.address,
}));
@@ -33,7 +33,7 @@ const DebugStream = () => {
options={accountOptions}
hideSelectedOptions
value={selectedAccount}
onChange={acc => (streamState.selectedAccount = acc as any)}
onChange={(acc) => (streamState.selectedAccount = acc as any)}
css={{ width: "100%" }}
/>
</>
@@ -73,7 +73,7 @@ const DebugStream = () => {
socket?.close();
streamState.socket = ref(
new WebSocket(
`wss://hooks-testnet-debugstream.xrpl-labs.com/${account}`
`wss://hooks-testnet-debugstream-v2.xrpl-labs.com/${account}`
)
);
} else if (!account && socket) {

View File

@@ -22,7 +22,7 @@ export default async function handler(
return res.status(405).json({ error: 'Method not allowed!' })
}
try {
const response = await fetch('https://hooks-testnet.xrpl-labs.com/newcreds', { method: 'POST' });
const response = await fetch('https://hooks-testnet-v2.xrpl-labs.com/newcreds', { method: 'POST' });
const json: Faucet | ErrorResponse = await response.json();
if ("error" in json) {
return res.status(429).json(json)

View File

@@ -1,419 +0,0 @@
diff --git a/node_modules/ripple-binary-codec/dist/enums/definitions.json b/node_modules/ripple-binary-codec/dist/enums/definitions.json
index 2333c42..b8f8eab 100644
--- a/node_modules/ripple-binary-codec/dist/enums/definitions.json
+++ b/node_modules/ripple-binary-codec/dist/enums/definitions.json
@@ -1,3 +1,4 @@
+
{
"TYPES": {
"Validation": 10003,
@@ -40,9 +41,7 @@
"Check": 67,
"Nickname": 110,
"Contract": 99,
- "NFTokenPage": 80,
- "NFTokenOffer": 55,
- "NegativeUNL": 78
+ "GeneratorMap": 103
},
"FIELDS": [
[
@@ -95,16 +94,6 @@
"type": "UInt16"
}
],
- [
- "TransferFee",
- {
- "nth": 4,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "UInt16"
- }
- ],
[
"Flags",
{
@@ -455,6 +444,16 @@
"type": "UInt32"
}
],
+ [
+ "EmitGeneration",
+ {
+ "nth": 43,
+ "isVLEncoded": false,
+ "isSerialized": true,
+ "isSigningField": true,
+ "type": "UInt32"
+ }
+ ],
[
"IndexNext",
{
@@ -635,16 +634,6 @@
"type": "Hash256"
}
],
- [
- "TokenID",
- {
- "nth": 10,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Hash256"
- }
- ],
[
"BookDirectory",
{
@@ -916,7 +905,7 @@
}
],
[
- "URI",
+ "Generator",
{
"nth": 5,
"isVLEncoded": true,
@@ -1045,36 +1034,6 @@
"type": "Blob"
}
],
- [
- "UNLModifyValidator",
- {
- "nth": 19,
- "isVLEncoded": true,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Blob"
- }
- ],
- [
- "ValidatorToDisable",
- {
- "nth": 20,
- "isVLEncoded": true,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Blob"
- }
- ],
- [
- "ValidatorToReEnable",
- {
- "nth": 21,
- "isVLEncoded": true,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Blob"
- }
- ],
[
"Account",
{
@@ -1156,7 +1115,7 @@
}
],
[
- "Minter",
+ "EmitCallback",
{
"nth": 9,
"isVLEncoded": true,
@@ -1276,9 +1235,9 @@
}
],
[
- "NonFungibleToken",
+ "Signer",
{
- "nth": 12,
+ "nth": 16,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
@@ -1286,9 +1245,9 @@
}
],
[
- "Signer",
+ "Majority",
{
- "nth": 16,
+ "nth": 18,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
@@ -1296,9 +1255,9 @@
}
],
[
- "Majority",
+ "DisabledValidator",
{
- "nth": 18,
+ "nth": 19,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
@@ -1306,9 +1265,9 @@
}
],
[
- "DisabledValidator",
+ "EmitDetails",
{
- "nth": 19,
+ "nth": 12,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
@@ -1395,16 +1354,6 @@
"type": "STArray"
}
],
- [
- "NonFungibleTokens",
- {
- "nth": 10,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "STArray"
- }
- ],
[
"Majorities",
{
@@ -1415,16 +1364,6 @@
"type": "STArray"
}
],
- [
- "DisabledValidators",
- {
- "nth": 17,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "STArray"
- }
- ],
[
"CloseResolution",
{
@@ -1535,16 +1474,6 @@
"type": "Vector256"
}
],
- [
- "TokenIDs",
- {
- "nth": 4,
- "isVLEncoded": true,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Vector256"
- }
- ],
[
"Transaction",
{
@@ -1596,7 +1525,7 @@
}
],
[
- "TicketCount",
+ "HookStateCount",
{
"nth": 40,
"isVLEncoded": false,
@@ -1606,7 +1535,7 @@
}
],
[
- "TicketSequence",
+ "HookReserveCount",
{
"nth": 41,
"isVLEncoded": false,
@@ -1616,7 +1545,7 @@
}
],
[
- "TokenTaxon",
+ "HookDataMaxSize",
{
"nth": 42,
"isVLEncoded": false,
@@ -1626,23 +1555,23 @@
}
],
[
- "MintedTokens",
+ "HookOn",
{
- "nth": 43,
+ "nth": 16,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
- "type": "UInt32"
+ "type": "UInt64"
}
],
[
- "BurnedTokens",
+ "EmitBurden",
{
- "nth": 44,
+ "nth": 12,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
- "type": "UInt32"
+ "type": "UInt64"
}
],
[
@@ -1686,29 +1615,9 @@
}
],
[
- "PreviousPageMin",
+ "EmitParentTxnID",
{
- "nth": 26,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Hash256"
- }
- ],
- [
- "NextPageMin",
- {
- "nth": 27,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "Hash256"
- }
- ],
- [
- "BuyOffer",
- {
- "nth": 28,
+ "nth": 10,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
@@ -1716,9 +1625,9 @@
}
],
[
- "SellOffer",
+ "EmitNonce",
{
- "nth": 29,
+ "nth": 11,
"isVLEncoded": false,
"isSerialized": true,
"isSigningField": true,
@@ -1735,16 +1644,6 @@
"type": "UInt8"
}
],
- [
- "UNLModifyDisabling",
- {
- "nth": 17,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "UInt8"
- }
- ],
[
"DestinationNode",
{
@@ -1754,36 +1653,6 @@
"isSigningField": true,
"type": "UInt64"
}
- ],
- [
- "Cookie",
- {
- "nth": 10,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "UInt64"
- }
- ],
- [
- "ServerVersion",
- {
- "nth": 11,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "UInt64"
- }
- ],
- [
- "OfferNode",
- {
- "nth": 12,
- "isVLEncoded": false,
- "isSerialized": true,
- "isSigningField": true,
- "type": "UInt64"
- }
]
],
"TRANSACTION_RESULTS": {
@@ -1908,18 +1777,7 @@
"tecDUPLICATE": 149,
"tecKILLED": 150,
"tecHAS_OBLIGATIONS": 151,
- "tecTOO_SOON": 152,
-
- "tecMAX_SEQUENCE_REACHED": 154,
- "tecNO_SUITABLE_PAGE": 155,
- "tecBUY_SELL_MISMATCH": 156,
- "tecOFFER_TYPE_MISMATCH": 157,
- "tecCANT_ACCEPT_OWN_OFFER": 158,
- "tecINSUFFICIENT_FUNDS": 159,
- "tecOBJECT_NOT_FOUND": 160,
- "tecINSUFFICIENT_PAYMENT": 161,
- "tecINCORRECT_ASSET": 162,
- "tecTOO_MANY": 163
+ "tecTOO_SOON": 152
},
"TRANSACTION_TYPES": {
"Invalid": -1,
@@ -1946,13 +1804,11 @@
"DepositPreauth": 19,
"TrustSet": 20,
"AccountDelete": 21,
- "NFTokenMint": 25,
- "NFTokenBurn": 26,
- "NFTokenCreateOffer": 27,
- "NFTokenCancelOffer": 28,
- "NFTokenAcceptOffer": 29,
+ "SetHook": 22,
+ "Invoke": 23,
+ "Batch": 24,
+
"EnableAmendment": 100,
- "SetFee": 101,
- "UNLModify": 102
+ "SetFee": 101
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,7 @@
import { derive, sign } from "xrpl-accountlib";
import state, { IAccount } from "../index";
import calculateHookOn from "../../utils/hookOnCalculator";
function arrayBufferToHex(arrayBuffer?: ArrayBuffer | null) {
if (!arrayBuffer) {
@@ -49,13 +50,35 @@ export const deployHook = async (account: IAccount & { name?: string }) => {
const tx = {
Account: account.address,
TransactionType: "SetHook",
Sequence: account.sequence,
Fee: "100000",
Hooks: [
// {
// Hook: {
// CreateCode:
// HookApiVersion: 0,
// HookNamespace: "Kissa",
// HookOn: calculateHookOn([]),
// Flags: 2
// }
// }
// ]
// [
{
Hook: {
CreateCode: arrayBufferToHex(
state.files?.[state.active]?.compiledContent
).toUpperCase(),
HookOn: "0000000000000000",
Sequence: account.sequence,
Fee: "1000",
HookOn: calculateHookOn([]),
HookNamespace: "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
HookApiVersion: 0,
}
}
]
};
console.log(tx)
const keypair = derive.familySeed(account.secret);
const { signedTransaction } = sign(tx, keypair);
const currentAccount = state.accounts.find(
@@ -69,6 +92,7 @@ export const deployHook = async (account: IAccount & { name?: string }) => {
command: "submit",
tx_blob: signedTransaction,
});
console.log(submitRes)
if (submitRes.engine_result === "tesSUCCESS") {
state.deployLogs.push({
type: "success",
@@ -81,7 +105,7 @@ export const deployHook = async (account: IAccount & { name?: string }) => {
} else {
state.deployLogs.push({
type: "error",
message: `[${submitRes.engine_result}] ${submitRes.engine_result_message}`,
message: `[${submitRes.engine_result || submitRes.error}] ${submitRes.engine_result_message || submitRes.error_exception}`,
});
}
} catch (err) {

View File

@@ -120,9 +120,8 @@ const state = proxy<IState>({
accounts: initialAccounts.length > 0 ? initialAccounts : [],
logs: [],
});
// Initialize socket connection
const client = new XrplClient("wss://hooks-testnet.xrpl-labs.com");
const client = new XrplClient("wss://hooks-testnet-v2.xrpl-labs.com");
client.on("online", () => {
state.client = ref(client);

41
utils/hookOnCalculator.ts Normal file
View File

@@ -0,0 +1,41 @@
const tts = {
ttPAYMENT: 0,
ttESCROW_CREATE: 1,
ttESCROW_FINISH: 2,
ttACCOUNT_SET: 3,
ttESCROW_CANCEL: 4,
ttREGULAR_KEY_SET: 5,
ttOFFER_CREATE: 7,
ttOFFER_CANCEL: 8,
ttTICKET_CREATE: 10,
ttSIGNER_LIST_SET: 12,
ttPAYCHAN_CREATE: 13,
ttPAYCHAN_FUND: 14,
ttPAYCHAN_CLAIM: 15,
ttCHECK_CREATE: 16,
ttCHECK_CASH: 17,
ttCHECK_CANCEL: 18,
ttDEPOSIT_PREAUTH: 19,
ttTRUST_SET: 20,
ttACCOUNT_DELETE: 21,
ttHOOK_SET: 22
};
type TTS = typeof tts;
const calculateHookOn = (arr: (keyof TTS)[]) => {
let start = '0x0000000000000000';
arr.forEach(n => {
let v = BigInt(start);
v ^= (BigInt(1) << BigInt(tts[n]));
let s = v.toString(16);
let l = s.length;
if (l < 16)
s = '0'.repeat(16 - l) + s;
s = '0x' + s;
start = s;
})
return start.substring(2);
}
export default calculateHookOn