Skip to content

Instantly share code, notes, and snippets.

@clowestab
clowestab / coordination-layer-rules.md
Created May 18, 2026 15:46
coordination-layer-rules.md

DAO Coordination Layer Rules

This document defines the rules governing the ENS DAO Coordination Layer (“Coordination Layer”).

These rules are intended to replace the existing ENS DAO Working Group Rules for the duration of the Coordination Layer pilot period approved by governance.

The Coordination Layer exists to provide bounded operational coordination, governance support, contributor coordination, and DAO-facing operational execution on behalf of ENS DAO.

The Coordination Layer is not ENS DAO governance itself, nor does it supersede the ENS DAO Constitution, executable governance proposals, or broader delegate authority.

@clowestab
clowestab / coordination-layer-funding-proposal-template.md
Created May 18, 2026 15:36
coordination-layer-funding-proposal-template.md

DAO Coordination Layer Funding Proposal Template

Summary

Provide a short high-level summary of the proposed outgoing, including:

  • what is being funded,
  • why it is being funded,
  • the amount requested,
  • and the intended outcome.
@clowestab
clowestab / ENS_Retrospective_Thomas_Comment.md
Last active November 28, 2025 23:33
ENS_Retrospective_Thomas_Comment.md

In a traditional company, there is a hierarchy of accountability. In a DAO, there is not. Thus far, the DAO has essentially been a free-for-all of self-interest. Let's not pretend otherwise.

I can't speak to James' motivations for pushing this review, but I think a review is sensible. I'm also very aware that intelligent contributors like Arnold and James struggle to get a metaphorical "foot in the door" without support from established delegates. The DAO is a walled garden.

Previously, Spence raised concerns about steward conflicts of interest. It was largely ignored because, frankly, everyone has massive conflicts of interest.

Limes recently posted about Service Provider presentations. The undertones were obvious, and in my opinion fair. But unless someone with the knowledge, incentives, and authority actively manages accountability, nothing happens. That should have been built into the Service Provider Program from the start.

This is a self-reinforcing feedback loop - the people proposing and pushing f

@clowestab
clowestab / contracts...AssortedTests.sol
Created January 22, 2024 10:03
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.22+commit.4fc1097e.js&optimize=false&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12 <0.9.0;
contract AssortedTests {
struct TestStruct {
NestedStruct[] nestedItems;
}
struct NestedStruct {
@clowestab
clowestab / .prettierrc.json
Created January 22, 2024 10:02
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.22+commit.4fc1097e.js&optimize=false&runs=200&gist=
{
"overrides": [
{
"files": "*.sol",
"options": {
"printWidth": 80,
"tabWidth": 4,
"useTabs": false,
"singleQuote": false,
"bracketSpacing": false
const axios = require('axios').default;
const mysql = require('mysql');
const util = require('util');
const slugify = require('slugify');
const GhostAdminAPI = require('@tryghost/admin-api');
const Downloader = require('nodejs-file-downloader');
//Helper function to setup a database wrapper that works with promises
//https://codeburst.io/node-js-mysql-and-async-await-6fb25b01b628
function makeDatabase() {
@clowestab
clowestab / Instagram-ghost.js
Created November 10, 2018 16:50
A script for synchronising your Instagram posts with your Ghost blog as discussed on my blog (https://thomasclowes.com)
const Parser = require('rss-parser');
const request = require('request');
const fs = require('fs');
const mime = require('mime-types');
const slugify = require('slugify');
//Enter your ghost credentials here
const clientId = "ghost-frontend";
const clientSecret = "enter-your-secret";
const username = "enter-your-email";
0x8be65246
0000000000000000000000000000000000000000000000000000000000000123
0000000000000000000000000000000000000000000000000000000000000080
3132333435363738393000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000e0
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000456
0000000000000000000000000000000000000000000000000000000000000789
000000000000000000000000000000000000000000000000000000000000000d
48656c6c6f2c20776f726c642100000000000000000000000000000000000000
final FrameLayout tabContent = (FrameLayout) view.findViewById(android.R.id.tabcontent);
View overlay = (View) view.findViewById(R.id.statusLayout);
overlay.setOnTouchListener(new View.OnTouchListener() {
private float mDownX;
private float mDownY;
private final float SCROLL_THRESHOLD = 10;
private boolean isOnClick;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">