pynthetix

2.35.7 • Public • Published

Pynthetix

CircleCI codecov npm version Discord Twitter Follow

Pynthetix is a crypto-backed pynthetic asset platform.

It is a multi-token system, powered by PERI, the Pynthetix Network Token. PERI holders can stake PERI to issue Pynths, on-chain pynthetic assets via the Mintr dApp The network currently supports an ever growing list of pynthetic assets. Please see the list of the deployed contracts on MAIN and TESTNETS Pynths can be traded using pynthetix.exchange

Pynthetix uses a proxy system so that upgrades will not be disruptive to the functionality of the contract. This smooths user interaction, since new functionality will become available without any interruption in their experience. It is also transparent to the community at large, since each upgrade is accompanied by events announcing those upgrades. New releases are managed via the Pynthetix Improvement Proposal (SIP) system similar to the EF's EIPs

Prices are committed on chain by a trusted oracle. Moving to a decentralised oracle is phased in with the first phase completed for all forex prices using Chainlink

Please note that this repository is under development.

For the latest system documentation see docs.pynthetix.io

DApps

Community

Discord Twitter Follow

For a guide from the community, see pynthetix.community


Repo Guide

Branching

A note on the branches used in this repo.

  • master represents the contracts live on mainnet and all testnets.
  • alpha is for the newest version of contracts, and is reserved for deploys to kovan
  • beta is for promoted alpha contracts, and is reserved for deploys to rinkeby
  • release-candidate is for promoted beta contracts, and is reserved for deploys to ropsten

When a new version of the contracts makes its way through all testnets, it eventually becomes promoted in master, with semver reflecting contract changes in the major or minor portion of the version (depending on backwards compatibility). patch changes are simply for changes to the JavaScript interface.

Testing

CircleCI codecov

Please see docs.pynthetix.io/contracts/testing for an overview of the automated testing methodologies.

Module Usage

npm version

This repo may be installed via npm install to support both node.js scripting applications and Solidity contract development.

Examples

💯 Please see our walkthrus for code examples in both JavaScript and Solidity: docs.pynthetix.io/contracts/walkthrus

Solidity API

All interfaces are available via the path pynthetix/contracts/interfaces.

In your code, the key is to use IAddressResolver which can be tied to the immutable proxy: ReadProxyAddressResolver (introduced in SIP-57). You can then fetch Pynthetix, FeePool, Depot, et al via IAddressResolver.getAddress(bytes32 name) where name is the bytes32 version of the contract name (case-sensitive). Or you can fetch any pynth using IAddressResolver.getPynth(bytes32 pynth) where pynth is the bytes32 name of the pynth (e.g. iETH, pUSD, sDEFI).

E.g.

npm install pynthetix

then you can write Solidity as below (using a compiler that links named imports via node_modules):

pragma solidity 0.5.16;

import 'pynthetix/contracts/interfaces/IAddressResolver.sol';
import 'pynthetix/contracts/interfaces/IPynthetix.sol';


contract MyContract {
  // This should be instantiated with our ReadProxyAddressResolver
  // it's a ReadProxy that won't change, so safe to code it here without a setter
  // see https://docs.pynthetix.io/addresses for addresses in mainnet and testnets
  IAddressResolver public pynthetixResolver;

  constructor(IAddressResolver _periResolver) public {
    pynthetixResolver = _periResolver;
  }

  function pynthetixIssue() external {
    IPynthetix pynthetix = pynthetixResolver.getAddress('Pynthetix');
    require(pynthetix != address(0), 'Pynthetix is missing from Pynthetix resolver');

    // Issue for msg.sender = address(MyContract)
    pynthetix.issueMaxPynths();
  }

  function pynthetixIssueOnBehalf(address user) external {
    IPynthetix pynthetix = pynthetixResolver.getAddress('Pynthetix');
    require(pynthetix != address(0), 'Pynthetix is missing from Pynthetix resolver');

    // Note: this will fail if `DelegateApprovals.approveIssueOnBehalf(address(MyContract))` has
    // not yet been invoked by the `user`
    pynthetix.issueMaxPynthsOnBehalf(user);
  }
}

Node.js API

  • getAST({ source, match = /^contracts\// }) Returns the Abstract Syntax Tree (AST) for all compiled sources. Optionally add source to restrict to a single contract source, and set match to an empty regex if you'd like all source ASTs including third party contracts
  • getPathToNetwork({ network, file = '' }) Returns the path to the folder (or file within the folder) for the given network
  • getSource({ network }) Return abi and bytecode for a contract source
  • getSuspensionReasons({ code }) Return mapping of SystemStatus suspension codes to string reasons
  • getStakingRewards({ network }) Return the list of staking reward contracts available.
  • getPynths({ network }) Return the list of pynths for a network
  • getTarget({ network }) Return the information about a contract's address and source file. The contract names are those specified in docs.pynthetix.io/addresses
  • getTokens({ network }) Return the list of tokens (pynths and PERI) used in the system, along with their addresses.
  • getUsers({ network }) Return the list of user accounts within the Pynthetix protocol (e.g. owner, fee, etc)
  • getVersions({ network, byContract = false }) Return the list of deployed versions to the network keyed by tagged version. If byContract is true, it keys by contract name.
  • networks Return the list of supported networks
  • toBytes32 Convert any string to a bytes32 value

Via code

const peri = require('pynthetix');

peri.getAST();
/*
{ 'contracts/AddressResolver.sol':
   { imports:
      [ 'contracts/Owned.sol',
        'contracts/interfaces/IAddressResolver.sol',
        'contracts/interfaces/IPynthetix.sol' ],
     contracts: { AddressResolver: [Object] },
     interfaces: {},
     libraries: {} },
  'contracts/Owned.sol':
   { imports: [],
     contracts: { Owned: [Object] },
     interfaces: {},
     libraries: {} },
*/

peri.getAST({ source: 'Pynthetix.sol' });
/*
{ imports:
   [ 'contracts/ExternStateToken.sol',
     'contracts/MixinResolver.sol',
     'contracts/interfaces/IPynthetix.sol',
     'contracts/TokenState.sol',
     'contracts/interfaces/IPynth.sol',
     'contracts/interfaces/IERC20.sol',
     'contracts/interfaces/ISystemStatus.sol',
     'contracts/interfaces/IExchanger.sol',
     'contracts/interfaces/IEtherCollateral.sol',
     'contracts/interfaces/IIssuer.sol',
     'contracts/interfaces/IPynthetixState.sol',
     'contracts/interfaces/IExchangeRates.sol',
     'contracts/SupplySchedule.sol',
     'contracts/interfaces/IRewardEscrow.sol',
     'contracts/interfaces/IHasBalance.sol',
     'contracts/interfaces/IRewardsDistribution.sol' ],
  contracts:
   { Pynthetix:
      { functions: [Array],
        events: [Array],
        variables: [Array],
        modifiers: [Array],
        structs: [],
        inherits: [Array] } },
  interfaces: {},
  libraries: {} }
*/

// Get the path to the network
peri.getPathToNetwork({ network: 'mainnet' });
//'.../Pynthetixio/pynthetix/publish/deployed/mainnet'

// retrieve an object detailing the contract ABI and bytecode
peri.getSource({ network: 'rinkeby', contract: 'Proxy' });
/*
{
  bytecode: '0..0',
  abi: [ ... ]
}
*/

peri.getSuspensionReasons();
/*
{
	1: 'System Upgrade',
	2: 'Market Closure',
	3: 'Circuit breaker',
	99: 'Emergency',
};
*/

// retrieve the array of pynths used
peri.getPynths({ network: 'rinkeby' }).map(({ name }) => name);
// ['pUSD', 'sEUR', ...]

// retrieve an object detailing the contract deployed to the given network.
peri.getTarget({ network: 'rinkeby', contract: 'ProxyPynthetix' });
/*
{
	name: 'ProxyPynthetix',
  address: '0x322A3346bf24363f451164d96A5b5cd5A7F4c337',
  source: 'Proxy',
  link: 'https://rinkeby.etherscan.io/address/0x322A3346bf24363f451164d96A5b5cd5A7F4c337',
  timestamp: '2019-03-06T23:05:43.914Z',
  txn: '',
	network: 'rinkeby'
}
*/

// retrieve the list of system user addresses
peri.getUsers({ network: 'mainnet' });
/*
[ { name: 'owner',
    address: '0xEb3107117FEAd7de89Cd14D463D340A2E6917769' },
  { name: 'deployer',
    address: '0xDe910777C787903F78C89e7a0bf7F4C435cBB1Fe' },
  { name: 'marketClosure',
    address: '0xC105Ea57Eb434Fbe44690d7Dec2702e4a2FBFCf7' },
  { name: 'oracle',
    address: '0xaC1ED4Fabbd5204E02950D68b6FC8c446AC95362' },
  { name: 'fee',
    address: '0x62d1fD5538Ea9037569E3DfCcdAE7605bC9341B1' },
  { name: 'zero',
    address: '0x0000000000000000000000000000000000000000' } ]
*/

peri.getVersions();
/*
{ 'v2.21.12-107':
   { tag: 'v2.21.12-107',
     fulltag: 'v2.21.12-107',
     release: 'Hadar',
     network: 'kovan',
     date: '2020-05-08T12:52:06-04:00',
     commit: '19997724bc7eaceb902c523a6742e0bd74fc75cb',
		 contracts: { ReadProxyAddressResolver: [Object] }
		}
}
*/

peri.networks;
// [ 'local', 'kovan', 'rinkeby', 'ropsten', 'mainnet' ]

peri.toBytes32('pUSD');
// '0x7355534400000000000000000000000000000000000000000000000000000000'

As a CLI tool

Same as above but as a CLI tool that outputs JSON, using names without the get prefixes:

$ npx pynthetix ast contracts/Pynth.sol
{
  "imports": [
    "contracts/Owned.sol",
    "contracts/ExternStateToken.sol",
    "contracts/MixinResolver.sol",
    "contracts/interfaces/IPynth.sol",
    "contracts/interfaces/IERC20.sol",
    "contracts/interfaces/ISystemStatus.sol",
    "contracts/interfaces/IFeePool.sol",
    "contracts/interfaces/IPynthetix.sol",
    "contracts/interfaces/IExchanger.sol",
    "contracts/interfaces/IIssue"
    # ...
  ]
}

$ npx pynthetix bytes32 pUSD
0x7355534400000000000000000000000000000000000000000000000000000000

$ npx pynthetix networks
[ 'local', 'kovan', 'rinkeby', 'ropsten', 'mainnet' ]

$ npx pynthetix source --network rinkeby --contract Proxy
{
  "bytecode": "0..0",
  "abi": [ ... ]
}

$ npx pynthetix suspension-reason --code 2
Market Closure

$ npx pynthetix pynths --network rinkeby --key name
["pUSD", "sEUR", ... ]

$ npx pynthetix target --network rinkeby --contract ProxyPynthetix
{
  "name": "ProxyPynthetix",
  "address": "0x322A3346bf24363f451164d96A5b5cd5A7F4c337",
  "source": "Proxy",
  "link": "https://rinkeby.etherscan.io/address/0x322A3346bf24363f451164d96A5b5cd5A7F4c337",
  "timestamp": "2019-03-06T23:05:43.914Z",
  "network": "rinkeby"
}

$ npx pynthetix users --network mainnet --user oracle
{
  "name": "oracle",
  "address": "0xaC1ED4Fabbd5204E02950D68b6FC8c446AC95362"
}

$ npx pynthetix versions
{
  "v2.0-19": {
    "tag": "v2.0-19",
    "fulltag": "v2.0-19",
    "release": "",
    "network": "mainnet",
    "date": "2019-03-11T18:17:52-04:00",
    "commit": "eeb271f4fdd2e615f9dba90503f42b2cb9f9716e",
    "contracts": {
      "Depot": {
        "address": "0x172E09691DfBbC035E37c73B62095caa16Ee2388",
        "status": "replaced",
        "replaced_in": "v2.18.1"
      },
      "ExchangeRates": {
        "address": "0x73b172756BD5DDf0110Ba8D7b88816Eb639Eb21c",
        "status": "replaced",
        "replaced_in": "v2.1.11"
      },

      # ...

    }
  }
}

$ npx pynthetix versions --by-contract
{
  "Depot": [
    {
      "address": "0x172E09691DfBbC035E37c73B62095caa16Ee2388",
      "status": "replaced",
      "replaced_in": "v2.18.1"
    },
    {
      "address": "0xE1f64079aDa6Ef07b03982Ca34f1dD7152AA3b86",
      "status": "current"
    }
  ],
  "ExchangeRates": [
    {
      "address": "0x73b172756BD5DDf0110Ba8D7b88816Eb639Eb21c",
      "status": "replaced",
      "replaced_in": "v2.1.11"
    },

    # ...
  ],

  # ...
}

Package Sidebar

Install

npm i pynthetix

Homepage

pynthetix.io

Weekly Downloads

2

Version

2.35.7

License

MIT

Unpacked Size

20.2 MB

Total Files

208

Last publish

Collaborators

  • jeoe000