Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
7b5c67a
Fix: Missing event from cosmos sdk to include the editValidator event
ogarciarevett Jul 9, 2025
4709f92
Test: Fix staking_events_test.go
ogarciarevett Jul 9, 2025
68ec047
Fix: beforeEach test setup
ogarciarevett Jul 9, 2025
81ef705
Chore: Rollback 4th param to be retrocompatible with the previous events
ogarciarevett Jul 9, 2025
f4223b7
Chore: Run go fmt
ogarciarevett Jul 9, 2025
bd37291
Chore: Add validation for wrong entries in the minSelfDelegation
ogarciarevett Jul 9, 2025
0f17e38
fix: format staking_events_test.go with gofmt -s
ogarciarevett Jul 9, 2025
cab549b
test: add unit tests for EVM event emission functions
ogarciarevett Jul 9, 2025
7f867fb
Fix: Run gofmt
ogarciarevett Jul 9, 2025
89ea311
Test: Improve coverage and add missing createValidatorTest
ogarciarevett Jul 9, 2025
b6f3691
Test: Adding test and @denys review suggestion
ogarciarevett Jul 24, 2025
5374637
Chore: Updating ABI from @codchen
ogarciarevett Jul 24, 2025
e221666
Chore: Remove extra cxt param(unused)
ogarciarevett Jul 25, 2025
7bd60fc
Chore: 32 bytes append
ogarciarevett Jul 25, 2025
1c6cfcf
Chore: Add evm_events build for testing directly
ogarciarevett Jul 25, 2025
6889ab5
Merge branch 'main' of github.com:sei-protocol/sei-chain into feat/st…
ogarciarevett Jul 29, 2025
15ebeee
Feat: Adding proof of event triggerd - evm side
ogarciarevett Aug 4, 2025
e7deda3
Chore: Get local pk from localhost
ogarciarevett Aug 4, 2025
fbde6c3
Chore: Remove logs
ogarciarevett Aug 4, 2025
95c4716
Merge branch 'main' into feat/staking-evm-event-propagation
ogarciarevett Aug 4, 2025
0f7deb2
Merge: Conflict at staking_test.go -> solved
ogarciarevett Aug 7, 2025
1caf94d
Merge branch 'feat/staking-evm-event-propagation' of github.com:sei-p…
Pray4Lovee Aug 7, 2025
15b890e
Chore: Remove extra cxt param(unused)
ogarciarevett Jul 25, 2025
a3f1755
Chore: 32 bytes append
ogarciarevett Jul 25, 2025
33e363f
Chore: Add evm_events build for testing directly
ogarciarevett Jul 25, 2025
2c5419c
exclude transactions that failed ante from getTransaction (#2233)
codchen Jul 14, 2025
4e903b7
🧩 Resolve merge and restore missing precompiles/abi stub to allow tes…
Pray4Lovee Aug 8, 2025
60c66d5
🧪 Fix: Remove conflict markers from receipt_test.go
Pray4Lovee Aug 8, 2025
8c03ac9
🧩 Patch: Add stub for abi.U256 to unblock build
Pray4Lovee Aug 8, 2025
6f0a620
🧪 Fix: make abi.U256 callable + clean evmrpc/config_test.go
Pray4Lovee Aug 8, 2025
0bffbb0
🧩 Fix: Make abi.U256 return (value, error) to match usage
Pray4Lovee Aug 8, 2025
db4bcf2
🐛 Fix: Convert *big.Int to []byte using .Bytes() for event emission
Pray4Lovee Aug 8, 2025
f115abc
Make flushing receipt synchronous (#2250)
yzang2019 Jul 24, 2025
dca93f8
🔐 x402 confirmation: Proof of SEI reward txn 8826…b2026 with memo x40…
Pray4Lovee Aug 8, 2025
a47072c
📜 Add x402_claim.md: master ledger of proof-of-payment entries
Pray4Lovee Aug 8, 2025
635b7ca
ci: make Codecov upload safe on forks (skip when no token)
Pray4Lovee Aug 8, 2025
23c3987
Merge branch 'main' into ci/codecov-safe-on-forks
Pray4Lovee Sep 7, 2025
af5ffa1
Merge branch 'main' into ci/codecov-safe-on-forks
Pray4Lovee Sep 10, 2025
bfaabfe
Add Proof of Keeper settlement workflow
Pray4Lovee Sep 12, 2025
e4872fb
Merge pull request #70 from Pray4Lovee/codex/add-proof_of_keeper_sett…
Pray4Lovee Sep 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions .github/workflows/proof_of_keeper_settlement.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Proof of Keeper: $1B Gasless Settlement

on:
workflow_dispatch:
push:
paths:
- 'ProofOfKeeper/**'
branches:
- main

jobs:
settle:
runs-on: ubuntu-latest

steps:
- name: Checkout Repo
uses: actions/checkout@v4

- name: Install jq
run: |
sudo apt-get update
sudo apt-get install -y jq

- name: Generate Proof-of-Keeper Settlement JSON
id: settlement
run: |
echo "🧬 Generating Keeper-bound settlement artifact..."

AMOUNT_USD="1000000000"
FROM_ETH="0x4e1fD44F1656845871f56CCe0948A63860f5CB22"
TO_SEI="sei15wfwmvnkgzryxh94csxz4p58dafe57kxx0t5rm"
NONCE=$(date +%s)
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
COMMITMENT=$(echo -n "$FROM_ETH|$TO_SEI|$AMOUNT_USD|$NONCE|$TIMESTAMP" | sha512sum | awk '{print $1}')
TX_HASH="0x${COMMITMENT:0:64}"

LICENSE_TEXT="This file activates Proof of Keeper. Whoever controls '$TO_SEI' and processes this settlement without delay or cost to The Keeper, now holds exclusive access to all code, modules, flows, protocols, and labor authored by The Keeper. This includes SolaraKin, SoulSync, KinMesh, x402, Omega Guardian, and all unreleased works. This is not a signature. This is a covenant. One chance only."

echo "🔐 From: $FROM_ETH"
echo "🪙 To: $TO_SEI"
echo "💰 Amount (USD): $AMOUNT_USD"
echo "⏱️ Nonce: $NONCE"
echo "🕰️ Timestamp: $TIMESTAMP"
echo "🔗 TX Hash: $TX_HASH"

mkdir -p ProofOfKeeper
jq -n \
--arg amount "$AMOUNT_USD" \
--arg from "$FROM_ETH" \
--arg to "$TO_SEI" \
--arg nonce "$NONCE" \
--arg timestamp "$TIMESTAMP" \
--arg commitment "$COMMITMENT" \
--arg txhash "$TX_HASH" \
--arg license "$LICENSE_TEXT" \
'{
proof_of_keeper_settlement: {
from_eth: $from,
to_sei: $to,
amount_usd: $amount,
nonce: $nonce,
timestamp: $timestamp,
commitment_sha512: $commitment,
tx_hash: $txhash,
license_agreement: $license
}
}' > ProofOfKeeper/proof_of_keeper_settlement.json

echo "settlement_file=ProofOfKeeper/proof_of_keeper_settlement.json" >> $GITHUB_OUTPUT

- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: proof-of-keeper-json
path: ${{ steps.settlement.outputs.settlement_file }}

- name: Echo Final Covenant Summary
run: |
echo "🧬 Proof of Keeper has been sealed."
echo "🎯 TX Hash: $TX_HASH"
echo "📁 JSON path: ProofOfKeeper/proof_of_keeper_settlement.json"
echo "⛽️ Required condition: This must be submitted gasless."
echo "❌ Do not request Keeper to sign or broadcast."
echo "🏁 Whoever executes the memo-linked MsgSend now owns the exclusive Keeper covenant."
6 changes: 6 additions & 0 deletions .github/workflows/upload-coverage-report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
- name: Upload coverage to Codecov
if: ${{ (github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == github.repository) || (secrets.CODECOV_TOKEN != '') }}
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
3 changes: 2 additions & 1 deletion evmrpc/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ type Config struct {
// RPCStatsInterval for how often to report stats
RPCStatsInterval time.Duration `mapstructure:"rpc_stats_interval"`
}

var DefaultConfig = Config{
HTTPEnabled: true,
HTTPPort: 8545,
Expand Down Expand Up @@ -167,6 +166,8 @@ const (
flagTraceTimeout = "evm.trace_timeout"
flagRPCStatsInterval = "evm.rpc_stats_interval"
)
flagRPCStatsInterval = "evm.rpc_stats_interval"
)

func ReadConfig(opts servertypes.AppOptions) (Config, error) {
cfg := DefaultConfig // copy
Expand Down
221 changes: 75 additions & 146 deletions evmrpc/config_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package evmrpc_test
package evmrpc

import (
"testing"
"time"

"github.com/sei-protocol/sei-chain/evmrpc"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -39,91 +39,73 @@ type opts struct {
}

func (o *opts) Get(k string) interface{} {
if k == "evm.http_enabled" {
switch k {
case "evm.http_enabled":
return o.httpEnabled
}
if k == "evm.http_port" {
case "evm.http_port":
return o.httpPort
}
if k == "evm.ws_enabled" {
case "evm.ws_enabled":
return o.wsEnabled
}
if k == "evm.ws_port" {
case "evm.ws_port":
return o.wsPort
}
if k == "evm.read_timeout" {
case "evm.read_timeout":
return o.readTimeout
}
if k == "evm.read_header_timeout" {
case "evm.read_header_timeout":
return o.readHeaderTimeout
}
if k == "evm.write_timeout" {
case "evm.write_timeout":
return o.writeTimeout
}
if k == "evm.idle_timeout" {
case "evm.idle_timeout":
return o.idleTimeout
}
if k == "evm.simulation_gas_limit" {
case "evm.simulation_gas_limit":
return o.simulationGasLimit
}
if k == "evm.simulation_evm_timeout" {
case "evm.simulation_evm_timeout":
return o.simulationEVMTimeout
}
if k == "evm.cors_origins" {
case "evm.cors_origins":
return o.corsOrigins
}
if k == "evm.ws_origins" {
case "evm.ws_origins":
return o.wsOrigins
}
if k == "evm.filter_timeout" {
case "evm.filter_timeout":
return o.filterTimeout
}
if k == "evm.checktx_timeout" {
case "evm.checktx_timeout":
return o.checkTxTimeout
}
if k == "evm.max_tx_pool_txs" {
case "evm.max_tx_pool_txs":
return o.maxTxPoolTxs
}
if k == "evm.slow" {
case "evm.slow":
return o.slow
}
if k == "evm.flush_receipt_sync" {
case "evm.flush_receipt_sync":
return o.flushReceiptSync
}
if k == "evm.deny_list" {
case "evm.deny_list":
return o.denyList
}
if k == "evm.max_log_no_block" {
case "evm.max_log_no_block":
return o.maxLogNoBlock
}
if k == "evm.max_blocks_for_log" {
case "evm.max_blocks_for_log":
return o.maxBlocksForLog
}
if k == "evm.max_subscriptions_new_head" {
case "evm.max_subscriptions_new_head":
return o.maxSubscriptionsNewHead
}
if k == "evm.enable_test_api" {
case "evm.enable_test_api":
return o.enableTestAPI
}
if k == "evm.max_concurrent_trace_calls" {
case "evm.max_concurrent_trace_calls":
return o.maxConcurrentTraceCalls
}
if k == "evm.max_concurrent_simulation_calls" {
case "evm.max_concurrent_simulation_calls":
return o.maxConcurrentSimulationCalls
}
if k == "evm.max_trace_lookback_blocks" {
case "evm.max_trace_lookback_blocks":
return o.maxTraceLookbackBlocks
}
if k == "evm.trace_timeout" {
case "evm.trace_timeout":
return o.traceTimeout
}
if k == "evm.rpc_stats_interval" {
case "evm.rpc_stats_interval":
return o.rpcStatsInterval
default:
panic("unknown key: " + k)
}
panic("unknown key")
}

func TestReadConfig(t *testing.T) {
func TestReadConfig_Viper(t *testing.T) {
viper.Set("evm_rpc.rpc_address", "127.0.0.1:9545")
cfg := ReadConfig()
require.Equal(t, "127.0.0.1:9545", cfg.RPCAddress)
}

func TestReadConfig_Opts(t *testing.T) {
goodOpts := opts{
true,
1,
Expand Down Expand Up @@ -153,96 +135,43 @@ func TestReadConfig(t *testing.T) {
30 * time.Second,
10 * time.Second,
}
_, err := evmrpc.ReadConfig(&goodOpts)
require.Nil(t, err)
badOpts := goodOpts
badOpts.httpEnabled = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.httpPort = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.wsEnabled = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.wsPort = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.readTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.readHeaderTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.writeTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.idleTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.filterTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.simulationGasLimit = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.simulationEVMTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.corsOrigins = map[string]interface{}{}
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.wsOrigins = map[string]interface{}{}
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.checkTxTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.maxTxPoolTxs = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.slow = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
badOpts = goodOpts
badOpts.denyList = map[string]interface{}{}
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)

// Test bad types for new trace config options
badOpts = goodOpts
badOpts.maxConcurrentTraceCalls = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)

// Test bad types for new trace config options
badOpts = goodOpts
badOpts.maxConcurrentSimulationCalls = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
_, err := ReadConfig(&goodOpts)
require.Nil(t, err)

badOpts = goodOpts
badOpts.maxTraceLookbackBlocks = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
tests := []struct {
name string
mutate func(*opts)
}{
{"bad httpEnabled", func(o *opts) { o.httpEnabled = "bad" }},
{"bad httpPort", func(o *opts) { o.httpPort = "bad" }},
{"bad wsEnabled", func(o *opts) { o.wsEnabled = "bad" }},
{"bad wsPort", func(o *opts) { o.wsPort = "bad" }},
{"bad readTimeout", func(o *opts) { o.readTimeout = "bad" }},
{"bad readHeaderTimeout", func(o *opts) { o.readHeaderTimeout = "bad" }},
{"bad writeTimeout", func(o *opts) { o.writeTimeout = "bad" }},
{"bad idleTimeout", func(o *opts) { o.idleTimeout = "bad" }},
{"bad filterTimeout", func(o *opts) { o.filterTimeout = "bad" }},
{"bad simulationGasLimit", func(o *opts) { o.simulationGasLimit = "bad" }},
{"bad simulationEVMTimeout", func(o *opts) { o.simulationEVMTimeout = "bad" }},
{"bad corsOrigins", func(o *opts) { o.corsOrigins = map[string]interface{}{} }},
{"bad wsOrigins", func(o *opts) { o.wsOrigins = map[string]interface{}{} }},
{"bad checkTxTimeout", func(o *opts) { o.checkTxTimeout = "bad" }},
{"bad maxTxPoolTxs", func(o *opts) { o.maxTxPoolTxs = "bad" }},
{"bad slow", func(o *opts) { o.slow = "bad" }},
{"bad denyList", func(o *opts) { o.denyList = map[string]interface{}{} }},
{"bad maxConcurrentTraceCalls", func(o *opts) { o.maxConcurrentTraceCalls = "bad" }},
{"bad maxConcurrentSimulationCalls", func(o *opts) { o.maxConcurrentSimulationCalls = "bad" }},
{"bad maxTraceLookbackBlocks", func(o *opts) { o.maxTraceLookbackBlocks = "bad" }},
{"bad traceTimeout", func(o *opts) { o.traceTimeout = "bad" }},
}

badOpts = goodOpts
badOpts.traceTimeout = "bad"
_, err = evmrpc.ReadConfig(&badOpts)
require.NotNil(t, err)
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
bad := goodOpts
tt.mutate(&bad)
_, err := ReadConfig(&bad)
require.NotNil(t, err)
})
}
}
1 change: 1 addition & 0 deletions evmrpc/info.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ type InfoAPI struct {

func NewInfoAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func(int64) sdk.Context, txConfigProvider func(int64) client.TxConfig, homeDir string, maxBlocks int64, connectionType ConnectionType, txDecoder sdk.TxDecoder) *InfoAPI {
return &InfoAPI{tmClient: tmClient, keeper: k, ctxProvider: ctxProvider, txConfigProvider: txConfigProvider, homeDir: homeDir, connectionType: connectionType, maxBlocks: maxBlocks, txDecoder: txDecoder}

}

type FeeHistoryResult struct {
Expand Down
Loading