Packages

Higher-level Elixir SDK for Polymarket: Gamma market discovery, Data API, CTF/pUSD helpers, and convenience facades. Depends on polymarket_clob for the low-level CLOB surface.

Current section

Files

Jump to
polymarket_sdk scripts generate_calldata_fixtures.mjs
Raw

scripts/generate_calldata_fixtures.mjs

// Phase 11a calldata fixture generator.
//
// Produces deterministic calldata test vectors for the six fixed on-chain
// functions Polymarket.ABI hand-encodes. ethers.js v6 is the trusted
// reference encoder; the output JSON is checked into
// `test/fixtures/calldata.json` and the Elixir test compares its
// hand-rolled output byte-for-byte.
//
// Setup (first time only) — installs ethers.js locally inside scripts/:
// (cd scripts && npm install)
//
// Generate fixtures (run from the polymarket package root):
// node scripts/generate_calldata_fixtures.mjs > test/fixtures/calldata.json
//
// The script intentionally writes to stdout so the caller can decide
// whether to overwrite the fixture file. The fixture file is the
// authoritative record once committed; do not regenerate without
// reviewing the diff.
import { ethers } from 'ethers';
// ── ABI definitions ──
const erc20Abi = ['function approve(address spender, uint256 amount)'];
const ctfAbi = [
'function redeemPositions(address collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint256[] indexSets)',
'function mergePositions(address collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint256[] partition, uint256 amount)',
'function splitPosition(address collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint256[] partition, uint256 amount)',
];
const collateralAbi = [
'function wrap(address _asset, address _to, uint256 _amount)',
'function unwrap(address _asset, address _to, uint256 _amount)',
];
const erc20 = new ethers.Interface(erc20Abi);
const ctf = new ethers.Interface(ctfAbi);
const coll = new ethers.Interface(collateralAbi);
// ── Stable test addresses and values ──
const ZERO_BYTES32 =
'0x0000000000000000000000000000000000000000000000000000000000000000';
const COND_ID =
'0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
const PUSD = '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB';
const USDC_E = '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
const EXCHANGE = '0xE111180000d2663C0091e4f400237545B87B996B';
const PROXY = '0x8f70343472CC7Fd382DE383723A0E6Ee02e2CAe5';
const SMALL_ADDR = '0x0000000000000000000000000000000000000001';
// ── Fixture rows ──
const fixtures = [
// ---- ERC-20 approve ----
{
family: 'erc20',
function: 'approve',
name: 'approve_small_addr_small_amount',
signature: 'approve(address,uint256)',
inputs: { spender: SMALL_ADDR, amount: '1000' },
calldata: erc20.encodeFunctionData('approve', [SMALL_ADDR, 1000n]),
},
{
family: 'erc20',
function: 'approve',
name: 'approve_pusd_to_exchange_max',
signature: 'approve(address,uint256)',
inputs: {
spender: EXCHANGE,
amount:
'115792089237316195423570985008687907853269984665640564039457584007913129639935',
},
calldata: erc20.encodeFunctionData('approve', [EXCHANGE, ethers.MaxUint256]),
},
// ---- CTF redeemPositions ----
{
family: 'ctf',
function: 'redeemPositions',
name: 'redeem_binary_yes_no',
signature: 'redeemPositions(address,bytes32,bytes32,uint256[])',
inputs: {
collateralToken: PUSD,
parentCollectionId: ZERO_BYTES32,
conditionId: COND_ID,
indexSets: ['1', '2'],
},
calldata: ctf.encodeFunctionData('redeemPositions', [
PUSD,
ZERO_BYTES32,
COND_ID,
[1n, 2n],
]),
},
{
family: 'ctf',
function: 'redeemPositions',
name: 'redeem_three_outcome',
signature: 'redeemPositions(address,bytes32,bytes32,uint256[])',
inputs: {
collateralToken: PUSD,
parentCollectionId: ZERO_BYTES32,
conditionId: COND_ID,
indexSets: ['1', '2', '4'],
},
calldata: ctf.encodeFunctionData('redeemPositions', [
PUSD,
ZERO_BYTES32,
COND_ID,
[1n, 2n, 4n],
]),
},
// ---- CTF mergePositions ----
{
family: 'ctf',
function: 'mergePositions',
name: 'merge_binary_5_usdc',
signature: 'mergePositions(address,bytes32,bytes32,uint256[],uint256)',
inputs: {
collateralToken: PUSD,
parentCollectionId: ZERO_BYTES32,
conditionId: COND_ID,
partition: ['1', '2'],
amount: '5000000',
},
calldata: ctf.encodeFunctionData('mergePositions', [
PUSD,
ZERO_BYTES32,
COND_ID,
[1n, 2n],
5_000_000n,
]),
},
// ---- CTF splitPosition ----
{
family: 'ctf',
function: 'splitPosition',
name: 'split_three_outcome_zero_amount',
signature: 'splitPosition(address,bytes32,bytes32,uint256[],uint256)',
inputs: {
collateralToken: PUSD,
parentCollectionId: ZERO_BYTES32,
conditionId: COND_ID,
partition: ['1', '2', '4'],
amount: '0',
},
calldata: ctf.encodeFunctionData('splitPosition', [
PUSD,
ZERO_BYTES32,
COND_ID,
[1n, 2n, 4n],
0n,
]),
},
{
family: 'ctf',
function: 'splitPosition',
name: 'split_binary_realistic',
signature: 'splitPosition(address,bytes32,bytes32,uint256[],uint256)',
inputs: {
collateralToken: PUSD,
parentCollectionId: ZERO_BYTES32,
conditionId: COND_ID,
partition: ['1', '2'],
amount: '5000000',
},
calldata: ctf.encodeFunctionData('splitPosition', [
PUSD,
ZERO_BYTES32,
COND_ID,
[1n, 2n],
5_000_000n,
]),
},
// ---- Collateral.wrap ----
{
family: 'collateral',
function: 'wrap',
name: 'wrap_usdc_e_to_proxy',
signature: 'wrap(address,address,uint256)',
inputs: {
_asset: USDC_E,
_to: PROXY,
_amount: '5000000',
},
calldata: coll.encodeFunctionData('wrap', [USDC_E, PROXY, 5_000_000n]),
},
// ---- Collateral.unwrap ----
{
family: 'collateral',
function: 'unwrap',
name: 'unwrap_pusd_to_proxy',
signature: 'unwrap(address,address,uint256)',
inputs: {
_asset: PUSD,
_to: PROXY,
_amount: '1000000',
},
calldata: coll.encodeFunctionData('unwrap', [PUSD, PROXY, 1_000_000n]),
},
];
const out = {
generated_by: 'scripts/generate_calldata_fixtures.mjs',
encoder: `ethers.js ${ethers.version}`,
fixtures,
};
process.stdout.write(JSON.stringify(out, null, 2) + '\n');