profile
viewpoint
Nick Johnson Arachnid @ethereum Foundation London, England http://blog.notdot.net/

Arachnid/bloggart 277

A blog application for App Engine

Arachnid/aetycoon 75

aetycoon provides a library of useful App Engine datastore property classes.

Arachnid/aeoid 49

Easy OpenID support for App Engine

Arachnid/bulkupdate 40

App Engine bulk updater library

Arachnid/AEAuth 28

A sample app demonstrating how to do App Engine authentication in an Android app

Arachnid/bdbdatastore 21

An alternate datastore backend for App Engine, implemented using BDB JE.

Arachnid/bloog 21

RESTful Blog for Google App Engine

Arachnid/AppEngine-OAuth-Library 20

An OAuth library for interacting with Twitter, MySpace and Yahoo on AppEngine

504rules/504rules.github.io 19

Rule page generator for 504

Arachnid/Atomify 14

Converts email to Atom

pull request commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

@makoto @decanus PTAL. I've fixed the timeUntilPremium function to work on wei as you'd expect it to instead of on attoUSD.

Arachnid

comment created time in a day

push eventensdomains/ethregistrar

Nick Johnson

commit sha d1285b1402925e22ed12b67a48083bc1145e7bad

Fix timeUntilPremium to operate on wei instead of attousd

view details

push time in a day

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const DummyOracle = artifacts.require('./DummyOracle');+const LinearPremiumPriceOracle = artifacts.require('./LinearPremiumPriceOracle');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++const DAY = 86400;++contract('LinearPremiumPriceOracle', function (accounts) {+    let priceOracle;++    before(async () => {

None of the tests here change the state, so I think changing this one to beforeEach would only slow the test down.

Arachnid

comment created time in 2 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const HashRegistrar = artifacts.require('@ensdomains/ens/HashRegistrar');+const PublicResolver = artifacts.require('@ensdomains/resolver/PublicResolver');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const ETHRegistrarController = artifacts.require('./ETHRegistrarController');+const DummyOracle = artifacts.require('./DummyOracle');+const StablePriceOracle = artifacts.require('./StablePriceOracle');+const BulkRenewal = artifacts.require('./BulkRenewal');+var Promise = require('bluebird');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"+const ETH_LABEL = sha3('eth');+const ETH_NAMEHASH = namehash.hash('eth');++const advanceTime = Promise.promisify(function(delay, done) {+    web3.currentProvider.send({+        jsonrpc: "2.0",+        "method": "evm_increaseTime",+        params: [delay]}, done)+    }+);++async function expectFailure(call) {

See above.

Arachnid

comment created time in 2 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const HashRegistrar = artifacts.require('@ensdomains/ens/HashRegistrar');+const PublicResolver = artifacts.require('@ensdomains/resolver/PublicResolver');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const ETHRegistrarController = artifacts.require('./ETHRegistrarController');+const DummyOracle = artifacts.require('./DummyOracle');+const StablePriceOracle = artifacts.require('./StablePriceOracle');+const BulkRenewal = artifacts.require('./BulkRenewal');+var Promise = require('bluebird');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"+const ETH_LABEL = sha3('eth');+const ETH_NAMEHASH = namehash.hash('eth');++const advanceTime = Promise.promisify(function(delay, done) {+    web3.currentProvider.send({+        jsonrpc: "2.0",+        "method": "evm_increaseTime",+        params: [delay]}, done)+    }+);++async function expectFailure(call) {+    let tx;+    try {+        tx = await call;+    } catch (error) {+        // Assert ganache revert exception+        assert.equal(+            error.message,+            'Returned error: VM Exception while processing transaction: revert'+        );+    }+    if(tx !== undefined) {+        assert.equal(parseInt(tx.receipt.status), 0);+    }+}++contract('BulkRenewal', function (accounts) {+    let ens;+    let resolver;+    let baseRegistrar;+    let controller;+    let priceOracle;+    let bulkRenewal;++    const secret = "0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";+    const ownerAccount = accounts[0]; // Account that owns the registrar+    const registrantAccount = accounts[1]; // Account that owns test names++    before(async () => {

As above - this PR isn't about this file.

Arachnid

comment created time in 2 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const HashRegistrar = artifacts.require('@ensdomains/ens/HashRegistrar');+const PublicResolver = artifacts.require('@ensdomains/resolver/PublicResolver');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const ETHRegistrarController = artifacts.require('./ETHRegistrarController');+const DummyOracle = artifacts.require('./DummyOracle');+const StablePriceOracle = artifacts.require('./StablePriceOracle');+const BulkRenewal = artifacts.require('./BulkRenewal');+var Promise = require('bluebird');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"+const ETH_LABEL = sha3('eth');+const ETH_NAMEHASH = namehash.hash('eth');++const advanceTime = Promise.promisify(function(delay, done) {

Then it will be fixed in a future PR. As a policy, requiring every issue to be fixed in any file that is touched by it just serves to discourage touching that code at all, and confuses the purpose and content of a PR.

Arachnid

comment created time in 2 days

issue commentethereum/EIPs

CI fails for all builds due to current state of master

Someone added spell check as a required check to the build some time ago. I'd be delighted to remove it.

rekmarks

comment created time in 3 days

pull request commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

@makoto @decanus PTAL

Arachnid

comment created time in 4 days

push eventensdomains/ethregistrar

Nick Johnson

commit sha d1ec4e62dc8ee56333b1d36c9505cb22de59b3c4

More changes in response to review.

view details

push time in 4 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+pragma solidity >=0.5.0;++import "./SafeMath.sol";+import "./StablePriceOracle.sol";++contract LinearPremiumPriceOracle is StablePriceOracle {+    using SafeMath for *;++    uint GRACE_PERIOD = 90 days;++    uint public initialPremium;

See above.

Arachnid

comment created time in 4 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+pragma solidity >=0.5.0;++import "./SafeMath.sol";+import "./StablePriceOracle.sol";++contract LinearPremiumPriceOracle is StablePriceOracle {+    using SafeMath for *;++    uint GRACE_PERIOD = 90 days;++    uint public initialPremium;+    uint public premiumDecreaseRate;++    constructor(DSValue _usdOracle, uint[] memory _rentPrices, uint _initialPremium, uint _premiumDecreaseRate) public+        StablePriceOracle(_usdOracle, _rentPrices)+    {+        initialPremium = _initialPremium;+        premiumDecreaseRate = _premiumDecreaseRate;+    }++    function _premium(string memory name, uint expires, uint duration) internal view returns(uint) {+        expires = expires.add(GRACE_PERIOD);+        if(expires > now) {+            // No premium for renewals+            return 0;+        }++        // Calculate the discount off the maximum premium+        uint discount = premiumDecreaseRate.mul(now.sub(expires));++        // If we've run out the premium period, return 0.+        if(discount > initialPremium) {+            return 0;+        }+        +        return initialPremium.sub(discount);+    }++    function timeUntilPremium(uint expires, uint amount) external view returns(uint) {

We will have to expose this via an interfaceID; deploying a new controller just to make a variable public isn't practical.

Arachnid

comment created time in 4 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

 const ETH_LABEL = sha3('eth'); const ETH_NAMEHASH = namehash.hash('eth');  const advanceTime = Promise.promisify(function(delay, done) {

None of this is changing in the current PR. Please don't gate changes on fixing everything wrong or out of date in every file it touches.

Arachnid

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

+var OwnedResolver = artifacts.require("@ensdomains/resolver/contracts/OwnedResolver.sol");+var OwnedRegistrar = artifacts.require("./OwnedRegistrar.sol");++module.exports = function(deployer) {+  deployer.deploy(OwnedResolver).then(function() {+    return deployer.deploy(OwnedRegistrar, "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", OwnedResolver.address);

Is OwnedResolver actually used anywhere here?

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

+var OwnedResolver = artifacts.require("@ensdomains/resolver/contracts/OwnedResolver.sol");

Nit: The filename should say 'deploy', not 'delploy'.

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

 contract OwnedRegistrar is RBAC {         emit RegistrarRemoved(id, registrar);     } +    function defaultResolver() external view returns (address) {+        return resolver;+    }++    function resetResolver(address newResolver) public onlyRole("owner") {

I would suggest calling this setResolver; reset implies setting it back to a previous value.

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

 import "./OwnerResolver.sol";  * removed by an account with the "authoriser" role.  *  * An audit of this code is available here: https://hackmd.io/s/SJcPchO57+ *+ * The default resolver for users is alterable in this version, but only the+ * "owner" can reset it.  */ contract OwnedRegistrar is RBAC {     ENS public ens;-    OwnerResolver public resolver;+    OldENS public oldENS;+    address public resolver;+    bytes32 public baseNode;     mapping(uint=>mapping(address=>bool)) public registrars; // Maps IANA IDs to authorised accounts     mapping(bytes32=>uint) public nonces; // Maps namehashes to domain nonces      event RegistrarAdded(uint id, address registrar);     event RegistrarRemoved(uint id, address registrar);     event Associate(bytes32 indexed node, bytes32 indexed subnode, address indexed owner);     event Disassociate(bytes32 indexed node, bytes32 indexed subnode);+    event ResolverReset(address newResolver); -    constructor(ENS _ens) public {+    constructor(ENS _ens, address _resolver, OldENS _oldENS, bytes32 _baseNode) public {         ens = _ens;-        resolver = new OwnerResolver(_ens);+        resolver = _resolver;+        oldENS = _oldENS;+        baseNode = _baseNode;         _addRole(msg.sender, "owner");++    }++    /**+     * @dev Migrate a name from the previous ENSRegistry and update its resolver.+     * @param labelHash The hash of the label specifying the subnode.+     */++    function migrate(uint256 labelHash) public onlyRole("owner") {+        bytes32 node = keccak256(abi.encodePacked(baseNode, bytes32(labelHash)));+        address owner = oldENS.owner(node);+        ens.setSubnodeOwner(baseNode, bytes32(labelHash), address(this));+        ens.setResolver(node, resolver);+        Resolver(resolver).setAddr(node, owner);+        ens.setOwner(node, owner);     } -    function addRole(address addr, string role) external onlyRole("owner") {+    function migrateAll(uint256[] calldata labelHashs) external onlyRole("owner") {

Nit: This should be labelHashes.

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

 import "./OwnerResolver.sol";  * removed by an account with the "authoriser" role.  *  * An audit of this code is available here: https://hackmd.io/s/SJcPchO57+ *+ * The default resolver for users is alterable in this version, but only the+ * "owner" can reset it.  */ contract OwnedRegistrar is RBAC {     ENS public ens;-    OwnerResolver public resolver;+    OldENS public oldENS;+    address public resolver;+    bytes32 public baseNode;     mapping(uint=>mapping(address=>bool)) public registrars; // Maps IANA IDs to authorised accounts     mapping(bytes32=>uint) public nonces; // Maps namehashes to domain nonces      event RegistrarAdded(uint id, address registrar);     event RegistrarRemoved(uint id, address registrar);     event Associate(bytes32 indexed node, bytes32 indexed subnode, address indexed owner);     event Disassociate(bytes32 indexed node, bytes32 indexed subnode);+    event ResolverReset(address newResolver); -    constructor(ENS _ens) public {+    constructor(ENS _ens, address _resolver, OldENS _oldENS, bytes32 _baseNode) public {         ens = _ens;-        resolver = new OwnerResolver(_ens);+        resolver = _resolver;+        oldENS = _oldENS;+        baseNode = _baseNode;         _addRole(msg.sender, "owner");++    }++    /**+     * @dev Migrate a name from the previous ENSRegistry and update its resolver.+     * @param labelHash The hash of the label specifying the subnode.+     */++    function migrate(uint256 labelHash) public onlyRole("owner") {+        bytes32 node = keccak256(abi.encodePacked(baseNode, bytes32(labelHash)));+        address owner = oldENS.owner(node);+        ens.setSubnodeOwner(baseNode, bytes32(labelHash), address(this));+        ens.setResolver(node, resolver);+        Resolver(resolver).setAddr(node, owner);+        ens.setOwner(node, owner);     } -    function addRole(address addr, string role) external onlyRole("owner") {+    function migrateAll(uint256[] calldata labelHashs) external onlyRole("owner") {

You can save some gas by leaving off onlyRole("owner"), as the individual migrate method will check it.

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

 import "./OwnerResolver.sol";  * removed by an account with the "authoriser" role.  *  * An audit of this code is available here: https://hackmd.io/s/SJcPchO57+ *+ * The default resolver for users is alterable in this version, but only the+ * "owner" can reset it.  */ contract OwnedRegistrar is RBAC {     ENS public ens;-    OwnerResolver public resolver;+    OldENS public oldENS;+    address public resolver;+    bytes32 public baseNode;     mapping(uint=>mapping(address=>bool)) public registrars; // Maps IANA IDs to authorised accounts     mapping(bytes32=>uint) public nonces; // Maps namehashes to domain nonces      event RegistrarAdded(uint id, address registrar);     event RegistrarRemoved(uint id, address registrar);     event Associate(bytes32 indexed node, bytes32 indexed subnode, address indexed owner);     event Disassociate(bytes32 indexed node, bytes32 indexed subnode);+    event ResolverReset(address newResolver); -    constructor(ENS _ens) public {+    constructor(ENS _ens, address _resolver, OldENS _oldENS, bytes32 _baseNode) public {         ens = _ens;-        resolver = new OwnerResolver(_ens);+        resolver = _resolver;+        oldENS = _oldENS;+        baseNode = _baseNode;         _addRole(msg.sender, "owner");++    }++    /**+     * @dev Migrate a name from the previous ENSRegistry and update its resolver.+     * @param labelHash The hash of the label specifying the subnode.+     */++    function migrate(uint256 labelHash) public onlyRole("owner") {+        bytes32 node = keccak256(abi.encodePacked(baseNode, bytes32(labelHash)));+        address owner = oldENS.owner(node);+        ens.setSubnodeOwner(baseNode, bytes32(labelHash), address(this));+        ens.setResolver(node, resolver);

You shouldn't do this for names that are already in the old registry; this will result in unexpectedly resetting some peoples names to point at other addresses, and could result in lost funds.

Instead you should either migrate the name over without changing the resolver - people can later update to the new resolver if they wish - or copy over any records from the old resolver to the new one. The former would be much preferred, as it has a lower chance of accidentally breaking something.

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

 import "./OwnerResolver.sol";  * removed by an account with the "authoriser" role.  *  * An audit of this code is available here: https://hackmd.io/s/SJcPchO57+ *+ * The default resolver for users is alterable in this version, but only the+ * "owner" can reset it.  */ contract OwnedRegistrar is RBAC {     ENS public ens;-    OwnerResolver public resolver;+    OldENS public oldENS;+    address public resolver;+    bytes32 public baseNode;     mapping(uint=>mapping(address=>bool)) public registrars; // Maps IANA IDs to authorised accounts     mapping(bytes32=>uint) public nonces; // Maps namehashes to domain nonces      event RegistrarAdded(uint id, address registrar);     event RegistrarRemoved(uint id, address registrar);     event Associate(bytes32 indexed node, bytes32 indexed subnode, address indexed owner);     event Disassociate(bytes32 indexed node, bytes32 indexed subnode);+    event ResolverReset(address newResolver); -    constructor(ENS _ens) public {+    constructor(ENS _ens, address _resolver, OldENS _oldENS, bytes32 _baseNode) public {         ens = _ens;-        resolver = new OwnerResolver(_ens);+        resolver = _resolver;+        oldENS = _oldENS;+        baseNode = _baseNode;         _addRole(msg.sender, "owner");++    }++    /**+     * @dev Migrate a name from the previous ENSRegistry and update its resolver.+     * @param labelHash The hash of the label specifying the subnode.+     */++    function migrate(uint256 labelHash) public onlyRole("owner") {

You probably want to make this only work for names that aren't already migrated, so you can't accidentally reset already-migrated names back to the default configuration.

hibbb

comment created time in 4 days

Pull request review commentcartoucheco/registrar

multi-chain supported

-pragma solidity ^0.4.20;+pragma solidity >=0.5.0 <0.7.0; pragma experimental ABIEncoderV2;  import "@ensdomains/ens/contracts/ENS.sol"; import "./RBAC.sol";-import "./OwnerResolver.sol";+import "@ensdomains/resolver/contracts/Resolver.sol";++interface OldENS {

It's safe to use the ENS interface for oldENS; just don't call any of the newly added methods.

hibbb

comment created time in 4 days

push eventethereum/EIPs

Wei Tang

commit sha 4cc3816b9567090b2b4118392631ef8546103723

Mark EIP-695 as Final (#2432)

view details

push time in 7 days

PR merged ethereum/EIPs

Mark EIP-695 as Final maintenance/editing

https://github.com/ethereum/EIPs/pull/2356#issuecomment-563025007

+1 -2

8 comments

1 changed file

sorpaas

pr closed time in 7 days

push eventensdomains/ethregistrar

Nick Johnson

commit sha 34e81240675c8d94e08444b9b5ecb805bf0881c6

Add tests for timeUntilPremium

view details

Nick Johnson

commit sha 98a850085281f9de5b3ace23f11f9e4dfa974bda

Changes in response to review

view details

push time in 7 days

pull request commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

@makoto PTAL

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const DummyOracle = artifacts.require('./DummyOracle');+const LinearPremiumPriceOracle = artifacts.require('./LinearPremiumPriceOracle');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++contract('LinearPremiumPriceOracle', function (accounts) {+    let priceOracle;++    before(async () => {+		ens = await ENS.new();+		registrar = await BaseRegistrar.new(ens.address, namehash.hash('eth'));+		await ens.setSubnodeOwner('0x0', sha3('eth'), registrar.address);+		await registrar.addController(accounts[0]);++        // Dummy oracle with 1 ETH == 2 USD+        var dummyOracle = await DummyOracle.new(toBN(2000000000000000000));+        // 4 attousd per second for 3 character names, 2 attousd per second for 4 character names,+        // 1 attousd per second for longer names.+        // Pricing premium starts out at 100 USD at expiry and decreases to 0 over 100k seconds (a bit over a day)+        const premium = toBN("100000000000000000000");+        const decreaseRate = toBN("1000000000000000");+        priceOracle = await LinearPremiumPriceOracle.new(dummyOracle.address, [0, 0, 4, 2, 1], premium, decreaseRate);+    });++    it('should report the correct premium and decrease rate', async () => {+        assert.equal((await priceOracle.initialPremium()).toString(), "100000000000000000000");+        assert.equal((await priceOracle.premiumDecreaseRate()).toString(), "1000000000000000");+    })++    it('should return correct base prices', async () => {+        assert.equal((await priceOracle.price("foo", 0, 3600)).toNumber(), 7200);+        assert.equal((await priceOracle.price("quux", 0, 3600)).toNumber(), 3600);+        assert.equal((await priceOracle.price("fubar", 0, 3600)).toNumber(), 1800);+        assert.equal((await priceOracle.price("foobie", 0, 3600)).toNumber(), 1800);+    });++    it('should not specify a premium for first-time registrations', async () => {

Premium doesn't depend on the duration, only on when the name was last registered.

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+pragma solidity >=0.5.0;++import "./SafeMath.sol";+import "./StablePriceOracle.sol";++contract LinearPremiumPriceOracle is StablePriceOracle {+    using SafeMath for *;++    uint GRACE_PERIOD = 90 days;++    uint public initialPremium;+    uint public premiumDecreaseRate;++    constructor(DSValue _usdOracle, uint[] memory _rentPrices, uint _initialPremium, uint _premiumDecreaseRate) public+        StablePriceOracle(_usdOracle, _rentPrices)+    {+        initialPremium = _initialPremium;+        premiumDecreaseRate = _premiumDecreaseRate;+    }++    function _premium(string memory name, uint expires, uint duration) internal view returns(uint) {+        expires = expires.add(GRACE_PERIOD);+        if(expires > now) {+            // No premium for renewals+            return 0;+        }++        // Calculate the discount off the maximum premium+        uint discount = premiumDecreaseRate.mul(now.sub(expires));++        if(discount > initialPremium) {+            return 0;+        }+        +        return initialPremium.sub(discount);+    }++    function timeUntilPremium(uint expires, uint amount) external view returns(uint) {

Done.

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+pragma solidity >=0.5.0;++import "./SafeMath.sol";+import "./StablePriceOracle.sol";++contract LinearPremiumPriceOracle is StablePriceOracle {+    using SafeMath for *;++    uint GRACE_PERIOD = 90 days;++    uint public initialPremium;+    uint public premiumDecreaseRate;++    constructor(DSValue _usdOracle, uint[] memory _rentPrices, uint _initialPremium, uint _premiumDecreaseRate) public+        StablePriceOracle(_usdOracle, _rentPrices)+    {+        initialPremium = _initialPremium;+        premiumDecreaseRate = _premiumDecreaseRate;+    }++    function _premium(string memory name, uint expires, uint duration) internal view returns(uint) {

No, but it's part of the interface.

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

 interface DSValue {     function read() external view returns (bytes32); } + // StablePriceOracle sets a price in USD, based on an oracle. contract StablePriceOracle is Ownable, PriceOracle {     using SafeMath for *;     using StringUtils for *; -    // Oracle address-    DSValue usdOracle;--    // Rent in attodollars (1e-18) per second+    // Rent in base price units by length. Element 0 is for 1-length names, and so on.     uint[] public rentPrices; +    // Oracle address+    DSValue public usdOracle;+     event OracleChanged(address oracle);+     event RentPriceChanged(uint[] prices);      constructor(DSValue _usdOracle, uint[] memory _rentPrices) public {-        setOracle(_usdOracle);+        usdOracle = _usdOracle;         setPrices(_rentPrices);     } -    /**-     * @dev Sets the price oracle address-     * @param _usdOracle The address of the price oracle to use.-     */-    function setOracle(DSValue _usdOracle) public onlyOwner {-        usdOracle = _usdOracle;-        emit OracleChanged(address(_usdOracle));+    function price(string calldata name, uint expires, uint duration) external view returns(uint) {+        uint len = name.strlen();+        if(len > rentPrices.length) {+            len = rentPrices.length;+        }+        require(len > 0);+        +        uint basePrice = rentPrices[len - 1].mul(duration);+        basePrice = basePrice.add(_premium(name, expires, duration));++        uint ethPrice = uint(usdOracle.read());+        return basePrice.mul(1e18).div(ethPrice);     }      /**      * @dev Sets rent prices.      * @param _rentPrices The price array. Each element corresponds to a specific      *                    name length; names longer than the length of the array-     *                    default to the price of the last element.+     *                    default to the price of the last element. Values are+     *                    in base price units, equal to one attodollar (1e-18+     *                    dollar) each.      */     function setPrices(uint[] memory _rentPrices) public onlyOwner {         rentPrices = _rentPrices;         emit RentPriceChanged(_rentPrices);     }      /**-     * @dev Returns the price to register or renew a name.-     * @param name The name being registered or renewed.-     * @param duration How long the name is being registered or extended for, in seconds.-     * @return The price of this renewal or registration, in wei.+     * @dev Sets the price oracle address+     * @param _usdOracle The address of the price oracle to use.      */-    function price(string calldata name, uint /*expires*/, uint duration) view external returns(uint) {-        uint len = name.strlen();-        if(len > rentPrices.length) {-            len = rentPrices.length;-        }-        require(len > 0);-        uint priceUSD = rentPrices[len - 1].mul(duration);+    function setOracle(DSValue _usdOracle) public onlyOwner {+        usdOracle = _usdOracle;+        emit OracleChanged(address(_usdOracle));+    } -        // Price of one ether in attodollars+    /**+     * @dev Returns the pricing premium in wei.+     */+    function premium(string calldata name, uint expires, uint duration) external view returns(uint) {         uint ethPrice = uint(usdOracle.read());+        return _premium(name, expires, duration).mul(1e18).div(ethPrice);+    } -        // priceUSD and ethPrice are both fixed-point values with 18dp, so we-        // multiply the numerator by 1e18 before dividing.-        return priceUSD.mul(1e18).div(ethPrice);+    /**+     * @dev Returns the pricing premium in internal base units.+     */+    function _premium(string memory name, uint expires, uint duration) internal view returns(uint) {+        return 0;

No, it is called by StablePriceOracle if you use it instead of a derived class, because it never adds a premium.

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

 interface DSValue {     function read() external view returns (bytes32); } + // StablePriceOracle sets a price in USD, based on an oracle. contract StablePriceOracle is Ownable, PriceOracle {     using SafeMath for *;     using StringUtils for *; -    // Oracle address-    DSValue usdOracle;--    // Rent in attodollars (1e-18) per second+    // Rent in base price units by length. Element 0 is for 1-length names, and so on.     uint[] public rentPrices; +    // Oracle address+    DSValue public usdOracle;+     event OracleChanged(address oracle);+     event RentPriceChanged(uint[] prices);      constructor(DSValue _usdOracle, uint[] memory _rentPrices) public {-        setOracle(_usdOracle);+        usdOracle = _usdOracle;         setPrices(_rentPrices);     } -    /**-     * @dev Sets the price oracle address-     * @param _usdOracle The address of the price oracle to use.-     */-    function setOracle(DSValue _usdOracle) public onlyOwner {-        usdOracle = _usdOracle;-        emit OracleChanged(address(_usdOracle));+    function price(string calldata name, uint expires, uint duration) external view returns(uint) {+        uint len = name.strlen();+        if(len > rentPrices.length) {+            len = rentPrices.length;+        }+        require(len > 0);

I'm very much not a fan of this. It bloats contract size, and good tools ought to report the line the transaction failed on anyway.

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const DummyOracle = artifacts.require('./DummyOracle');+const LinearPremiumPriceOracle = artifacts.require('./LinearPremiumPriceOracle');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++contract('LinearPremiumPriceOracle', function (accounts) {+    let priceOracle;++    before(async () => {+		ens = await ENS.new();+		registrar = await BaseRegistrar.new(ens.address, namehash.hash('eth'));+		await ens.setSubnodeOwner('0x0', sha3('eth'), registrar.address);+		await registrar.addController(accounts[0]);++        // Dummy oracle with 1 ETH == 2 USD+        var dummyOracle = await DummyOracle.new(toBN(2000000000000000000));+        // 4 attousd per second for 3 character names, 2 attousd per second for 4 character names,+        // 1 attousd per second for longer names.+        // Pricing premium starts out at 100 USD at expiry and decreases to 0 over 100k seconds (a bit over a day)

No, these are just convenient figures for testing.

Arachnid

comment created time in 7 days

Pull request review commentensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

+const ENS = artifacts.require('@ensdomains/ens/ENSRegistry');+const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation');+const DummyOracle = artifacts.require('./DummyOracle');+const LinearPremiumPriceOracle = artifacts.require('./LinearPremiumPriceOracle');++const namehash = require('eth-ens-namehash');+const sha3 = require('web3-utils').sha3;+const toBN = require('web3-utils').toBN;++contract('LinearPremiumPriceOracle', function (accounts) {+    let priceOracle;++    before(async () => {+		ens = await ENS.new();+		registrar = await BaseRegistrar.new(ens.address, namehash.hash('eth'));+		await ens.setSubnodeOwner('0x0', sha3('eth'), registrar.address);+		await registrar.addController(accounts[0]);++        // Dummy oracle with 1 ETH == 2 USD+        var dummyOracle = await DummyOracle.new(toBN(2000000000000000000));+        // 4 attousd per second for 3 character names, 2 attousd per second for 4 character names,

This is described in the docs to setPrices on StablePriceOracle.

Arachnid

comment created time in 7 days

PR opened ensdomains/ethregistrar

Refactor price oracles and introduce a linear premium price oracle

This new oracle type applies a premium to reregistration of recently expired domains that starts high and diminishes over time.

+312 -208

0 comment

8 changed files

pr created time in 8 days

create barnchensdomains/ethregistrar

branch : neworacle

created branch time in 8 days

delete branch ensdomains/dnssec-oracle

delete branch : decanus-patch-1

delete time in 8 days

push eventensdomains/dnssec-oracle

Dean Eigenmann

commit sha f7d0b47626cc8f769fc9b51bf8fc1e9f94d45c74

Update README.md

view details

Nick Johnson

commit sha 3afc8e5d53fe964a18ac8eb4ee085419fc7096aa

Merge pull request #77 from ensdomains/decanus-patch-1 Update README.md

view details

push time in 8 days

Pull request review commentcartoucheco/registrar

Alterable resolver

 contract Migrations {   function setCompleted(uint completed) public restricted {     last_completed_migration = completed;   }-

This contract is auto-generated by Truffle and should be left as-is.

liubenbencom

comment created time in 12 days

MemberEvent

push eventensdomains/ens-subgraph

Makoto Inoue

commit sha fa5859363cd7c26d9a7a917b5281973a2498babf

Add docker endpoint

view details

Makoto Inoue

commit sha e5be902f59972baa1c4e203dfeb81b13c0d23544

Merge pull request #15 from ensdomains/docker Add docker endpoint

view details

Makoto Inoue

commit sha 48412aae7c3c668c8b3aa7729cdb7c50151853c7

rename docker container names

view details

Makoto Inoue

commit sha 251c9af952124f6758830434ce2d1a08998f6b8d

Merge pull request #16 from ensdomains/rename-docker rename docker container names

view details

Nick Johnson

commit sha 4ef90eb19fc23ececced52145038e2b2ecce24ed

Remove obsolete NameMigrated event

view details

Nick Johnson

commit sha 8bff683e2cb51e72cc20bc33a20aadc36ab90b7d

Remove obsolete auctionRegistrar

view details

Nick Johnson

commit sha 68ef70c53a422dedc5ae9b2ff299036b863f9643

Fix bug with names transferred to accounts we haven't seen before

view details

Nick Johnson

commit sha e9379149c738cea511bc8f86525ba21063aa6b85

Fix goerli bug with handling of name strings containg nulls

view details

Nick Johnson

commit sha 1cfe8e580fca27803cfbebe4994dac2edf67de38

Propagate registration and renewal events to the Registration so we can sort by name

view details

Nick Johnson

commit sha 6f6efe530d4b6f312687d60e8a824f1e445de27e

Merge branch 'master' of github.com:ensdomains/ens-subgraph

view details

Nick Johnson

commit sha b8b73dca14a0e5e65d582b1b7db65f4df523deb4

Fetch labelName from ENS dictionary for registrations

view details

Nick Johnson

commit sha 842a6c6402855e8a6e6fedcdd33b4662f2c047ea

Merge branch 'master' into rinkeby

view details

push time in a month

push eventensdomains/ens-subgraph

Makoto Inoue

commit sha fa5859363cd7c26d9a7a917b5281973a2498babf

Add docker endpoint

view details

Makoto Inoue

commit sha e5be902f59972baa1c4e203dfeb81b13c0d23544

Merge pull request #15 from ensdomains/docker Add docker endpoint

view details

Makoto Inoue

commit sha 48412aae7c3c668c8b3aa7729cdb7c50151853c7

rename docker container names

view details

Makoto Inoue

commit sha 251c9af952124f6758830434ce2d1a08998f6b8d

Merge pull request #16 from ensdomains/rename-docker rename docker container names

view details

Nick Johnson

commit sha 4ef90eb19fc23ececced52145038e2b2ecce24ed

Remove obsolete NameMigrated event

view details

Nick Johnson

commit sha 8bff683e2cb51e72cc20bc33a20aadc36ab90b7d

Remove obsolete auctionRegistrar

view details

Nick Johnson

commit sha 68ef70c53a422dedc5ae9b2ff299036b863f9643

Fix bug with names transferred to accounts we haven't seen before

view details

Nick Johnson

commit sha e9379149c738cea511bc8f86525ba21063aa6b85

Fix goerli bug with handling of name strings containg nulls

view details

Nick Johnson

commit sha 1cfe8e580fca27803cfbebe4994dac2edf67de38

Propagate registration and renewal events to the Registration so we can sort by name

view details

Nick Johnson

commit sha 6f6efe530d4b6f312687d60e8a824f1e445de27e

Merge branch 'master' of github.com:ensdomains/ens-subgraph

view details

Nick Johnson

commit sha b8b73dca14a0e5e65d582b1b7db65f4df523deb4

Fetch labelName from ENS dictionary for registrations

view details

Nick Johnson

commit sha 7d4d1e9a9605f4421a9cce9a346949798e35d295

Merge branch 'master' into goerli

view details

push time in a month

push eventensdomains/ens-subgraph

Makoto Inoue

commit sha fa5859363cd7c26d9a7a917b5281973a2498babf

Add docker endpoint

view details

Makoto Inoue

commit sha e5be902f59972baa1c4e203dfeb81b13c0d23544

Merge pull request #15 from ensdomains/docker Add docker endpoint

view details

Makoto Inoue

commit sha 48412aae7c3c668c8b3aa7729cdb7c50151853c7

rename docker container names

view details

Makoto Inoue

commit sha 251c9af952124f6758830434ce2d1a08998f6b8d

Merge pull request #16 from ensdomains/rename-docker rename docker container names

view details

Nick Johnson

commit sha 4ef90eb19fc23ececced52145038e2b2ecce24ed

Remove obsolete NameMigrated event

view details

Nick Johnson

commit sha 8bff683e2cb51e72cc20bc33a20aadc36ab90b7d

Remove obsolete auctionRegistrar

view details

Nick Johnson

commit sha 68ef70c53a422dedc5ae9b2ff299036b863f9643

Fix bug with names transferred to accounts we haven't seen before

view details

Nick Johnson

commit sha e9379149c738cea511bc8f86525ba21063aa6b85

Fix goerli bug with handling of name strings containg nulls

view details

Nick Johnson

commit sha 1cfe8e580fca27803cfbebe4994dac2edf67de38

Propagate registration and renewal events to the Registration so we can sort by name

view details

Nick Johnson

commit sha 6f6efe530d4b6f312687d60e8a824f1e445de27e

Merge branch 'master' of github.com:ensdomains/ens-subgraph

view details

Nick Johnson

commit sha b8b73dca14a0e5e65d582b1b7db65f4df523deb4

Fetch labelName from ENS dictionary for registrations

view details

Nick Johnson

commit sha cab23746d0419622ddb2603c479d035c704cc321

Merge branch 'master' into ropsten

view details

push time in a month

push eventensdomains/ens-subgraph

Nick Johnson

commit sha b8b73dca14a0e5e65d582b1b7db65f4df523deb4

Fetch labelName from ENS dictionary for registrations

view details

push time in a month

push eventensdomains/ens-subgraph

Nick Johnson

commit sha 4ef90eb19fc23ececced52145038e2b2ecce24ed

Remove obsolete NameMigrated event

view details

Nick Johnson

commit sha 8bff683e2cb51e72cc20bc33a20aadc36ab90b7d

Remove obsolete auctionRegistrar

view details

Nick Johnson

commit sha 68ef70c53a422dedc5ae9b2ff299036b863f9643

Fix bug with names transferred to accounts we haven't seen before

view details

Nick Johnson

commit sha e9379149c738cea511bc8f86525ba21063aa6b85

Fix goerli bug with handling of name strings containg nulls

view details

Nick Johnson

commit sha 1cfe8e580fca27803cfbebe4994dac2edf67de38

Propagate registration and renewal events to the Registration so we can sort by name

view details

Nick Johnson

commit sha 6f6efe530d4b6f312687d60e8a824f1e445de27e

Merge branch 'master' of github.com:ensdomains/ens-subgraph

view details

push time in a month

issue closedensdomains/ens-subgraph

Fix subgraph where returning null for registrant

sea.eth 0xc4b747e014d22818e6ecf33eb0650062f46200d7c66f70f4a380b38d6791faf9

closed time in a month

jefflau

issue commentensdomains/ens-subgraph

Fix subgraph where returning null for registrant

Fixed!

jefflau

comment created time in a month

issue commentensdomains/ens-app

Transfer button tooltip should be more helpful during the grace period

Yup!

On Tue, 5 May 2020, 7:39 pm Jeff Lau, notifications@github.com wrote:

This is supposed to say you can't transfer during the grace period, right?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/ensdomains/ens-app/issues/711#issuecomment-623904245, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAELSM4HRWODUUETL6UAQDRP67CBANCNFSM4MZBUS7A .

Arachnid

comment created time in a month

issue openedensdomains/ens-app

Handle pagination of names on the account page

Currently we only fetch the first page from the graph results, then sort them and display them. This results in users who have a large number of domains - for example https://app.ens.domains/address/0x9417ab659e81411dc3d0385b2dd27fa0a4f38392 - having missing domains. Since the sort order isn't the same on the subgraph, the missing domains appear to be random.

We either need to do 'infinite scroll' or some other pagination option. This probably means restricting sort orders to those that the subgraph can natively support, too.

created time in a month

issue openedensdomains/ens-app

Renewal reminder message is unhelpful

The reminder message says "renew them all in one transaction", but doesn't contain a link or an explanation of how to do that. Screenshot from 2020-05-05 08-17-58

created time in a month

issue openedensdomains/ens-app

Checksums on controller/registrant fields are screwy

Take for example https://app.ens.domains/name/chasewright.eth - both controller and registrant are the same account, but they have different checksums (capitalisation). In the example above, the controller checksum appears to be the correct one.

created time in a month

issue openedensdomains/ens-app

Transfer button tooltip should be more helpful during the grace period

If the user is logged in as the registrant, during the grace period, the transfer button message should explain that you can't renew a domain during the grace period.

created time in a month

issue openedensdomains/ens-app

Transfer button disabled message should refer to registrant, not controller

Currently it says "you can only make changes if you are the controller".

created time in a month

issue openedensdomains/ens-app

Renew button should be enabled for everyone

Anyone can renew a name at any time. We shouldn't be disabling the renew button in the UI.

created time in a month

delete branch ensdomains/ethregistrar

delete branch : bulkrenewal-2

delete time in a month

push eventensdomains/ethregistrar

Makoto Inoue

commit sha eb81e93861871122044dace61ca5a99b47257520

Bulkrenewal 2 (#51) * Implement bulk renewal contract * Fix tests broken by different tx return type * Check for excess funds returned * v2.0.2 Co-authored-by: Nick Johnson <arachnid@notdot.net>

view details

push time in a month

PR merged ensdomains/ethregistrar

Bulkrenewal 2

This is to merge #49

+155 -1

0 comment

3 changed files

makoto

pr closed time in a month

push eventensdomains/ethregistrar

Nick Johnson

commit sha 5e3947506067b5e086bc3fe87f1a73edc7de2c0d

Revert "Update the controller to support referrals and bulk renewals (#50)" (#52) This reverts commit 7d2a68430d62004acbf7a30032ac5dd162f1c8f2.

view details

Nick Johnson

commit sha 861203b0ba092aeeca75536f3b19a4e83ea32d34

Merge remote-tracking branch 'origin/master' into bulkrenewal-2

view details

push time in a month

delete branch ensdomains/ethregistrar

delete branch : revert-50-controllerupdate

delete time in a month

push eventensdomains/ethregistrar

Nick Johnson

commit sha 5e3947506067b5e086bc3fe87f1a73edc7de2c0d

Revert "Update the controller to support referrals and bulk renewals (#50)" (#52) This reverts commit 7d2a68430d62004acbf7a30032ac5dd162f1c8f2.

view details

push time in a month

PR merged ensdomains/ethregistrar

Revert "Update the controller to support referrals and bulk renewals"

Reverts ensdomains/ethregistrar#50 since we've decided not to do on-chain referrals for now.

+142 -278

0 comment

5 changed files

Arachnid

pr closed time in a month

PR opened ensdomains/ethregistrar

Revert "Update the controller to support referrals and bulk renewals"

Reverts ensdomains/ethregistrar#50 since we've decided not to do on-chain referrals for now.

+142 -278

0 comment

5 changed files

pr created time in a month

create barnchensdomains/ethregistrar

branch : revert-50-controllerupdate

created branch time in a month

push eventensdomains/ethregistrar

Dean Eigenmann

commit sha b2ccd0e2f2e78ae3e4ef7e16a832beb513bce9c7

upgrade/tests (#7) * renamed files, using time function from helper * upgraded * updates * fixes * fix * fix * fix * Update TestBaseRegistrar.js

view details

Nick Johnson

commit sha 7d2a68430d62004acbf7a30032ac5dd162f1c8f2

Update the controller to support referrals and bulk renewals (#50) * Support bulk renewal * Add referral support to the registrar controller * Changes in response to review

view details

Nick Johnson

commit sha 47975460b99e905c184b5333787536bf423ea72c

Merge remote-tracking branch 'origin/master' into bulkrenewal

view details

push time in a month

push eventensdomains/ethregistrar

Dean Eigenmann

commit sha b2ccd0e2f2e78ae3e4ef7e16a832beb513bce9c7

upgrade/tests (#7) * renamed files, using time function from helper * upgraded * updates * fixes * fix * fix * fix * Update TestBaseRegistrar.js

view details

Nick Johnson

commit sha 7d2a68430d62004acbf7a30032ac5dd162f1c8f2

Update the controller to support referrals and bulk renewals (#50) * Support bulk renewal * Add referral support to the registrar controller * Changes in response to review

view details

Makoto

commit sha c6810c27700e65ea98871b30e9e3cf4db9e2e748

v2.0.2

view details

Nick Johnson

commit sha 47975460b99e905c184b5333787536bf423ea72c

Merge remote-tracking branch 'origin/master' into bulkrenewal

view details

push time in a month

push eventpidcodes/pidcodes.github.com

Sean Cross

commit sha 6cee75b61a5a6a6cc207f1e432dd6b8a86853c45

simmel: add betrusted org and simmel device (#514) Signed-off-by: Sean Cross <sean@xobs.io>

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

simmel: add betrusted org and simmel device

Add a request for the Betrusted Simmel (https://simmel.betrusted.io/)

+15 -0

0 comment

2 changed files

xobs

pr closed time in a month

pull request commentpidcodes/pidcodes.github.com

Add 1209/B737 - LrLite

Can you please upload hardware source files to your repository, not just the gerbers?

remov-b4-flight

comment created time in a month

push eventremov-b4-flight/pidcodes.github.com

Nick Johnson

commit sha cd1f1cee23d4254b9869b1713e1313dfc62d4eed

Delete .project

view details

push time in a month

push eventpidcodes/pidcodes.github.com

Manuel Bl

commit sha ecd1654322c842aae06224af450f4cf983a2ed68

PID request for USB-to-serial adapter (#512)

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

PID request for USB-to-serial adapter

Pull request to add a new PID for the open-source hardware and firmware of a USB-to-serial adapter that can be used without installing any proprietary drivers (as it implements the USB CDC ACM protocol). Built around a crystal-less USB design using a STM32F042 MCU.

+9 -0

0 comment

1 changed file

manuelbl

pr closed time in a month

push eventpidcodes/pidcodes.github.com

mphi_rc

commit sha 43069a8bb9ae10fe99266bb51c85280037f8665c

Request PID 0xF1D0 for Pi Zero Security Key (#511)

view details

push time in a month

pull request commentpidcodes/pidcodes.github.com

Request pid for Comrade P1

Can you please update your repository to include a README, and links to the hardware source files for your project?

ershov-konst

comment created time in a month

pull request commentpidcodes/pidcodes.github.com

Request for PID 5750 with VID 0x1209 for CUAV autopilot.

In order to grant you a free PID, you need to provide hardware design source files, so that someone can modify and reproduce your project in accordance with your license, not just PDFs. Can you please upload the source files, or update your PR to point to where they can already be found?

cuhome

comment created time in a month

PR merged pidcodes/pidcodes.github.com

PID request for snopf password generator

snopf is an open source (GPL2) password generator running on an ATtiny85.

+22 -0

0 comment

3 changed files

snopf

pr closed time in a month

push eventpidcodes/pidcodes.github.com

Hajo

commit sha 60fcbba58629c1d205220f9a144e966fedaf1792

PID request for snopf password generator (#503) * PID request for snopf password generator * Update index.md Co-authored-by: Nick Johnson <arachnid@notdot.net>

view details

push time in a month

push eventpidcodes/pidcodes.github.com

Doankt

commit sha 899d4c789e7186dbb52bf670ca443a57e16d72da

Request 1209/8300 for doankt, Poomsae Controller (#507) * Request 1209/8300 for doankt, Poomsae Controller * Update index.md Co-authored-by: Nick Johnson <arachnid@notdot.net>

view details

push time in a month

push eventDoankt/pidcodes.github.com

Nick Johnson

commit sha 96584f09656a908253d7e2925d7f7d2f6b81c154

Update index.md

view details

push time in a month

push eventpidcodes/pidcodes.github.com

nullstalgia

commit sha 6ababd78d13f77c3a3b3101edc4b09fa85c79c27

PID Request for NullWiiCon (0x2231) (#506) Co-authored-by: Tony Sesek <leorijn223@gmail.com>

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

PID Request for NullWiiCon (0x2231)

NullWiiCon is a configurable, versatile adapter for NES/SNES Classic Controllers, Wii Classic Controllers, etc. Has switchable firmwares for Nintendo Switch, XInput, RetroArch, etc.

KiCad Projects and Source code on https://github.com/nullstalgia/NullWiiCon

OSHWA Cert: https://certification.oshwa.org/us000234.html

+15 -0

0 comment

2 changed files

nullstalgia

pr closed time in a month

push eventpidcodes/pidcodes.github.com

Yury Vostrenkov

commit sha 4febb2c9d626ad92dfdc6ebeb8fa905c71157b58

FreeJoy project PID request (#505) Co-authored-by: Yury Vostrenkov <yuvostrenkov@gmail.com>

view details

push time in a month

push eventsnopf/pidcodes.github.com

Nick Johnson

commit sha c06122862c6f8e00b5829465400e7bd4662a4dfc

Update index.md

view details

push time in a month

push eventpidcodes/pidcodes.github.com

Kiel Pease

commit sha 8794250f817ffa72a6a3ca1935f8a2e085bf8f2a

Request for PID 0xDB50 of VID 0x1209 - Game Pad HID Controller for Simulations (#502) * Request a PID for player controller * Request a PID for game player controller controls * Added directory for PID DB50 * Delete PeaseTech file mess up * Edited index.md with request info

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

Request for PID 0xDB50 of VID 0x1209 - Game Pad HID Controller for Simulations

Simple Game Pad HID Controller for Simulations Requesting VID:0x1209 PIDL0xDB50 https://github.com/kielpease/DBS_Controller

kielpease Pease Technology, LLC

+21 -0

0 comment

2 changed files

kielpease

pr closed time in a month

push eventpidcodes/pidcodes.github.com

Sandeepan Sengupta

commit sha 232afb1e58582239f644e816acd82788dde96c26

Refresh (#501) * Delete Index.md * Delete Index.md * Delete Index.md * Delete index.md * Added ORG * Added PID

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

Refresh

Ref. #493

@Arachnid, I failed to resolve conflicts. Creating a new request from new fork

+34 -34

0 comment

7 changed files

sandeepansg

pr closed time in a month

push eventpidcodes/pidcodes.github.com

Jed Hodson

commit sha 85d63c76ea799778948f64753d586a30cd6e05b4

Request 1209/8192 for Prototyping Corner UWB Feather (#500) * Created Prototyping Corner Org * Created UWB Feather project * Fixed owner

view details

push time in a month

push eventpidcodes/pidcodes.github.com

Gregory Davill

commit sha 16fde2cf290478ad3ff0da85c114d380661d527d

Request PID: 5AF0 for OrangeCrab Bootloader (#499) * org: add GoodStuffDepartment GoodStuffDepartment is an electronic design consultancy by Greg Davill * 1209: 5af0: add OrangeCrab bootloader OrangeCrab is a OSHW ECP5 based FPGA development board. It makes use of the FPGA targeted foboot USB DFU bootloader.

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

Request PID: 5AF0 for OrangeCrab Bootloader

The OrangeCrab is a OSHW FPGA development board based around the ECP5 FPGA.

+14 -0

1 comment

2 changed files

gregdavill

pr closed time in a month

push eventpidcodes/pidcodes.github.com

Ladniy

commit sha 62b0c00ccfbcf502cb9d69556baa33f0acbd7c7b

PID request for Jiran Keyboard (#497) * Create and fill files * Update index.md * Update index.md * Update

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

PID request for Jiran Keyboard

PID request for my own designed keyboard. I would like to get a PID for my first open-source project.

Everything is working, PCB was ordered and tested. As a MCU I use a ProMicro controller.

+15 -0

0 comment

2 changed files

Ladniy

pr closed time in a month

push eventpidcodes/pidcodes.github.com

Keir Fraser

commit sha 95bc4a0d8a64a8da7f5ad80b4239060f962be9ae

Request PID 4D69 for Greaseweazle (#495)

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

Request PID 4D69 for Greaseweazle

The firmware is in the src/ folder of the Greaseweazle repo. The host software (Python) is in the scripts/ folder of the Greaseweazle repo.

Hardware is the Blue Pill STM32 board coupled with an adapter PCB, KiCad sources for which are at https://github.com/keirf/PCB-Projects

There is also an STM32F7 based board for which schematics, BOM, and Gerbers are supplied in the Greaseweazle wiki (https://github.com/keirf/Greaseweazle/wiki/STM32F730-Board#design-files)

+16 -0

0 comment

2 changed files

keirf

pr closed time in a month

Pull request review commentpidcodes/pidcodes.github.com

added AXIOM Beta and AXIOM Remote devices

+---+layout: pid+title: AXIOM Beta+owner: apertus°+license: GNU GPL V2 & Cern OHL+site: https://www.apertus.org/axiom-beta+source: https://github.com/apertus-open-source-cinema/axiom-beta-firmware & https://wiki.apertus.org/index.php/AXIOM_Beta/PCBs

Please supply a single URL - this is automatically converted to a link, so mutliple URLs won't work.

sp-apertus

comment created time in a month

pull request commentpidcodes/pidcodes.github.com

Fixed index.md file(s)

Your PR has conflicting files with head. You'll need to resolve those (or create a new PR without the conflicts) before it can be merged.

SandeepanSengupta

comment created time in a month

push eventpidcodes/pidcodes.github.com

hidsh

commit sha 683d312edb248091fe6a1cbd177c761f7296461b

Request PID for bootleg - a keyboard w/ trackball (#474) * add 5505 for bootleg * Update PR rename project name

view details

push time in a month

PR merged pidcodes/pidcodes.github.com

Request PID for bootleg - a keyboard w/ trackball

Dear Arachnid

I would like to get a PID for my third USB keyboard which is currently working.

Thank you!

+14 -0

2 comments

2 changed files

hidsh

pr closed time in a month

push eventpidcodes/pidcodes.github.com

wnmusic

commit sha 469391018a7a1bbaa86f2d3ae8656bfa2051c284

Request PID for simpleFE (#462) * Request PID for simpleFE * change the org name to be linked to the org layout

view details

push time in a month

more