ABI encoding, fast

Overview

fast-abi

Encodes and decodes abi data, fast.

Usage

const RUST_ENCODER = new FastABI(ABI as MethodAbi[]);
const callData = RUST_ENCODER.encodeInput('sampleSellsFromUniswapV2', [...values]);
// 0x.....

// Decode the output of a method call
const output = RUST_ENCODER.decodeOutput('sampleSellsFromUniswapV2', callData);
// {
//   router: '0x6b175474e89094c44da98b954eedeac495271d0f',
//   path: [ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ],
//   takerTokenAmounts: [ 1, 2, 3 ]
// }

Perf

    Uniswap ABI
      13 input encode
        ✓ ZeroEx - optimized (2579ms)
        p25: 0.223583ms, p50: 0.22825ms, p99: 1.734083ms, p100: 5.321458ms
        ✓ ZeroEx - no optimize (893ms)
        p25: 0.077166ms, p50: 0.077792ms, p99: 0.098417ms, p100: 2.595542ms
        ✓ fast-abi (335ms)
        p25: 0.027958ms, p50: 0.028292ms, p99: 0.032583ms, p100: 2.886333ms

      13 input decode
        ✓ ZeroEx (1399ms)
        p25: 0.112125ms, p50: 0.113542ms, p99: 0.219583ms, p100: 63.167208ms
        ✓ fast-abi (392ms)
        p25: 0.02975ms, p50: 0.030708ms, p99: 0.046667ms, p100: 4.391958ms

      13 output decode
        ✓ ZeroEx (1138ms)
        p25: 0.100583ms, p50: 0.101458ms, p99: 0.126875ms, p100: 4.380667ms
        ✓ fast-abi (327ms)
        p25: 0.023709ms, p50: 0.024625ms, p99: 0.049875ms, p100: 8.044291ms

      130 input encode
        ✓ ZeroEx - optimized (15317ms)
        p25: 1.374375ms, p50: 1.398958ms, p99: 3.235333ms, p100: 9.725875ms
        ✓ ZeroEx - no optimize (6272ms)
        p25: 0.552209ms, p50: 0.560416ms, p99: 1.711958ms, p100: 3.264542ms
        ✓ fast-abi (1569ms)
        p25: 0.140291ms, p50: 0.142292ms, p99: 0.1875ms, p100: 10.919333ms

      130 input decode
        ✓ ZeroEx (10277ms)
        p25: 0.8775ms, p50: 0.891917ms, p99: 3.149708ms, p100: 211.279542ms
        ✓ fast-abi (2381ms)
        p25: 0.189791ms, p50: 0.192541ms, p99: 0.367417ms, p100: 10.084375ms

      130 output decode
        ✓ ZeroEx (9743ms)
        p25: 0.872875ms, p50: 0.886042ms, p99: 3.282917ms, p100: 6.403833ms
        ✓ fast-abi (2244ms)
        p25: 0.177959ms, p50: 0.183959ms, p99: 0.230166ms, p100: 6.963125ms
Comments
  • Bump node-fetch from 2.6.1 to 2.6.7

    Bump node-fetch from 2.6.1 to 2.6.7

    Bumps node-fetch from 2.6.1 to 2.6.7.

    Release notes

    Sourced from node-fetch's releases.

    v2.6.7

    Security patch release

    Recommended to upgrade, to not leak sensitive cookie and authentication header information to 3th party host while a redirect occurred

    What's Changed

    Full Changelog: https://github.com/node-fetch/node-fetch/compare/v2.6.6...v2.6.7

    v2.6.6

    What's Changed

    Full Changelog: https://github.com/node-fetch/node-fetch/compare/v2.6.5...v2.6.6

    v2.6.2

    fixed main path in package.json

    Commits
    • 1ef4b56 backport of #1449 (#1453)
    • 8fe5c4e 2.x: Specify encoding as an optional peer dependency in package.json (#1310)
    • f56b0c6 fix(URL): prefer built in URL version when available and fallback to whatwg (...
    • b5417ae fix: import whatwg-url in a way compatible with ESM Node (#1303)
    • 18193c5 fix v2.6.3 that did not sending query params (#1301)
    • ace7536 fix: properly encode url with unicode characters (#1291)
    • 152214c Fix(package.json): Corrected main file path in package.json (#1274)
    • See full diff in compare view
    Maintainer changes

    This version was pushed to npm by endless, a new releaser for node-fetch since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • feat: revamp building and publishing

    feat: revamp building and publishing

    Currently, the native tarball brings in about 60 MB of unnecessary source code and build dependencies. This restructures the build so that we only package index.node, and standardizes on a process more similar to neon-router

    opened by kimpers 0
  • Bump tar from 6.1.0 to 6.1.10

    Bump tar from 6.1.0 to 6.1.10

    Bumps tar from 6.1.0 to 6.1.10.

    Commits
    • 188badd 6.1.10
    • 23312ce drop dirCache for symlink on all platforms
    • 4f1f4a2 6.1.9
    • 875a37e fix: prevent path escape using drive-relative paths
    • b6162c7 fix: reserve paths properly for unicode, windows
    • 3aaf19b fix: prune dirCache properly for unicode, windows
    • 6a9c51d 6.1.8
    • dfc5923 fix: skip extract if linkpath is stripped entirely
    • 575a511 fix: reserve paths case-insensitively
    • d61628c 6.1.7
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump path-parse from 1.0.6 to 1.0.7

    Bump path-parse from 1.0.6 to 1.0.7

    Bumps path-parse from 1.0.6 to 1.0.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Perf

    Perf

    import { expect } from '@0x/contracts-test-utils';
    import { AbiEncoder, BigNumber, NULL_ADDRESS } from '@0x/utils';
    import { MethodAbi } from 'ethereum-types';
    import { utils } from 'ethers';
    // import { utils as ethers5Utils } from 'ethers5';
    import _ = require('lodash');
    import { performance, PerformanceObserver } from 'perf_hooks';
    
    const percentile = require('percentile');
    // tslint:disable-next-line: no-implicit-dependencies
    import { FastABI } from 'fast-abi';
    
    import { ZERO_AMOUNT } from '../../src/utils/market_operation_utils/constants';
    import { getSampleAmounts } from '../../src/utils/market_operation_utils/sampler';
    
    describe.only('Encoder perf', () => {
        const UNISWAP_V2_SELL_ABI: MethodAbi = {
            inputs: [
                {
                    internalType: 'address',
                    name: 'router',
                    type: 'address',
                },
                {
                    internalType: 'address[]',
                    name: 'path',
                    type: 'address[]',
                },
                {
                    internalType: 'uint256[]',
                    name: 'takerTokenAmounts',
                    type: 'uint256[]',
                },
            ],
            name: 'sampleSellsFromUniswapV2',
            outputs: [
                {
                    internalType: 'uint256[]',
                    name: 'makerTokenAmounts',
                    type: 'uint256[]',
                },
            ],
            stateMutability: 'view',
            type: 'function',
        };
    
        const KYBER_TUPLE_ABI: MethodAbi = {
            inputs: [
                {
                    name: 'opts',
                    type: 'tuple',
                    components: [
                        {
                            name: 'reserveOffset',
                            type: 'uint256',
                        },
                        {
                            name: 'hintHandler',
                            type: 'address',
                        },
                        {
                            name: 'networkProxy',
                            type: 'address',
                        },
                        {
                            name: 'weth',
                            type: 'address',
                        },
                        {
                            name: 'hint',
                            type: 'bytes',
                        },
                    ],
                },
                {
                    name: 'takerToken',
                    type: 'address',
                },
                {
                    name: 'makerToken',
                    type: 'address',
                },
                {
                    name: 'takerTokenAmounts',
                    type: 'uint256[]',
                },
            ],
            name: 'sampleSellsFromKyberNetwork',
            outputs: [
                {
                    name: 'reserveId',
                    type: 'bytes32',
                },
                {
                    name: 'hint',
                    type: 'bytes',
                },
                {
                    name: 'makerTokenAmounts',
                    type: 'uint256[]',
                },
            ],
            stateMutability: 'view',
            type: 'function',
        };
    
        const BATCH_CALL_ABI: MethodAbi = {
            inputs: [
                {
                    name: 'callDatas',
                    type: 'bytes[]',
                },
            ],
            name: 'batchCall',
            outputs: [
                {
                    name: 'callResults',
                    type: 'tuple[]',
                    components: [
                        {
                            name: 'data',
                            type: 'bytes',
                        },
                        {
                            name: 'success',
                            type: 'bool',
                        },
                    ],
                },
            ],
            stateMutability: 'view',
            type: 'function',
        };
    
        const RUST_ENCODER = new FastABI([UNISWAP_V2_SELL_ABI, BATCH_CALL_ABI, KYBER_TUPLE_ABI], { BigNumber });
    
        // tslint:disable: custom-no-magic-numbers
        const RUNS = 10000;
        // const RUNS = 1;
        const ADDRESS_1 = '0x6b175474e89094c44da98b954eedeac495271d0f';
        const ADDRESS_2 = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
        let summary: { p25: string; p50: string; p99: string; p100: string };
        const perf = (fn: () => void): any => {
            const wrapped = performance.timerify(fn);
            const resultsMs: number[] = [];
            const obs = new PerformanceObserver(list => resultsMs.push(list.getEntries()[0].duration));
            obs.observe({ entryTypes: ['function'] });
            _.times(RUNS, () => wrapped());
            obs.disconnect();
            summary = {
                p25: percentile(25, resultsMs),
                p50: percentile(50, resultsMs),
                p99: percentile(99, resultsMs),
                p100: percentile(100, resultsMs),
            };
        };
    
        before(() => {
            console.log('Runs:', RUNS);
        });
        beforeEach(() => {
            summary = { p25: '0', p50: '0', p99: '0', p100: '0' };
        });
        afterEach(() => {
            const { p25, p50, p99, p100 } = summary;
            console.log(`p25: ${p25}ms, p50: ${p50}ms, p99: ${p99}ms, p100: ${p100}ms\n`);
        });
    
        const TIMEOUT = 360000;
        const ZERO_EX_ENCODER = new AbiEncoder.Method(UNISWAP_V2_SELL_ABI);
        const ZERO_EX_UNOPTIMIZED: AbiEncoder.EncodingRules = { shouldOptimize: false, shouldAnnotate: false };
        const ZERO_EX_OPTIMIZED: AbiEncoder.EncodingRules = { shouldOptimize: true, shouldAnnotate: false };
    
        const ETHERS_INTERFACE = new utils.Interface([UNISWAP_V2_SELL_ABI]);
        const ETHERS_ENCODER = ETHERS_INTERFACE.functions[UNISWAP_V2_SELL_ABI.name];
    
        // const ETHERS_5_INTERFACE = new ethers5Utils.Interface([UNISWAP_V2_SELL_ABI]);
    
        describe.only('hello', () => {
            it('node', () => {
                const f = () => 'hello world';
                perf(f);
            });
            it.only('rust', () => {
                const f = () => FastABI.ping();
                perf(f);
            });
            it.only('rust - encode', () => {
                const params = [ADDRESS_1, [ADDRESS_2], [1, 2, 3]];
                const output = RUST_ENCODER.encodeInput('sampleSellsFromUniswapV2', params);
            });
        });
    
        describe.only('Tuple ABI', () => {
            const ZERO_EX_TUPLE = new AbiEncoder.Method(KYBER_TUPLE_ABI);
            const params = [
                {
                    reserveOffset: ZERO_AMOUNT,
                    hintHandler: NULL_ADDRESS,
                    networkProxy: NULL_ADDRESS,
                    weth: NULL_ADDRESS,
                    hint: '0x',
                },
                ADDRESS_1,
                ADDRESS_2,
                getSampleAmounts(new BigNumber(100e6), 13, 1.03),
            ];
            const encoded = ZERO_EX_TUPLE.encode(params, ZERO_EX_UNOPTIMIZED);
            describe('encode', () => {
                it('rust', () => {
                    const f = () => RUST_ENCODER.encodeInput('sampleSellsFromKyberNetwork', params);
                    expect(f()).to.eq(encoded);
                    perf(f);
                });
                it('zeroex - optimized', () => {
                    const f = () => ZERO_EX_TUPLE.encode(params, ZERO_EX_OPTIMIZED);
                    perf(f);
                });
                it('zeroex - unoptimized', () => {
                    const f = () => ZERO_EX_TUPLE.encode(params, ZERO_EX_UNOPTIMIZED);
                    perf(f);
                });
            });
    
            describe('decode', () => {
                it('rust', () => {
                    const f = () => RUST_ENCODER.decodeInput('sampleSellsFromKyberNetwork', encoded);
                });
            });
        });
    
        describe('Uniswap ABI', () => {
            [13, 130].forEach(numSamples => {
                describe(`${numSamples} input encode`, () => {
                    const params: [string, string[], BigNumber[]] = [
                        ADDRESS_1, // router
                        [ADDRESS_1, ADDRESS_2, ADDRESS_1], // path
                        getSampleAmounts(new BigNumber(100e6), numSamples, 1.03),
                    ];
    
                    it.only('ZeroEx - optimized', () => {
                        const f = () => ZERO_EX_ENCODER.encode(params, ZERO_EX_OPTIMIZED);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it.only('ZeroEx - no optimize', () => {
                        const f = () => ZERO_EX_ENCODER.encode(params, ZERO_EX_UNOPTIMIZED);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it('ZeroEx - BigInt - optimize', () => {
                        const amounts = params[2].map(n => BigInt(n.toString()));
                        const f = () => ZERO_EX_ENCODER.encode([params[0], params[1], amounts], ZERO_EX_OPTIMIZED);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it('ZeroEx - BigInt - no optimize', () => {
                        const amounts = params[2].map(n => BigInt(n.toString()));
                        const f = () => ZERO_EX_ENCODER.encode([params[0], params[1], amounts], ZERO_EX_UNOPTIMIZED);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it.only('rust', () => {
                        const f = () => RUST_ENCODER.encodeInput('sampleSellsFromUniswapV2', params);
                        perf(f);
                        expect(f()).to.eq(ZERO_EX_ENCODER.encode(params, ZERO_EX_UNOPTIMIZED));
                    }).timeout(TIMEOUT);
    
                    it.skip('Ethers', () => {
                        const f = () => ETHERS_ENCODER.encode(params);
                        perf(f);
                    });
                    // it.skip('Ethers 5', () => {
                    //     const f = () => ETHERS_5_INTERFACE.encodeFunctionData(UNISWAP_V2_SELL_ABI.name, params);
                    //     perf(f);
                    // }).timeout(TIMEOUT);
                });
    
                describe.only(`${numSamples} input decode`, () => {
                    const params: [string, string[], BigNumber[]] = [
                        ADDRESS_1, // router
                        [ADDRESS_1, ADDRESS_2, ADDRESS_1], // path
                        getSampleAmounts(new BigNumber(100e6), numSamples, 1.03),
                    ];
                    const data = ZERO_EX_ENCODER.encode(params, ZERO_EX_UNOPTIMIZED);
                    it('ZeroEx', () => {
                        const f = () => ZERO_EX_ENCODER.decode(data);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it('rust', () => {
                        const f = () => RUST_ENCODER.decodeInput('sampleSellsFromUniswapV2', data);
                        perf(f);
                    }).timeout(TIMEOUT);
                });
    
                describe.only(`${numSamples} output decode`, () => {
                    const params = getSampleAmounts(new BigNumber(100e6), numSamples, 1.03);
                    const data = ZERO_EX_ENCODER.encodeReturnValues([params], ZERO_EX_UNOPTIMIZED);
                    it('ZeroEx', () => {
                        const f = () => ZERO_EX_ENCODER.decodeReturnValues(data);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it('rust', () => {
                        const f = () => RUST_ENCODER.decodeOutput('sampleSellsFromUniswapV2', data);
                        perf(f);
                    }).timeout(TIMEOUT);
                });
            });
        });
    
        describe('BatchCall ABI', () => {
            [10, 50, 100].forEach(numSamples => {
                describe.only(`${numSamples} batchCall`, () => {
                    const callParams: [string, string[], BigNumber[]] = [
                        ADDRESS_1, // router
                        [ADDRESS_1, ADDRESS_2, ADDRESS_1], // path
                        getSampleAmounts(new BigNumber(100e6), 13, 1.03),
                    ];
    
                    const encodedBatchCall = ZERO_EX_ENCODER.encode(callParams, ZERO_EX_UNOPTIMIZED);
                    const params = _.times(numSamples, () => encodedBatchCall);
    
                    const BATCH_CALL_ENCODER = new AbiEncoder.Method(BATCH_CALL_ABI);
    
                    it('rust', () => {
                        const f = () => RUST_ENCODER.encodeInput('batchCall', [params]);
                        expect(f()).to.eq(BATCH_CALL_ENCODER.encode([params], ZERO_EX_UNOPTIMIZED));
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it('ZeroEx - optimized', () => {
                        const f = () => BATCH_CALL_ENCODER.encode([params], ZERO_EX_OPTIMIZED);
                        perf(f);
                    }).timeout(TIMEOUT);
    
                    it('ZeroEx - no optimize', () => {
                        const f = () => BATCH_CALL_ENCODER.encode([params], ZERO_EX_UNOPTIMIZED);
                        perf(f);
                    }).timeout(TIMEOUT);
                });
            });
        });
    });
    
    
    opened by dekz 0
Releases(0.0.5)
Owner
0x
The Protocol for Trading Tokens
0x
Node.js bindings to the ripgrep library, for fast file searching in JavaScript without child processes!

ripgrepjs ripgrepjs: Node.js bindings to the ripgrep library, for direct integration with JS programs without spawning an extra subprocess! This proje

Annika 1 May 10, 2022
🚀 Fast and 100% API compatible postcss replacer, built in Rust

postcss-rs ?? Fast and 100% API compatible postcss replacer, built in Rust ⚠️ DO NOT USE. STILL WORK IN PROGRESS. Performance Improvement Tokenize boo

null 472 Dec 28, 2022
🚀 Fast and simple Node.js version manager, built in Rust

Fast Node Manager (fnm) ?? Fast and simple Node.js version manager, built in Rust Features ?? Cross-platform support (macOS, Windows, Linux) ✨ Single

Gal Schlezinger 9.8k Jan 2, 2023
swc is a super-fast compiler written in rust; producing widely-supported javascript from modern standards and typescript.

Make the web (development) faster. SWC (stands for Speedy Web Compiler) is a super-fast TypeScript / JavaScript compiler written in Rust. It's a libra

swc 25.4k Dec 31, 2022
Robust and Fast tokenizations alignment library for Rust and Python

Robust and Fast tokenizations alignment library for Rust and Python Demo: demo Rust document: docs.rs Blog post: How to calculate the alignment betwee

Explosion 157 Dec 28, 2022
🚀 A fast, modern & efficient interpreted language.

Lace is an efficient, modern and predictable procedural programming language written in rust. Easy to write: Lace's syntax is easy to learn and write,

null 11 Oct 2, 2022
Ethereal - a general-purpose programming language that is designed to be fast and simple

Ethereal is a general-purpose programming language that is designed to be fast and simple. Heavly inspired by Monkey and written in Rust

Synthesized Infinity 21 Nov 25, 2022
Fast state-of-the-art tokenizers for Ruby

Fast state-of-the-art tokenizers for Ruby

Andrew Kane 34 Dec 15, 2022
Lisp interpreter that might be fast someday maybe?

ehlisp Pronunciation I'm not really sure. Maybe like an incorrect pronunciation of "ellipse", like "ellisp"? Also maybe like "a lisp". I named it this

Eddie Hatfield 3 Oct 6, 2022
⚡ Fast Web Security Scanner written in Rust based on Lua Scripts 🌖 🦀

⚡ Fast Web Security Scanner written in Rust based on Lua Scripts ?? ??

Rusty Sec 14 Nov 28, 2022
Fast regex in Rust for Apache Arrow, compiled to WASM

Rust regex in wasm I have been looking for a fast regular expression library in Javascript that runs on Apache Arrow for a few years. Arrow uses UTF-8

Nomic AI 3 May 3, 2023
Substreams development kit for Ethereum chains, contains Firehose Block model and helpers as well as utilities for Ethereum ABI encoding/decoding.

Substreams Ethereum Substreams development kit for Ethereum chains, contains Rust Firehose Block model and helpers as well as utilities for Ethereum A

StreamingFast 15 Oct 25, 2022
Databento Binary Encoding (DBZ) - Fast message encoding and storage format for market data

dbz A library (dbz-lib) and CLI tool (dbz-cli) for working with Databento Binary Encoding (DBZ) files. Python bindings for dbz-lib are provided in the

Databento, Inc. 15 Nov 4, 2022
A tool to deserialize data from an input encoding, transform it and serialize it back into an output encoding.

dts A simple tool to deserialize data from an input encoding, transform it and serialize it back into an output encoding. Requires rust >= 1.56.0. Ins

null 11 Dec 14, 2022
Rust ABI safe code generator

CGlue offers an easy way to ABI (application binary interface) safety. Just a few annotations and your trait is ready to go!

Auri 142 Jan 2, 2023
Linux ABI-compatible kernel written in Rust

Linux ABI-compatible kernel written in Rust ??️ Screenshot (v0.1.0-alpha.1) ?? Build dependencies To compile GalaxyOS kernel and create basic OS ISO i

Krzysztof Stefańczyk 3 Dec 5, 2022
A quick way to decode a contract's transaction data with only the contract address and abi.

tx-decoder A quick way to decode a contract's transaction data with only the contract address and abi. E.g, let tx_data = "0xe70dd2fc00000000000000000

DeGatchi 15 Feb 13, 2023
A library to generate bindings from Cairo ABI.

Cainome: bindings generation from Cairo ABI Cainome is a library to generate bindings from Cairo ABI. Cainome architecture provides a flexible way to

null 6 Dec 22, 2023
A series of compact encoding schemes for building small and fast parsers and serializers

A series of compact encoding schemes for building small and fast parsers and serializers

Manfred Kröhnert 2 Feb 5, 2022
AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf

ab-av1 AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf. Command: auto-encode Automatically determine the best crf to deliver th

Alex Butler 92 Jan 1, 2023