Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
408f3e0
feat: P2P economy layer with budget, risk, pricing, negotiation, escrow
langowarny Mar 6, 2026
0a0e08d
refactor: improve economy layer code quality and performance
langowarny Mar 6, 2026
556da08
feat: add contract interaction support to economy layer
langowarny Mar 6, 2026
e97359e
feat: add observability & monitoring system with token tracking
langowarny Mar 7, 2026
c71677b
feat: enhance economy and observability features with new cmds and doc
langowarny Mar 7, 2026
615e657
Merge pull request #47 from langoai/feature/p2p-economy
langowarny Mar 7, 2026
45dc7fa
feat: Enhance test parallelism, improve assertions across multiple tests
langowarny Mar 7, 2026
4841ed9
Merge pull request #48 from langoai/feature/test-infra-refactoring
langowarny Mar 7, 2026
8234ee0
feat: add on-chain escrow sentinel arch with dual-mode settlement
langowarny Mar 7, 2026
4f00166
feat: integrate Foundry contracts and enhance escrow functionality
langowarny Mar 7, 2026
90ca18f
feat: on-chain escrow functionality and introduce Security Sentinel
langowarny Mar 7, 2026
31da4ea
feat: README add badges
langowarny Mar 7, 2026
e0e7792
Merge pull request #49 from langoai/feature/p2p-escrow
langowarny Mar 7, 2026
63d9ed6
feat: ERC-7579 modular smart account with session keys
langowarny Mar 8, 2026
f2dc221
feat: ERC-4337 paymaster support for gasless USDC transactions
langowarny Mar 8, 2026
5e116b8
fix: resolve 55 P2P + smart account technical debt issues
langowarny Mar 8, 2026
d03519e
fix: eliminate stubs, dead code, add critical test coverage
langowarny Mar 8, 2026
2db0c41
sync: update downstream artifacts for ERC-7579 smart account features
langowarny Mar 8, 2026
dc5c291
Merge pull request #50 from langoai/feature/p2p-smart-account
langowarny Mar 8, 2026
7d87fab
refactor : gofmt go files
langowarny Mar 8, 2026
b2c9fcd
feat: enhance agent execution with auto-extend timeout, progress updates
langowarny Mar 8, 2026
58c7795
feat: add auto-extend timeout and progress indicators to agent config…
langowarny Mar 9, 2026
bb40a83
Merge pull request #51 from langoai/feature/agent-error-ux
langowarny Mar 9, 2026
ff765d5
docs: update README - why lango
langowarny Mar 9, 2026
39663be
feat: add deployment configuration and update script for Lango contracts
langowarny Mar 9, 2026
51ea7ac
feat: add experimental economy and smart account features to README
langowarny Mar 9, 2026
7882ba0
feat: add ABI files for Lango escrow and vault contracts
langowarny Mar 9, 2026
a9d9e90
refactor: clean up code, improve clarity in smart account, economy mod
langowarny Mar 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ go.work.sum
passphrase.txt

!lango.example.json
!contracts/deployments/*.json
!internal/**/abi/*.json
/lango

.cursor/
Expand All @@ -45,6 +47,11 @@ passphrase.txt
bin/
dist/

# Foundry
contracts/out/
contracts/cache/
contracts/lib/

# Coverage reports
.coverage/

Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "contracts/lib/forge-std"]
path = contracts/lib/forge-std
url = https://github.com/foundry-rs/forge-std
6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ lint:
generate:
$(GOCMD) generate ./...

## check-abi: Verify ABI bindings match Solidity sources
check-abi:
@bash scripts/check-abi.sh

## ci: Run full local CI pipeline (fmt-check → vet → lint → test)
ci: fmt-check vet lint test

Expand Down Expand Up @@ -176,7 +180,7 @@ help:
.PHONY: build build-linux build-darwin build-all install \
dev run \
test test-short test-p2p bench coverage \
fmt fmt-check vet lint generate ci \
fmt fmt-check vet lint generate check-abi ci \
deps \
codesign \
sandbox-image \
Expand Down
212 changes: 203 additions & 9 deletions README.md

Large diffs are not rendered by default.

42 changes: 40 additions & 2 deletions cmd/lango/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,23 @@ import (
cliagent "github.com/langoai/lango/internal/cli/agent"
cliapproval "github.com/langoai/lango/internal/cli/approval"
clibg "github.com/langoai/lango/internal/cli/bg"
clicontract "github.com/langoai/lango/internal/cli/contract"
clicron "github.com/langoai/lango/internal/cli/cron"
climcp "github.com/langoai/lango/internal/cli/mcp"
"github.com/langoai/lango/internal/cli/doctor"
clieconomy "github.com/langoai/lango/internal/cli/economy"
cligraph "github.com/langoai/lango/internal/cli/graph"
clilearning "github.com/langoai/lango/internal/cli/learning"
clilibrarian "github.com/langoai/lango/internal/cli/librarian"
climcp "github.com/langoai/lango/internal/cli/mcp"
climemory "github.com/langoai/lango/internal/cli/memory"
climetrics "github.com/langoai/lango/internal/cli/metrics"
"github.com/langoai/lango/internal/cli/onboard"
clip2p "github.com/langoai/lango/internal/cli/p2p"
"github.com/langoai/lango/internal/cli/tui"
clipayment "github.com/langoai/lango/internal/cli/payment"
clisecurity "github.com/langoai/lango/internal/cli/security"
"github.com/langoai/lango/internal/cli/settings"
cliaccount "github.com/langoai/lango/internal/cli/smartaccount"
"github.com/langoai/lango/internal/cli/tui"
cliworkflow "github.com/langoai/lango/internal/cli/workflow"
"github.com/langoai/lango/internal/config"
"github.com/langoai/lango/internal/configstore"
Expand Down Expand Up @@ -207,6 +211,40 @@ func main() {
mcpCmd.GroupID = "infra"
rootCmd.AddCommand(mcpCmd)

economyCfgLoader := func() (*config.Config, error) {
boot, err := bootstrap.Run(bootstrap.Options{})
if err != nil {
return nil, err
}
defer boot.DBClient.Close()
return boot.Config, nil
}
economyCmd := clieconomy.NewEconomyCmd(economyCfgLoader)
economyCmd.GroupID = "infra"
rootCmd.AddCommand(economyCmd)

contractCfgLoader := func() (*config.Config, error) {
boot, err := bootstrap.Run(bootstrap.Options{})
if err != nil {
return nil, err
}
defer boot.DBClient.Close()
return boot.Config, nil
}
contractCmd := clicontract.NewContractCmd(contractCfgLoader)
contractCmd.GroupID = "infra"
rootCmd.AddCommand(contractCmd)

accountCmd := cliaccount.NewAccountCmd(func() (*bootstrap.Result, error) {
return bootstrap.Run(bootstrap.Options{})
})
accountCmd.GroupID = "infra"
rootCmd.AddCommand(accountCmd)

metricsCmd := climetrics.NewMetricsCmd()
metricsCmd.GroupID = "data"
rootCmd.AddCommand(metricsCmd)

cronCmd := clicron.NewCronCmd(func() (*bootstrap.Result, error) {
return bootstrap.Run(bootstrap.Options{})
})
Expand Down
3 changes: 3 additions & 0 deletions contracts/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
BASESCAN_API_KEY=
DEPLOY_MOCK_USDC=false
3 changes: 3 additions & 0 deletions contracts/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
out/
cache/
lib/
11 changes: 11 additions & 0 deletions contracts/deployments/84532.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"chainId": 84532,
"deployer": "0x4BDBDE4A725A83820B7A94cD5dB523eb4515dDAd",
"escrowExecutor": "0x5d08310987C5B59cB03F01363142656C5AE23997",
"escrowHub": "0x1820A1C403A5811660a4893Ae028862208e4f7A8",
"sessionValidator": "0xB52877B5E27F77795Fbe59101D07CA81dbd3f8aC",
"spendingHook": "0xc428774991dBDf6645E254be793cb93A66cd9b4B",
"tokenAddress": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"vaultFactory": "0x1CA47128D7fdDD0D875C3AeC7274C894F2c792C2",
"vaultImplementation": "0x18167Daeca7A09B32D8BE93c73737B95B64A7ff8"
}
8 changes: 8 additions & 0 deletions contracts/foundry.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"lib/forge-std": {
"tag": {
"name": "v1.15.0",
"rev": "0844d7e1fc5e60d77b68e469bff60265f236c398"
}
}
}
20 changes: 20 additions & 0 deletions contracts/foundry.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
remappings = ["forge-std/=lib/forge-std/src/"]
solc = "0.8.24"
optimizer = true
optimizer_runs = 200
fs_permissions = [{ access = "read-write", path = "deployments" }]

[profile.default.fmt]
line_length = 120
tab_width = 4
bracket_spacing = false

[rpc_endpoints]
base_sepolia = "${BASE_SEPOLIA_RPC_URL}"

[etherscan]
base_sepolia = { key = "${BASESCAN_API_KEY}", url = "https://api-sepolia.basescan.org/api", chain = 84532 }
71 changes: 71 additions & 0 deletions contracts/script/Deploy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "../src/LangoEscrowHub.sol";
import "../src/LangoVault.sol";
import "../src/LangoVaultFactory.sol";
import "../src/modules/LangoSessionValidator.sol";
import "../src/modules/LangoSpendingHook.sol";
import "../src/modules/LangoEscrowExecutor.sol";
import "../test/mocks/MockUSDC.sol";

/// @title Deploy — deploy all Lango infrastructure contracts.
/// @notice Outputs deployed addresses to deployments/<chainId>.json.
contract DeployScript is Script {
// Base Sepolia canonical USDC
address constant CANONICAL_USDC = 0x036CbD53842c5426634e7929541eC2318f3dCF7e;

function run() external {
bool deployMockUsdc = vm.envOr("DEPLOY_MOCK_USDC", false);

// Signing method is determined by CLI flags:
// --account <name> → Foundry encrypted keystore (recommended)
// --interactive → prompt for private key at runtime
// --ledger / --trezor→ hardware wallet
// --private-key $KEY → direct key (CI only)
vm.startBroadcast();

address deployer = msg.sender;

// 1. Token — MockUSDC or canonical
address tokenAddress;
if (deployMockUsdc) {
MockUSDC mockUsdc = new MockUSDC();
tokenAddress = address(mockUsdc);
} else {
tokenAddress = CANONICAL_USDC;
}

// 2. Escrow Hub — deployer is testnet arbitrator
LangoEscrowHub escrowHub = new LangoEscrowHub(deployer);

// 3. Vault implementation (clone target, no constructor args)
LangoVault vaultImpl = new LangoVault();

// 4. Vault Factory — needs vault implementation address
LangoVaultFactory vaultFactory = new LangoVaultFactory(address(vaultImpl));

// 5. ERC-7579 Modules (no constructor args)
LangoSessionValidator sessionValidator = new LangoSessionValidator();
LangoSpendingHook spendingHook = new LangoSpendingHook();
LangoEscrowExecutor escrowExecutor = new LangoEscrowExecutor();

vm.stopBroadcast();

// Write deployment addresses to JSON
string memory obj = "deployment";
vm.serializeAddress(obj, "deployer", deployer);
vm.serializeUint(obj, "chainId", block.chainid);
vm.serializeAddress(obj, "tokenAddress", tokenAddress);
vm.serializeAddress(obj, "escrowHub", address(escrowHub));
vm.serializeAddress(obj, "vaultImplementation", address(vaultImpl));
vm.serializeAddress(obj, "vaultFactory", address(vaultFactory));
vm.serializeAddress(obj, "sessionValidator", address(sessionValidator));
vm.serializeAddress(obj, "spendingHook", address(spendingHook));
string memory json = vm.serializeAddress(obj, "escrowExecutor", address(escrowExecutor));

string memory path = string.concat("deployments/", vm.toString(block.chainid), ".json");
vm.writeJson(json, path);
}
}
Loading