feat: remove batch readonly

This commit is contained in:
Kyle Fang
2025-02-23 02:20:11 +00:00
parent 246b0e44f6
commit c42c475c48
4 changed files with 83 additions and 184 deletions

View File

@@ -29,11 +29,7 @@ const result = await batchRead({
contract: contractPrincipalCV(...), contract: contractPrincipalCV(...),
mapName: 'my-map', mapName: 'my-map',
mapKey: someCV mapKey: someCV
}] }],
});
// Batch readonly function calls
const readonlyResult = await batchReadonly({
readonly: [{ readonly: [{
contract: contractPrincipalCV(...), contract: contractPrincipalCV(...),
functionName: 'my-function', functionName: 'my-function',

View File

@@ -9,7 +9,6 @@ import {
type ClarityValue, type ClarityValue,
type ContractPrincipalCV, type ContractPrincipalCV,
deserializeCV, deserializeCV,
type OptionalCV,
serializeCV, serializeCV,
} from '@stacks/transactions'; } from '@stacks/transactions';
@@ -133,56 +132,4 @@ export async function batchRead(
maps: convertResults(rs.maps), maps: convertResults(rs.maps),
readonly: convertResults(rs.readonly), readonly: convertResults(rs.readonly),
}; };
} }
export interface BatchReadonlyRequest {
readonly: {
contract: ContractPrincipalCV;
functionName: string;
functionArgs: ClarityValue[];
}[];
index_block_hash?: string;
}
export async function batchReadonly(
req: BatchReadonlyRequest,
options: BatchApiOptions = {}
): Promise<(ClarityValue | Error)[]> {
const payload = req.readonly.map((r) => [
serializeCV(r.contract),
r.functionName,
...r.functionArgs.map((arg) => serializeCV(arg)),
]);
const ibh =
req.index_block_hash == null
? null
: req.index_block_hash.startsWith('0x')
? req.index_block_hash.substring(2)
: req.index_block_hash;
const url = `${options.stxerApi ?? DEFAULT_STXER_API}/sidecar/v2/batch-readonly${ibh == null ? '' : `?tip=${ibh}`
}`;
const data = await fetch(url, {
method: 'POST',
body: JSON.stringify(payload),
});
const text = await data.text();
if (!text.includes('Ok') && !text.includes('Err')) {
throw new Error(
`Requesting batch readonly failed: ${text}, url: ${url}, payload: ${JSON.stringify(
payload
)}`
);
}
const results = JSON.parse(text) as [{ Ok: string } | { Err: string }];
const rs: (ClarityValue | Error)[] = [];
for (const result of results) {
if ('Ok' in result) {
rs.push(deserializeCV(result.Ok));
} else {
rs.push(new Error(result.Err));
}
}
return rs;
}

View File

@@ -1,127 +1,82 @@
import { import {
contractPrincipalCV, contractPrincipalCV,
principalCV, principalCV,
stringAsciiCV, stringAsciiCV,
tupleCV, tupleCV,
uintCV, uintCV,
} from '@stacks/transactions'; } from '@stacks/transactions';
import { batchRead, batchReadonly } from '../batch-api'; import { batchRead } from '../batch-api';
async function batchReadsExample() { async function batchReadsExample() {
const rs = await batchRead({ const rs = await batchRead({
// index_block_hash: // index_block_hash:
// 'ce04817b9c6d90814ff9c06228d3a07d64335b1d9b01a233456fc304e34f7c0e', // block 373499 // 'ce04817b9c6d90814ff9c06228d3a07d64335b1d9b01a233456fc304e34f7c0e', // block 373499
variables: [ variables: [
{ {
contract: contractPrincipalCV( contract: contractPrincipalCV(
'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275', 'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275',
'liquidity-token-v5kbe3oqvac' 'liquidity-token-v5kbe3oqvac'
),
variableName: 'balance-x',
},
{
contract: contractPrincipalCV(
'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275',
'liquidity-token-v5kbe3oqvac'
),
variableName: 'balance-y',
},
{
contract: contractPrincipalCV(
'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275',
'liquidity-token-v5kbe3oqvac'
),
variableName: 'something-not-exists',
},
],
maps: [
{
contract: contractPrincipalCV(
'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM',
'amm-registry-v2-01'
),
mapName: 'pools-data-map',
mapKey: tupleCV({
'token-x': principalCV(
'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-wstx-v2'
), ),
variableName: 'balance-x', 'token-y': principalCV(
}, 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex'
{
contract: contractPrincipalCV(
'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275',
'liquidity-token-v5kbe3oqvac'
), ),
variableName: 'balance-y', factor: uintCV(1e8),
}, }),
{ },
contract: contractPrincipalCV( {
'SP1Z92MPDQEWZXW36VX71Q25HKF5K2EPCJ304F275', contract: contractPrincipalCV(
'liquidity-token-v5kbe3oqvac' 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1',
), 'univ2-core'
variableName: 'something-not-exists', ),
}, mapName: 'pools',
], mapKey: uintCV(1),
maps: [ },
{ {
contract: contractPrincipalCV( contract: contractPrincipalCV(
'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM', 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1',
'amm-registry-v2-01' 'contract-not-exists'
), ),
mapName: 'pools-data-map', mapName: 'pools',
mapKey: tupleCV({ mapKey: uintCV(1),
'token-x': principalCV( },
'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-wstx-v2' ],
), });
'token-y': principalCV( console.log(rs);
'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex' }
),
factor: uintCV(1e8), async function main() {
}), await batchReadsExample();
}, // await batchReadonlyExample();
{ }
contract: contractPrincipalCV(
'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1', if (require.main === module) {
'univ2-core' main().catch(console.error);
), }
mapName: 'pools',
mapKey: uintCV(1),
},
{
contract: contractPrincipalCV(
'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1',
'contract-not-exists'
),
mapName: 'pools',
mapKey: uintCV(1),
},
],
});
console.log(rs);
}
async function batchReadonlyExample() {
const rs = await batchReadonly({
index_block_hash:
'ce04817b9c6d90814ff9c06228d3a07d64335b1d9b01a233456fc304e34f7c0e',
readonly: [
{
contract: contractPrincipalCV(
'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4',
'sbtc-token'
),
functionName: 'get-total-supply',
functionArgs: [],
},
{
contract: contractPrincipalCV(
'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4',
'sbtc-token'
),
functionName: 'get-balance',
functionArgs: [
principalCV('SP1CT7J2RWBZD62QAX36A2PQ3HKH5NFDGVHB8J34V'),
],
},
{
contract: contractPrincipalCV(
'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4',
'sbtc-token'
),
functionName: 'function-not-exists',
functionArgs: [],
},
{
contract: contractPrincipalCV(
'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4',
'sbtc-token'
),
functionName: 'get-balance',
functionArgs: [stringAsciiCV('invalid-args')],
},
],
});
console.log(rs);
}
async function main() {
await batchReadsExample();
// await batchReadonlyExample();
}
if (require.main === module) {
main().catch(console.error);
}

View File

@@ -5,6 +5,7 @@
"module": "esnext", "module": "esnext",
"allowImportingTsExtensions": false, "allowImportingTsExtensions": false,
"moduleResolution": "node", "moduleResolution": "node",
"esModuleInterop": true "esModuleInterop": true,
"noEmit": true
} }
} }