Skip to content

[Phase 3] Extrinsic Codec Refactoring (Issue #39)#56

Merged
gmajor-encrypt merged 1 commit intomasterfrom
feature/extrinsic-codec
Mar 24, 2026
Merged

[Phase 3] Extrinsic Codec Refactoring (Issue #39)#56
gmajor-encrypt merged 1 commit intomasterfrom
feature/extrinsic-codec

Conversation

@gmajor-encrypt
Copy link
Owner

Summary

This PR refactors the Extrinsic transaction encoder/decoder for the SCALE codec library.

Features Implemented

Extrinsic v4 Format Support

  • Signed extrinsics: Version byte with 0x80 flag
  • Unsigned extrinsics: Version byte without 0x80 flag
  • Length prefix: Compact-encoded length

Components

Signature (class)

  • Signer address
  • Signature bytes (64 bytes for Sr25519/Ed25519, 65 for Ecdsa)
  • Extra data (era, nonce, tip)
  • Signature type detection

Extrinsic (class)

  • Call data (pallet, function, args)
  • Optional signature
  • Extra data
  • Convenience getters

ExtrinsicBuilder (class)

  • Fluent builder pattern
  • pallet() / function() setters
  • args() / arg() for arguments
  • signer() / signature() for signing
  • nonce() / tip() for extra data
  • immortal() / mortal() for era
  • build() / buildUnsigned()

ExtrinsicEncoder (class)

  • SCALE encoding for extrinsics
  • MultiAddress encoding (Id variant)
  • Signature encoding
  • Era encoding (immortal/mortal)
  • Compact-encoded nonce/tip

ExtrinsicDecoder (class)

  • SCALE decoding for extrinsics
  • MultiAddress decoding
  • Signature decoding
  • Extra data decoding
  • Call data extraction

Example Usage

use Substrate\ScaleCodec\Extrinsic\{ExtrinsicBuilder, ExtrinsicEncoder, ExtrinsicDecoder};

// Build unsigned extrinsic
$unsigned = ExtrinsicBuilder::create()
    ->pallet('System')
    ->function('remark')
    ->palletIndex(0)
    ->functionIndex(0)
    ->buildUnsigned();

// Build signed extrinsic
$signed = ExtrinsicBuilder::create()
    ->pallet('Balances')
    ->function('transfer')
    ->palletIndex(5)
    ->functionIndex(0)
    ->signer($signerAddress)
    ->signature($signature)
    ->nonce(1)
    ->tip(0)
    ->mortal(64, 100)
    ->build();

// Encode
$encoder = new ExtrinsicEncoder();
$encoded = $encoder->encode($signed);

// Decode
$decoder = new ExtrinsicDecoder();
$decoded = $decoder->decode($encoded);

Tests

  • Unit tests in tests/Extrinsic/ExtrinsicTest.php
  • Signature tests
  • Extrinsic tests
  • Builder tests
  • Encoder/decoder tests

Issue


Ready for review.

- Extrinsic v4 format support
- ExtrinsicBuilder pattern for creating transactions
- ExtrinsicEncoder for SCALE encoding
- ExtrinsicDecoder for SCALE decoding
- Signature class for signature data

Features:
- Signed/unsigned extrinsic support
- MultiAddress support (Id/Index)
- Era encoding (immortal/mortal)
- Nonce and tip encoding
- Pallet/function index encoding

Components:
- Signature: Signature data container
- Extrinsic: Extrinsic data model
- ExtrinsicBuilder: Fluent builder pattern
- ExtrinsicEncoder: SCALE encoder
- ExtrinsicDecoder: SCALE decoder

Tests:
- Unit tests for all components
- Signature type tests
- Builder pattern tests
- Encoder/decoder tests

Closes #39
@gmajor-encrypt gmajor-encrypt merged commit 20e5649 into master Mar 24, 2026
1 check passed
@gmajor-encrypt gmajor-encrypt deleted the feature/extrinsic-codec branch March 24, 2026 09:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Phase 3] Extrinsic Codec Refactoring

1 participant