feat: port over smart contracts repository into the monorepo (#458)

This commit is contained in:
Dexter Edwards 2022-05-27 10:22:18 +01:00 committed by GitHub
parent a7df669f8a
commit d858d9cf8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 3604 additions and 0 deletions

View File

@ -0,0 +1,18 @@
{
"extends": ["../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@ -0,0 +1,11 @@
# smart-contracts
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build smart-contracts` to build the library.
## Running unit tests
Run `nx test smart-contracts` to execute the unit tests via [Jest](https://jestjs.io).

View File

@ -0,0 +1,14 @@
module.exports = {
displayName: 'smart-contracts',
preset: '../../jest.preset.js',
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
transform: {
'^.+\\.[tj]s$': 'ts-jest',
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/libs/smart-contracts',
};

View File

@ -0,0 +1,5 @@
{
"name": "@vegaprotocol/smart-contracts",
"version": "0.0.1",
"type": "commonjs"
}

View File

@ -0,0 +1,32 @@
{
"root": "libs/smart-contracts",
"sourceRoot": "libs/smart-contracts/src",
"targets": {
"build": {
"executor": "@nrwl/js:tsc",
"outputs": ["{options.outputPath}"],
"options": {
"outputPath": "dist/libs/smart-contracts",
"main": "libs/smart-contracts/src/index.ts",
"tsConfig": "libs/smart-contracts/tsconfig.lib.json",
"assets": ["libs/smart-contracts/*.md"]
}
},
"lint": {
"executor": "@nrwl/linter:eslint",
"outputs": ["{options.outputFile}"],
"options": {
"lintFilePatterns": ["libs/smart-contracts/**/*.ts"]
}
},
"test": {
"executor": "@nrwl/jest:jest",
"outputs": ["coverage/libs/smart-contracts"],
"options": {
"jestConfig": "libs/smart-contracts/jest.config.js",
"passWithNoTests": true
}
}
},
"tags": []
}

View File

@ -0,0 +1,292 @@
[
{
"inputs": [
{
"internalType": "address",
"name": "vesting_address",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "bytes2",
"name": "",
"type": "bytes2"
}
],
"name": "allowed_countries",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"name": "commitments",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "controller",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "issuers",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "commit_untargeted",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"internalType": "struct Signature",
"name": "sig",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "tranche",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "expiry",
"type": "uint32"
}
],
"internalType": "struct Claim",
"name": "clm",
"type": "tuple"
},
{
"internalType": "bytes2",
"name": "country",
"type": "bytes2"
},
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "claim_targeted",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"internalType": "struct Signature",
"name": "sig",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "tranche",
"type": "uint8"
},
{
"internalType": "uint32",
"name": "expiry",
"type": "uint32"
}
],
"internalType": "struct Claim",
"name": "clm",
"type": "tuple"
},
{
"internalType": "bytes2",
"name": "country",
"type": "bytes2"
}
],
"name": "claim_untargeted",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes2[]",
"name": "countries",
"type": "bytes2[]"
}
],
"name": "allow_countries",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes2[]",
"name": "countries",
"type": "bytes2[]"
}
],
"name": "block_countries",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "issuer",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "permit_issuer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "issuer",
"type": "address"
}
],
"name": "revoke_issuer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_controller",
"type": "address"
}
],
"name": "swap_controller",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "destroy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]

View File

@ -0,0 +1,198 @@
[
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
}
]

View File

@ -0,0 +1,288 @@
[
{
"inputs": [
{ "internalType": "string", "name": "_name", "type": "string" },
{ "internalType": "string", "name": "_symbol", "type": "string" },
{ "internalType": "uint8", "name": "_decimals", "type": "uint8" },
{
"internalType": "uint256",
"name": "total_supply_whole_tokens",
"type": "uint256"
},
{ "internalType": "uint256", "name": "faucet_amount", "type": "uint256" }
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{ "internalType": "address", "name": "owner", "type": "address" },
{ "internalType": "address", "name": "spender", "type": "address" }
],
"name": "allowance",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{ "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "approve",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "account", "type": "address" }
],
"name": "balanceOf",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [],
"name": "decimals",
"outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{ "internalType": "uint256", "name": "addedValue", "type": "uint256" }
],
"name": "increaseAllowance",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "isOwner",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [],
"name": "kill",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [],
"name": "owner",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function",
"constant": true
},
{
"inputs": [
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "transfer",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "sender", "type": "address" },
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "transferFrom",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "newOwner", "type": "address" }
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "faucet",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "account", "type": "address" },
{ "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "issue",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "uint256", "name": "amount", "type": "uint256" },
{
"internalType": "address",
"name": "bridge_address",
"type": "address"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "admin_deposit_single",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "uint256", "name": "amount", "type": "uint256" },
{
"internalType": "address",
"name": "bridge_address",
"type": "address"
},
{
"internalType": "bytes32[]",
"name": "vega_public_keys",
"type": "bytes32[]"
}
],
"name": "admin_deposit_bulk",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]

View File

@ -0,0 +1,309 @@
[
{
"inputs": [
{
"internalType": "address payable",
"name": "erc20_asset_pool",
"type": "address"
},
{
"internalType": "address",
"name": "multisig_control",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset_source",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "new_maximum",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
}
],
"name": "Asset_Deposit_Maximum_Set",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset_source",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "new_minimum",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
}
],
"name": "Asset_Deposit_Minimum_Set",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user_address",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "asset_source",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Asset_Deposited",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset_source",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_asset_id",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
}
],
"name": "Asset_Listed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "asset_source",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
}
],
"name": "Asset_Removed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user_address",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "asset_source",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
}
],
"name": "Asset_Withdrawn",
"type": "event"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" },
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "deposit_asset",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "vega_asset_id", "type": "bytes32" }
],
"name": "get_asset_source",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" }
],
"name": "get_deposit_maximum",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" }
],
"name": "get_deposit_minimum",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "get_multisig_control_address",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" }
],
"name": "get_vega_asset_id",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" }
],
"name": "is_asset_listed",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" },
{ "internalType": "bytes32", "name": "vega_asset_id", "type": "bytes32" },
{ "internalType": "uint256", "name": "nonce", "type": "uint256" },
{ "internalType": "bytes", "name": "signatures", "type": "bytes" }
],
"name": "list_asset",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" },
{ "internalType": "uint256", "name": "nonce", "type": "uint256" },
{ "internalType": "bytes", "name": "signatures", "type": "bytes" }
],
"name": "remove_asset",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" },
{
"internalType": "uint256",
"name": "maximum_amount",
"type": "uint256"
},
{ "internalType": "uint256", "name": "nonce", "type": "uint256" },
{ "internalType": "bytes", "name": "signatures", "type": "bytes" }
],
"name": "set_deposit_maximum",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" },
{
"internalType": "uint256",
"name": "minimum_amount",
"type": "uint256"
},
{ "internalType": "uint256", "name": "nonce", "type": "uint256" },
{ "internalType": "bytes", "name": "signatures", "type": "bytes" }
],
"name": "set_deposit_minimum",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "asset_source", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" },
{ "internalType": "address", "name": "target", "type": "address" },
{ "internalType": "uint256", "name": "nonce", "type": "uint256" },
{ "internalType": "bytes", "name": "signatures", "type": "bytes" }
],
"name": "withdraw_asset",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]

View File

@ -0,0 +1,203 @@
[
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Stake_Deposited",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Stake_Removed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Stake_Transferred",
"type": "event"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "stake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "remove_stake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "new_address",
"type": "address"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "transfer_stake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "staking_token",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "stake_balance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "total_staked",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]

View File

@ -0,0 +1,214 @@
[
{
"inputs": [
{ "internalType": "uint256", "name": "total_supply_", "type": "uint256" },
{
"internalType": "uint256",
"name": "mint_lock_expiry_",
"type": "uint256"
},
{ "internalType": "string", "name": "name_", "type": "string" },
{ "internalType": "string", "name": "symbol_", "type": "string" }
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "new_controller",
"type": "address"
}
],
"name": "Controller_Changed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{ "internalType": "address", "name": "owner", "type": "address" },
{ "internalType": "address", "name": "spender", "type": "address" }
],
"name": "allowance",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "approve",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "account", "type": "address" }
],
"name": "balanceOf",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "new_controller", "type": "address" }
],
"name": "change_controller",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "controller",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{ "internalType": "uint256", "name": "addedValue", "type": "uint256" }
],
"name": "increaseAllowance",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "target", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "mint_and_issue",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "mint_lock_expiry",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "transfer",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "sender", "type": "address" },
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "transferFrom",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
}
]

View File

@ -0,0 +1,717 @@
[
{
"inputs": [
{
"internalType": "address",
"name": "token_v1_address",
"type": "address"
},
{
"internalType": "address",
"name": "token_v2_address",
"type": "address"
},
{
"internalType": "address[]",
"name": "old_addresses",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "new_addresses",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "new_controller",
"type": "address"
}
],
"name": "Controller_Set",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "issuer",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Issuer_Permitted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "issuer",
"type": "address"
}
],
"name": "Issuer_Revoked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Stake_Deposited",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Stake_Removed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "Stake_Transferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Tranche_Balance_Added",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Tranche_Balance_Removed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
},
{
"indexed": false,
"internalType": "uint256",
"name": "cliff_start",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "duration",
"type": "uint256"
}
],
"name": "Tranche_Created",
"type": "event"
},
{
"inputs": [],
"name": "accuracy_scale",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "address_migration",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
},
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "assisted_withdraw_from_tranche",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "controller",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "cliff_start",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
}
],
"name": "create_tranche",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "default_tranche_id",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
}
],
"name": "get_tranche_balance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
}
],
"name": "get_vested_for_tranche",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "issue_into_tranche",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "move_into_tranche",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "issuer",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "permit_issuer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "permitted_issuance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "remove_stake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "issuer",
"type": "address"
}
],
"name": "revoke_issuer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "new_controller",
"type": "address"
}
],
"name": "set_controller",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "stake_balance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "vega_public_key",
"type": "bytes32"
}
],
"name": "stake_tokens",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "staking_token",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "total_locked",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "total_staked",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tranche_count",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"name": "tranches",
"outputs": [
{
"internalType": "uint256",
"name": "cliff_start",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "user_stats",
"outputs": [
{
"internalType": "uint256",
"name": "total_in_all_tranches",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lien",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "user_total_all_tranches",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "v1_address",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "v1_migrated",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "v2_address",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "tranche_id",
"type": "uint8"
}
],
"name": "withdraw_from_tranche",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]

View File

@ -0,0 +1,126 @@
import { Networks } from './vega';
const customVegaTokenAddress = process.env.CUSTOM_TOKEN_ADDRESS as string;
const customClaimAddress = process.env.CUSTOM_CLAIM_ADDRESS as string;
const customLockedAddress = process.env.CUSTOM_LOCKED_ADDRESS as string;
const customVestingAddress = process.env.CUSTOM_VESTING_ADDRESS as string;
const customStakingBridge = process.env.CUSTOM_STAKING_BRIDGE as string;
const customErc20Bridge = process.env.CUSTOM_ERC20_BRIDGE as string;
export type EthereumChainId = '0x1' | '0x3' | '0x4' | '0x5' | '0x2a';
export type EthereumChainName =
| 'Mainnet'
| 'Ropsten'
| 'Rinkeby'
| 'Goerli'
| 'Kovan';
export const EthereumChainNames: Record<EthereumChainId, EthereumChainName> = {
'0x1': 'Mainnet',
'0x3': 'Ropsten',
'0x4': 'Rinkeby',
'0x5': 'Goerli',
'0x2a': 'Kovan',
};
export const EthereumChainIds: Record<EthereumChainName, EthereumChainId> = {
Mainnet: '0x1',
Ropsten: '0x3',
Rinkeby: '0x4',
Goerli: '0x5',
Kovan: '0x2a',
};
export const ChainIdMap: Record<EthereumChainId, number> = {
'0x1': 1,
'0x3': 3,
'0x4': 4,
'0x5': 5,
'0x2a': 42,
};
interface VegaContracts {
vestingAddress: string;
vegaTokenAddress: string;
claimAddress: string;
lockedAddress: string;
stakingBridge: string;
erc20Bridge: string;
}
export const EnvironmentConfig: { [key in Networks]: VegaContracts } = {
[Networks.CUSTOM]: {
vegaTokenAddress: customVegaTokenAddress,
claimAddress: customClaimAddress,
lockedAddress: customLockedAddress,
vestingAddress: customVestingAddress,
stakingBridge: customStakingBridge,
erc20Bridge: customErc20Bridge,
},
[Networks.DEVNET]: {
vegaTokenAddress: '0xc93137f9F4B820Ca85FfA3C7e84cCa6Ebc7bB517',
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994',
lockedAddress: '0x0',
vestingAddress: '0xd1216AAb948f5FC706Df73df6d71c64CcaA8550a',
stakingBridge: '0xf2cD5C8b8c52f96293338A0AF463a0Bfc602D5bc',
erc20Bridge: '0xE43013C3c2A134AB3782ADEb258669A8566DAD57',
},
[Networks.STAGNET]: {
vegaTokenAddress: '0x547cbA83a7eb82b546ee5C7ff0527F258Ba4546D',
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
lockedAddress: '0x0', // TODO not deployed to this env
vestingAddress: '0xfCe6eB272D3d4146A96bC28de71212b327F575fa',
stakingBridge: '0x7D88CD817227D599815d407D929af18Bb8D57176',
erc20Bridge: '0xc0835e6dEf177F8ba2561C4e4216827A3798c6B9',
},
[Networks.STAGNET2]: {
vegaTokenAddress: '0xd8fa193B93a179DdCf51FFFDe5320E0872cdcf44',
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
lockedAddress: '0x0', // TODO not deployed to this env
vestingAddress: '0x9F10cBeEf03A564Fb914c2010c0Cd55E9BB11406',
stakingBridge: '0x7896C9491962D5839783CB6e0492ECebd34Bb35F',
erc20Bridge: '0xffC1eb64e22fd5E29816c633eE84088EEEe879E5',
},
[Networks.TESTNET]: {
vegaTokenAddress: '0xDc335304979D378255015c33AbFf09B60c31EBAb',
claimAddress: '0x8Cef746ab7C83B61F6461cC92882bD61AB65a994', // TODO not deployed to this env, but random address so app doesn't error
lockedAddress: '0x0', // TODO not deployed to this env
vestingAddress: '0xe2deBB240b43EDfEBc9c38B67c0894B9A92Bf07c',
stakingBridge: '0xF5A3830F002BE78dd801214F5316b677E0355c60',
erc20Bridge: '0xF009C66c6afC9661143fD7cE1eDb02c1961a6510',
},
[Networks.MAINNET]: {
vegaTokenAddress: '0xcB84d72e61e383767C4DFEb2d8ff7f4FB89abc6e',
claimAddress: '0x0ee1fb382caf98e86e97e51f9f42f8b4654020f3',
lockedAddress: '0x78344c7305d73a7a0ac3c94cd9960f4449a1814e',
vestingAddress: '0x23d1bFE8fA50a167816fBD79D7932577c06011f4',
stakingBridge: '0x195064D33f09e0c42cF98E665D9506e0dC17de68',
erc20Bridge: '0xCd403f722b76366f7d609842C589906ca051310f',
},
};
// No concept of dev/staging/test for these right now.
export const RewardsAddresses = {
[EthereumChainIds.Mainnet]: {
'SushiSwap VEGA/ETH': '0x285de24077440c53b1661287D170e3ae22de0a44',
'SushiSwap VEGA/USDC': '0x49407c243c26f109b3c77c41dd83742164c20b5f',
} as { [key: string]: string },
[EthereumChainIds.Ropsten]: {
'SushiSwap VEGA/ETH': '0xa93dd6912897c5fe8503a82234d829bc7905714b',
'SushiSwap VEGA/USDC': '0xa93dd6912897c5fe8503a82234d829bc7905714b',
} as { [key: string]: string },
};
export const RewardsPoolAddresses = {
[EthereumChainIds.Mainnet]: {
'0x285de24077440c53b1661287D170e3ae22de0a44':
'0x29c827ce49accf68a1a278c67c9d30c52fbbc348',
'0x49407c243c26f109b3c77c41dd83742164c20b5f':
'0x42b7B8f8F83fA5cbf0176f8c24Ad51EbcD4B5F17',
} as { [key: string]: string },
[EthereumChainIds.Ropsten]: {
// Only one deployed to this environment
'0xa93dd6912897c5fe8503a82234d829bc7905714b':
'0x29c827ce49accf68a1a278c67c9d30c52fbbc348',
} as { [key: string]: string },
};

View File

@ -0,0 +1,2 @@
export * from './ethereum';
export * from './vega';

View File

@ -0,0 +1,8 @@
export enum Networks {
CUSTOM = 'CUSTOM',
TESTNET = 'TESTNET',
STAGNET = 'STAGNET',
STAGNET2 = 'STAGNET2',
DEVNET = 'DEVNET',
MAINNET = 'MAINNET',
}

View File

@ -0,0 +1,73 @@
import type { ethers } from 'ethers';
import type { TxData } from '.';
export class BaseContract {
public signer: ethers.Signer | null = null;
public provider: ethers.providers.Provider;
public transactions: TxData[] = [];
public listeners: ((transactions: TxData[]) => void)[] = [];
constructor(provider: ethers.providers.Provider, signer?: ethers.Signer) {
this.provider = provider;
this.signer = signer || null;
}
async handleEvent(event: ethers.Event, requiredConfirmations = 1) {
const tx = await event.getTransaction();
// start tracking transaction if its not already in the transactions array
const existing = this.transactions.find((t) => t.tx.hash === tx.hash);
if (!existing) {
this.trackTransaction(tx, requiredConfirmations);
}
}
async trackTransaction(
tx: ethers.providers.TransactionResponse,
requiredConfirmations = 1
) {
this.mergeTransaction({
tx,
receipt: null,
pending: true,
requiredConfirmations,
});
let receipt = null;
for (let i = 1; i <= requiredConfirmations; i++) {
receipt = await tx.wait(i);
this.mergeTransaction({
tx,
receipt,
pending: true,
requiredConfirmations,
});
}
this.mergeTransaction({
tx,
receipt,
pending: false,
requiredConfirmations,
});
}
private mergeTransaction(tx: TxData) {
this.transactions = [
// Replace any existing transaction in the array with this one
...this.transactions.filter((t) => t.tx.hash !== tx.tx.hash),
tx,
];
this.emit();
}
emit() {
this.listeners.forEach((ln) => {
ln(this.transactions);
});
}
listen(cb: (txs: TxData[]) => void) {
this.listeners.push(cb);
}
}

View File

@ -0,0 +1,111 @@
import type { BigNumber as EthersBigNumber } from 'ethers';
import { ethers } from 'ethers';
import erc20Abi from '../abis/erc20_abi.json';
import erc20AbiFaucet from '../abis/erc20_abi_faucet.json';
import BigNumber from 'bignumber.js';
import { addDecimal, removeDecimal } from '../utils';
import { BaseContract } from './base-contract';
export class ERC20Token extends BaseContract {
public contract: ethers.Contract;
public dp: Promise<number>;
private faucetable: boolean;
constructor(
address: string,
provider: ethers.providers.Web3Provider,
signer?: ethers.Signer,
faucetable = false
) {
super(provider, signer);
this.faucetable = faucetable;
const contract = new ethers.Contract(
address,
faucetable ? erc20AbiFaucet : erc20Abi,
signer || provider
);
this.contract = contract;
this.dp = (async () => {
const val = await contract.decimals();
return Number(val);
})();
}
/** Gets Vega token total supply */
async totalSupply(): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.totalSupply();
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
/** Gets number tokens an Ethereum account owns */
async balanceOf(address: string): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.balanceOf(address);
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
async transfer(
from: string,
to: string,
amount: BigNumber,
confirmations = 1
) {
const value = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.transfer(from, to, value);
this.trackTransaction(tx, confirmations);
return tx;
}
async transferFrom(
sender: string,
recipient: string,
amount: BigNumber,
confirmations = 1
) {
const value = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.transferFrom(sender, recipient, value);
this.trackTransaction(tx, confirmations);
return tx;
}
/** Gets Ethereum account's permitted allowance */
async allowance(address: string, spender: string): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.allowance(
address,
spender
);
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
/** Executs contracts approve function */
async approve(
spender: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const amount = removeDecimal(
new BigNumber(Number.MAX_SAFE_INTEGER),
await this.dp
).toString();
const tx = await this.contract.approve(spender, amount);
this.trackTransaction(tx, confirmations);
return tx;
}
async faucet(confirmations = 1): Promise<ethers.ContractTransaction> {
if (!this.faucetable) {
throw new Error('Faucet function can not be called on this contract');
}
const tx = await this.contract.faucet();
this.trackTransaction(tx, confirmations);
return tx;
}
/** Gets number of decimals used by token */
async decimals(): Promise<number> {
const res: number = await this.contract.decimals();
return Number(res);
}
}

View File

@ -0,0 +1,8 @@
export * from './stake-helpers';
export * from './tranche-helpers';
export * from './vega-claim';
export * from './vega-erc20-bridge';
export * from './vega-staking';
export * from './vega-vesting';
export * from './vega-web3-types';
export * from './erc20-token';

View File

@ -0,0 +1,40 @@
import type { ethers } from 'ethers';
import BigNumber from 'bignumber.js';
import { addDecimal } from '../utils/decimals';
export function combineStakeEventsByVegaKey(
events: ethers.Event[],
decimals: number
): { [vegaKey: string]: BigNumber } {
const res = events.reduce((obj, e) => {
const vegaKey = e.args?.vega_public_key;
const amount = parseEventAmount(e, decimals);
const isDeposit = e.event === 'Stake_Deposited';
const isRemove = e.event === 'Stake_Removed';
if (!isDeposit && !isRemove) return obj;
if (Object.prototype.hasOwnProperty.call(obj, vegaKey)) {
if (isDeposit) {
obj[vegaKey] = obj[vegaKey].plus(amount);
} else {
obj[vegaKey] = obj[vegaKey].minus(amount);
}
} else {
if (isDeposit) {
obj[vegaKey] = amount;
} else {
obj[vegaKey] = new BigNumber(0);
}
}
return obj;
}, {} as { [vegaKey: string]: BigNumber });
return res;
}
function parseEventAmount(e: ethers.Event, decimals: number) {
const rawAmount = new BigNumber(e.args?.amount.toString() || 0);
return addDecimal(rawAmount, decimals);
}

View File

@ -0,0 +1,165 @@
import BigNumber from 'bignumber.js';
import type { ethers } from 'ethers';
import uniq from 'lodash/uniq';
import { addDecimal } from '../utils/decimals';
import type { Tranche, TrancheUser } from './vega-web3-types';
import { TrancheEvents } from './vega-web3-types';
export function createUserTransactions(
events: ethers.Event[],
decimals: number
) {
return events.map((event) => {
return {
amount: addDecimal(
new BigNumber(event.args?.amount.toString()),
decimals
),
user: event.args?.user,
tranche_id: event.args?.tranche_id,
tx: event.transactionHash,
};
});
}
export function getUsersInTranche(
balanceAddedEvents: ethers.Event[],
balanceRemovedEvents: ethers.Event[],
addresses: string[],
decimals: number
): TrancheUser[] {
return addresses.map((address) => {
const userDeposits = balanceAddedEvents.filter(
(event) => event.args?.user === address
);
const userWithdraws = balanceRemovedEvents.filter(
(event) => event.args?.user === address
);
const deposits = createUserTransactions(userDeposits, decimals);
const withdrawals = createUserTransactions(userWithdraws, decimals);
const total_tokens = deposits.reduce(
(pre, cur) => pre.plus(cur.amount),
new BigNumber(0)
);
const withdrawn_tokens = withdrawals.reduce(
(pre, cur) => pre.plus(cur.amount),
new BigNumber(0)
);
const remaining_tokens = total_tokens.minus(withdrawn_tokens);
return {
address,
deposits,
withdrawals,
total_tokens,
withdrawn_tokens,
remaining_tokens,
};
});
}
export function sumFromEvents(events: ethers.Event[], decimals: number) {
const amounts = events.map((e) =>
addDecimal(new BigNumber(e.args?.amount.toString()), decimals)
);
// Start with a 0 so if there are none there is no NaN
return BigNumber.sum.apply(null, [new BigNumber(0), ...amounts]);
}
export function getLockedAmount(
totalAdded: BigNumber,
cliffStart: number,
trancheDuration: number
) {
let amount = new BigNumber(0);
const ts = Math.round(new Date().getTime() / 1000);
const tranche_progress = (ts - cliffStart) / trancheDuration;
if (tranche_progress < 0) {
amount = totalAdded;
} else if (tranche_progress < 1) {
amount = totalAdded.times(1 - tranche_progress);
}
return amount;
}
export function createTransactions(events: ethers.Event[], decimals: number) {
return events.map((event) => {
return {
amount: addDecimal(
new BigNumber(event.args?.amount.toString()),
decimals
),
user: event.args?.user,
tx: event.transactionHash,
};
});
}
export function getTranchesFromHistory(
createEvents: ethers.Event[],
addEvents: ethers.Event[],
removeEvents: ethers.Event[],
decimals: number
): Tranche[] {
return createEvents.map((event) => {
const tranche_id = event.args?.tranche_id;
const balanceAddedEvents = addEvents.filter(
(e) =>
e.event === TrancheEvents.BalanceAdded &&
e.args?.tranche_id === tranche_id
);
const balanceRemovedEvents = removeEvents.filter(
(e) =>
e.event === TrancheEvents.BalanceRemoved &&
e.args?.tranche_id === tranche_id
);
//get tranche start and end dates
const tranche_duration = event.args?.duration;
const cliff_start = event.args?.cliff_start;
const tranche_start = new Date(cliff_start.mul(1000).toNumber());
const tranche_end = new Date(
cliff_start.add(tranche_duration).mul(1000).toNumber()
);
// get added and removed values
const total_added = sumFromEvents(balanceAddedEvents, decimals);
const total_removed = sumFromEvents(balanceRemovedEvents, decimals);
// get locked amount
const locked_amount = getLockedAmount(
total_added,
cliff_start,
tranche_duration
);
// get all deposits and withdrawals
const deposits = createTransactions(balanceAddedEvents, decimals);
const withdrawals = createTransactions(balanceRemovedEvents, decimals);
// get all users
const uniqueAddresses = uniq(
balanceAddedEvents.map((event) => event.args?.user)
);
const users = getUsersInTranche(
balanceAddedEvents,
balanceRemovedEvents,
uniqueAddresses,
decimals
);
return {
tranche_id: parseInt(tranche_id),
tranche_start,
tranche_end,
total_added,
total_removed,
locked_amount,
deposits,
withdrawals,
users,
};
});
}

View File

@ -0,0 +1,156 @@
import type BigNumber from 'bignumber.js';
import { ethers } from 'ethers';
import { EnvironmentConfig } from '../config/ethereum';
import type { Networks } from '../config/vega';
import claimAbi from '../abis/claim_abi.json';
import tokenAbi from '../abis/vega_token_abi.json';
import { asciiToHex, removeDecimal } from '../utils';
import { BaseContract } from './base-contract';
export const UNSPENT_CODE = '0x0000000000000000000000000000000000000000';
export const SPENT_CODE = '0x0000000000000000000000000000000000000001';
/**
* Example:
* ```
* const provider = new Web3.providers.HttpProvider(
* "https://ropsten.infura.io/v3/5aff9e61ad844bcf982d0d0c3f1d29f1"
* );
* const web3 = new Web3(provider);
*
* // Ropsten address
* const contract = new VegaClaim(web3, "0xAf5dC1772714b2F4fae3b65eb83100f1Ea677b21")
* contract.isCountryBlocked("US").then(console.log)
* contract.isClaimValid({ claimCode: "0x...", expiry: 0, nonce: "0x00", account: "0x00" })
* ```
*/
export class VegaClaim extends BaseContract {
public contract: ethers.Contract;
public tokenContract: ethers.Contract;
public dp: Promise<number>;
constructor(
network: Networks,
provider: ethers.providers.Web3Provider,
signer?: ethers.Signer
) {
super(provider, signer);
this.contract = new ethers.Contract(
EnvironmentConfig[network].claimAddress,
claimAbi,
this.signer || this.provider
);
const tokenContract = new ethers.Contract(
EnvironmentConfig[network].vegaTokenAddress,
tokenAbi,
this.signer || this.provider
);
this.tokenContract = tokenContract;
this.dp = (async () => {
const val = await tokenContract.decimals();
return Number(val);
})();
}
/** Execute contracts commit_untargeted function */
async commit(
s: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const tx = await this.contract.commit_untargeted(s);
this.trackTransaction(tx, confirmations);
return tx;
}
/**
* Perform the final claim. Automatically switches between targeted and
* untargeted claims. However, for untargeted ones, it's assumed that commit
* was performed and mined beforehand
* @return {Promise<boolean>}
*/
public async claim(
{
amount,
tranche,
expiry,
target,
country,
v,
r,
s,
}: {
amount: BigNumber;
tranche: number;
expiry: number;
target?: string;
country: string;
v: number;
r: string;
s: string;
},
confirmations = 1
): Promise<ethers.ContractTransaction> {
const convertedAmount = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract[
target != null ? 'claim_targeted' : 'claim_untargeted'
](
...[
{ r, s, v },
{
amount: convertedAmount,
tranche,
expiry,
},
asciiToHex(country),
target,
].filter(Boolean)
);
this.trackTransaction(tx, confirmations);
return tx;
}
/**
* Check if this code was already committed to by this account
* @return {Promise<boolean>}
*/
async isCommitted({ s }: { s: string }): Promise<string> {
return await this.contract.commitments(s);
}
/**
* Checks if a code is past its' expiry date
* @param expiry Expiry of the code
* @returns Promise<boolean>
*/
async isExpired(expiry: number): Promise<boolean> {
return expiry < (await this.provider.getBlock('latest')).timestamp;
}
/**
* Utility method to check if the nonce has already been used. If it has the code has already been claimed.
* @param s The s part of the signature
* @return {string}
*/
async isUsed(s: string): Promise<boolean> {
return (await this.contract.commitments(s)) === SPENT_CODE;
}
/**
* Check if country is blocked. country must be the two letter ISO code
* @param {string} country 2 letter ISO code
* @return {Promise<boolean>}
*/
async isCountryBlocked(country: string): Promise<boolean> {
const isAllowed = await this.contract.allowed_countries(
asciiToHex(country)
);
return !isAllowed;
}
}

View File

@ -0,0 +1,109 @@
import type { BigNumber as EthersBigNumber } from 'ethers';
import { ethers } from 'ethers';
import { EnvironmentConfig } from '../config/ethereum';
import type { Networks } from '../config/vega';
import erc20BridgeAbi from '../abis/erc20_bridge_abi.json';
import { BaseContract } from './base-contract';
import BigNumber from 'bignumber.js';
import { addDecimal } from '../utils';
export class VegaErc20Bridge extends BaseContract {
private contract: ethers.Contract;
constructor(
network: Networks,
provider: ethers.providers.Web3Provider,
signer?: ethers.Signer
) {
super(provider, signer);
this.contract = new ethers.Contract(
EnvironmentConfig[network].erc20Bridge,
erc20BridgeAbi,
this.signer || this.provider
);
}
/** Executes contracts withdraw_asset function */
async withdraw(
approval: {
assetSource: string;
amount: string;
nonce: string;
signatures: string;
targetAddress: string;
},
confirmations = 1
): Promise<ethers.ContractTransaction> {
const tx = await this.contract.withdraw_asset(
approval.assetSource,
approval.amount, // No need to remove decimals as this value is already set and not manipulated by the user
approval.targetAddress,
approval.nonce,
approval.signatures
);
this.trackTransaction(tx, confirmations);
return tx;
}
async depositAsset(
assetSource: string,
amount: string,
vegaPublicKey: string,
confirmations = 1
) {
const tx = await this.contract.deposit_asset(
assetSource,
amount,
vegaPublicKey
);
this.trackTransaction(tx, confirmations);
return tx;
}
async getAssetSource(vegaAssetId: string): Promise<string> {
const res = await this.contract.get_asset_source(vegaAssetId);
return res;
}
async getDepositMaximum(
assetSource: string,
decimals: number
): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.get_deposit_maximum(
assetSource
);
const value = addDecimal(new BigNumber(res.toString()), decimals);
return value;
}
async getDepositMinimum(
assetSource: string,
decimals: number
): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.get_deposit_minimum(
assetSource
);
const value = addDecimal(new BigNumber(res.toString()), decimals);
return value;
}
async getMultisigControlAddress(): Promise<string> {
const res = await this.contract.get_multisig_control_address();
return res;
}
async getVegaAssetId(): Promise<string> {
const res = await this.contract.get_vega_asset_id();
return res;
}
async isAssetListed(assetSource: string): Promise<boolean> {
const res = await this.contract.is_asset_listed(assetSource);
return res;
}
}

View File

@ -0,0 +1,131 @@
import type { BigNumber as EthersBigNumber } from 'ethers';
import { ethers } from 'ethers';
import stakingAbi from '../abis/staking_abi.json';
import tokenAbi from '../abis/vega_token_abi.json';
import { combineStakeEventsByVegaKey } from './stake-helpers';
import BigNumber from 'bignumber.js';
import { BaseContract } from './base-contract';
import { EnvironmentConfig } from '../config/ethereum';
import type { Networks } from '../config/vega';
import { addDecimal, hexadecimalify, removeDecimal } from '../utils';
export class VegaStaking extends BaseContract {
public contract: ethers.Contract;
public tokenContract: ethers.Contract;
public dp: Promise<number>;
constructor(
network: Networks,
provider: ethers.providers.Web3Provider,
signer?: ethers.Signer
) {
super(provider, signer);
const tokenContract = new ethers.Contract(
EnvironmentConfig[network].vegaTokenAddress,
tokenAbi,
this.signer || this.provider
);
this.tokenContract = tokenContract;
this.contract = new ethers.Contract(
EnvironmentConfig[network].stakingBridge,
stakingAbi,
this.signer || this.provider
);
this.dp = (async () => {
const val = await tokenContract.decimals();
return Number(val);
})();
}
/** Executes staking contracts stake function */
async addStake(
amount: BigNumber,
vegaKey: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const convertedAmount = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.stake(
convertedAmount,
hexadecimalify(vegaKey)
);
// store and track the transaction in BaseContract
this.trackTransaction(tx, confirmations);
return tx;
}
/** Executes staking contracts remove_stake function */
async removeStake(
amount: BigNumber,
vegaKey: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const convertedAmount = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.remove_stake(
convertedAmount,
hexadecimalify(vegaKey)
);
this.trackTransaction(tx, confirmations);
return tx;
}
/** Executes staking contracts transfer_stake function */
async transferStake(
amount: BigNumber,
newAddress: string,
vegaKey: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const convertedAmount = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.transfer_stake(
convertedAmount,
newAddress,
hexadecimalify(vegaKey)
);
this.trackTransaction(tx, confirmations);
return tx;
}
/** Returns the amount staked for given Vega public key */
async stakeBalance(address: string, vegaKey: string): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.stake_balance(
address,
hexadecimalify(vegaKey)
);
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
/** Returns the total amount currently staked */
async totalStaked(): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.total_staked();
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
/** Returns amounts staked across all Vega keys for single Ethereum account */
async userTotalStakedByVegaKey(
ethereumAccount: string
): Promise<{ [vegaKey: string]: BigNumber }> {
const addFilter = this.contract.filters.Stake_Deposited(ethereumAccount);
const removeFilter = this.contract.filters.Stake_Removed(ethereumAccount);
const addEvents = await this.contract.queryFilter(addFilter);
const removeEvents = await this.contract.queryFilter(removeFilter);
const res = combineStakeEventsByVegaKey(
[...addEvents, ...removeEvents],
await this.dp
);
return res;
}
}

View File

@ -0,0 +1,182 @@
import BigNumber from 'bignumber.js';
import type { BigNumber as EthersBigNumber } from 'ethers';
import { ethers } from 'ethers';
import { EnvironmentConfig } from '../config/ethereum';
import type { Networks } from '../config/vega';
import vestingAbi from '../abis/vesting_abi.json';
import tokenAbi from '../abis/vega_token_abi.json';
import { BaseContract } from './base-contract';
import { combineStakeEventsByVegaKey } from './stake-helpers';
import { getTranchesFromHistory } from './tranche-helpers';
import type { Tranche } from './vega-web3-types';
import { addDecimal, hexadecimalify, removeDecimal } from '../utils';
export class VegaVesting extends BaseContract {
public contract: ethers.Contract;
public tokenContract: ethers.Contract;
public dp: Promise<number>;
constructor(
network: Networks,
provider: ethers.providers.Web3Provider,
signer?: ethers.Signer
) {
super(provider, signer);
const tokenContract = new ethers.Contract(
EnvironmentConfig[network].vegaTokenAddress,
tokenAbi,
this.signer || this.provider
);
this.tokenContract = tokenContract;
this.contract = new ethers.Contract(
EnvironmentConfig[network].vestingAddress,
vestingAbi,
this.signer || this.provider
);
this.dp = (async () => {
const val = await tokenContract.decimals();
return Number(val);
})();
}
/** Executes vesting contracts stake_tokens function */
async addStake(
amount: BigNumber,
vegaKey: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const convertedAmount = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.stake_tokens(
convertedAmount,
hexadecimalify(vegaKey)
);
this.trackTransaction(tx, confirmations);
return tx;
}
/** Executes vesting contracts remove_stake function */
async removeStake(
amount: BigNumber,
vegaKey: string,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const convertedAmount = removeDecimal(amount, await this.dp).toString();
const tx = await this.contract.remove_stake(
convertedAmount,
hexadecimalify(vegaKey)
);
this.trackTransaction(tx, confirmations);
return tx;
}
/** Returns the amount staked for a given Vega public key */
async stakeBalance(address: string, vegaKey: string): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.stake_balance(
address,
hexadecimalify(vegaKey)
);
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
/** Returns the total amount currently staked */
async totalStaked(): Promise<BigNumber> {
const res: EthersBigNumber = await this.contract.total_staked();
const value = addDecimal(new BigNumber(res.toString()), await this.dp);
return value;
}
/** Returns the amount of locked tokens in the vesting contract */
async getLien(address: string): Promise<BigNumber> {
const {
lien,
}: {
lien: EthersBigNumber;
total_in_all_tranches: EthersBigNumber;
} = await this.contract.user_stats(address);
const value = addDecimal(new BigNumber(lien.toString()), await this.dp);
return value;
}
/** Returns the amount a user has in a specific tranche */
async userTrancheTotalBalance(
address: string,
tranche: number
): Promise<BigNumber> {
const amount: EthersBigNumber = await this.contract.get_tranche_balance(
address,
tranche
);
const value = addDecimal(new BigNumber(amount.toString()), await this.dp);
return value;
}
/** Returns vested amount for a given tranche */
async userTrancheVestedBalance(
address: string,
tranche: number
): Promise<BigNumber> {
const amount: EthersBigNumber = await this.contract.get_vested_for_tranche(
address,
tranche
);
const value = addDecimal(new BigNumber(amount.toString()), await this.dp);
return value;
}
/** Returns the users total tokens across all tranches */
async getUserBalanceAllTranches(account: string): Promise<BigNumber> {
const amount: EthersBigNumber = await this.contract.user_total_all_tranches(
account
);
const value = addDecimal(new BigNumber(amount.toString()), await this.dp);
return value;
}
/** Gets all tranche data */
async getAllTranches(): Promise<Tranche[]> {
const [created, added, removed] = await Promise.all([
this.contract.queryFilter(this.contract.filters.Tranche_Created()),
this.contract.queryFilter(this.contract.filters.Tranche_Balance_Added()),
this.contract.queryFilter(
this.contract.filters.Tranche_Balance_Removed()
),
]);
const dp = await this.dp;
return getTranchesFromHistory(created, added, removed, dp);
}
/** Executes contracts withdraw_from_tranche function */
async withdrawFromTranche(
trancheId: number,
confirmations = 1
): Promise<ethers.ContractTransaction> {
const tx = await this.contract.withdraw_from_tranche(trancheId);
this.trackTransaction(tx, confirmations);
return tx;
}
/** Returns amounts staked across all Vega keys for single Ethereum account */
async userTotalStakedByVegaKey(address: string) {
const addFilter = this.contract.filters.Stake_Deposited(address);
const removeFilter = this.contract.filters.Stake_Removed(address);
const addEvents = await this.contract.queryFilter(addFilter);
const removeEvents = await this.contract.queryFilter(removeFilter);
const res = combineStakeEventsByVegaKey(
[...addEvents, ...removeEvents],
await this.dp
);
return res;
}
}

View File

@ -0,0 +1,83 @@
import type { ethers } from 'ethers';
import type BigNumber from 'bignumber.js';
export interface Tranche {
tranche_id: number;
tranche_start: Date;
tranche_end: Date;
total_added: BigNumber;
total_removed: BigNumber;
locked_amount: BigNumber;
deposits: Array<TrancheDeposit>;
withdrawals: Array<TrancheWithdrawal>;
users: Array<TrancheUser>;
}
export interface TrancheDeposit {
amount: BigNumber;
user: string;
tx: string;
}
export interface TrancheWithdrawal {
amount: BigNumber;
user: string;
tx: string;
}
export interface TrancheUser {
address: string;
deposits: Array<{
amount: BigNumber;
user: string;
tx: string;
tranche_id: number;
}>;
withdrawals: Array<{
amount: BigNumber;
user: string;
tx: string;
tranche_id: number;
}>;
total_tokens: BigNumber;
withdrawn_tokens: BigNumber;
remaining_tokens: BigNumber;
}
export enum TrancheEvents {
Created = 'Tranche_Created',
BalanceAdded = 'Tranche_Balance_Added',
BalanceRemoved = 'Tranche_Balance_Removed',
}
export interface IVegaClaimData {
amount: BigNumber;
tranche: number;
expiry: number;
target?: string;
}
export interface IVegaClaimSignature {
v: number;
r: string;
s: string;
}
export interface IClaimTokenParams {
claim: IVegaClaimData;
signature: IVegaClaimSignature;
country: string | null;
}
export interface EpochDetails {
id: string;
startSeconds: BigNumber;
endSeconds: BigNumber;
}
export interface TxData {
tx: ethers.ContractTransaction;
receipt: ethers.ContractReceipt | null;
pending: boolean;
requiredConfirmations: number;
}

View File

@ -0,0 +1,3 @@
export * from './config';
export * from './contracts';
export * from './utils';

View File

@ -0,0 +1,17 @@
/**
* From:
* https://github.com/ChainSafe/web3.js/blob/436e77a8eaa061fbaa183a9f73ca590c2e1d7697/packages/web3-utils/src/index.js
*/
export const asciiToHex = (str: string) => {
if (!str) return '0x00';
let hex = '';
for (let i = 0; i < str.length; i++) {
const code = str.charCodeAt(i);
const n = code.toString(16);
hex += n.length < 2 ? '0' + n : n;
}
return '0x' + hex;
};

View File

@ -0,0 +1,22 @@
import BigNumber from 'bignumber.js';
import { addDecimal, removeDecimal } from './decimals';
test('Do not pad numbers with 0s when the number length is less than the specified DPs', () => {
expect(addDecimal(new BigNumber(10000), 10).toString()).toEqual('0.000001');
});
test('Handles large numbers correctly', () => {
const claimCode = new BigNumber('20000000000000000000000000');
const decimals = 18;
const decimalised = addDecimal(claimCode, decimals);
expect(decimalised.toString()).toEqual('20000000');
const undecimalised = removeDecimal(claimCode, decimals);
expect(undecimalised.toString()).toEqual(
'20000000000000000000000000000000000000000000'
);
const mangled = removeDecimal(addDecimal(claimCode, decimals), decimals);
expect(mangled.toString()).toEqual('20000000000000000000000000');
});

View File

@ -0,0 +1,10 @@
import BigNumber from 'bignumber.js';
BigNumber.config({ EXPONENTIAL_AT: 20000 });
export function addDecimal(value: BigNumber, decimals: number): BigNumber {
return value.dividedBy(Math.pow(10, decimals)).decimalPlaces(decimals);
}
export function removeDecimal(value: BigNumber, decimals: number): BigNumber {
return value.times(Math.pow(10, decimals));
}

View File

@ -0,0 +1,6 @@
import { hexadecimalify } from './hexadecimalify';
test('Prepends strings with 0x', () => {
expect(hexadecimalify('abc')).toEqual('0xabc');
expect(hexadecimalify('123456789')).toEqual('0x123456789');
});

View File

@ -0,0 +1,3 @@
export function hexadecimalify(str: string) {
return `0x${str}`;
}

View File

@ -0,0 +1,3 @@
export * from './decimals';
export * from './ascii-to-hex';
export * from './hexadecimalify';

View File

@ -0,0 +1,24 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"resolveJsonModule": true,
"esModuleInterop": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
]
}

View File

@ -0,0 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"declaration": true,
"types": []
},
"include": ["**/*.ts"],
"exclude": ["**/*.spec.ts", "**/*.test.ts"]
}

View File

@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"module": "commonjs",
"types": ["jest", "node"]
},
"include": ["**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"]
}

View File

@ -26,6 +26,7 @@
"@vegaprotocol/order-list": ["libs/order-list/src/index.ts"],
"@vegaprotocol/positions": ["libs/positions/src/index.ts"],
"@vegaprotocol/react-helpers": ["libs/react-helpers/src/index.ts"],
"@vegaprotocol/smart-contracts": ["libs/smart-contracts/src/index.ts"],
"@vegaprotocol/tailwindcss-config": [
"libs/tailwindcss-config/src/index.js"
],

View File

@ -16,6 +16,7 @@
"react-helpers": "libs/react-helpers",
"simple-trading-app": "apps/simple-trading-app",
"simple-trading-app-e2e": "apps/simple-trading-app-e2e",
"smart-contracts": "libs/smart-contracts",
"static": "apps/static",
"stats": "apps/stats",
"stats-e2e": "apps/stats-e2e",