diff --git a/blockchain/Dockerfile b/blockchain/Dockerfile index 5f0159d8..b9ba9d47 100644 --- a/blockchain/Dockerfile +++ b/blockchain/Dockerfile @@ -1,2 +1,2 @@ -FROM ghcr.io/foundry-rs/foundry -ENTRYPOINT [ "anvil", "--block-time", "5", "--host", "0.0.0.0" ] +FROM ghcr.io/foundry-rs/foundry:v1.0.0 +ENTRYPOINT [ "anvil", "--host", "0.0.0.0", "--port", "80", "--chain-id", "74207", "--block-time", "5" ] diff --git a/blockchain/apps/treasury/contracts/Treasury.sol b/blockchain/apps/treasury/contracts/Treasury.sol index 79f17bf9..1de12dd6 100644 --- a/blockchain/apps/treasury/contracts/Treasury.sol +++ b/blockchain/apps/treasury/contracts/Treasury.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/interfaces/IERC20.sol"; @@ -7,24 +7,44 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; +import "./WETH.sol"; contract Treasury is Ownable, EIP712 { - address private publicKey; + address private publicKey_; string private name_; + address payable private weth_; + bool private isFrozen_; using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; - // solhint-disable-next-line var-name-mixedcase bytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,address token,uint256 value,uint256 nonce,uint256 deadline)"); event Deposit(address indexed owner, address indexed spender, address indexed token, uint256 amount); event Withdraw(address indexed owner, address indexed spender, address indexed token, uint256 amount, uint256 nonce, uint256 deadline); - constructor(string memory _name, address _publicKey) EIP712(_name, "1") { - publicKey = _publicKey; + constructor(string memory _name, address payable _weth, address _publicKey) EIP712(_name, "1") { + publicKey_ = _publicKey; name_ = _name; + weth_ = _weth; + isFrozen_ = false; + } + + function isFrozen() public view returns (bool) { + return isFrozen_; + } + + function freeze() onlyOwner external { + isFrozen_ = true; + } + + function unfreeze() onlyOwner external { + isFrozen_ = false; + } + + function adminWithdraw(address token, uint256 amount, address to) onlyOwner external { + IERC20(token).transfer(to, amount); } /** @@ -41,14 +61,6 @@ contract Treasury is Ownable, EIP712 { return _nonces[owner].current(); } - /** - * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - /** * @dev "Consume a nonce": return the current value and increment. * @@ -60,28 +72,38 @@ contract Treasury is Ownable, EIP712 { nonce.increment(); } + receive() external payable { + require(!isFrozen_, "Treasury: contract is fronzen"); + address owner = address(msg.sender); + uint256 amount = msg.value; + IWETH(weth_).deposit{value: amount}(); + emit Deposit(owner, publicKey_, weth_, amount); + } + function depositPermit(address token, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external { + require(!isFrozen_, "Treasury: contract is fronzen"); address owner = address(msg.sender); IERC20Permit(token).permit(owner, address(this), amount, deadline, v, r, s); IERC20(token).transferFrom(owner, address(this), amount); - emit Deposit(owner, publicKey, token, amount); + emit Deposit(owner, publicKey_, token, amount); } function withdrawPermit(address token, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s, address to) external { + require(!isFrozen_, "Treasury: contract is fronzen"); address owner = address(msg.sender); uint256 nonce = _useNonce(owner); - require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); + require(block.timestamp <= deadline, "Treasury: expired deadline"); - bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, publicKey, owner, token, amount, nonce, deadline)); + bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, publicKey_, owner, token, amount, nonce, deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); - require(signer == publicKey, "ERC20Permit: invalid signature"); + require(signer == publicKey_, "Treasury: invalid signature"); IERC20(token).transfer(to, amount); - emit Withdraw(publicKey, owner, token, amount, nonce, deadline); + emit Withdraw(publicKey_, owner, token, amount, nonce, deadline); } } diff --git a/blockchain/apps/treasury/contracts/WETH.sol b/blockchain/apps/treasury/contracts/WETH.sol new file mode 100644 index 00000000..272cb5f1 --- /dev/null +++ b/blockchain/apps/treasury/contracts/WETH.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; +import "@openzeppelin/contracts/interfaces/IERC20.sol"; + +interface IWETH is IERC20 { + event Deposit(address indexed from, uint256 value); + event Withdrawal(address indexed to, uint256 value); + + receive() external payable; + + function deposit() external payable; + + function withdraw(uint256 wad) external; +} + +contract WETH is IWETH, ERC20Permit { + constructor( + string memory _name, + string memory _symbol + ) ERC20(_name, _symbol) ERC20Permit(_name) {} + + receive() external payable { + deposit(); + } + + function deposit() public payable { + _mint(_msgSender(), msg.value); + emit Deposit(_msgSender(), msg.value); + } + + function withdraw(uint256 amount) public { + require(balanceOf(_msgSender()) >= amount); + _burn(_msgSender(), amount); + payable(_msgSender()).transfer(amount); + emit Withdrawal(_msgSender(), amount); + } +} diff --git a/blockchain/apps/treasury/hardhat.config.ts b/blockchain/apps/treasury/hardhat.config.ts index d02f4e16..c8238fc4 100644 --- a/blockchain/apps/treasury/hardhat.config.ts +++ b/blockchain/apps/treasury/hardhat.config.ts @@ -7,6 +7,12 @@ const config: HardhatUserConfig = { local: { url: "http://localhost:8545/", }, + testnet: { + url: "https://node.ksox.finance/", + }, + polygon: { + url: "https://polygon-rpc.com/", + } }, }; diff --git a/blockchain/apps/treasury/package.json b/blockchain/apps/treasury/package.json index b06cc56b..1cb28780 100644 --- a/blockchain/apps/treasury/package.json +++ b/blockchain/apps/treasury/package.json @@ -5,7 +5,9 @@ "scripts": { "compile": "npx hardhat compile", "test": "npx hardhat test", - "deploy": "npx hardhat --network local run scripts/deploy.ts" + "hardhat": "npx hardhat", + "deploy:local": "npx hardhat run --network local scripts/deploy.ts", + "deploy:testnet": "npx hardhat run --network testnet scripts/deploy.ts" }, "author": "", "license": "ISC", @@ -15,6 +17,7 @@ }, "dependencies": { "@openzeppelin/contracts": "^4.9.3", + "@trezor/connect": "^9.1.1", "dotenv": "^16.3.1" } } diff --git a/blockchain/apps/treasury/scripts/deploy.ts b/blockchain/apps/treasury/scripts/deploy.ts index eb14cb81..993bf7bc 100644 --- a/blockchain/apps/treasury/scripts/deploy.ts +++ b/blockchain/apps/treasury/scripts/deploy.ts @@ -3,6 +3,10 @@ import { ethers } from "hardhat"; async function main() { const [owner] = await ethers.getSigners(); + const WethFactory = await ethers.getContractFactory("WETH"); + const weth = await WethFactory.deploy("Wrapped Native", "WETH"); + await weth.waitForDeployment(); + const TokenFactory = await ethers.getContractFactory("Token"); const tokens = [ @@ -12,7 +16,11 @@ async function main() { ]; const TreasuryFactory = await ethers.getContractFactory("Treasury"); - const treasury = await TreasuryFactory.deploy("Treasury", owner); + const treasury = await TreasuryFactory.deploy( + "Treasury", + await weth.getAddress(), + owner + ); console.log("waiting for token contracts to be deployed..."); for (let i = 0; i < tokens.length; i += 1) { @@ -47,6 +55,7 @@ async function main() { } console.log("tokens minted"); + console.log(`${await weth.name()}: ${await weth.getAddress()}`); for (let i = 0; i < tokens.length; i += 1) { const token = tokens[i]; console.log(`${await token.name()}: ${await token.getAddress()}`); diff --git a/blockchain/apps/treasury/scripts/generateRandomAccount.ts b/blockchain/apps/treasury/scripts/generateRandomAccount.ts new file mode 100644 index 00000000..81a85914 --- /dev/null +++ b/blockchain/apps/treasury/scripts/generateRandomAccount.ts @@ -0,0 +1,9 @@ +import { privateKeyToAccount } from "viem/accounts"; +import { toHex } from "viem/utils"; +import { randomBytes } from "crypto"; + +let privateKey = toHex(randomBytes(32)); +let account = privateKeyToAccount(privateKey); + +console.log(privateKey); +console.log(account.address); diff --git a/blockchain/apps/treasury/test/permit.ts b/blockchain/apps/treasury/test/permit.ts index 9593b3e8..4bce92a4 100644 --- a/blockchain/apps/treasury/test/permit.ts +++ b/blockchain/apps/treasury/test/permit.ts @@ -1,4 +1,7 @@ -import { time, loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers"; +import { + time, + loadFixture, +} from "@nomicfoundation/hardhat-toolbox/network-helpers"; import { expect } from "chai"; import { ethers } from "hardhat"; @@ -25,29 +28,67 @@ describe("Permit Deposit & Permit Withdraw Mechanisms", function () { const { chainId } = await ethers.provider.getNetwork(); const [owner, user, otherUser, signingKey] = await ethers.getSigners(); - const TokenFactory = await ethers.getContractFactory("TokenPermit"); + const WethFactory = await ethers.getContractFactory("WETH"); + const weth = await WethFactory.connect(owner).deploy("WETH", "WETH"); + await weth.waitForDeployment(); + + const TokenFactory = await ethers.getContractFactory("Token"); const token = await TokenFactory.connect(owner).deploy("MyToken", "MTK"); + await token.waitForDeployment(); const TreasuryFactory = await ethers.getContractFactory("Treasury"); - const treasury = await TreasuryFactory.connect(owner).deploy("Treasury", signingKey.address); + const treasury = await TreasuryFactory.connect(owner).deploy( + "Treasury", + await weth.getAddress(), + signingKey.address + ); + await treasury.waitForDeployment(); - return { chainId, owner, user, otherUser, signingKey, token, treasury }; + return { + chainId, + owner, + user, + otherUser, + signingKey, + weth, + token, + treasury, + }; } async function deployTreasuryFixturePremint() { const { chainId } = await ethers.provider.getNetwork(); const [owner, user, otherUser, signingKey] = await ethers.getSigners(); - const TokenFactory = await ethers.getContractFactory("TokenPermit"); + const WethFactory = await ethers.getContractFactory("WETH"); + const weth = await WethFactory.connect(owner).deploy("WETH", "WETH"); + await weth.waitForDeployment(); + + const TokenFactory = await ethers.getContractFactory("Token"); const token = await TokenFactory.connect(owner).deploy("MyToken", "MTK"); + await token.waitForDeployment(); const TreasuryFactory = await ethers.getContractFactory("Treasury"); - const treasury = await TreasuryFactory.connect(owner).deploy("Treasury", signingKey.address); + const treasury = await TreasuryFactory.connect(owner).deploy( + "Treasury", + await weth.getAddress(), + signingKey.address + ); + await treasury.waitForDeployment(); const MINT_AMOUNT = 100n * 10n ** (await token.decimals()); await token.connect(owner).mint(user, MINT_AMOUNT); - return { chainId, owner, user, otherUser, signingKey, token, treasury }; + return { + chainId, + owner, + user, + otherUser, + signingKey, + weth, + token, + treasury, + }; } describe("Token", () => { @@ -66,7 +107,9 @@ describe("Permit Deposit & Permit Withdraw Mechanisms", function () { describe("Treasury", () => { it("permit deposit funds", async function () { - const { chainId, user, token, treasury } = await loadFixture(deployTreasuryFixturePremint); + const { chainId, user, token, treasury } = await loadFixture( + deployTreasuryFixturePremint + ); const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; const deadline = (await time.latest()) + ONE_YEAR_IN_SECS; @@ -99,13 +142,18 @@ describe("Permit Deposit & Permit Withdraw Mechanisms", function () { deadline: deadline, }; - const { r, s, v } = splitSig(await user.signTypedData(domain, { Permit: permitType }, permit)); - await treasury.connect(user).depositPermit(tokenAddress, value, deadline, v, r, s); + const { r, s, v } = splitSig( + await user.signTypedData(domain, { Permit: permitType }, permit) + ); + await treasury + .connect(user) + .depositPermit(tokenAddress, value, deadline, v, r, s); expect(await token.balanceOf(treasury)).to.equal(value); }); it("permit withdraw funds", async function () { - const { chainId, user, otherUser, signingKey, token, treasury } = await loadFixture(deployTreasuryFixturePremint); + const { chainId, user, otherUser, signingKey, token, treasury } = + await loadFixture(deployTreasuryFixturePremint); const value = 10n * 10n ** (await token.connect(user).decimals()); { @@ -139,8 +187,12 @@ describe("Permit Deposit & Permit Withdraw Mechanisms", function () { deadline: deadline, }; - const { r, s, v } = splitSig(await user.signTypedData(domain, { Permit: permitType }, permit)); - await treasury.connect(user).depositPermit(tokenAddress, value, deadline, v, r, s); + const { r, s, v } = splitSig( + await user.signTypedData(domain, { Permit: permitType }, permit) + ); + await treasury + .connect(user) + .depositPermit(tokenAddress, value, deadline, v, r, s); } expect(await token.balanceOf(treasury)).to.equal(value); { @@ -176,11 +228,71 @@ describe("Permit Deposit & Permit Withdraw Mechanisms", function () { deadline: deadline, }; - const { r, s, v } = splitSig(await signingKey.signTypedData(domain, { Permit: permitType }, permit)); - await treasury.connect(user).withdrawPermit(tokenAddress, value, deadline, v, r, s, otherUser); + const { r, s, v } = splitSig( + await signingKey.signTypedData(domain, { Permit: permitType }, permit) + ); + await treasury + .connect(user) + .withdrawPermit(tokenAddress, value, deadline, v, r, s, otherUser); } expect(await token.balanceOf(treasury)).to.equal(0); expect(await token.balanceOf(otherUser)).to.equal(value); }); + it("weth deposit and withdraw", async function () { + const { chainId, user, otherUser, signingKey, weth, token, treasury } = + await loadFixture(deployTreasuryFixturePremint); + const treasuryAddress = await treasury.getAddress(); + const treasuryName = await treasury.name(); + const tokenAddress = await weth.getAddress(); + + const value = 10n * 10n ** (await token.connect(user).decimals()); + { + const tx = await user.sendTransaction({ + to: treasuryAddress, + value, + }); + await tx.wait(); + } + expect(await weth.balanceOf(treasuryAddress)).to.equal(value); + { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const deadline = (await time.latest()) + ONE_YEAR_IN_SECS; + const nonce = await treasury.nonces(user.address); + + const domain = { + name: treasuryName, + version: "1", + chainId: chainId, + verifyingContract: treasuryAddress, + }; + + const permitType = [ + { name: "owner", type: "address" }, + { name: "spender", type: "address" }, + { name: "token", type: "address" }, + { name: "value", type: "uint256" }, + { name: "nonce", type: "uint256" }, + { name: "deadline", type: "uint256" }, + ]; + + const permit = { + owner: signingKey.address, + spender: user.address, + token: tokenAddress, + value: value, + nonce: nonce, + deadline: deadline, + }; + + const { r, s, v } = splitSig( + await signingKey.signTypedData(domain, { Permit: permitType }, permit) + ); + await treasury + .connect(user) + .withdrawPermit(tokenAddress, value, deadline, v, r, s, otherUser); + } + expect(await weth.balanceOf(treasuryAddress)).to.equal(0); + expect(await weth.balanceOf(otherUser.address)).to.equal(value); + }); }); }); diff --git a/blockchain/k8s/node.yaml b/blockchain/k8s/node.yaml new file mode 100644 index 00000000..58a69e41 --- /dev/null +++ b/blockchain/k8s/node.yaml @@ -0,0 +1,70 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: blockchain-node-deployment + namespace: ksox-finance + labels: + app: blockchain-node +spec: + selector: + matchLabels: + app: blockchain-node + template: + metadata: + labels: + app: blockchain-node + spec: + containers: + - name: blockchain-node + image: registry.internal.visoft.solutions/blockchain-node + envFrom: + - secretRef: + name: envs + ports: + - containerPort: 80 + resources: + requests: + memory: 200Mi + cpu: 200m + limits: + memory: 400Mi + cpu: 400m +--- +apiVersion: v1 +kind: Service +metadata: + name: blockchain-node-service + namespace: ksox-finance +spec: + selector: + app: blockchain-node + ports: + - protocol: TCP + port: 80 + targetPort: 80 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: blockchain-node-ingress + namespace: ksox-finance + annotations: + nginx.ingress.kubernetes.io/use-regex: "true" + nginx.ingress.kubernetes.io/rewrite-target: /$1 +spec: + ingressClassName: ingress-nginx + tls: + - hosts: + - node.ksox.finance + secretName: ksox-finance-tls + rules: + - host: node.ksox.finance + http: + paths: + - path: /(.*) + pathType: ImplementationSpecific + backend: + service: + name: blockchain-node-service + port: + number: 80 diff --git a/blockchain/package-lock.json b/blockchain/package-lock.json index c6af0f8b..c979499a 100644 --- a/blockchain/package-lock.json +++ b/blockchain/package-lock.json @@ -10,7 +10,8 @@ "license": "ISC", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "package/trezor" ] }, "apps/crowdsale": { @@ -56,6 +57,7 @@ "license": "ISC", "dependencies": { "@openzeppelin/contracts": "^4.9.3", + "@trezor/connect": "^9.1.1", "dotenv": "^16.3.1" }, "devDependencies": { @@ -75,8 +77,7 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==", - "dev": true + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" }, "node_modules/@apps/crowdsale": { "resolved": "apps/crowdsale", @@ -1076,11 +1077,32 @@ "rlp": "^2.2.3" } }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/hashes": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true, "funding": [ { "type": "individual", @@ -1092,7 +1114,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true, "funding": [ { "type": "individual", @@ -1952,11 +1973,64 @@ "resolved": "packages/prettier", "link": true }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true, "funding": [ { "type": "individual", @@ -2151,6 +2225,257 @@ "antlr4ts": "^0.5.0-alpha.4" } }, + "node_modules/@trezor/analytics": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.5.tgz", + "integrity": "sha512-XpgAsQDi8uZ+PmfCS6KUn+frUqR1ckOY9NdeC0PMGmkTzWm47oatvoyLSy2umd30T9M4h1LJECBqA80XpEV5MA==", + "dependencies": { + "@trezor/env-utils": "1.0.4", + "@trezor/utils": "9.0.11" + } + }, + "node_modules/@trezor/blockchain-link": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.15.tgz", + "integrity": "sha512-Y7QsggFUGk84yKY06eSuS3oTNwH+chz0fuCWMs7aKr4TxXsxILNwzoYg7Erecf+WZuydAdmjZRDT4QbmMUc65g==", + "dependencies": { + "@trezor/blockchain-link-types": "1.0.4", + "@trezor/blockchain-link-utils": "1.0.5", + "@trezor/utils": "9.0.11", + "@trezor/utxo-lib": "1.0.9", + "@types/web": "^0.0.100", + "bignumber.js": "^9.1.1", + "events": "^3.3.0", + "ripple-lib": "^1.10.1", + "socks-proxy-agent": "6.1.1", + "ws": "7.5.9" + } + }, + "node_modules/@trezor/blockchain-link-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.4.tgz", + "integrity": "sha512-EBX8Fi38mqIRStOQsUNbma1RwEP57B104N77p1CPHML3Kxu6M0DVcTulFKJKAJ6laQyfULzTeUYfEdn//dCcFA==" + }, + "node_modules/@trezor/blockchain-link-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.5.tgz", + "integrity": "sha512-Kj8Zuy22ApV+FcLhMFdFVMAjbJwS4VaXndkz1OgjF7UHTb0jEJtIk5JSe5KNbvNUsyGcEAn9vZ+RogfZETOVGw==", + "dependencies": { + "@trezor/utils": "9.0.11", + "bignumber.js": "^9.1.1" + } + }, + "node_modules/@trezor/blockchain-link/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@trezor/connect": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.1.1.tgz", + "integrity": "sha512-qIovN55BN5zciRiwIeEAHISjspy9jWkusBntk5z5SFmXw95KG6trms7GCodpbEuueboUS9Ts9xHorYwvqMmweg==", + "dependencies": { + "@trezor/blockchain-link": "2.1.15", + "@trezor/blockchain-link-types": "1.0.4", + "@trezor/connect-analytics": "1.0.4", + "@trezor/connect-common": "0.0.18", + "@trezor/transport": "1.1.14", + "@trezor/utils": "9.0.11", + "@trezor/utxo-lib": "1.0.9", + "bignumber.js": "^9.1.1", + "blakejs": "^1.2.1", + "bs58": "^5.0.0", + "bs58check": "^3.0.1", + "cross-fetch": "^3.1.6", + "events": "^3.3.0", + "randombytes": "2.1.0" + } + }, + "node_modules/@trezor/connect-analytics": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.4.tgz", + "integrity": "sha512-GLD5CCh6hcXsovxM2Fyns25GbGRCJ3lgFhWQ9WyqkFveI41cwMGCJZuXSyGSWCeMpazOYdvpgyXMqc22J2tatg==", + "dependencies": { + "@trezor/analytics": "1.0.5" + } + }, + "node_modules/@trezor/connect-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.18.tgz", + "integrity": "sha512-tFian3z2ce/gQpjtFddr5NCKeJEEpV/t+Srb0Sa/STXqY/mTaADzti1aqp+/w4bL+1E2NNdAmCtsCl5AZc4a+A==", + "dependencies": { + "@trezor/env-utils": "1.0.4" + } + }, + "node_modules/@trezor/connect/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/connect/node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "node_modules/@trezor/connect/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/@trezor/connect/node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, + "node_modules/@trezor/env-utils": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.4.tgz", + "integrity": "sha512-V9DdjpCH6hyN7AYPEIV1WR44fmgN6d3iF8DtHYNljnMFOaan167DDVq51ZpSPAnyppulIEhdK7kuLDW3KPcnpw==", + "dependencies": { + "ua-parser-js": "^1.0.35" + }, + "peerDependencies": { + "expo-localization": "^14.1.1", + "react-native": "0.71.8", + "react-native-config": "^1.5.0" + }, + "peerDependenciesMeta": { + "expo-localization": { + "optional": true + }, + "react-native": { + "optional": true + }, + "react-native-config": { + "optional": true + } + } + }, + "node_modules/@trezor/transport": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.14.tgz", + "integrity": "sha512-KRurYZonsPugKyCJFEEkDi82gjD1lwNDEaROCwQvIHcdXO2spHj1XDlIWa8dgBVrglukJmYutqCzE+RtaMeVVQ==", + "dependencies": { + "@trezor/utils": "9.0.11", + "bytebuffer": "^5.0.1", + "cross-fetch": "^3.1.6", + "json-stable-stringify": "^1.0.2", + "long": "^4.0.0", + "prettier": "2.8.8", + "protobufjs": "7.2.4", + "usb": "^2.9.0" + } + }, + "node_modules/@trezor/transport/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@trezor/utils": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.11.tgz", + "integrity": "sha512-HJBgR6/VYjJX8AP/fNIcYC+gDNjP2JLfgYBrT/naupEwDQJcxfn8KgUBrR1/akm61g8CPOot/YEj4o5nXuRt/g==" + }, + "node_modules/@trezor/utxo-lib": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.9.tgz", + "integrity": "sha512-ezLJzAslhW6HVTyZWpfBmrXY5/hz5XKT0FkYRS7lhnf56LwtVPUkLvLqGtDPuV8djF04meXxoRNO8jjtnQgYqA==", + "dependencies": { + "@trezor/utils": "9.0.11", + "bchaddrjs": "^0.5.2", + "bech32": "^2.0.0", + "bip66": "^1.1.5", + "bitcoin-ops": "^1.4.1", + "blake-hash": "^2.0.0", + "blakejs": "^1.2.1", + "bn.js": "^5.2.1", + "bs58": "^5.0.0", + "bs58check": "^3.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "int64-buffer": "^1.0.1", + "pushdata-bitcoin": "^1.0.1", + "tiny-secp256k1": "^1.1.6", + "typeforce": "^1.18.0", + "varuint-bitcoin": "^1.1.2", + "wif": "^2.0.6" + } + }, + "node_modules/@trezor/utxo-lib/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@trezor/utxo-lib/node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "node_modules/@trezor/utxo-lib/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "node_modules/@trezor/utxo-lib/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/@trezor/utxo-lib/node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -2274,6 +2599,11 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" + }, "node_modules/@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2297,8 +2627,7 @@ "node_modules/@types/node": { "version": "20.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", - "dev": true + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" }, "node_modules/@types/pbkdf2": { "version": "3.1.0", @@ -2354,6 +2683,24 @@ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "node_modules/@types/w3c-web-usb": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.6.tgz", + "integrity": "sha512-cSjhgrr8g4KbPnnijAr/KJDNKa/bBa+ixYkywFRvrhvi9n1WEl7yYbtRyzE6jqNQiSxxJxoAW3STaOQwJHndaw==" + }, + "node_modules/@types/web": { + "version": "0.0.100", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.100.tgz", + "integrity": "sha512-8NDSrDsyF7qv93SQ7aNFk0NqpNb1QEC1meoEZW/+KGMHZWd0WOC2DiT9pVhS5+w5q+u9+2bkBCfUQpe9wbqiPA==" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", @@ -2643,6 +2990,29 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@wagmi/chains": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@wagmi/chains/-/chains-1.7.0.tgz", + "integrity": "sha512-TKVeHv0GqP5sV1yQ8BDGYToAFezPnCexbbBpeH14x7ywi5a1dDStPffpt9x+ytE6LJWkZ6pAMs/HNWXBQ5Nqmw==", + "funding": [ + { + "type": "gitcoin", + "url": "https://wagmi.sh/gitcoin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -2650,6 +3020,29 @@ "dev": true, "peer": true }, + "node_modules/abitype": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.3.tgz", + "integrity": "sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/abstract-level": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", @@ -2745,14 +3138,12 @@ "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "dependencies": { "debug": "4" }, @@ -3004,6 +3395,17 @@ "safer-buffer": "~2.1.0" } }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -3070,8 +3472,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -3117,7 +3517,6 @@ "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" } @@ -3126,7 +3525,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -3142,6 +3540,43 @@ } ] }, + "node_modules/bchaddrjs": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/bchaddrjs/-/bchaddrjs-0.5.2.tgz", + "integrity": "sha512-OO7gIn3m7ea4FVx4cT8gdlWQR2+++EquhdpWQJH9BQjK63tJJ6ngB3QMZDO6DiBoXiIGUsTPHjlrHVxPGcGxLQ==", + "dependencies": { + "bs58check": "2.1.2", + "buffer": "^6.0.3", + "cashaddrjs": "0.4.4", + "stream-browserify": "^3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bchaddrjs/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -3165,6 +3600,14 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bigint-crypto-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", @@ -3174,6 +3617,14 @@ "node": ">=14.0.0" } }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3183,29 +3634,67 @@ "node": ">=8" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "safe-buffer": "^5.0.1" } }, - "node_modules/braces": { + "node_modules/bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" + }, + "node_modules/blake-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", + "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/blake-hash/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", @@ -3220,8 +3709,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "node_modules/browser-level": { "version": "1.0.1", @@ -3259,7 +3747,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dev": true, "dependencies": { "base-x": "^3.0.2" } @@ -3268,7 +3755,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -3310,6 +3796,25 @@ "node": ">=10.16.0" } }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bytebuffer/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -3323,8 +3828,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "peer": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3370,6 +3873,14 @@ "dev": true, "peer": true }, + "node_modules/cashaddrjs": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cashaddrjs/-/cashaddrjs-0.4.4.tgz", + "integrity": "sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==", + "dependencies": { + "big-integer": "1.6.36" + } + }, "node_modules/catering": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", @@ -3507,7 +4018,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -3784,7 +4294,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -3797,7 +4306,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -3814,6 +4322,14 @@ "dev": true, "peer": true }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3862,7 +4378,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -3887,6 +4402,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -3920,8 +4440,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "peer": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -4038,7 +4556,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -4052,8 +4569,7 @@ "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -4196,6 +4712,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5271,10 +5792,9 @@ } }, "node_modules/ethers": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.0.tgz", - "integrity": "sha512-pxt5hK82RNwcTX2gOZP81t6qVPVspnkpeivwEgQuK9XUvbNtghBnT8GNIb/gPh+WnVSfi8cXC9XlfT8sqc6D6w==", - "dev": true, + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "funding": [ { "type": "individual", @@ -5301,14 +5821,12 @@ "node_modules/ethers/node_modules/@types/node": { "version": "18.15.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" }, "node_modules/ethers/node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/ethjs-unit": { "version": "0.1.6", @@ -5346,6 +5864,14 @@ "npm": ">=3" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -5446,6 +5972,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5539,8 +6070,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -5621,9 +6150,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true, - "peer": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -5683,8 +6210,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "peer": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -5874,8 +6399,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6196,8 +6719,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -6228,8 +6749,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -6241,8 +6760,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -6254,8 +6771,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -6267,8 +6782,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -6283,7 +6796,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -6297,7 +6809,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -6323,7 +6834,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -6399,7 +6909,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -6424,7 +6933,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -6502,8 +7010,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -6512,6 +7019,14 @@ "dev": true, "peer": true }, + "node_modules/int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -6546,6 +7061,26 @@ "fp-ts": "^1.0.0" } }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -6630,8 +7165,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -6674,6 +7207,20 @@ "node": ">=4" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6696,6 +7243,21 @@ "npm": ">=3" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -6818,8 +7380,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "peer": true, "dependencies": { "which-typed-array": "^1.1.11" }, @@ -6884,6 +7444,14 @@ "unfetch": "^4.2.0" } }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -6945,6 +7513,17 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -6971,6 +7550,14 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsonschema": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", @@ -7125,8 +7712,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -7247,6 +7833,11 @@ "node": ">=8" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -7299,7 +7890,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -7375,14 +7965,12 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { "version": "3.1.2", @@ -7551,8 +8139,12 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" }, "node_modules/nanoid": { "version": "3.3.3", @@ -7632,7 +8224,6 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7652,7 +8243,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -7742,12 +8332,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "peer": true, "engines": { "node": ">= 0.4" } @@ -8068,6 +8671,34 @@ "node": ">= 4" } }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -8090,6 +8721,14 @@ "node": ">=6" } }, + "node_modules/pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", + "dependencies": { + "bitcoin-ops": "^1.3.0" + } + }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -8124,7 +8763,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -8148,7 +8786,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8438,12 +9075,144 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, + "node_modules/ripple-address-codec": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.0.tgz", + "integrity": "sha512-Tvd81i7hpDmNqHvkj6iYlj8Tv3I1Romw5gfjni9eacewJvGV2xe+p2y0FAw39z72qfciRMhQyHvpnviBcWVBNw==", + "dependencies": { + "base-x": "^3.0.9", + "create-hash": "^1.1.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.9.0.tgz", + "integrity": "sha512-vJlY23rRrP9XPD9bo63lAvZphjj1OGtfLzEUxlYYD7SJvDbYEaiEsriC69LKOXMft5sCFRvCsLGOeSDAdZW9hw==", + "dependencies": { + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "6.0.3", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.3.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec/node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ripple-binary-codec/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/ripple-keypairs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.0.tgz", + "integrity": "sha512-LzM3Up9Pwz3dYqnczzNptimN3AxtjeGbDGeiOzREzbkslKiZcJ615b/ghBN4H23SC6W1GAL95juEzzimDi4THw==", + "dependencies": { + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.4", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.3.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-lib": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.10.1.tgz", + "integrity": "sha512-OQk+Syl2JfxKxV2KuF/kBMtnh012I5tNnziP3G4WDGCGSIAgeqkOgkR59IQ0YDNrs1YW8GbApxrdMSRi/QClcA==", + "dependencies": { + "@types/lodash": "^4.14.136", + "@types/ws": "^7.2.0", + "bignumber.js": "^9.0.0", + "https-proxy-agent": "^5.0.0", + "jsonschema": "1.2.2", + "lodash": "^4.17.4", + "ripple-address-codec": "^4.1.1", + "ripple-binary-codec": "^1.1.3", + "ripple-keypairs": "^1.0.3", + "ripple-lib-transactionparser": "0.8.2", + "ws": "^7.2.0" + }, + "engines": { + "node": ">=10.13.0", + "yarn": "^1.15.2" + } + }, + "node_modules/ripple-lib-transactionparser": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz", + "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", + "dependencies": { + "bignumber.js": "^9.0.0", + "lodash": "^4.17.15" + } + }, + "node_modules/ripple-lib/node_modules/jsonschema": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", + "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==", + "engines": { + "node": "*" + } + }, + "node_modules/ripple-lib/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/rlp": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", @@ -8538,7 +9307,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -8761,7 +9529,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -8917,6 +9684,41 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/solc": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", @@ -9738,6 +10540,15 @@ "node": ">=0.10.0" } }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -9751,7 +10562,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -10075,6 +10885,27 @@ "node": ">= 0.12" } }, + "node_modules/tiny-secp256k1": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", + "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tiny-secp256k1/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10125,8 +10956,11 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trezor": { + "resolved": "packages/trezor", + "link": true }, "node_modules/ts-api-utils": { "version": "1.0.1", @@ -10553,11 +11387,16 @@ "dev": true, "peer": true }, + "node_modules/typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, "node_modules/typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, + "devOptional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -10577,6 +11416,24 @@ "node": ">=8" } }, + "node_modules/ua-parser-js": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", @@ -10653,6 +11510,25 @@ "punycode": "^2.1.0" } }, + "node_modules/usb": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/usb/-/usb-2.10.0.tgz", + "integrity": "sha512-FbzLhziRs4rHnTDZX+eKl9yBVjiuMNX+opl0r8TFPj265PuNtqak3qw5c8DLpBwq3z1JZgAOgm5Nn7cV30nCxg==", + "hasInstallScript": true, + "dependencies": { + "@types/w3c-web-usb": "^1.0.6", + "node-addon-api": "^7.0.0", + "node-gyp-build": "^4.5.0" + }, + "engines": { + "node": ">=12.22.0 <13.0 || >=14.17.0" + } + }, + "node_modules/usb/node_modules/node-addon-api": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", + "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" + }, "node_modules/utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", @@ -10660,11 +11536,22 @@ "dev": true, "peer": true }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", @@ -10682,6 +11569,14 @@ "dev": true, "peer": true }, + "node_modules/varuint-bitcoin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -10697,6 +11592,120 @@ "extsprintf": "^1.2.0" } }, + "node_modules/viem": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-1.7.0.tgz", + "integrity": "sha512-S4SclYe0Oca6TuPh2YPI3BzfC7a4UvN7TRDCWwpoVNnu9+4z2hqCZhW+6aF1yufgSwdezNsF14vztE/P4eMdBw==", + "dependencies": { + "@adraffy/ens-normalize": "1.9.0", + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.0", + "@scure/bip32": "1.3.0", + "@scure/bip39": "1.2.0", + "@types/ws": "^8.5.4", + "@wagmi/chains": "1.7.0", + "abitype": "0.9.3", + "isomorphic-ws": "5.0.0", + "ws": "8.12.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@adraffy/ens-normalize": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz", + "integrity": "sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==" + }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", + "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/viem/node_modules/@scure/bip32": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.0.tgz", + "integrity": "sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/curves": "~1.0.0", + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/viem/node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.0.0.tgz", + "integrity": "sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "1.3.0" + } + }, + "node_modules/viem/node_modules/@scure/bip39": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.0.tgz", + "integrity": "sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/viem/node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/web3-utils": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", @@ -10719,14 +11728,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -10775,8 +11782,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, - "peer": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -10801,6 +11806,14 @@ "string-width": "^1.0.2 || 2" } }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "dependencies": { + "bs58check": "<3.0.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -10931,7 +11944,6 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, "engines": { "node": ">=10.0.0" }, @@ -11060,6 +12072,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "package/trezor": { + "version": "1.0.0", + "extraneous": true, + "license": "ISC", + "devDependencies": {} + }, "packages/eslint": { "name": "@packages/eslint", "version": "1.0.0", @@ -11078,6 +12096,15 @@ "devDependencies": { "prettier": "^3.0.1" } + }, + "packages/trezor": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@trezor/connect": "^9.1.1", + "ethers": "^6.7.1", + "viem": "^1.7.0" + } } } } diff --git a/blockchain/package.json b/blockchain/package.json index 0fc84da4..130dcdf7 100644 --- a/blockchain/package.json +++ b/blockchain/package.json @@ -13,7 +13,9 @@ "node": "npm run start --workspace apps/node", "compile": "npm run compile --workspace", "test": "npm run test --workspace", - "deploy": "npm run deploy --workspace" + "hardhat": "npm run hardhat --workspace", + "deploy:local": "npm run deploy:local --workspace", + "deploy:testnet": "npm run deploy:testnet --workspace" }, "author": "", "license": "ISC", diff --git a/compose.yaml b/compose.yaml index 6ce566e8..a64b9a5c 100644 --- a/compose.yaml +++ b/compose.yaml @@ -5,7 +5,7 @@ services: build: context: ./blockchain ports: - - 8545:8545 + - 8545:80 postgres: container_name: ksox-postgres @@ -33,7 +33,7 @@ services: context: ./server dockerfile: ./engagement.dockerfile args: - - SQLX_OFFLINE=true + - SQLX_OFFLINE="true" env_file: - ./server/.env depends_on: @@ -48,7 +48,7 @@ services: context: ./server dockerfile: ./engine.dockerfile args: - - SQLX_OFFLINE=true + - SQLX_OFFLINE="true" env_file: - ./server/.env depends_on: @@ -63,7 +63,7 @@ services: context: ./server dockerfile: ./blockchain.dockerfile args: - - SQLX_OFFLINE=true + - SQLX_OFFLINE="true" env_file: - ./server/.env depends_on: @@ -79,7 +79,7 @@ services: context: ./server dockerfile: ./worker.dockerfile args: - - SQLX_OFFLINE=true + - SQLX_OFFLINE="true" env_file: - ./server/.env depends_on: @@ -99,7 +99,7 @@ services: context: ./web dockerfile: ./exchange.dockerfile args: - - NODE_ENV=development + - NODE_ENV="development" depends_on: - server-worker @@ -110,7 +110,7 @@ services: context: ./web dockerfile: ./exchange-landing.dockerfile args: - - NODE_ENV=development + - NODE_ENV="development" depends_on: - server-worker @@ -121,7 +121,7 @@ services: context: ./web dockerfile: ./processor.dockerfile args: - - NODE_ENV=development + - NODE_ENV="development" depends_on: - server-worker @@ -132,7 +132,7 @@ services: context: ./web dockerfile: ./dashboard.dockerfile args: - - NODE_ENV=development + - NODE_ENV="development" depends_on: - server-worker diff --git a/containers/busybox.dockerfile b/containers/busybox.dockerfile deleted file mode 100644 index 24a79d08..00000000 --- a/containers/busybox.dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM busybox diff --git a/k8s/_namespace.yaml b/k8s/_namespace.yaml deleted file mode 100644 index d2209272..00000000 --- a/k8s/_namespace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: ksox-finance diff --git a/k8s/certificates.yaml b/k8s/certificates.yaml deleted file mode 100644 index cb668754..00000000 --- a/k8s/certificates.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: ksox-finance-cert - namespace: ksox-finance -spec: - secretName: ksox-finance-tls - dnsNames: - - ksox.finance - - www.ksox.finance - - app.ksox.finance - - pay.ksox.finance - - dashboard.ksox.finance - issuerRef: - name: ksox-finance-letsencrypt-http01 diff --git a/k8s/issuer.yaml b/k8s/issuer.yaml deleted file mode 100644 index fe3d7498..00000000 --- a/k8s/issuer.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: ksox-finance-letsencrypt-http01 - namespace: ksox-finance -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: pavlnowak@gmail.com - privateKeySecretRef: - name: ksox-finance-issuer-account-key - solvers: - - http01: - ingress: - ingressClassName: ingress-nginx - selector: - dnsZones: - - ksox.finance diff --git a/k8s/ksox-exchange.yaml b/k8s/ksox-exchange.yaml deleted file mode 100644 index e45d9b65..00000000 --- a/k8s/ksox-exchange.yaml +++ /dev/null @@ -1,49 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: ksox-exchange-issuer - namespace: ksox-finance -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: pavlnowak@gmail.com - privateKeySecretRef: - name: ksox-exchange-issuer-account-key - solvers: - - http01: - ingress: - ingressClassName: ingress-nginx - selector: - dnsZones: - - ksox.exchange ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: ksox-exchange-cert - namespace: ksox-finance -spec: - secretName: ksox-exchange-tls - dnsNames: - - ksox.exchange - - www.ksox.exchange - issuerRef: - name: ksox-exchange-issuer ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: redirect-ingress - namespace: ksox-finance - annotations: - nginx.ingress.kubernetes.io/permanent-redirect: https://www.ksox.finance -spec: - ingressClassName: ingress-nginx - tls: - - hosts: - - ksox.exchange - - www.ksox.exchange - secretName: ksox-exchange-tls - rules: - - host: ksox.exchange - - host: www.ksox.exchange diff --git a/k8s/pvcs.yaml b/k8s/pvcs.yaml deleted file mode 100644 index 260f4157..00000000 --- a/k8s/pvcs.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: postgres-pv-claim - namespace: ksox-finance -spec: - storageClassName: openebs-hostpath - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 512Gi ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: redis-pv-claim - namespace: ksox-finance -spec: - storageClassName: openebs-hostpath - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 256Gi diff --git a/postgres/Dockerfile b/postgres/Dockerfile index 276f1f74..f16de58b 100644 --- a/postgres/Dockerfile +++ b/postgres/Dockerfile @@ -1,3 +1,3 @@ -FROM postgres +FROM postgres:15.4-alpine COPY ./migrations/* /docker-entrypoint-initdb.d/ diff --git a/postgres/k8s/postgres.yaml b/postgres/k8s/postgres.yaml index b531f05f..d7398551 100644 --- a/postgres/k8s/postgres.yaml +++ b/postgres/k8s/postgres.yaml @@ -15,31 +15,27 @@ spec: app: postgres-database spec: volumes: - - name: postgres-pv-storage + - name: postgres-pv persistentVolumeClaim: - claimName: postgres-pv-claim + claimName: postgres-pvc containers: - name: postgres-database - image: postgres-database + image: registry.internal.visoft.solutions/postgres-database + envFrom: + - configMapRef: + name: settings ports: - containerPort: 5432 volumeMounts: - mountPath: "/var/lib/postgresql/data" - name: postgres-pv-storage + name: postgres-pv resources: requests: - memory: 300Mi - cpu: 300m + memory: 100Mi + cpu: 100m limits: - memory: 500Mi - cpu: 500m - env: - - name: POSTGRES_USER - value: ksoxuser - - name: POSTGRES_PASSWORD - value: ksoxuserp4ssword - - name: POSTGRES_DB - value: ksox + memory: 200Mi + cpu: 200m --- apiVersion: v1 kind: Service diff --git a/postgres/migrations/00_core_types.sql b/postgres/migrations/00_core_types.sql index 571afe54..94d221e4 100644 --- a/postgres/migrations/00_core_types.sql +++ b/postgres/migrations/00_core_types.sql @@ -4,6 +4,11 @@ ALTER SYSTEM SET max_connections = 50; -- Add migration script here CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +CREATE TYPE confirmations AS ( + actual NUMERIC(78), + desired NUMERIC(78) +); + CREATE TYPE fraction AS ( numer NUMERIC(78), denom NUMERIC(78) diff --git a/postgres/migrations/01_core_tables.sql b/postgres/migrations/01_core_tables.sql index 3601ece4..37fd6fb2 100644 --- a/postgres/migrations/01_core_tables.sql +++ b/postgres/migrations/01_core_tables.sql @@ -3,9 +3,7 @@ CREATE TABLE "users" ( "created_at" TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, "last_modification_at" TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, "address" CHAR(42) UNIQUE NOT NULL, - "name" VARCHAR(50) UNIQUE, - "phone" VARCHAR(50) UNIQUE, - "email" VARCHAR(100) UNIQUE + "name" VARCHAR(50) UNIQUE ); CREATE TABLE "assets" ( @@ -13,6 +11,7 @@ CREATE TABLE "assets" ( "created_at" TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, "last_modification_at" TIMESTAMP(6) WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, "name" VARCHAR NOT NULL, + "icon_path" VARCHAR(50) NOT NULL, "address" CHAR(42) UNIQUE NOT NULL, "decimals" fraction NOT NULL, "symbol" VARCHAR NOT NULL, @@ -43,7 +42,7 @@ CREATE TABLE "deposits" ( "asset" CHAR(42) NOT NULL, "amount" fraction NOT NULL, "tx_hash" CHAR(66) NOT NULL, - "confirmations" fraction NOT NULL + "confirmations" confirmations NOT NULL ); CREATE TABLE "withdraws" ( diff --git a/postgres/migrations/03_example_assets.sql b/postgres/migrations/03_example_assets.sql index fe2a2240..53c0b3ad 100644 --- a/postgres/migrations/03_example_assets.sql +++ b/postgres/migrations/03_example_assets.sql @@ -1,8 +1,11 @@ -INSERT INTO "assets" ("name", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES -('Wrapped Bitcoin', '0x5fbdb2315678afecb367f032d93f642f64180aa3', (1000000000000000000, 1), 'BTC', (0, 1), (0, 1), (0, 1)); +INSERT INTO "assets" ("name", "icon_path", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES +('Wrapped Native', '/gfx/asset_icons/generic.svg', '0x5fbdb2315678afecb367f032d93f642f64180aa3', (1000000000000000000, 1), 'WETH', (0, 1), (0, 1), (0, 1)); -INSERT INTO "assets" ("name", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES -('Wrapped Ether', '0xe7f1725e7734ce288f8367e1bb143e90bb3f0512', (1000000000000000000, 1), 'ETH', (0, 1), (0, 1), (0, 1)); +INSERT INTO "assets" ("name", "icon_path", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES +('Wrapped Bitcoin', '/gfx/asset_icons/btc.svg', '0xe7f1725e7734ce288f8367e1bb143e90bb3f0512', (1000000000000000000, 1), 'BTC', (0, 1), (0, 1), (0, 1)); -INSERT INTO "assets" ("name", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES -('Tether USD', '0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0', (1000000000000000000, 1), 'USDT', (0, 1), (0, 1), (0, 1)); +INSERT INTO "assets" ("name", "icon_path", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES +('Wrapped Ether', '/gfx/asset_icons/eth.svg', '0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0', (1000000000000000000, 1), 'ETH', (0, 1), (0, 1), (0, 1)); + +INSERT INTO "assets" ("name", "icon_path", "address", "decimals", "symbol", "maker_fee", "taker_fee", "transfer_fee") VALUES +('Tether USD', '/gfx/asset_icons/usdt.svg', '0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9', (1000000000000000000, 1), 'USDT', (0, 1), (0, 1), (0, 1)); diff --git a/postgres/migrations/04_perpetual_account.sql b/postgres/migrations/04_perpetual_account.sql index 99795bac..0e3ed6cd 100644 --- a/postgres/migrations/04_perpetual_account.sql +++ b/postgres/migrations/04_perpetual_account.sql @@ -1,4 +1,5 @@ -INSERT INTO "users" ("id", "address") VALUES ('00000000-0000-0000-0000-000000000000', '0x0000000000000000000000000000000000000000'); +INSERT INTO "users" ("id", "address", "name") VALUES +('00000000-0000-0000-0000-000000000000', '0x0000000000000000000000000000000000000000', 'External'); DO $$ DECLARE @@ -20,4 +21,4 @@ BEGIN LOOP INSERT INTO "valuts" ("user_id","asset_id","balance") VALUES ('ce3876ba-15b7-4409-8cf2-035fcc9d8687', asset.id, '{"Finite":{"numer":"0","denom":"1"}}'); END LOOP; -END; $$; \ No newline at end of file +END; $$; diff --git a/readme.md b/readme.md index 8290a77a..7ca1d96e 100644 --- a/readme.md +++ b/readme.md @@ -42,15 +42,17 @@ kubectl config use-context minikube skaffold delete ``` -## run code in production +## deploy code to production To deploy application to production do ```shell kubectl config use-context visoft-prod -skaffold -d registry.internal.visoft.solutions run +kubectl -n ksox-finance create secret generic envs --from-env-file .env +skaffold run ``` To remove application from production do ```shell kubectl config use-context visoft-prod -skaffold -d registry.internal.visoft.solutions delete +skaffold delete +kubectl -n ksox-finance delete secrets envs ``` diff --git a/redis/Dockerfile b/redis/Dockerfile index bf0a7a97..64e064a2 100644 --- a/redis/Dockerfile +++ b/redis/Dockerfile @@ -1 +1 @@ -FROM redis +FROM redis:7.2-alpine diff --git a/redis/k8s/redis.yaml b/redis/k8s/redis.yaml index 1f571686..6f9fe2f8 100644 --- a/redis/k8s/redis.yaml +++ b/redis/k8s/redis.yaml @@ -20,7 +20,7 @@ spec: claimName: redis-pv-claim containers: - name: redis-database - image: redis-database + image: registry.internal.visoft.solutions/redis-database ports: - containerPort: 6379 volumeMounts: @@ -28,11 +28,11 @@ spec: name: redis-pv-storage resources: requests: - memory: 300Mi - cpu: 300m + memory: 100Mi + cpu: 100m limits: - memory: 500Mi - cpu: 500m + memory: 200Mi + cpu: 200m --- apiVersion: v1 kind: Service diff --git a/server/.sqlx/query-019aa7745e3990bf1ae40d85928c71b816baa3f16fc1456fb6a9ab9049a14be7.json b/server/.sqlx/query-019aa7745e3990bf1ae40d85928c71b816baa3f16fc1456fb6a9ab9049a14be7.json new file mode 100644 index 00000000..c2ba1116 --- /dev/null +++ b/server/.sqlx/query-019aa7745e3990bf1ae40d85928c71b816baa3f16fc1456fb6a9ab9049a14be7.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE users\n SET\n last_modification_at = $2,\n name = $3\n WHERE users.id = $1\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid", + "Timestamptz", + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "019aa7745e3990bf1ae40d85928c71b816baa3f16fc1456fb6a9ab9049a14be7" +} diff --git a/server/.sqlx/query-eb7e895e0be227d2861a7830da64ae752d3192e9ac3dbc4224d40d5cfa8f7120.json b/server/.sqlx/query-06ad56c2d23be1d7fa917adff81118725d75c2f8ef978dcfcdc5ef10e4978deb.json similarity index 66% rename from server/.sqlx/query-eb7e895e0be227d2861a7830da64ae752d3192e9ac3dbc4224d40d5cfa8f7120.json rename to server/.sqlx/query-06ad56c2d23be1d7fa917adff81118725d75c2f8ef978dcfcdc5ef10e4978deb.json index 3ca8d5f7..2d76e28e 100644 --- a/server/.sqlx/query-eb7e895e0be227d2861a7830da64ae752d3192e9ac3dbc4224d40d5cfa8f7120.json +++ b/server/.sqlx/query-06ad56c2d23be1d7fa917adff81118725d75c2f8ef978dcfcdc5ef10e4978deb.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name,\n users.phone,\n users.email\n FROM users\n WHERE users.address = $1\n ", + "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name\n FROM users\n WHERE users.address = $1\n ", "describe": { "columns": [ { @@ -27,16 +27,6 @@ "ordinal": 4, "name": "name", "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "phone", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" } ], "parameters": { @@ -49,10 +39,8 @@ false, false, false, - true, - true, true ] }, - "hash": "eb7e895e0be227d2861a7830da64ae752d3192e9ac3dbc4224d40d5cfa8f7120" + "hash": "06ad56c2d23be1d7fa917adff81118725d75c2f8ef978dcfcdc5ef10e4978deb" } diff --git a/server/.sqlx/query-6b1fba29ad84d95ede006c42a6968dc742a3aecc803573f6ccdce30210e28de5.json b/server/.sqlx/query-08f3dbb78979f7238e81b1d1231161a56aee83854db32f34b7b6da7dc9f99963.json similarity index 67% rename from server/.sqlx/query-6b1fba29ad84d95ede006c42a6968dc742a3aecc803573f6ccdce30210e28de5.json rename to server/.sqlx/query-08f3dbb78979f7238e81b1d1231161a56aee83854db32f34b7b6da7dc9f99963.json index 2f1be6c1..14ce9de7 100644 --- a/server/.sqlx/query-6b1fba29ad84d95ede006c42a6968dc742a3aecc803573f6ccdce30210e28de5.json +++ b/server/.sqlx/query-08f3dbb78979f7238e81b1d1231161a56aee83854db32f34b7b6da7dc9f99963.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name,\n users.phone,\n users.email\n FROM users\n WHERE users.id = $1\n ", + "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name\n FROM users\n WHERE users.id = $1\n ", "describe": { "columns": [ { @@ -27,16 +27,6 @@ "ordinal": 4, "name": "name", "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "phone", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" } ], "parameters": { @@ -49,10 +39,8 @@ false, false, false, - true, - true, true ] }, - "hash": "6b1fba29ad84d95ede006c42a6968dc742a3aecc803573f6ccdce30210e28de5" + "hash": "08f3dbb78979f7238e81b1d1231161a56aee83854db32f34b7b6da7dc9f99963" } diff --git a/server/.sqlx/query-150a7a27b34c1b33906986cae8813060cd266f3c8acb4bd64c31a5025c680852.json b/server/.sqlx/query-150a7a27b34c1b33906986cae8813060cd266f3c8acb4bd64c31a5025c680852.json new file mode 100644 index 00000000..eea04178 --- /dev/null +++ b/server/.sqlx/query-150a7a27b34c1b33906986cae8813060cd266f3c8acb4bd64c31a5025c680852.json @@ -0,0 +1,135 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n transfers.id,\n transfers.created_at,\n from_valuts.user_id as from_user_id,\n from_users.address as \"from_user_address: Address\",\n from_users.name as from_user_name,\n to_valuts.user_id as to_user_id,\n to_users.address as \"to_user_address: Address\",\n to_users.name as to_user_name,\n assets.id as asset_id,\n assets.icon_path as asset_icon_path,\n assets.name as asset_name,\n assets.symbol as asset_symbol,\n transfers.amount as \"amount: Fraction\",\n transfers.fee as \"fee: Fraction\"\n FROM transfers\n JOIN valuts from_valuts ON transfers.from_valut_id = from_valuts.id\n JOIN valuts to_valuts ON transfers.to_valut_id = to_valuts.id\n JOIN assets ON transfers.asset_id = assets.id\n JOIN users from_users ON from_valuts.user_id = from_users.id\n JOIN users to_users ON to_valuts.user_id = to_users.id\n WHERE (to_valuts.user_id = $1 AND from_valuts.user_id = $2)\n OR (to_valuts.user_id = $2 AND from_valuts.user_id = $1)\n ORDER BY transfers.created_at DESC\n LIMIT $3\n OFFSET $4\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 2, + "name": "from_user_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "from_user_address: Address", + "type_info": "Bpchar" + }, + { + "ordinal": 4, + "name": "from_user_name", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "to_user_id", + "type_info": "Uuid" + }, + { + "ordinal": 6, + "name": "to_user_address: Address", + "type_info": "Bpchar" + }, + { + "ordinal": 7, + "name": "to_user_name", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "asset_id", + "type_info": "Uuid" + }, + { + "ordinal": 9, + "name": "asset_icon_path", + "type_info": "Varchar" + }, + { + "ordinal": 10, + "name": "asset_name", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "asset_symbol", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "amount: Fraction", + "type_info": { + "Custom": { + "name": "fraction", + "kind": { + "Composite": [ + [ + "numer", + "Numeric" + ], + [ + "denom", + "Numeric" + ] + ] + } + } + } + }, + { + "ordinal": 13, + "name": "fee: Fraction", + "type_info": { + "Custom": { + "name": "fraction", + "kind": { + "Composite": [ + [ + "numer", + "Numeric" + ], + [ + "denom", + "Numeric" + ] + ] + } + } + } + } + ], + "parameters": { + "Left": [ + "Uuid", + "Uuid", + "Int8", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "150a7a27b34c1b33906986cae8813060cd266f3c8acb4bd64c31a5025c680852" +} diff --git a/server/.sqlx/query-17d4b67f7903f292cc5b282306c9667b3f0c86d68cf61336b72bff61e6413dea.json b/server/.sqlx/query-17d4b67f7903f292cc5b282306c9667b3f0c86d68cf61336b72bff61e6413dea.json index 754fbce6..9f1c4087 100644 --- a/server/.sqlx/query-17d4b67f7903f292cc5b282306c9667b3f0c86d68cf61336b72bff61e6413dea.json +++ b/server/.sqlx/query-17d4b67f7903f292cc5b282306c9667b3f0c86d68cf61336b72bff61e6413dea.json @@ -64,15 +64,15 @@ "name": "confirmations: Fraction", "type_info": { "Custom": { - "name": "fraction", + "name": "confirmations", "kind": { "Composite": [ [ - "numer", + "actual", "Numeric" ], [ - "denom", + "desired", "Numeric" ] ] diff --git a/server/.sqlx/query-eb2ac548537fc57211d7488a3acacf2b70283d37838e2a3b530a8c8da7f63202.json b/server/.sqlx/query-2326c64e63794382fb8b23d97e2b04ccdc1866401d785d0eced95f74d68dfdd2.json similarity index 59% rename from server/.sqlx/query-eb2ac548537fc57211d7488a3acacf2b70283d37838e2a3b530a8c8da7f63202.json rename to server/.sqlx/query-2326c64e63794382fb8b23d97e2b04ccdc1866401d785d0eced95f74d68dfdd2.json index 5ab689ae..44f1173d 100644 --- a/server/.sqlx/query-eb2ac548537fc57211d7488a3acacf2b70283d37838e2a3b530a8c8da7f63202.json +++ b/server/.sqlx/query-2326c64e63794382fb8b23d97e2b04ccdc1866401d785d0eced95f74d68dfdd2.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE \n deposits\n SET\n confirmations = $2::fraction,\n last_modification_at = $3\n WHERE\n id = $1\n ", + "query": "\n UPDATE \n deposits\n SET\n confirmations = $2::confirmations,\n last_modification_at = $3\n WHERE\n id = $1\n ", "describe": { "columns": [], "parameters": { @@ -8,15 +8,15 @@ "Uuid", { "Custom": { - "name": "fraction", + "name": "confirmations", "kind": { "Composite": [ [ - "numer", + "actual", "Numeric" ], [ - "denom", + "desired", "Numeric" ] ] @@ -28,5 +28,5 @@ }, "nullable": [] }, - "hash": "eb2ac548537fc57211d7488a3acacf2b70283d37838e2a3b530a8c8da7f63202" + "hash": "2326c64e63794382fb8b23d97e2b04ccdc1866401d785d0eced95f74d68dfdd2" } diff --git a/server/.sqlx/query-c939aaefef9adb4ca0638919ce257fd3545d501a2262714119a95bdd38364815.json b/server/.sqlx/query-28d80798d01a45486c5c1eb6e5b302a16e55ea625841d14a6f6cb96f4af389b0.json similarity index 82% rename from server/.sqlx/query-c939aaefef9adb4ca0638919ce257fd3545d501a2262714119a95bdd38364815.json rename to server/.sqlx/query-28d80798d01a45486c5c1eb6e5b302a16e55ea625841d14a6f6cb96f4af389b0.json index 6aed4f9e..ea2cdb5a 100644 --- a/server/.sqlx/query-c939aaefef9adb4ca0638919ce257fd3545d501a2262714119a95bdd38364815.json +++ b/server/.sqlx/query-28d80798d01a45486c5c1eb6e5b302a16e55ea625841d14a6f6cb96f4af389b0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n id,\n created_at,\n last_modification_at,\n name,\n symbol,\n address as \"address: Address\",\n decimals as \"decimals: Fraction\",\n maker_fee as \"maker_fee: Fraction\",\n taker_fee as \"taker_fee: Fraction\",\n transfer_fee as \"transfer_fee: Fraction\"\n FROM assets\n WHERE id = $1\n ", + "query": "\n SELECT\n id,\n created_at,\n last_modification_at,\n name,\n icon_path,\n symbol,\n address as \"address: Address\",\n decimals as \"decimals: Fraction\",\n maker_fee as \"maker_fee: Fraction\",\n taker_fee as \"taker_fee: Fraction\",\n transfer_fee as \"transfer_fee: Fraction\"\n FROM assets\n WHERE id = $1\n ", "describe": { "columns": [ { @@ -25,16 +25,21 @@ }, { "ordinal": 4, - "name": "symbol", + "name": "icon_path", "type_info": "Varchar" }, { "ordinal": 5, + "name": "symbol", + "type_info": "Varchar" + }, + { + "ordinal": 6, "name": "address: Address", "type_info": "Bpchar" }, { - "ordinal": 6, + "ordinal": 7, "name": "decimals: Fraction", "type_info": { "Custom": { @@ -55,7 +60,7 @@ } }, { - "ordinal": 7, + "ordinal": 8, "name": "maker_fee: Fraction", "type_info": { "Custom": { @@ -76,7 +81,7 @@ } }, { - "ordinal": 8, + "ordinal": 9, "name": "taker_fee: Fraction", "type_info": { "Custom": { @@ -97,7 +102,7 @@ } }, { - "ordinal": 9, + "ordinal": 10, "name": "transfer_fee: Fraction", "type_info": { "Custom": { @@ -133,8 +138,9 @@ false, false, false, + false, false ] }, - "hash": "c939aaefef9adb4ca0638919ce257fd3545d501a2262714119a95bdd38364815" + "hash": "28d80798d01a45486c5c1eb6e5b302a16e55ea625841d14a6f6cb96f4af389b0" } diff --git a/server/.sqlx/query-11ec484abd90476622e7a9cee000d5f941565ae67d155885a3ba105330b33d52.json b/server/.sqlx/query-31fe7566af95d71f2144da3f73b63faceba49960b04086c27c7fa401499dbef5.json similarity index 71% rename from server/.sqlx/query-11ec484abd90476622e7a9cee000d5f941565ae67d155885a3ba105330b33d52.json rename to server/.sqlx/query-31fe7566af95d71f2144da3f73b63faceba49960b04086c27c7fa401499dbef5.json index 2897677f..25c1636f 100644 --- a/server/.sqlx/query-11ec484abd90476622e7a9cee000d5f941565ae67d155885a3ba105330b33d52.json +++ b/server/.sqlx/query-31fe7566af95d71f2144da3f73b63faceba49960b04086c27c7fa401499dbef5.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO \n users\n (last_modification_at, address) VALUES ($1, $2)\n RETURNING id, created_at, last_modification_at, address as \"address: Address\", users.name, users.phone, users.email\n ", + "query": "\n INSERT INTO \n users\n (last_modification_at, address) VALUES ($1, $2)\n RETURNING id, created_at, last_modification_at, address as \"address: Address\", users.name\n ", "describe": { "columns": [ { @@ -27,16 +27,6 @@ "ordinal": 4, "name": "name", "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "phone", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" } ], "parameters": { @@ -50,10 +40,8 @@ false, false, false, - true, - true, true ] }, - "hash": "11ec484abd90476622e7a9cee000d5f941565ae67d155885a3ba105330b33d52" + "hash": "31fe7566af95d71f2144da3f73b63faceba49960b04086c27c7fa401499dbef5" } diff --git a/server/.sqlx/query-45f12473415796781c6672e01133e4f282138732c1fd2fdfa6b09fd3080f9699.json b/server/.sqlx/query-35dd857384048f37e46d8d81388d6713dc80dca9d02c1affd7bfcdeb7454978f.json similarity index 76% rename from server/.sqlx/query-45f12473415796781c6672e01133e4f282138732c1fd2fdfa6b09fd3080f9699.json rename to server/.sqlx/query-35dd857384048f37e46d8d81388d6713dc80dca9d02c1affd7bfcdeb7454978f.json index 1807ac69..f9d480ae 100644 --- a/server/.sqlx/query-45f12473415796781c6672e01133e4f282138732c1fd2fdfa6b09fd3080f9699.json +++ b/server/.sqlx/query-35dd857384048f37e46d8d81388d6713dc80dca9d02c1affd7bfcdeb7454978f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n INSERT INTO deposits\n (created_at, last_modification_at, owner, spender, asset, amount, tx_hash, confirmations)\n VALUES\n ($1, $2, $3, $4, $5, $6::fraction, $7, $8::fraction)\n RETURNING \n id,\n created_at,\n last_modification_at,\n owner as \"owner: Address\",\n spender as \"spender: Address\",\n asset as \"asset: Address\",\n amount as \"amount: Fraction\",\n tx_hash as \"tx_hash: TxHash\",\n confirmations as \"confirmations: Fraction\"\n ", + "query": "\n INSERT INTO deposits\n (created_at, last_modification_at, owner, spender, asset, amount, tx_hash, confirmations)\n VALUES\n ($1, $2, $3, $4, $5, $6::fraction, $7, $8::confirmations)\n RETURNING \n id,\n created_at,\n last_modification_at,\n owner as \"owner: Address\",\n spender as \"spender: Address\",\n asset as \"asset: Address\",\n amount as \"amount: Fraction\",\n tx_hash as \"tx_hash: TxHash\",\n confirmations as \"confirmations: Confirmations\"\n ", "describe": { "columns": [ { @@ -61,18 +61,18 @@ }, { "ordinal": 8, - "name": "confirmations: Fraction", + "name": "confirmations: Confirmations", "type_info": { "Custom": { - "name": "fraction", + "name": "confirmations", "kind": { "Composite": [ [ - "numer", + "actual", "Numeric" ], [ - "denom", + "desired", "Numeric" ] ] @@ -108,15 +108,15 @@ "Bpchar", { "Custom": { - "name": "fraction", + "name": "confirmations", "kind": { "Composite": [ [ - "numer", + "actual", "Numeric" ], [ - "denom", + "desired", "Numeric" ] ] @@ -137,5 +137,5 @@ false ] }, - "hash": "45f12473415796781c6672e01133e4f282138732c1fd2fdfa6b09fd3080f9699" + "hash": "35dd857384048f37e46d8d81388d6713dc80dca9d02c1affd7bfcdeb7454978f" } diff --git a/server/.sqlx/query-6a76b9d3284b0a75aa38c519e7705e005543f1eeb8fe2d39ce99600f8760ceac.json b/server/.sqlx/query-44424f4836142cd07866875613b2ed36f18261ce756e6e02e29af209fb265fd6.json similarity index 82% rename from server/.sqlx/query-6a76b9d3284b0a75aa38c519e7705e005543f1eeb8fe2d39ce99600f8760ceac.json rename to server/.sqlx/query-44424f4836142cd07866875613b2ed36f18261ce756e6e02e29af209fb265fd6.json index e6d6247f..8033411c 100644 --- a/server/.sqlx/query-6a76b9d3284b0a75aa38c519e7705e005543f1eeb8fe2d39ce99600f8760ceac.json +++ b/server/.sqlx/query-44424f4836142cd07866875613b2ed36f18261ce756e6e02e29af209fb265fd6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n id,\n created_at,\n last_modification_at,\n name,\n symbol,\n address as \"address: Address\",\n decimals as \"decimals: Fraction\",\n maker_fee as \"maker_fee: Fraction\",\n taker_fee as \"taker_fee: Fraction\",\n transfer_fee as \"transfer_fee: Fraction\"\n FROM assets\n ", + "query": "\n SELECT\n id,\n created_at,\n last_modification_at,\n name,\n icon_path,\n symbol,\n address as \"address: Address\",\n decimals as \"decimals: Fraction\",\n maker_fee as \"maker_fee: Fraction\",\n taker_fee as \"taker_fee: Fraction\",\n transfer_fee as \"transfer_fee: Fraction\"\n FROM assets\n ", "describe": { "columns": [ { @@ -25,16 +25,21 @@ }, { "ordinal": 4, - "name": "symbol", + "name": "icon_path", "type_info": "Varchar" }, { "ordinal": 5, + "name": "symbol", + "type_info": "Varchar" + }, + { + "ordinal": 6, "name": "address: Address", "type_info": "Bpchar" }, { - "ordinal": 6, + "ordinal": 7, "name": "decimals: Fraction", "type_info": { "Custom": { @@ -55,7 +60,7 @@ } }, { - "ordinal": 7, + "ordinal": 8, "name": "maker_fee: Fraction", "type_info": { "Custom": { @@ -76,7 +81,7 @@ } }, { - "ordinal": 8, + "ordinal": 9, "name": "taker_fee: Fraction", "type_info": { "Custom": { @@ -97,7 +102,7 @@ } }, { - "ordinal": 9, + "ordinal": 10, "name": "transfer_fee: Fraction", "type_info": { "Custom": { @@ -131,8 +136,9 @@ false, false, false, + false, false ] }, - "hash": "6a76b9d3284b0a75aa38c519e7705e005543f1eeb8fe2d39ce99600f8760ceac" + "hash": "44424f4836142cd07866875613b2ed36f18261ce756e6e02e29af209fb265fd6" } diff --git a/server/.sqlx/query-e417070c9a7f6f16050b361727969537cd9cc3434b6dc560cb2d18ae5c5e3d84.json b/server/.sqlx/query-594838e5487644876e9d9e7f1303a7808181336e793a66a62b8b384285e1c3df.json similarity index 64% rename from server/.sqlx/query-e417070c9a7f6f16050b361727969537cd9cc3434b6dc560cb2d18ae5c5e3d84.json rename to server/.sqlx/query-594838e5487644876e9d9e7f1303a7808181336e793a66a62b8b384285e1c3df.json index bdfe7e39..87fe0242 100644 --- a/server/.sqlx/query-e417070c9a7f6f16050b361727969537cd9cc3434b6dc560cb2d18ae5c5e3d84.json +++ b/server/.sqlx/query-594838e5487644876e9d9e7f1303a7808181336e793a66a62b8b384285e1c3df.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name,\n users.phone,\n users.email\n FROM users\n WHERE users.last_modification_at > $1\n ORDER BY last_modification_at ASC\n ", + "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name\n FROM users\n WHERE users.last_modification_at > $1\n ORDER BY last_modification_at ASC\n ", "describe": { "columns": [ { @@ -27,16 +27,6 @@ "ordinal": 4, "name": "name", "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "phone", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" } ], "parameters": { @@ -49,10 +39,8 @@ false, false, false, - true, - true, true ] }, - "hash": "e417070c9a7f6f16050b361727969537cd9cc3434b6dc560cb2d18ae5c5e3d84" + "hash": "594838e5487644876e9d9e7f1303a7808181336e793a66a62b8b384285e1c3df" } diff --git a/server/.sqlx/query-5726f97626805f6c5a74c31a25162b0456c4e71749775b7662a33affa93fd615.json b/server/.sqlx/query-6c358ff5e101b175bd7ae07efc0a881cc27bda840f337e611c77d69d6945e0fc.json similarity index 68% rename from server/.sqlx/query-5726f97626805f6c5a74c31a25162b0456c4e71749775b7662a33affa93fd615.json rename to server/.sqlx/query-6c358ff5e101b175bd7ae07efc0a881cc27bda840f337e611c77d69d6945e0fc.json index c0209117..e5725a41 100644 --- a/server/.sqlx/query-5726f97626805f6c5a74c31a25162b0456c4e71749775b7662a33affa93fd615.json +++ b/server/.sqlx/query-6c358ff5e101b175bd7ae07efc0a881cc27bda840f337e611c77d69d6945e0fc.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name,\n users.phone,\n users.email\n FROM users\n ", + "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: Address\",\n users.name\n FROM users\n ", "describe": { "columns": [ { @@ -27,16 +27,6 @@ "ordinal": 4, "name": "name", "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "phone", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" } ], "parameters": { @@ -47,10 +37,8 @@ false, false, false, - true, - true, true ] }, - "hash": "5726f97626805f6c5a74c31a25162b0456c4e71749775b7662a33affa93fd615" + "hash": "6c358ff5e101b175bd7ae07efc0a881cc27bda840f337e611c77d69d6945e0fc" } diff --git a/server/.sqlx/query-3e5366a5b1856ed3d7ff6f8661f24b34610af6c221701e32818b83800bdd25cd.json b/server/.sqlx/query-a901d740be8d1274d88fc516f07ed80233bc0abf38e4fdef00ed1f78da94e75f.json similarity index 64% rename from server/.sqlx/query-3e5366a5b1856ed3d7ff6f8661f24b34610af6c221701e32818b83800bdd25cd.json rename to server/.sqlx/query-a901d740be8d1274d88fc516f07ed80233bc0abf38e4fdef00ed1f78da94e75f.json index ac2cf626..e662e7c9 100644 --- a/server/.sqlx/query-3e5366a5b1856ed3d7ff6f8661f24b34610af6c221701e32818b83800bdd25cd.json +++ b/server/.sqlx/query-a901d740be8d1274d88fc516f07ed80233bc0abf38e4fdef00ed1f78da94e75f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: EvmAddress\",\n users.name,\n users.phone,\n users.email\n FROM users\n WHERE users.last_modification_at > $1\n ORDER BY last_modification_at ASC\n ", + "query": "\n SELECT\n users.id,\n users.created_at,\n users.last_modification_at,\n users.address as \"address: EvmAddress\",\n users.name\n FROM users\n WHERE users.last_modification_at > $1\n ORDER BY last_modification_at ASC\n ", "describe": { "columns": [ { @@ -27,16 +27,6 @@ "ordinal": 4, "name": "name", "type_info": "Varchar" - }, - { - "ordinal": 5, - "name": "phone", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "email", - "type_info": "Varchar" } ], "parameters": { @@ -49,10 +39,8 @@ false, false, false, - true, - true, true ] }, - "hash": "3e5366a5b1856ed3d7ff6f8661f24b34610af6c221701e32818b83800bdd25cd" + "hash": "a901d740be8d1274d88fc516f07ed80233bc0abf38e4fdef00ed1f78da94e75f" } diff --git a/server/.sqlx/query-affbcd2c5e78ccacaecd710113fa35c36387c1945c02caa9852c1c98566706ce.json b/server/.sqlx/query-affbcd2c5e78ccacaecd710113fa35c36387c1945c02caa9852c1c98566706ce.json deleted file mode 100644 index 7120eae1..00000000 --- a/server/.sqlx/query-affbcd2c5e78ccacaecd710113fa35c36387c1945c02caa9852c1c98566706ce.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE users\n SET\n last_modification_at = $2,\n name = $3,\n phone = $4,\n email = $5\n WHERE users.id = $1\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Uuid", - "Timestamptz", - "Varchar", - "Varchar", - "Varchar" - ] - }, - "nullable": [] - }, - "hash": "affbcd2c5e78ccacaecd710113fa35c36387c1945c02caa9852c1c98566706ce" -} diff --git a/server/.sqlx/query-beed1a9bdf3b036e0e1fa4a3ce42b7554490cc08f124a1bf740cc82888bceb0a.json b/server/.sqlx/query-beed1a9bdf3b036e0e1fa4a3ce42b7554490cc08f124a1bf740cc82888bceb0a.json new file mode 100644 index 00000000..480fe901 --- /dev/null +++ b/server/.sqlx/query-beed1a9bdf3b036e0e1fa4a3ce42b7554490cc08f124a1bf740cc82888bceb0a.json @@ -0,0 +1,132 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n transfers.id,\n transfers.created_at,\n from_valuts.user_id as from_user_id,\n from_users.address as \"from_user_address: Address\",\n from_users.name as from_user_name,\n to_valuts.user_id as to_user_id,\n to_users.address as \"to_user_address: Address\",\n to_users.name as to_user_name,\n assets.id as asset_id,\n assets.icon_path as asset_icon_path,\n assets.name as asset_name,\n assets.symbol as asset_symbol,\n transfers.amount as \"amount: Fraction\",\n transfers.fee as \"fee: Fraction\"\n FROM transfers\n JOIN valuts from_valuts ON transfers.from_valut_id = from_valuts.id\n JOIN valuts to_valuts ON transfers.to_valut_id = to_valuts.id\n JOIN assets ON transfers.asset_id = assets.id\n JOIN users from_users ON from_valuts.user_id = from_users.id\n JOIN users to_users ON to_valuts.user_id = to_users.id\n WHERE transfers.id = ANY($1)\n ORDER BY transfers.created_at DESC\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 2, + "name": "from_user_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "from_user_address: Address", + "type_info": "Bpchar" + }, + { + "ordinal": 4, + "name": "from_user_name", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "to_user_id", + "type_info": "Uuid" + }, + { + "ordinal": 6, + "name": "to_user_address: Address", + "type_info": "Bpchar" + }, + { + "ordinal": 7, + "name": "to_user_name", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "asset_id", + "type_info": "Uuid" + }, + { + "ordinal": 9, + "name": "asset_icon_path", + "type_info": "Varchar" + }, + { + "ordinal": 10, + "name": "asset_name", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "asset_symbol", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "amount: Fraction", + "type_info": { + "Custom": { + "name": "fraction", + "kind": { + "Composite": [ + [ + "numer", + "Numeric" + ], + [ + "denom", + "Numeric" + ] + ] + } + } + } + }, + { + "ordinal": 13, + "name": "fee: Fraction", + "type_info": { + "Custom": { + "name": "fraction", + "kind": { + "Composite": [ + [ + "numer", + "Numeric" + ], + [ + "denom", + "Numeric" + ] + ] + } + } + } + } + ], + "parameters": { + "Left": [ + "UuidArray" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "beed1a9bdf3b036e0e1fa4a3ce42b7554490cc08f124a1bf740cc82888bceb0a" +} diff --git a/server/.sqlx/query-dc1d902015380c03c0c5d7fd7f50a23bd56c5c9a72a8a63fdbe61a2ab0857873.json b/server/.sqlx/query-dc1d902015380c03c0c5d7fd7f50a23bd56c5c9a72a8a63fdbe61a2ab0857873.json index c0410fc8..647a8aad 100644 --- a/server/.sqlx/query-dc1d902015380c03c0c5d7fd7f50a23bd56c5c9a72a8a63fdbe61a2ab0857873.json +++ b/server/.sqlx/query-dc1d902015380c03c0c5d7fd7f50a23bd56c5c9a72a8a63fdbe61a2ab0857873.json @@ -64,15 +64,15 @@ "name": "confirmations: Fraction", "type_info": { "Custom": { - "name": "fraction", + "name": "confirmations", "kind": { "Composite": [ [ - "numer", + "actual", "Numeric" ], [ - "denom", + "desired", "Numeric" ] ] diff --git a/server/.sqlx/query-ec7dc9edd5d29c0fd921f3ffcf5828b9c8ca045b3822f6a502da0fbe3e00553f.json b/server/.sqlx/query-ec7dc9edd5d29c0fd921f3ffcf5828b9c8ca045b3822f6a502da0fbe3e00553f.json new file mode 100644 index 00000000..6fcb6ff6 --- /dev/null +++ b/server/.sqlx/query-ec7dc9edd5d29c0fd921f3ffcf5828b9c8ca045b3822f6a502da0fbe3e00553f.json @@ -0,0 +1,134 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n transfers.id,\n transfers.created_at,\n from_valuts.user_id as from_user_id,\n from_users.address as \"from_user_address: Address\",\n from_users.name as from_user_name,\n to_valuts.user_id as to_user_id,\n to_users.address as \"to_user_address: Address\",\n to_users.name as to_user_name,\n assets.id as asset_id,\n assets.icon_path as asset_icon_path,\n assets.name as asset_name,\n assets.symbol as asset_symbol,\n transfers.amount as \"amount: Fraction\",\n transfers.fee as \"fee: Fraction\"\n FROM transfers\n JOIN valuts from_valuts ON transfers.from_valut_id = from_valuts.id\n JOIN valuts to_valuts ON transfers.to_valut_id = to_valuts.id\n JOIN assets ON transfers.asset_id = assets.id\n JOIN users from_users ON from_valuts.user_id = from_users.id\n JOIN users to_users ON to_valuts.user_id = to_users.id\n WHERE to_valuts.user_id = $1 OR from_valuts.user_id = $1\n ORDER BY transfers.created_at DESC\n LIMIT $2\n OFFSET $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Uuid" + }, + { + "ordinal": 1, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 2, + "name": "from_user_id", + "type_info": "Uuid" + }, + { + "ordinal": 3, + "name": "from_user_address: Address", + "type_info": "Bpchar" + }, + { + "ordinal": 4, + "name": "from_user_name", + "type_info": "Varchar" + }, + { + "ordinal": 5, + "name": "to_user_id", + "type_info": "Uuid" + }, + { + "ordinal": 6, + "name": "to_user_address: Address", + "type_info": "Bpchar" + }, + { + "ordinal": 7, + "name": "to_user_name", + "type_info": "Varchar" + }, + { + "ordinal": 8, + "name": "asset_id", + "type_info": "Uuid" + }, + { + "ordinal": 9, + "name": "asset_icon_path", + "type_info": "Varchar" + }, + { + "ordinal": 10, + "name": "asset_name", + "type_info": "Varchar" + }, + { + "ordinal": 11, + "name": "asset_symbol", + "type_info": "Varchar" + }, + { + "ordinal": 12, + "name": "amount: Fraction", + "type_info": { + "Custom": { + "name": "fraction", + "kind": { + "Composite": [ + [ + "numer", + "Numeric" + ], + [ + "denom", + "Numeric" + ] + ] + } + } + } + }, + { + "ordinal": 13, + "name": "fee: Fraction", + "type_info": { + "Custom": { + "name": "fraction", + "kind": { + "Composite": [ + [ + "numer", + "Numeric" + ], + [ + "denom", + "Numeric" + ] + ] + } + } + } + } + ], + "parameters": { + "Left": [ + "Uuid", + "Int8", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "ec7dc9edd5d29c0fd921f3ffcf5828b9c8ca045b3822f6a502da0fbe3e00553f" +} diff --git a/server/.sqlx/query-d5409d6550f7915286b6f3ec163e9732ae0ec57b941fea3fcc61e3f4fe89d3f0.json b/server/.sqlx/query-f30755a2654846f2163d85170a29172423db56cc5732f34ef55c34c937c6aee0.json similarity index 80% rename from server/.sqlx/query-d5409d6550f7915286b6f3ec163e9732ae0ec57b941fea3fcc61e3f4fe89d3f0.json rename to server/.sqlx/query-f30755a2654846f2163d85170a29172423db56cc5732f34ef55c34c937c6aee0.json index 2e8a88c8..7bad126b 100644 --- a/server/.sqlx/query-d5409d6550f7915286b6f3ec163e9732ae0ec57b941fea3fcc61e3f4fe89d3f0.json +++ b/server/.sqlx/query-f30755a2654846f2163d85170a29172423db56cc5732f34ef55c34c937c6aee0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT\n id,\n created_at,\n last_modification_at,\n name,\n symbol,\n address as \"address: Address\",\n decimals as \"decimals: Fraction\",\n maker_fee as \"maker_fee: Fraction\",\n taker_fee as \"taker_fee: Fraction\",\n transfer_fee as \"transfer_fee: Fraction\"\n FROM assets\n WHERE last_modification_at > $1\n ORDER BY last_modification_at ASC\n ", + "query": "\n SELECT\n id,\n created_at,\n last_modification_at,\n name,\n icon_path,\n symbol,\n address as \"address: Address\",\n decimals as \"decimals: Fraction\",\n maker_fee as \"maker_fee: Fraction\",\n taker_fee as \"taker_fee: Fraction\",\n transfer_fee as \"transfer_fee: Fraction\"\n FROM assets\n WHERE last_modification_at > $1\n ORDER BY last_modification_at ASC\n ", "describe": { "columns": [ { @@ -25,16 +25,21 @@ }, { "ordinal": 4, - "name": "symbol", + "name": "icon_path", "type_info": "Varchar" }, { "ordinal": 5, + "name": "symbol", + "type_info": "Varchar" + }, + { + "ordinal": 6, "name": "address: Address", "type_info": "Bpchar" }, { - "ordinal": 6, + "ordinal": 7, "name": "decimals: Fraction", "type_info": { "Custom": { @@ -55,7 +60,7 @@ } }, { - "ordinal": 7, + "ordinal": 8, "name": "maker_fee: Fraction", "type_info": { "Custom": { @@ -76,7 +81,7 @@ } }, { - "ordinal": 8, + "ordinal": 9, "name": "taker_fee: Fraction", "type_info": { "Custom": { @@ -97,7 +102,7 @@ } }, { - "ordinal": 9, + "ordinal": 10, "name": "transfer_fee: Fraction", "type_info": { "Custom": { @@ -133,8 +138,9 @@ false, false, false, + false, false ] }, - "hash": "d5409d6550f7915286b6f3ec163e9732ae0ec57b941fea3fcc61e3f4fe89d3f0" + "hash": "f30755a2654846f2163d85170a29172423db56cc5732f34ef55c34c937c6aee0" } diff --git a/server/Cargo.lock b/server/Cargo.lock index 3ccba72c..1d754eae 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -52,9 +52,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -107,6 +107,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" +[[package]] +name = "array-init" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" +dependencies = [ + "nodrop", +] + [[package]] name = "arrayvec" version = "0.7.4" @@ -260,9 +269,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -299,9 +308,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bech32" -version = "0.7.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" [[package]] name = "bigdecimal" @@ -314,15 +323,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -353,16 +353,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bitvec" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] - [[package]] name = "bitvec" version = "1.0.1" @@ -370,20 +360,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", - "radium 0.7.0", + "radium", "tap", "wyz", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -429,11 +410,12 @@ dependencies = [ [[package]] name = "bs58" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.9.9", + "sha2", + "tinyvec", ] [[package]] @@ -510,9 +492,9 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.15.4" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" dependencies = [ "camino", "cargo-platform", @@ -524,9 +506,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", "libc", @@ -566,56 +548,52 @@ dependencies = [ [[package]] name = "coins-bip32" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30a84aab436fcb256a2ab3c80663d8aec686e6bae12827bb05fef3e1e439c9f" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ - "bincode", "bs58", "coins-core", - "digest 0.10.7", - "getrandom", + "digest", "hmac", "k256", - "lazy_static", "serde", - "sha2 0.10.7", + "sha2", "thiserror", ] [[package]] name = "coins-bip39" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f4d04ee18e58356accd644896aeb2094ddeafb6a713e056cef0c0a8e468c15" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ - "bitvec 0.17.4", + "bitvec", "coins-bip32", - "getrandom", "hmac", "once_cell", "pbkdf2 0.12.2", "rand", - "sha2 0.10.7", + "sha2", "thiserror", ] [[package]] name = "coins-core" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b949a1c63fb7eb591eb7ba438746326aedf0ae843e51ec92ba6bec5bb382c4f" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" dependencies = [ "base64 0.21.2", "bech32", "bs58", - "digest 0.10.7", + "digest", "generic-array", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.7", + "sha2", "sha3", "thiserror", ] @@ -634,6 +612,18 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "const-hex" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca268df6cd88e646b564e6aff1a016834e5f42077c736ef6b6789c31ef9ec5dc" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "serde", +] + [[package]] name = "const-oid" version = "0.9.5" @@ -839,9 +829,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" dependencies = [ "serde", ] @@ -869,27 +859,27 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "const-oid", "crypto-common", "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -900,6 +890,18 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -930,7 +932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", - "digest 0.10.7", + "digest", "elliptic-curve", "rfc6979", "signature", @@ -954,7 +956,7 @@ checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ "base16ct", "crypto-bigint", - "digest 0.10.7", + "digest", "ff", "generic-array", "group", @@ -976,9 +978,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] @@ -1050,11 +1052,11 @@ dependencies = [ [[package]] name = "enr" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" +checksum = "0be7b2ac146c1f99fe245c02d16af0696450d8e06c135db75e10eeb9e642c20d" dependencies = [ - "base64 0.13.1", + "base64 0.21.2", "bytes", "hex", "k256", @@ -1062,6 +1064,7 @@ dependencies = [ "rand", "rlp", "serde", + "serde-hex", "sha3", "zeroize", ] @@ -1112,7 +1115,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest 0.10.7", + "digest", "hex", "hmac", "pbkdf2 0.11.0", @@ -1120,7 +1123,7 @@ dependencies = [ "scrypt", "serde", "serde_json", - "sha2 0.10.7", + "sha2", "sha3", "thiserror", "uuid 0.8.2", @@ -1176,9 +1179,9 @@ dependencies = [ [[package]] name = "ethers" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b4026b97da8281276744741fac7eb385da905f6093c583331fa2953fdd4253" +checksum = "9ba3fd516c15a9a587135229466dbbfc85796de55c5660afbbb1b1c78517d85c" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -1192,9 +1195,9 @@ dependencies = [ [[package]] name = "ethers-addressbook" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcb6ffefc230d8c42874c51b28dc11dbb8de50b27a8fdf92648439d6baa68dc" +checksum = "0245617f11b8178fa50b52e433e2c34ac69f39116b62c8be2437decf2edf1986" dependencies = [ "ethers-core", "once_cell", @@ -1204,17 +1207,16 @@ dependencies = [ [[package]] name = "ethers-contract" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4719a44c3d37ab07c6dea99ab174068d8c35e441b60b6c20ce4e48357273e8" +checksum = "02bb80fd2c22631a5eb8a02cbf373cc5fd86937fc966bb670b9a884580c8e71c" dependencies = [ + "const-hex", "ethers-contract-abigen", "ethers-contract-derive", "ethers-core", "ethers-providers", - "ethers-signers", "futures-util", - "hex", "once_cell", "pin-project", "serde", @@ -1224,16 +1226,16 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "155ea1b84d169d231317ed86e307af6f2bed6b40dd17e5e94bc84da21cadb21c" +checksum = "22c54db0d393393e732a5b20273e4f8ab89f0cce501c84e75fab9c126799a6e6" dependencies = [ "Inflector", + "const-hex", "dunce", "ethers-core", "ethers-etherscan", "eyre", - "hex", "prettyplease 0.2.12", "proc-macro2", "quote", @@ -1248,14 +1250,14 @@ dependencies = [ [[package]] name = "ethers-contract-derive" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8567ff196c4a37c1a8c90ec73bda0ad2062e191e4f0a6dc4d943e2ec4830fc88" +checksum = "62ee4f216184a1304b707ed258f4f70aa40bf7e1522ab8963d127a8d516eaa1a" dependencies = [ "Inflector", + "const-hex", "ethers-contract-abigen", "ethers-core", - "hex", "proc-macro2", "quote", "serde_json", @@ -1264,18 +1266,18 @@ dependencies = [ [[package]] name = "ethers-core" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60ca2514feb98918a0a31de7e1983c29f2267ebf61b2dc5d4294f91e5b866623" +checksum = "8c29523f73c12753165781c6e5dc11c84d3e44c080a15f7c6cfbd70b514cb6f1" dependencies = [ "arrayvec", "bytes", "cargo_metadata", "chrono", + "const-hex", "elliptic-curve", "ethabi", "generic-array", - "hex", "k256", "num_enum", "once_cell", @@ -1294,9 +1296,9 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22b3a8269d3df0ed6364bc05b4735b95f4bf830ce3aef87d5e760fb0e93e5b91" +checksum = "4aab5af432b3fe5b7756b60df5c9ddeb85a13414575ad8a9acd707c24f0a77a5" dependencies = [ "ethers-core", "reqwest", @@ -1309,9 +1311,9 @@ dependencies = [ [[package]] name = "ethers-middleware" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c339aad74ae5c451d27e0e49c7a3c7d22620b119b4f9291d7aa21f72d7f366" +checksum = "356151d5ded56d4918146366abc9dfc9df367cf0096492a7a5477b21b7693615" dependencies = [ "async-trait", "auto_impl", @@ -1336,14 +1338,15 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b411b119f1cf0efb69e2190883dee731251882bb21270f893ee9513b3a697c48" +checksum = "00c84664b294e47fc2860d6db0db0246f79c4c724e552549631bb9505b834bee" dependencies = [ "async-trait", "auto_impl", "base64 0.21.2", "bytes", + "const-hex", "enr", "ethers-core", "futures-channel", @@ -1351,9 +1354,9 @@ dependencies = [ "futures-timer", "futures-util", "hashers", - "hex", "http", "instant", + "jsonwebtoken", "once_cell", "pin-project", "reqwest", @@ -1373,34 +1376,35 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4864d387456a9c09a1157fa10e1528b29d90f1d859443acf06a1b23365fb518c" +checksum = "170b299698702ef1f53d2275af7d6d97409cfa4f9398ee9ff518f6bc9102d0ad" dependencies = [ "async-trait", "coins-bip32", "coins-bip39", + "const-hex", "elliptic-curve", "eth-keystore", "ethers-core", - "hex", "rand", - "sha2 0.10.7", + "sha2", "thiserror", "tracing", ] [[package]] name = "ethers-solc" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6c2b9625a2c639d46625f88acc2092a3cb35786c37f7c2128b3ca20f639b3c" +checksum = "66559c8f774712df303c907d087275a52a2046b256791aaa566d5abc8ea66731" dependencies = [ "cfg-if", + "const-hex", + "dirs", "dunce", "ethers-core", "glob", - "hex", "home", "md-5", "num_cpus", @@ -1432,6 +1436,7 @@ name = "evm" version = "0.1.0" dependencies = [ "ethereum-types", + "num-bigint", "prefix-hex", "serde", "sqlx", @@ -1721,17 +1726,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "glob" @@ -1764,9 +1767,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -1876,7 +1879,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -2172,6 +2175,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.2", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "k256" version = "0.13.1" @@ -2182,7 +2199,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.7", + "sha2", "signature", ] @@ -2303,13 +2320,19 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "md-5" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -2416,6 +2439,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + [[package]] name = "nom" version = "7.1.3" @@ -2444,9 +2473,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "arbitrary", "autocfg", @@ -2469,7 +2498,7 @@ dependencies = [ "num-iter", "num-traits", "rand", - "smallvec", + "smallvec 1.11.0", "zeroize", ] @@ -2549,18 +2578,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2570,9 +2599,9 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" dependencies = [ "memchr", ] @@ -2583,12 +2612,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "open-fastrlp" version = "0.1.4" @@ -2658,11 +2681,17 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-float" -version = "3.8.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7417b1484e3641a8791af3c3123cdc083ac60a0d262a2f281b6125d58917caf4" +checksum = "2a54938017eacd63036332b4ae5c8a49fc8c0c1d6d629893057e4f13609edd06" dependencies = [ "num-traits", "rand", @@ -2682,7 +2711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" dependencies = [ "arrayvec", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "impl-trait-for-tuples", "parity-scale-codec-derive", @@ -2720,7 +2749,7 @@ dependencies = [ "cfg-if", "libc", "redox_syscall 0.3.5", - "smallvec", + "smallvec 1.11.0", "windows-targets", ] @@ -2753,10 +2782,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.7", + "digest", "hmac", "password-hash", - "sha2 0.10.7", + "sha2", ] [[package]] @@ -2765,10 +2794,19 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest 0.10.7", + "digest", "hmac", ] +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -3149,12 +3187,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "radium" version = "0.7.0" @@ -3317,9 +3349,9 @@ checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ "base64 0.21.2", "bytes", @@ -3353,7 +3385,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.22.6", + "webpki-roots 0.25.2", "winreg", ] @@ -3388,7 +3420,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -3421,7 +3453,7 @@ checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" dependencies = [ "byteorder", "const-oid", - "digest 0.10.7", + "digest", "num-bigint-dig", "num-integer", "num-iter", @@ -3477,7 +3509,7 @@ checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", - "rustls-webpki 0.101.3", + "rustls-webpki 0.101.4", "sct", ] @@ -3502,9 +3534,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.3" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261e9e0888cba427c3316e6322805653c9425240b6fd96cee7cb671ab70ab8d0" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring", "untrusted", @@ -3609,7 +3641,7 @@ dependencies = [ "hmac", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.7", + "sha2", ] [[package]] @@ -3688,18 +3720,29 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.183" +version = "1.0.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" +checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" dependencies = [ "serde_derive", ] +[[package]] +name = "serde-hex" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca37e3e4d1b39afd7ff11ee4e947efae85adfddf4841787bfa47c470e96dc26d" +dependencies = [ + "array-init", + "serde", + "smallvec 0.6.14", +] + [[package]] name = "serde_derive" -version = "1.0.183" +version = "1.0.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" +checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" dependencies = [ "proc-macro2", "quote", @@ -3750,9 +3793,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1402f54f9a3b9e2efe71c1cea24e648acce55887983553eeb858cf3115acfd49" +checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" dependencies = [ "base64 0.21.2", "chrono", @@ -3762,14 +3805,14 @@ dependencies = [ "serde", "serde_json", "serde_with_macros", - "time 0.3.25", + "time 0.3.27", ] [[package]] name = "serde_with_macros" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9197f1ad0e3c173a0222d3c4404fb04c3afe87e962bcb327af73e8301fa203c7" +checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" dependencies = [ "darling", "proc-macro2", @@ -3785,7 +3828,7 @@ checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -3794,19 +3837,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.7" @@ -3815,7 +3845,7 @@ checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", + "digest", ] [[package]] @@ -3824,7 +3854,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.7", + "digest", "keccak", ] @@ -3852,7 +3882,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ - "digest 0.10.7", + "digest", "rand_core", ] @@ -3869,6 +3899,18 @@ dependencies = [ "wide", ] +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time 0.3.27", +] + [[package]] name = "siphasher" version = "0.3.10" @@ -3877,13 +3919,22 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] +[[package]] +name = "smallvec" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + [[package]] name = "smallvec" version = "1.11.0" @@ -4006,8 +4057,8 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "sha2 0.10.7", - "smallvec", + "sha2", + "smallvec 1.11.0", "sqlformat", "thiserror", "tokio", @@ -4045,7 +4096,7 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.7", + "sha2", "sqlx-core", "sqlx-mysql", "sqlx-postgres", @@ -4070,7 +4121,7 @@ dependencies = [ "bytes", "chrono", "crc", - "digest 0.10.7", + "digest", "dotenvy", "either", "futures-channel", @@ -4091,8 +4142,8 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2 0.10.7", - "smallvec", + "sha2", + "smallvec 1.11.0", "sqlx-core", "stringprep", "thiserror", @@ -4134,8 +4185,8 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2 0.10.7", - "smallvec", + "sha2", + "smallvec 1.11.0", "sqlx-core", "stringprep", "thiserror", @@ -4233,19 +4284,19 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "svm-rs" -version = "0.2.23" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a04fc4f5cd35c700153b233f5575ccb3237e0f941fa5049d9e98254d10bf2fe" +checksum = "597e3a746727984cb7ea2487b6a40726cad0dbe86628e7d429aa6b8c4c153db4" dependencies = [ + "dirs", "fs2", "hex", - "home", "once_cell", "reqwest", "semver", "serde", "serde_json", - "sha2 0.10.7", + "sha2", "thiserror", "url", "zip", @@ -4287,9 +4338,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.7.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", @@ -4352,9 +4403,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.25" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" +checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" dependencies = [ "deranged", "itoa", @@ -4371,9 +4422,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" +checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" dependencies = [ "time-core", ] @@ -4475,9 +4526,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec509ac96e9a0c43427c74f003127d953a265737636129424288d27cb5c4b12c" +checksum = "2b2dbec703c26b00d74844519606ef15d09a7d6857860f84ad223dec002ddea2" dependencies = [ "futures-util", "log", @@ -4544,6 +4595,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ + "async-stream", "async-trait", "axum", "base64 0.21.2", @@ -4558,7 +4610,9 @@ dependencies = [ "percent-encoding", "pin-project", "prost", + "rustls-pemfile", "tokio", + "tokio-rustls", "tokio-stream", "tower", "tower-layer", @@ -4674,7 +4728,7 @@ checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ "nu-ansi-term", "sharded-slab", - "smallvec", + "smallvec 1.11.0", "thread_local", "tracing-core", "tracing-log", @@ -4688,9 +4742,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "tungstenite" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67" +checksum = "e862a1c4128df0112ab625f55cd5c934bcb4312ba80b39ae4b4835a3fd58e649" dependencies = [ "byteorder", "bytes", @@ -4705,7 +4759,6 @@ dependencies = [ "thiserror", "url", "utf-8", - "webpki", ] [[package]] @@ -4966,33 +5019,20 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" dependencies = [ - "webpki", + "rustls-webpki 0.100.1", ] [[package]] name = "webpki-roots" -version = "0.23.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" -dependencies = [ - "rustls-webpki 0.100.1", -] +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "which" @@ -5072,9 +5112,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f51fb4c64f8b770a823c043c7fad036323e1c48f55287b7bbb7987b2fcdf3b" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -5087,62 +5127,63 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde1bb55ae4ce76a597a8566d82c57432bc69c039449d61572a7a353da28f68c" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1513e8d48365a78adad7322fd6b5e4c4e99d92a69db8df2d435b25b1f1f286d4" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60587c0265d2b842298f5858e1a5d79d146f9ee0c37be5782e92a6eb5e1d7a83" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224fe0e0ffff5d2ea6a29f82026c8f43870038a0ffc247aa95a52b47df381ac4" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62fc52a0f50a088de499712cbc012df7ebd94e2d6eb948435449d76a6287e7ad" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2093925509d91ea3d69bcd20238f4c2ecdb1a29d3c281d026a09705d0dd35f3d" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ade45bc8bf02ae2aa34a9d54ba660a1a58204da34ba793c00d83ca3730b5f1" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.10" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5504cc7644f4b593cbc05c4a55bf9bd4e94b867c3c0bd440934174d50482427d" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys", ] [[package]] @@ -5247,7 +5288,7 @@ dependencies = [ "hmac", "pbkdf2 0.11.0", "sha1", - "time 0.3.25", + "time 0.3.27", "zstd", ] diff --git a/server/blockchain.dockerfile b/server/blockchain.dockerfile index fbdf5679..327f9654 100644 --- a/server/blockchain.dockerfile +++ b/server/blockchain.dockerfile @@ -1,19 +1,15 @@ -FROM rust:slim-bullseye AS chef -# We only pay the installation cost once, -# it will be cached from the second build onwards -RUN rustup toolchain install stable -RUN rustup default stable -RUN apt-get update -RUN apt-get install -y libssl-dev pkg-config protobuf-compiler -RUN apt-get autoremove -RUN cargo install cargo-chef -WORKDIR /app +FROM rust:1-alpine AS chef +# Use apk for package management in Alpine +RUN apk add --no-cache build-base libressl-dev protoc protobuf-dev +RUN cargo install cargo-chef FROM chef AS planner +WORKDIR /app COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder +WORKDIR /app COPY --from=planner /app/recipe.json recipe.json # Build dependencies - this is the caching Docker layer! RUN cargo chef cook --release --recipe-path recipe.json @@ -25,7 +21,6 @@ ENV SQLX_OFFLINE ${SQLX_OFFLINE} RUN cargo build --release -p blockchain # We do not need the Rust toolchain to run the binary! -FROM chef AS runtime -WORKDIR /app +FROM alpine AS runtime COPY --from=builder /app/target/release/blockchain /usr/local/bin -ENTRYPOINT [ "/usr/local/bin/blockchain" ] +ENTRYPOINT [ "blockchain" ] diff --git a/server/blockchain/Cargo.toml b/server/blockchain/Cargo.toml index ad4135c8..35a0eae0 100644 --- a/server/blockchain/Cargo.toml +++ b/server/blockchain/Cargo.toml @@ -9,36 +9,46 @@ async-stream = "0.3.5" chrono = { version = "0.4.26", features = ["serde"] } engine = { path = "../engine" } ethereum-types = "0.14.1" -ethers = { version = "2.0.8", features = ["ws", "rustls", "openssl", "abigen", "eip712"] } +ethers = { version = "2.0.9", features = [ + "ws", + "rustls", + "openssl", + "abigen", + "eip712", +] } evm = { path = "../types/evm" } fraction = { path = "../types/fraction" } futures = "0.3.28" linked-hash-map = "0.5.6" macros = { path = "../types/macros" } -num-bigint = { version = "0.4.3", features = ["serde", "arbitrary", "quickcheck"] } +num-bigint = { version = "0.4.4", features = [ + "serde", + "arbitrary", + "quickcheck", +] } num-derive = "0.4.0" num-rational = { version = "0.4.1", features = ["serde"] } num-traits = "0.2.16" prefix-hex = "0.7.1" prost = "0.11.9" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" sqlx = { version = "0.7.1", features = [ "runtime-tokio-native-tls", "postgres", "uuid", "bigdecimal", - "chrono" + "chrono", ] } thiserror = "1.0.47" tokio = { version = "1.32.0", features = ["full"] } tokio-stream = "0.1.14" -tonic = "0.9.2" +tonic = { version = "0.9.2", features = ["tls"] } tracing = "0.1.37" tracing-subscriber = "0.3.17" uuid = { version = "1.4.1", features = ["v4", "serde"] } value = { path = "../types/value" } [build-dependencies] -ethers = "2.0.8" +ethers = "2.0.9" tonic-build = "0.9.2" diff --git a/server/blockchain/src/blockchain_engine/deposits/mod.rs b/server/blockchain/src/blockchain_engine/deposits/mod.rs index 9c2b025a..fd62a756 100644 --- a/server/blockchain/src/blockchain_engine/deposits/mod.rs +++ b/server/blockchain/src/blockchain_engine/deposits/mod.rs @@ -4,7 +4,7 @@ use ethers::{ prelude::LogMeta, providers::{Middleware, Provider, Ws}, }; -use fraction::Fraction; +use evm::confirmations::Confirmations; use futures::stream::StreamExt; use num_bigint::BigInt; use sqlx::PgPool; @@ -40,8 +40,7 @@ impl DepositsBlockchainManager { let database = self.database.to_owned(); let provider = self.provider.to_owned(); let contract = self.contract.to_owned(); - let confirmations = Fraction::from_raw((BigInt::from(1), self.confirmations.to_owned())) - .unwrap_or_default(); + let confirmations = Confirmations::from_raw(BigInt::from(0), self.confirmations.to_owned()); let join_handle: tokio::task::JoinHandle> = tokio::spawn( async move { diff --git a/server/blockchain/src/blockchain_engine/withdraws/mod.rs b/server/blockchain/src/blockchain_engine/withdraws/mod.rs index 87ce8f85..cd8fabfd 100644 --- a/server/blockchain/src/blockchain_engine/withdraws/mod.rs +++ b/server/blockchain/src/blockchain_engine/withdraws/mod.rs @@ -45,6 +45,7 @@ pub struct WithdrawsBlockchainManager { pub provider: Provider, pub contract: Treasury>, pub contract_key_wallet: LocalWallet, + pub chain_id: U256, } impl WithdrawsBlockchainManager { @@ -113,6 +114,7 @@ impl WithdrawsBlockchainManager { database: self.database.to_owned(), contract: self.contract.to_owned(), contract_key_wallet: self.contract_key_wallet.to_owned(), + chain_id: self.chain_id, } } } @@ -125,6 +127,7 @@ pub struct WithdrawsBlockchainManagerController { database: PgPool, contract: Treasury>, contract_key_wallet: LocalWallet, + chain_id: U256, } impl WithdrawsBlockchainManagerController { pub async fn shutdown(self) -> Result, JoinError> { @@ -182,7 +185,7 @@ impl WithdrawsBlockchainManagerController { .await?; let permit = Permit { - chain_id: U256::from(31337), + chain_id: self.chain_id, name: "Treasury".to_string(), verifying_contract: Address::from(self.contract.address()), owner: withdraw.owner, diff --git a/server/blockchain/src/database/managers/deposits.rs b/server/blockchain/src/database/managers/deposits.rs index 22afb398..2ff2150c 100644 --- a/server/blockchain/src/database/managers/deposits.rs +++ b/server/blockchain/src/database/managers/deposits.rs @@ -1,6 +1,7 @@ use crate::database::projections::deposit::{Deposit, DepositInsert}; use chrono::Utc; use evm::address::Address; +use evm::confirmations::Confirmations; use evm::txhash::TxHash; use fraction::Fraction; use sqlx::{postgres::PgQueryResult, Postgres, Transaction}; @@ -20,7 +21,7 @@ impl DepositsManager { INSERT INTO deposits (created_at, last_modification_at, owner, spender, asset, amount, tx_hash, confirmations) VALUES - ($1, $2, $3, $4, $5, $6::fraction, $7, $8::fraction) + ($1, $2, $3, $4, $5, $6::fraction, $7, $8::confirmations) RETURNING id, created_at, @@ -30,7 +31,7 @@ impl DepositsManager { asset as "asset: Address", amount as "amount: Fraction", tx_hash as "tx_hash: TxHash", - confirmations as "confirmations: Fraction" + confirmations as "confirmations: Confirmations" "#, now, now, @@ -55,7 +56,7 @@ impl DepositsManager { UPDATE deposits SET - confirmations = $2::fraction, + confirmations = $2::confirmations, last_modification_at = $3 WHERE id = $1 diff --git a/server/blockchain/src/database/projections/deposit.rs b/server/blockchain/src/database/projections/deposit.rs index 076e5ff9..93abe78b 100644 --- a/server/blockchain/src/database/projections/deposit.rs +++ b/server/blockchain/src/database/projections/deposit.rs @@ -1,7 +1,7 @@ use chrono::{DateTime, Utc}; use ethers::prelude::LogMeta; -use evm::{address::Address, txhash::TxHash}; -use fraction::{num_traits::One, Fraction}; +use evm::{address::Address, confirmations::Confirmations, txhash::TxHash}; +use fraction::Fraction; use num_bigint::BigInt; use num_traits::Zero; use serde::{Deserialize, Serialize}; @@ -15,7 +15,7 @@ use crate::{ database::managers::{assets::AssetsManager, users::UsersManager, valuts::ValutsManager}, engine_base, }; -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct Deposit { pub id: Uuid, pub created_at: DateTime, @@ -25,7 +25,7 @@ pub struct Deposit { pub asset: Address, pub amount: Fraction, pub tx_hash: TxHash, - pub confirmations: Fraction, + pub confirmations: Confirmations, } impl Deposit { @@ -56,23 +56,23 @@ impl Deposit { } impl Confirmable for Deposit { - fn set(&mut self, confirmations: BigInt) { - let (_, denom) = self.confirmations.0.clone().into(); - self.confirmations = Fraction::from_raw((confirmations, denom)).unwrap_or_default() + fn set(&mut self, actual: BigInt) { + self.confirmations = + Confirmations::from_raw(actual, self.confirmations.desired().to_owned()); } fn is_confirmed(&self) -> bool { - self.confirmations >= Fraction::one() + self.confirmations.actual() >= self.confirmations.desired() } } -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct DepositInsert { pub owner: Address, pub spender: Address, pub asset: Address, pub amount: Fraction, pub tx_hash: TxHash, - pub confirmations: Fraction, + pub confirmations: Confirmations, } impl DepositInsert { @@ -80,7 +80,7 @@ impl DepositInsert { t: &'t mut Transaction<'_, Postgres>, filter: &DepositFilter, meta: &LogMeta, - confirmations: Fraction, + confirmations: Confirmations, ) -> sqlx::Result { let asset = AssetsManager::get_by_address(t, &Address(filter.token)).await?; Ok(Self { diff --git a/server/blockchain/src/main.rs b/server/blockchain/src/main.rs index c17bc91e..82940052 100644 --- a/server/blockchain/src/main.rs +++ b/server/blockchain/src/main.rs @@ -7,7 +7,7 @@ mod shutdown_signal; use contracts::treasury::Treasury; use engine_base::engine_client::EngineClient; use ethers::{ - providers::{Provider, Ws}, + providers::{Provider, Ws, Middleware}, signers::LocalWallet, }; use num_bigint::BigInt; @@ -72,6 +72,7 @@ async fn main() -> Result<(), Box> { provider: provider.to_owned(), contract: treasury.to_owned(), contract_key_wallet, + chain_id: provider.get_chainid().await?, } .start(engine_client.to_owned()) .await; diff --git a/server/engagement.dockerfile b/server/engagement.dockerfile index 4deebedd..de8d1594 100644 --- a/server/engagement.dockerfile +++ b/server/engagement.dockerfile @@ -1,19 +1,15 @@ -FROM rust:slim-bullseye AS chef -# We only pay the installation cost once, -# it will be cached from the second build onwards -RUN rustup toolchain install stable -RUN rustup default stable -RUN apt-get update -RUN apt-get install -y libssl-dev pkg-config protobuf-compiler -RUN apt-get autoremove -RUN cargo install cargo-chef -WORKDIR /app +FROM rust:1-alpine AS chef +# Use apk for package management in Alpine +RUN apk add --no-cache build-base libressl-dev protoc protobuf-dev +RUN cargo install cargo-chef FROM chef AS planner +WORKDIR /app COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder +WORKDIR /app COPY --from=planner /app/recipe.json recipe.json # Build dependencies - this is the caching Docker layer! RUN cargo chef cook --release --recipe-path recipe.json @@ -25,7 +21,6 @@ ENV SQLX_OFFLINE ${SQLX_OFFLINE} RUN cargo build --release -p engagement # We do not need the Rust toolchain to run the binary! -FROM chef AS runtime -WORKDIR /app +FROM alpine AS runtime COPY --from=builder /app/target/release/engagement /usr/local/bin -ENTRYPOINT [ "/usr/local/bin/engagement" ] +ENTRYPOINT [ "engagement" ] diff --git a/server/engagement/Cargo.toml b/server/engagement/Cargo.toml index 6b2a5633..47884d13 100644 --- a/server/engagement/Cargo.toml +++ b/server/engagement/Cargo.toml @@ -14,25 +14,25 @@ futures = "0.3.28" headers = "0.3.8" hyper = { version = "0.14.27", features = ["full"] } macros = { path = "../types/macros" } -num-bigint = { version = "0.4.3" } +num-bigint = { version = "0.4.4" } prefix-hex = "0.7.1" prost = "0.11.9" rand = "0.8.5" regex = "1.9.3" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" sqlx = { version = "0.7.1", features = [ "runtime-tokio-native-tls", "postgres", "uuid", "bigdecimal", - "chrono" + "chrono", ] } strum = { version = "0.25", features = ["derive"] } thiserror = "1.0.47" tokio = { version = "1.32.0", features = ["full"] } tokio-stream = "0.1.14" -tonic = "0.9.2" +tonic = { version = "0.9.2", features = ["tls"] } tower = "0.4.13" tracing = "0.1.37" tracing-subscriber = "0.3.17" @@ -41,4 +41,3 @@ value = { path = "../types/value" } [build-dependencies] tonic-build = "0.9.2" - diff --git a/server/engagement/src/database/managers/users.rs b/server/engagement/src/database/managers/users.rs index c23fcb91..f24255f8 100644 --- a/server/engagement/src/database/managers/users.rs +++ b/server/engagement/src/database/managers/users.rs @@ -24,9 +24,7 @@ impl UsersManager { users.created_at, users.last_modification_at, users.address as "address: EvmAddress", - users.name, - users.phone, - users.email + users.name FROM users WHERE users.last_modification_at > $1 ORDER BY last_modification_at ASC diff --git a/server/engagement/src/database/projections/user.rs b/server/engagement/src/database/projections/user.rs index b9bcb130..e7686f3f 100644 --- a/server/engagement/src/database/projections/user.rs +++ b/server/engagement/src/database/projections/user.rs @@ -16,8 +16,6 @@ pub struct User { pub last_modification_at: DateTime, pub address: EvmAddress, pub name: Option, - pub phone: Option, - pub email: Option, } impl FromRow<'_, PgRow> for User { @@ -35,8 +33,6 @@ impl FromRow<'_, PgRow> for User { last_modification_at: row.try_get("last_modification_at")?, address: evm_address, name: row.try_get("name")?, - phone: row.try_get("phone")?, - email: row.try_get("email")?, }) } } diff --git a/server/engine.dockerfile b/server/engine.dockerfile index 8fe26c99..3b017f8e 100644 --- a/server/engine.dockerfile +++ b/server/engine.dockerfile @@ -1,19 +1,15 @@ -FROM rust:slim-bullseye AS chef -# We only pay the installation cost once, -# it will be cached from the second build onwards -RUN rustup toolchain install stable -RUN rustup default stable -RUN apt-get update -RUN apt-get install -y libssl-dev pkg-config protobuf-compiler -RUN apt-get autoremove -RUN cargo install cargo-chef -WORKDIR /app +FROM rust:1-alpine AS chef +# Use apk for package management in Alpine +RUN apk add --no-cache build-base libressl-dev protoc protobuf-dev +RUN cargo install cargo-chef FROM chef AS planner +WORKDIR /app COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder +WORKDIR /app COPY --from=planner /app/recipe.json recipe.json # Build dependencies - this is the caching Docker layer! RUN cargo chef cook --release --recipe-path recipe.json @@ -25,7 +21,6 @@ ENV SQLX_OFFLINE ${SQLX_OFFLINE} RUN cargo build --release -p engine # We do not need the Rust toolchain to run the binary! -FROM chef AS runtime -WORKDIR /app +FROM alpine AS runtime COPY --from=builder /app/target/release/engine /usr/local/bin -ENTRYPOINT [ "/usr/local/bin/engine" ] +ENTRYPOINT [ "engine" ] diff --git a/server/engine/Cargo.toml b/server/engine/Cargo.toml index 9bc348d5..8320b538 100644 --- a/server/engine/Cargo.toml +++ b/server/engine/Cargo.toml @@ -12,24 +12,24 @@ fraction = { path = "../types/fraction" } futures = "0.3.28" hyper = { version = "0.14.27", features = ["full"] } macros = { path = "../types/macros" } -num-bigint = { version = "0.4.3" } +num-bigint = { version = "0.4.4" } num-traits = "0.2.16" proptest = "1.2.0" prost = "0.11.9" seq-macro = "0.3.5" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" sqlx = { version = "0.7.1", features = [ "runtime-tokio-native-tls", "postgres", "uuid", "bigdecimal", - "chrono" + "chrono", ] } thiserror = "1.0.47" tokio = { version = "1.32.0", features = ["full"] } tokio-stream = "0.1.14" -tonic = "0.9.2" +tonic = { version = "0.9.2", features = ["tls"] } tower = "0.4.13" tracing = "0.1.37" tracing-subscriber = "0.3.17" diff --git a/server/k8s/blockchain.yaml b/server/k8s/blockchain.yaml new file mode 100644 index 00000000..afabe8f6 --- /dev/null +++ b/server/k8s/blockchain.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: server-blockchain-deployment + namespace: ksox-finance + labels: + app: server-blockchain +spec: + selector: + matchLabels: + app: server-blockchain + template: + metadata: + labels: + app: server-blockchain + spec: + containers: + - name: server-blockchain + image: registry.internal.visoft.solutions/server-blockchain + envFrom: + - secretRef: + name: keys + - configMapRef: + name: settings + ports: + - containerPort: 80 + resources: + requests: + memory: 100Mi + cpu: 100m + limits: + memory: 200Mi + cpu: 200m +--- +apiVersion: v1 +kind: Service +metadata: + name: server-blockchain-service + namespace: ksox-finance +spec: + selector: + app: server-blockchain + ports: + - protocol: TCP + port: 80 + targetPort: 80 diff --git a/server/k8s/engagement.yaml b/server/k8s/engagement.yaml index a22b2498..22665561 100644 --- a/server/k8s/engagement.yaml +++ b/server/k8s/engagement.yaml @@ -16,38 +16,21 @@ spec: spec: containers: - name: server-engagement - image: server-engagement + image: registry.internal.visoft.solutions/server-engagement + envFrom: + - secretRef: + name: keys + - configMapRef: + name: settings ports: - containerPort: 80 resources: requests: + memory: 100Mi + cpu: 100m + limits: memory: 200Mi cpu: 200m - limits: - memory: 400Mi - cpu: 400m - env: - - name: DATABASE_URL - value: postgresql://ksoxuser:ksoxuserp4ssword@postgres-service/ksox - - name: ENGINE_FRACTION_ACCURACY - value: 1/10000 - initContainers: - - name: wait-for-postgres - image: busybox - command: - [ - "sh", - "-c", - "until nc -z postgres-service 5432; do echo waiting for postgres; sleep 1.$((RANDOM % 100)); done;", - ] - - name: wait-for-redis - image: busybox - command: - [ - "sh", - "-c", - "until nc -z redis-service 6379; do echo waiting for redis; sleep 1.$((RANDOM % 100)); done;", - ] --- apiVersion: v1 kind: Service diff --git a/server/k8s/engine.yaml b/server/k8s/engine.yaml index b969debb..283c9f0d 100644 --- a/server/k8s/engine.yaml +++ b/server/k8s/engine.yaml @@ -16,38 +16,21 @@ spec: spec: containers: - name: server-engine - image: server-engine + image: registry.internal.visoft.solutions/server-engine + envFrom: + - secretRef: + name: keys + - configMapRef: + name: settings ports: - containerPort: 80 resources: requests: + memory: 100Mi + cpu: 100m + limits: memory: 200Mi cpu: 200m - limits: - memory: 500Mi - cpu: 500m - env: - - name: DATABASE_URL - value: postgresql://ksoxuser:ksoxuserp4ssword@postgres-service/ksox - - name: ENGINE_FRACTION_ACCURACY - value: 1/10000 - initContainers: - - name: wait-for-postgres - image: busybox - command: - [ - "sh", - "-c", - "until nc -z postgres-service 5432; do echo waiting for postgres; sleep 1.$((RANDOM % 100)); done;", - ] - - name: wait-for-redis - image: busybox - command: - [ - "sh", - "-c", - "until nc -z redis-service 6379; do echo waiting for redis; sleep 1.$((RANDOM % 100)); done;", - ] --- apiVersion: v1 kind: Service diff --git a/server/k8s/worker.yaml b/server/k8s/worker.yaml index f9eab826..3c32c1b7 100644 --- a/server/k8s/worker.yaml +++ b/server/k8s/worker.yaml @@ -16,58 +16,21 @@ spec: spec: containers: - name: server-worker - image: server-worker + image: registry.internal.visoft.solutions/server-worker + envFrom: + - secretRef: + name: keys + - configMapRef: + name: settings ports: - containerPort: 80 resources: requests: + memory: 100Mi + cpu: 100m + limits: memory: 200Mi cpu: 200m - limits: - memory: 500Mi - cpu: 500m - env: - - name: DATABASE_URL - value: postgresql://ksoxuser:ksoxuserp4ssword@postgres-service/ksox - - name: ENGINE_URL - value: http://server-engine-service/ - - name: REDIS_URL - value: redis://redis-service/ - - name: WORKER_FRACTION_ACCURACY - value: 1/10000 - initContainers: - - name: wait-for-postgres - image: busybox - command: - [ - "sh", - "-c", - "until nc -z postgres-service 5432; do echo waiting for postgres; sleep 1.$((RANDOM % 100)); done;", - ] - - name: wait-for-redis - image: busybox - command: - [ - "sh", - "-c", - "until nc -z redis-service 6379; do echo waiting for redis; sleep 1.$((RANDOM % 100)); done;", - ] - - name: wait-for-engine - image: busybox - command: - [ - "sh", - "-c", - "until nc -z server-engine-service 80; do echo waiting for engine; sleep 1.$((RANDOM % 100)); done;", - ] - - name: wait-for-engagement - image: busybox - command: - [ - "sh", - "-c", - "until nc -z server-engagement-service 80; do echo waiting for engagement; sleep 1.$((RANDOM % 100)); done;", - ] --- apiVersion: v1 kind: Service @@ -91,7 +54,7 @@ metadata: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: - ingressClassName: ingress-nginx + ingressClassName: ingress-nginx-external tls: - hosts: - app.ksox.finance diff --git a/server/readme.md b/server/readme.md index 29c36c56..a8bc4ad1 100644 --- a/server/readme.md +++ b/server/readme.md @@ -3,12 +3,12 @@ #### **`.cargo/config.toml`** ``` KSOX_SERVER_BLOCKCHAIN_URL="http://ksox-server-blockchain/" -KSOX_WS_BLOCKCHAIN_URL="http://localhost:8545/" +KSOX_WS_BLOCKCHAIN_URL="http://localhost/" KSOX_POSTGRES_URL="postgresql://ksoxuser:ksoxuserp4ssword@localhost/ksox" KSOX_REDIS_URL="redis://localhost/" KSOX_SERVER_ENGINE_URL="http://localhost/" CONTRACT_PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" -CONTRACT_ADDRESS="0x5FbDB2315678afecb367f032d93F642f64180aa3" +CONTRACT_ADDRESS="0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" DEPOSIT_CONFIRMATIONS="5" TESTS_CASES="10000" TESTS_FRACTION_BYTES="2" @@ -19,12 +19,12 @@ SQLX_OFFLINE="true" #### **`.env`** ``` KSOX_SERVER_BLOCKCHAIN_URL="http://ksox-server-blockchain/" -KSOX_WS_BLOCKCHAIN_URL="ws://ksox-blockchain:8545/" +KSOX_WS_BLOCKCHAIN_URL="ws://ksox-blockchain/" KSOX_POSTGRES_URL="postgresql://ksoxuser:ksoxuserp4ssword@ksox-postgres/ksox" KSOX_REDIS_URL="redis://ksox-redis/" KSOX_SERVER_ENGINE_URL="http://ksox-server-engine/" CONTRACT_PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" -CONTRACT_ADDRESS="0x5FbDB2315678afecb367f032d93F642f64180aa3" +CONTRACT_ADDRESS="0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" DEPOSIT_CONFIRMATIONS="5" TESTS_CASES = "10000" TESTS_FRACTION_BYTES = "2" diff --git a/server/types/evm/Cargo.toml b/server/types/evm/Cargo.toml index adeedf52..73255205 100644 --- a/server/types/evm/Cargo.toml +++ b/server/types/evm/Cargo.toml @@ -6,8 +6,9 @@ edition = "2021" [dependencies] ethereum-types = "0.14.1" +num-bigint = { version = "0.4.4", features = ["serde", "arbitrary", "quickcheck"] } prefix-hex = "0.7.1" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } sqlx = { version = "0.7.1", features = [ "runtime-tokio-native-tls", "postgres", diff --git a/server/types/evm/src/confirmations.rs b/server/types/evm/src/confirmations.rs new file mode 100644 index 00000000..5b3d0d43 --- /dev/null +++ b/server/types/evm/src/confirmations.rs @@ -0,0 +1,49 @@ +use num_bigint::BigInt; +use serde::{Deserialize, Serialize}; +use sqlx::{database::HasValueRef, types::BigDecimal, Database, Decode}; + +#[derive(Debug, Clone, Hash, Default, Deserialize, Serialize)] +pub struct Confirmations { + actual: BigInt, + desired: BigInt, +} +impl Confirmations { + pub fn new(desired: BigInt) -> Self { + Confirmations { + actual: BigInt::from(0), + desired, + } + } + + pub fn from_raw(actual: BigInt, desired: BigInt) -> Self { + Confirmations { actual, desired } + } + + pub fn to_tuple_string(&self) -> String { + format!("({},{})", self.actual, self.desired) + } + + pub fn actual(&self) -> &BigInt { + &self.actual + } + + pub fn desired(&self) -> &BigInt { + &self.desired + } +} +impl<'r, DB: Database> Decode<'r, DB> for Confirmations +where + (BigDecimal, BigDecimal): Decode<'r, DB>, +{ + fn decode( + value: >::ValueRef, + ) -> Result> { + let (actual, desired) = <(BigDecimal, BigDecimal) as Decode>::decode(value)?; + + let (actual_bigint, actual_exp) = actual.into_bigint_and_exponent(); + let (desired_bigint, desired_exp) = desired.into_bigint_and_exponent(); + let actual = actual_bigint * BigInt::from(10).pow(TryInto::try_into(-actual_exp)?); + let desired = desired_bigint * BigInt::from(10).pow(TryInto::try_into(-desired_exp)?); + Ok(Confirmations::from_raw(actual, desired)) + } +} diff --git a/server/types/evm/src/lib.rs b/server/types/evm/src/lib.rs index 77cf36f8..dba39aea 100644 --- a/server/types/evm/src/lib.rs +++ b/server/types/evm/src/lib.rs @@ -1,2 +1,3 @@ pub mod address; +pub mod confirmations; pub mod txhash; diff --git a/server/types/fraction/Cargo.toml b/server/types/fraction/Cargo.toml index 4de9db9b..77efb288 100644 --- a/server/types/fraction/Cargo.toml +++ b/server/types/fraction/Cargo.toml @@ -6,13 +6,13 @@ edition = "2021" [dependencies] ethereum-types = "0.14.1" -num-bigint = { version = "0.4.3", features = ["serde", "arbitrary", "quickcheck"] } +num-bigint = { version = "0.4.4", features = ["serde", "arbitrary", "quickcheck"] } num-derive = "0.4.0" num-rational = { version = "0.4.1", features = ["serde"] } num-traits = "0.2.16" proptest = "1.2.0" seq-macro = "0.3.5" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" sqlx = { version = "0.7.1", features = [ "postgres", "bigdecimal" ] } diff --git a/server/types/infinity/Cargo.toml b/server/types/infinity/Cargo.toml index b992ae5a..49ee48a4 100644 --- a/server/types/infinity/Cargo.toml +++ b/server/types/infinity/Cargo.toml @@ -6,10 +6,10 @@ edition = "2021" [dependencies] fraction = { path = "../fraction" } -num-bigint = { version = "0.4.3", features = ["serde", "arbitrary", "quickcheck"] } +num-bigint = { version = "0.4.4", features = ["serde", "arbitrary", "quickcheck"] } num-derive = "0.4.0" num-rational = { version = "0.4.1", features = ["serde"] } num-traits = "0.2.16" proptest = "1.2.0" seq-macro = "0.3.5" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } diff --git a/server/types/pricelevel/Cargo.toml b/server/types/pricelevel/Cargo.toml index 8734b2e8..06f8e9f4 100644 --- a/server/types/pricelevel/Cargo.toml +++ b/server/types/pricelevel/Cargo.toml @@ -7,13 +7,13 @@ edition = "2021" [dependencies] async-stream = "0.3.5" fraction = { path = "../fraction" } -num-bigint = { version = "0.4.3", features = ["serde", "arbitrary", "quickcheck"] } +num-bigint = { version = "0.4.4", features = ["serde", "arbitrary", "quickcheck"] } num-derive = "0.4.0" num-rational = { version = "0.4.1", features = ["serde"] } num-traits = "0.2.16" proptest = "1.2.0" seq-macro = "0.3.5" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" tokio = { version = "1.32.0", features = ["full"] } tokio-stream = "0.1.14" diff --git a/server/types/value/Cargo.toml b/server/types/value/Cargo.toml index 5039158e..9e0d6157 100644 --- a/server/types/value/Cargo.toml +++ b/server/types/value/Cargo.toml @@ -7,13 +7,13 @@ edition = "2021" [dependencies] fraction = { path = "../fraction" } infinity = { path = "../infinity" } -num-bigint = { version = "0.4.3", features = ["serde", "arbitrary", "quickcheck"] } +num-bigint = { version = "0.4.4", features = ["serde", "arbitrary", "quickcheck"] } num-derive = "0.4.0" num-rational = { version = "0.4.1", features = ["serde"] } num-traits = "0.2.16" proptest = "1.2.0" seq-macro = "0.3.5" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" sqlx = { version = "0.7.1", features = [ "postgres", "bigdecimal" ] } thiserror = "1.0.47" diff --git a/server/worker.dockerfile b/server/worker.dockerfile index 86960b66..6f7ff010 100644 --- a/server/worker.dockerfile +++ b/server/worker.dockerfile @@ -1,19 +1,15 @@ -FROM rust:slim-bullseye AS chef -# We only pay the installation cost once, -# it will be cached from the second build onwards -RUN rustup toolchain install stable -RUN rustup default stable -RUN apt-get update -RUN apt-get install -y libssl-dev pkg-config protobuf-compiler -RUN apt-get autoremove -RUN cargo install cargo-chef -WORKDIR /app +FROM rust:1-alpine AS chef +# Use apk for package management in Alpine +RUN apk add --no-cache build-base libressl-dev protoc protobuf-dev +RUN cargo install cargo-chef FROM chef AS planner +WORKDIR /app COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder +WORKDIR /app COPY --from=planner /app/recipe.json recipe.json # Build dependencies - this is the caching Docker layer! RUN cargo chef cook --release --recipe-path recipe.json @@ -25,7 +21,6 @@ ENV SQLX_OFFLINE ${SQLX_OFFLINE} RUN cargo build --release -p worker # We do not need the Rust toolchain to run the binary! -FROM chef AS runtime -WORKDIR /app +FROM alpine AS runtime COPY --from=builder /app/target/release/worker /usr/local/bin -ENTRYPOINT [ "/usr/local/bin/worker" ] +ENTRYPOINT [ "worker" ] diff --git a/server/worker/Cargo.toml b/server/worker/Cargo.toml index 8cee02a4..b8f6e372 100644 --- a/server/worker/Cargo.toml +++ b/server/worker/Cargo.toml @@ -12,7 +12,7 @@ bytes = "1.4.0" chrono = { version = "0.4.26", features = ["serde"] } engagement = { path = "../engagement" } ethereum-types = "0.14.1" -ethers-core = "2.0.8" +ethers-core = "2.0.9" evm = { path = "../types/evm" } fraction = { path = "../types/fraction" } futures = "0.3.28" @@ -20,8 +20,8 @@ headers = "0.3.8" hyper = { version = "0.14.27", features = ["full"] } macros = { path = "../types/macros" } nalgebra = "0.32.3" -num-bigint = { version = "0.4.3" } -ordered-float = { version = "3.8.0", features = ["serde"] } +num-bigint = { version = "0.4.4" } +ordered-float = { version = "3.9.1", features = ["serde"] } predicates = "3.0.3" prefix-hex = "0.7.1" pricelevel = { path = "../types/pricelevel" } @@ -29,22 +29,22 @@ prost = "0.11.9" rand = "0.8.5" redis = { version = "0.23.2", features = ["tokio-comp"] } regex = "1.9.3" -serde = { version = "1.0.183", features = ["derive"] } +serde = { version = "1.0.186", features = ["derive"] } serde_json = "1.0.105" -serde_with = "3.2.0" +serde_with = "3.3.0" sqlx = { version = "0.7.1", features = [ "runtime-tokio-native-tls", "postgres", "uuid", "bigdecimal", - "chrono" + "chrono", ] } strsim = "0.10.0" strum = { version = "0.25", features = ["derive"] } thiserror = "1.0.47" tokio = { version = "1.32.0", features = ["full"] } tokio-stream = "0.1.14" -tonic = "0.9.2" +tonic = { version = "0.9.2", features = ["tls"] } tower = "0.4.13" tracing = "0.1.37" tracing-subscriber = "0.3.17" diff --git a/server/worker/src/api/private/transfer.rs b/server/worker/src/api/private/transfer.rs index f39e2cae..696ce20d 100644 --- a/server/worker/src/api/private/transfer.rs +++ b/server/worker/src/api/private/transfer.rs @@ -1,4 +1,5 @@ use axum::{extract::State, Json}; +use evm::address::Address; use fraction::Fraction; use serde::{Deserialize, Serialize}; use uuid::Uuid; @@ -11,8 +12,8 @@ use crate::{ #[derive(Deserialize, Serialize)] pub struct Request { - pub from_user_id: Uuid, - pub to_user_id: Uuid, + pub from_user_address: Address, + pub to_user_address: Address, pub asset_id: Uuid, pub amount: Fraction, } @@ -27,17 +28,19 @@ pub async fn root( _user_id: UserId, Json(payload): Json, ) -> Result, AppError> { + let from_user = state.users_manager.get_for_evm_address(payload.from_user_address).await?; let from_valut_id = state .valuts_manager - .get_for_user_asset(payload.from_user_id, payload.asset_id) + .get_for_user_asset(from_user.id, payload.asset_id) .await? .id; + let to_user = state.users_manager.get_for_evm_address(payload.to_user_address).await?; let to_valut_id = state .valuts_manager - .get_for_user_asset(payload.to_user_id, payload.asset_id) + .get_for_user_asset(to_user.id, payload.asset_id) .await? .id; - let asset = state.assets_manager.get_by_id(&payload.asset_id).await?; + let asset = state.assets_manager.get_by_id(payload.asset_id).await?; let response = state .engine_client .transfer(TransferRequest { @@ -45,7 +48,7 @@ pub async fn root( to_valut_id: to_valut_id.to_string(), asset_id: asset.id.to_string(), amount: serde_json::to_string(&payload.amount)?, - fee_fraction: asset.transfer_fee.to_string(), + fee_fraction: serde_json::to_string(&asset.transfer_fee)?, }) .await? .into_inner(); @@ -53,4 +56,4 @@ pub async fn root( Ok(Json(Response { response: format!("transfered {response:?}"), })) -} +} \ No newline at end of file diff --git a/server/worker/src/api/private/transfers/display/mod.rs b/server/worker/src/api/private/transfers/display/mod.rs new file mode 100644 index 00000000..843e2b0d --- /dev/null +++ b/server/worker/src/api/private/transfers/display/mod.rs @@ -0,0 +1,44 @@ +mod sse; +use std::ops::Deref; + +use axum::{ + extract::{Query, State}, + routing::get, + Json, Router, +}; +use tokio_stream::StreamExt; + +use crate::{ + api::{auth::models::UserId, AppError, Pagination}, + models::AppState, +}; + +use super::DisplayTransfer; + +pub fn router(app_state: &AppState) -> Router { + Router::new() + .route("/", get(root)) + .route("/sse", get(sse::root)) + .with_state(app_state.clone()) +} + +pub async fn root( + State(state): State, + user_id: UserId, + Query(params): Query, +) -> Result>, AppError> { + let mut stream = state + .transfers_manager + .get_display_for_user_id(*user_id, params.limit, params.offset) + .map(|t| { + Ok::(DisplayTransfer::from_extended_transfer( + *user_id.deref(), + t?, + )) + }); + let mut vec = Vec::::new(); + while let Some(res) = stream.next().await { + vec.push(res?); + } + Ok(Json(vec)) +} diff --git a/server/worker/src/api/private/transfers/display/sse.rs b/server/worker/src/api/private/transfers/display/sse.rs new file mode 100644 index 00000000..a9f870a1 --- /dev/null +++ b/server/worker/src/api/private/transfers/display/sse.rs @@ -0,0 +1,41 @@ +use std::{ + io::{Error, ErrorKind}, + ops::Deref, + time::Duration, +}; + +use axum::{ + extract::State, + response::sse::{Event, Sse}, +}; +use futures::stream::Stream; +use tokio_stream::StreamExt; + +use crate::{ + api::{auth::models::UserId, private::transfers::DisplayTransfer}, + models::AppState, +}; + +pub async fn root( + State(state): State, + user_id: UserId, +) -> Sse>> { + let stream = async_stream::stream! { + let mut stream = state.transfers_notification_manager.subscribe_display_to_user(*user_id).await + .map_err(|err| Error::new(ErrorKind::BrokenPipe, err))?; + while let Some(element) = stream.next().await { + if let Ok(t) = element { + let result: Vec = t.iter().map(|x| DisplayTransfer::from_extended_transfer(*user_id.deref(), x.to_owned())).collect(); + yield Event::default().json_data(result).map_err(Error::from); + } else { + break; + } + } + }; + + Sse::new(stream).keep_alive( + axum::response::sse::KeepAlive::new() + .interval(Duration::from_secs(10)) + .text("keep-alive-text"), + ) +} diff --git a/server/worker/src/api/private/transfers/mod.rs b/server/worker/src/api/private/transfers/mod.rs index df411956..f288ec85 100644 --- a/server/worker/src/api/private/transfers/mod.rs +++ b/server/worker/src/api/private/transfers/mod.rs @@ -1,3 +1,5 @@ +mod display; +mod specific; mod sse; use axum::{ @@ -5,11 +7,16 @@ use axum::{ routing::get, Json, Router, }; +use chrono::{DateTime, Utc}; +use evm::address::Address; +use fraction::Fraction; +use serde::{Deserialize, Serialize}; use tokio_stream::StreamExt; +use uuid::Uuid; use crate::{ api::{auth::models::UserId, AppError, Pagination}, - database::projections::transfer::Transfer, + database::projections::transfer::{ExtendedTransfer, Transfer}, models::AppState, }; @@ -18,6 +25,8 @@ pub fn router(app_state: &AppState) -> Router { .route("/", get(root)) .route("/sse", get(sse::root)) .with_state(app_state.clone()) + .nest("/specific", specific::router(app_state)) + .nest("/display", display::router(app_state)) } pub async fn root( @@ -34,3 +43,79 @@ pub async fn root( } Ok(Json(vec)) } + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +#[serde(rename_all = "lowercase")] +pub enum DisplayTransferDirection { + Income, + Outcome, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +pub struct DisplayTransfer { + pub id: Uuid, + pub created_at: DateTime, + pub user_id: Uuid, + pub user_address: Address, + pub user_name: Option, + pub other_user_id: Uuid, + pub other_user_address: Address, + pub other_user_name: Option, + pub asset_id: Uuid, + pub asset_icon_path: String, + pub asset_name: String, + pub asset_symbol: String, + pub amount: Fraction, + pub fee: Fraction, + pub direction: DisplayTransferDirection, +} +impl DisplayTransfer { + fn from_extended_transfer(id: Uuid, transfer: ExtendedTransfer) -> Self { + let ( + user_id, + user_address, + user_name, + other_user_id, + other_user_address, + other_user_name, + direction, + ) = if id == transfer.from_user_id { + ( + transfer.from_user_id, + transfer.from_user_address, + transfer.from_user_name, + transfer.to_user_id, + transfer.to_user_address, + transfer.to_user_name, + DisplayTransferDirection::Outcome, + ) + } else { + ( + transfer.to_user_id, + transfer.to_user_address, + transfer.to_user_name, + transfer.from_user_id, + transfer.from_user_address, + transfer.from_user_name, + DisplayTransferDirection::Income, + ) + }; + DisplayTransfer { + id: transfer.id, + created_at: transfer.created_at, + user_id, + user_address, + user_name, + other_user_id, + other_user_address, + other_user_name, + asset_id: transfer.asset_id, + asset_icon_path: transfer.asset_icon_path, + asset_name: transfer.asset_name, + asset_symbol: transfer.asset_symbol, + amount: transfer.amount, + fee: transfer.fee, + direction, + } + } +} diff --git a/server/worker/src/api/private/transfers/specific/mod.rs b/server/worker/src/api/private/transfers/specific/mod.rs new file mode 100644 index 00000000..0864cea5 --- /dev/null +++ b/server/worker/src/api/private/transfers/specific/mod.rs @@ -0,0 +1,53 @@ +mod sse; +use std::ops::Deref; + +use axum::{ + extract::{Query, State}, + routing::get, + Json, Router, +}; +use serde::Deserialize; +use tokio_stream::StreamExt; +use uuid::Uuid; + +use crate::{ + api::{auth::models::UserId, AppError}, + models::AppState, +}; + +use super::DisplayTransfer; + +pub fn router(app_state: &AppState) -> Router { + Router::new() + .route("/", get(root)) + .route("/sse", get(sse::root)) + .with_state(app_state.clone()) +} + +#[derive(Deserialize)] +pub struct Params { + pub other_user_id: Uuid, + pub limit: i64, + pub offset: i64, +} + +pub async fn root( + State(state): State, + user_id: UserId, + Query(params): Query, +) -> Result>, AppError> { + let mut stream = state + .transfers_manager + .get_specific_for_user_id(*user_id, params.other_user_id, params.limit, params.offset) + .map(|t| { + Ok::(DisplayTransfer::from_extended_transfer( + *user_id.deref(), + t?, + )) + }); + let mut vec = Vec::::new(); + while let Some(res) = stream.next().await { + vec.push(res?); + } + Ok(Json(vec)) +} diff --git a/server/worker/src/api/private/transfers/specific/sse.rs b/server/worker/src/api/private/transfers/specific/sse.rs new file mode 100644 index 00000000..971f990d --- /dev/null +++ b/server/worker/src/api/private/transfers/specific/sse.rs @@ -0,0 +1,49 @@ +use std::{ + io::{Error, ErrorKind}, + ops::Deref, + time::Duration, +}; + +use axum::{ + extract::{State, Query}, + response::sse::{Event, Sse}, +}; +use futures::stream::Stream; +use serde::Deserialize; +use tokio_stream::StreamExt; +use uuid::Uuid; + +use crate::{ + api::{auth::models::UserId, private::transfers::DisplayTransfer}, + models::AppState, +}; + +#[derive(Deserialize)] +pub struct Params { + pub other_user_id: Uuid +} + +pub async fn root( + State(state): State, + user_id: UserId, + Query(params): Query +) -> Sse>> { + let stream = async_stream::stream! { + let mut stream = state.transfers_notification_manager.subscribe_specific_to_user(*user_id, params.other_user_id).await + .map_err(|err| Error::new(ErrorKind::BrokenPipe, err))?; + while let Some(element) = stream.next().await { + if let Ok(t) = element { + let result: Vec = t.iter().map(|x| DisplayTransfer::from_extended_transfer(*user_id.deref(), x.to_owned())).collect(); + yield Event::default().json_data(result).map_err(Error::from); + } else { + break; + } + } + }; + + Sse::new(stream).keep_alive( + axum::response::sse::KeepAlive::new() + .interval(Duration::from_secs(10)) + .text("keep-alive-text"), + ) +} diff --git a/server/worker/src/api/private/transfers/sse.rs b/server/worker/src/api/private/transfers/sse.rs index 9ddb4e7f..d856474f 100644 --- a/server/worker/src/api/private/transfers/sse.rs +++ b/server/worker/src/api/private/transfers/sse.rs @@ -17,7 +17,7 @@ pub async fn root( user_id: UserId, ) -> Sse>> { let stream = async_stream::stream! { - let mut stream = state.transfers_notification_manager.subscribe_to_user_as_taker(*user_id).await + let mut stream = state.transfers_notification_manager.subscribe_to_user(*user_id).await .map_err(|err| Error::new(ErrorKind::BrokenPipe, err))?; while let Some(element) = stream.next().await { yield Event::default().json_data(element).map_err(Error::from); diff --git a/server/worker/src/api/private/user/mod.rs b/server/worker/src/api/private/user/mod.rs index 62b82476..08a72a49 100644 --- a/server/worker/src/api/private/user/mod.rs +++ b/server/worker/src/api/private/user/mod.rs @@ -43,8 +43,6 @@ pub async fn update_metadata( ) -> Result, AppError> { let mut user = state.users_manager.get_by_id(*user_id).await?; user.name = params.name; - user.email = params.email; - user.phone = params.phone; state.users_manager.update(user.clone()).await?; Ok(Json(user)) } diff --git a/server/worker/src/database/managers/assets.rs b/server/worker/src/database/managers/assets.rs index c19361a1..8a4d7fc3 100644 --- a/server/worker/src/database/managers/assets.rs +++ b/server/worker/src/database/managers/assets.rs @@ -21,7 +21,7 @@ impl AssetsManager { Self { database } } - pub async fn get_by_id(&self, asset_id: &Uuid) -> Result { + pub async fn get_by_id(&self, asset_id: Uuid) -> Result { sqlx::query_as!( Asset, r#" @@ -30,6 +30,7 @@ impl AssetsManager { created_at, last_modification_at, name, + icon_path, symbol, address as "address: Address", decimals as "decimals: Fraction", @@ -57,6 +58,7 @@ impl AssetsManager { created_at, last_modification_at, name, + icon_path, symbol, address as "address: Address", decimals as "decimals: Fraction", @@ -82,6 +84,7 @@ impl AssetsManager { created_at, last_modification_at, name, + icon_path, symbol, address as "address: Address", decimals as "decimals: Fraction", diff --git a/server/worker/src/database/managers/transfers.rs b/server/worker/src/database/managers/transfers.rs index e3269ab3..d6dd11db 100644 --- a/server/worker/src/database/managers/transfers.rs +++ b/server/worker/src/database/managers/transfers.rs @@ -1,14 +1,16 @@ use std::pin::Pin; +use evm::address::Address; use fraction::Fraction; use futures::Stream; use sqlx::{postgres::PgPool, Result}; +use tokio_stream::StreamExt; use uuid::Uuid; use super::notifications::{ NotificationManagerOutput, NotificationManagerPredicateInput, NotificationManagerSubscriber, }; -use crate::database::projections::transfer::Transfer; +use crate::database::projections::transfer::{ExtendedTransfer, Transfer}; #[derive(Debug, Clone)] pub struct TransfersManager { @@ -107,16 +109,144 @@ impl TransfersManager { ) .fetch(&self.database) } + + pub fn get_display_transfers_by_ids( + &self, + ids: &[Uuid], + ) -> Pin> + Send + '_>> { + sqlx::query_as!( + ExtendedTransfer, + r#" + SELECT + transfers.id, + transfers.created_at, + from_valuts.user_id as from_user_id, + from_users.address as "from_user_address: Address", + from_users.name as from_user_name, + to_valuts.user_id as to_user_id, + to_users.address as "to_user_address: Address", + to_users.name as to_user_name, + assets.id as asset_id, + assets.icon_path as asset_icon_path, + assets.name as asset_name, + assets.symbol as asset_symbol, + transfers.amount as "amount: Fraction", + transfers.fee as "fee: Fraction" + FROM transfers + JOIN valuts from_valuts ON transfers.from_valut_id = from_valuts.id + JOIN valuts to_valuts ON transfers.to_valut_id = to_valuts.id + JOIN assets ON transfers.asset_id = assets.id + JOIN users from_users ON from_valuts.user_id = from_users.id + JOIN users to_users ON to_valuts.user_id = to_users.id + WHERE transfers.id = ANY($1) + ORDER BY transfers.created_at DESC + "#, + &ids, + ) + .fetch(&self.database) + } + + pub fn get_display_for_user_id( + &self, + user_id: Uuid, + limit: i64, + offset: i64, + ) -> Pin> + Send + '_>> { + sqlx::query_as!( + ExtendedTransfer, + r#" + SELECT + transfers.id, + transfers.created_at, + from_valuts.user_id as from_user_id, + from_users.address as "from_user_address: Address", + from_users.name as from_user_name, + to_valuts.user_id as to_user_id, + to_users.address as "to_user_address: Address", + to_users.name as to_user_name, + assets.id as asset_id, + assets.icon_path as asset_icon_path, + assets.name as asset_name, + assets.symbol as asset_symbol, + transfers.amount as "amount: Fraction", + transfers.fee as "fee: Fraction" + FROM transfers + JOIN valuts from_valuts ON transfers.from_valut_id = from_valuts.id + JOIN valuts to_valuts ON transfers.to_valut_id = to_valuts.id + JOIN assets ON transfers.asset_id = assets.id + JOIN users from_users ON from_valuts.user_id = from_users.id + JOIN users to_users ON to_valuts.user_id = to_users.id + WHERE to_valuts.user_id = $1 OR from_valuts.user_id = $1 + ORDER BY transfers.created_at DESC + LIMIT $2 + OFFSET $3 + "#, + user_id, + limit, + offset + ) + .fetch(&self.database) + } + + pub fn get_specific_for_user_id( + &self, + user_id: Uuid, + other_user_id: Uuid, + limit: i64, + offset: i64, + ) -> Pin> + Send + '_>> { + sqlx::query_as!( + ExtendedTransfer, + r#" + SELECT + transfers.id, + transfers.created_at, + from_valuts.user_id as from_user_id, + from_users.address as "from_user_address: Address", + from_users.name as from_user_name, + to_valuts.user_id as to_user_id, + to_users.address as "to_user_address: Address", + to_users.name as to_user_name, + assets.id as asset_id, + assets.icon_path as asset_icon_path, + assets.name as asset_name, + assets.symbol as asset_symbol, + transfers.amount as "amount: Fraction", + transfers.fee as "fee: Fraction" + FROM transfers + JOIN valuts from_valuts ON transfers.from_valut_id = from_valuts.id + JOIN valuts to_valuts ON transfers.to_valut_id = to_valuts.id + JOIN assets ON transfers.asset_id = assets.id + JOIN users from_users ON from_valuts.user_id = from_users.id + JOIN users to_users ON to_valuts.user_id = to_users.id + WHERE (to_valuts.user_id = $1 AND from_valuts.user_id = $2) + OR (to_valuts.user_id = $2 AND from_valuts.user_id = $1) + ORDER BY transfers.created_at DESC + LIMIT $3 + OFFSET $4 + "#, + user_id, + other_user_id, + limit, + offset + ) + .fetch(&self.database) + } } #[derive(Debug, Clone)] pub struct TransfersNotificationManager { notification_manager_subscriber: NotificationManagerSubscriber, + transfers_manager: TransfersManager, } impl TransfersNotificationManager { - pub fn new(notification_manager_subscriber: NotificationManagerSubscriber) -> Self { + pub fn new( + notification_manager_subscriber: NotificationManagerSubscriber, + transfers_manager: TransfersManager, + ) -> Self { Self { notification_manager_subscriber, + transfers_manager, } } @@ -181,4 +311,83 @@ impl TransfersNotificationManager { Err(sqlx::Error::RowNotFound) } } + + pub async fn subscribe_display_to_user( + &self, + user_id: Uuid, + ) -> sqlx::Result>> + Send>>> { + let p = predicates::function::function(move |input: &NotificationManagerPredicateInput| { + match input { + NotificationManagerPredicateInput::Transfers(transfer) => { + transfer.from_user_id == user_id || transfer.to_user_id == user_id + } + _ => false, + } + }); + + if let Ok(mut rx) = self + .notification_manager_subscriber + .subscribe_to(Box::new(p)) + .await + { + let transfers_manager = self.transfers_manager.clone(); + let stream = async_stream::try_stream! { + while let Some(notification) = rx.recv().await { + if let NotificationManagerOutput::Transfers(transfers) = notification { + let transfers_ids: Vec = transfers.iter().map(|x| x.id).collect(); + let mut results = transfers_manager.get_display_transfers_by_ids(transfers_ids.as_slice()); + let mut r = Vec::new(); + while let Some(result) = results.next().await { + r.push(result?); + } + yield r; + } + } + }; + Ok(Box::pin(stream)) + } else { + Err(sqlx::Error::RowNotFound) + } + } + + pub async fn subscribe_specific_to_user( + &self, + user_id: Uuid, + other_user_id: Uuid, + ) -> sqlx::Result>> + Send>>> { + let p = predicates::function::function(move |input: &NotificationManagerPredicateInput| { + match input { + NotificationManagerPredicateInput::Transfers(transfer) => { + (transfer.from_user_id == user_id && transfer.to_user_id == other_user_id) + || (transfer.from_user_id == other_user_id + && transfer.to_user_id == user_id) + } + _ => false, + } + }); + + if let Ok(mut rx) = self + .notification_manager_subscriber + .subscribe_to(Box::new(p)) + .await + { + let transfers_manager = self.transfers_manager.clone(); + let stream = async_stream::try_stream! { + while let Some(notification) = rx.recv().await { + if let NotificationManagerOutput::Transfers(transfers) = notification { + let transfers_ids: Vec = transfers.iter().map(|x| x.id).collect(); + let mut results = transfers_manager.get_display_transfers_by_ids(transfers_ids.as_slice()); + let mut r = Vec::new(); + while let Some(result) = results.next().await { + r.push(result?); + } + yield r; + } + } + }; + Ok(Box::pin(stream)) + } else { + Err(sqlx::Error::RowNotFound) + } + } } diff --git a/server/worker/src/database/managers/users.rs b/server/worker/src/database/managers/users.rs index b31d9c91..6c9fef67 100644 --- a/server/worker/src/database/managers/users.rs +++ b/server/worker/src/database/managers/users.rs @@ -33,9 +33,7 @@ impl UsersManager { users.created_at, users.last_modification_at, users.address as "address: Address", - users.name, - users.phone, - users.email + users.name FROM users WHERE users.address = $1 "#, @@ -52,7 +50,7 @@ impl UsersManager { INSERT INTO users (last_modification_at, address) VALUES ($1, $2) - RETURNING id, created_at, last_modification_at, address as "address: Address", users.name, users.phone, users.email + RETURNING id, created_at, last_modification_at, address as "address: Address", users.name "#, Utc::now(), &address.to_string() @@ -73,9 +71,7 @@ impl UsersManager { users.created_at, users.last_modification_at, users.address as "address: Address", - users.name, - users.phone, - users.email + users.name FROM users WHERE users.last_modification_at > $1 ORDER BY last_modification_at ASC @@ -95,9 +91,7 @@ impl UsersManager { users.created_at, users.last_modification_at, users.address as "address: Address", - users.name, - users.phone, - users.email + users.name FROM users WHERE users.id = $1 "#, @@ -116,9 +110,7 @@ impl UsersManager { users.created_at, users.last_modification_at, users.address as "address: Address", - users.name, - users.phone, - users.email + users.name FROM users "# ) @@ -133,16 +125,12 @@ impl UsersManager { UPDATE users SET last_modification_at = $2, - name = $3, - phone = $4, - email = $5 + name = $3 WHERE users.id = $1 "#, user.id, now, user.name, - user.phone, - user.email, ) .execute(&self.database) .await diff --git a/server/worker/src/database/projections/asset.rs b/server/worker/src/database/projections/asset.rs index 160a2fef..be96a9a4 100644 --- a/server/worker/src/database/projections/asset.rs +++ b/server/worker/src/database/projections/asset.rs @@ -10,6 +10,7 @@ pub struct Asset { pub created_at: DateTime, pub last_modification_at: DateTime, pub name: String, + pub icon_path: String, pub symbol: String, pub address: Address, pub decimals: Fraction, diff --git a/server/worker/src/database/projections/transfer.rs b/server/worker/src/database/projections/transfer.rs index dd9e3aee..d68a948f 100644 --- a/server/worker/src/database/projections/transfer.rs +++ b/server/worker/src/database/projections/transfer.rs @@ -1,4 +1,5 @@ use chrono::{DateTime, Utc}; +use evm::address::Address; use fraction::Fraction; use serde::{Deserialize, Serialize}; use sqlx::types::Uuid; @@ -16,3 +17,21 @@ pub struct Transfer { pub amount: Fraction, pub fee: Fraction, } + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] +pub struct ExtendedTransfer { + pub id: Uuid, + pub created_at: DateTime, + pub from_user_id: Uuid, + pub from_user_address: Address, + pub from_user_name: Option, + pub to_user_id: Uuid, + pub to_user_address: Address, + pub to_user_name: Option, + pub asset_id: Uuid, + pub asset_icon_path: String, + pub asset_name: String, + pub asset_symbol: String, + pub amount: Fraction, + pub fee: Fraction, +} diff --git a/server/worker/src/database/projections/user.rs b/server/worker/src/database/projections/user.rs index dae8a910..0ee37e94 100644 --- a/server/worker/src/database/projections/user.rs +++ b/server/worker/src/database/projections/user.rs @@ -12,8 +12,6 @@ pub struct User { pub last_modification_at: DateTime, pub address: Address, pub name: Option, - pub phone: Option, - pub email: Option, } impl FromRow<'_, PgRow> for User { @@ -31,8 +29,6 @@ impl FromRow<'_, PgRow> for User { last_modification_at: row.try_get("last_modification_at")?, address, name: row.try_get("name")?, - phone: row.try_get("phone")?, - email: row.try_get("email")?, }) } } diff --git a/server/worker/src/main.rs b/server/worker/src/main.rs index d337f8cf..59366ee8 100644 --- a/server/worker/src/main.rs +++ b/server/worker/src/main.rs @@ -87,6 +87,7 @@ async fn main() -> Result<(), Box> { transfers_manager: TransfersManager::new(database.clone()), transfers_notification_manager: TransfersNotificationManager::new( notification_manager_controller.get_subscriber(), + TransfersManager::new(database.clone()), ), badges_manager: BadgesManager::new(database.clone()), badges_notification_manager: BadgesNotificationManager::new( diff --git a/server/worker/src/recognition/user.rs b/server/worker/src/recognition/user.rs index 2b69dbe1..a2ec07a1 100644 --- a/server/worker/src/recognition/user.rs +++ b/server/worker/src/recognition/user.rs @@ -1,12 +1,13 @@ -use std::io::{Error, ErrorKind}; +use std::{io::{Error, ErrorKind}, future}; use database::{managers::users::UsersManager, projections::user::User}; -use futures::TryStreamExt; +use futures::{TryStreamExt}; use nalgebra::DVector; use ordered_float::OrderedFloat; use serde::Serialize; use sqlx::{Pool, Postgres}; use strsim::sorensen_dice; +use uuid::Uuid; use crate::database; @@ -31,6 +32,7 @@ impl UserRecognition { async fn get_users(&self) -> Result, Error> { self.users_manager .get_all() + .try_filter(|user| future::ready( user.id != Uuid::default() )) .try_collect() .await .map_err(|err| Error::new(ErrorKind::BrokenPipe, err)) @@ -44,8 +46,6 @@ impl UserRecognition { Some(user.id.to_string().to_lowercase()), Some(user.address.to_string().to_lowercase()), user.name.as_ref().map(|f| f.to_lowercase()), - user.email.as_ref().map(|f| f.to_lowercase()), - user.phone.as_ref().map(|f| f.to_lowercase()), ], ) }); diff --git a/skaffold.yaml b/skaffold.yaml index d9c2edb4..4c5bf840 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -1,53 +1,54 @@ -apiVersion: skaffold/v4beta3 +apiVersion: skaffold/v4beta6 kind: Config build: artifacts: - - image: busybox - context: ./containers + - image: registry.internal.visoft.solutions/blockchain-node + context: ./blockchain docker: - dockerfile: busybox.dockerfile - - image: postgres-database + dockerfile: Dockerfile + - image: registry.internal.visoft.solutions/postgres-database context: ./postgres docker: dockerfile: Dockerfile - - image: redis-database + - image: registry.internal.visoft.solutions/redis-database context: ./redis docker: dockerfile: Dockerfile - - image: server-engine + - image: registry.internal.visoft.solutions/server-blockchain context: ./server docker: - dockerfile: engine.dockerfile - - image: server-engagement + dockerfile: blockchain.dockerfile + - image: registry.internal.visoft.solutions/server-engine context: ./server docker: - dockerfile: engagement.dockerfile - - image: server-worker + dockerfile: engine.dockerfile + - image: registry.internal.visoft.solutions/server-engagement context: ./server docker: - dockerfile: worker.dockerfile - - image: pay-worker + dockerfile: engagement.dockerfile + - image: registry.internal.visoft.solutions/server-worker context: ./server docker: dockerfile: worker.dockerfile - - image: web-exchange + - image: registry.internal.visoft.solutions/web-exchange context: ./web docker: dockerfile: exchange.dockerfile - - image: web-exchange-landing + - image: registry.internal.visoft.solutions/web-exchange-landing context: ./web docker: dockerfile: exchange-landing.dockerfile - - image: web-processor + - image: registry.internal.visoft.solutions/web-processor context: ./web docker: dockerfile: processor.dockerfile - - image: web-dashboard + - image: registry.internal.visoft.solutions/web-dashboard context: ./web docker: dockerfile: dashboard.dockerfile manifests: rawYaml: + - ./blockchain/k8s/* - ./postgres/k8s/* - ./redis/k8s/* - ./server/k8s/* diff --git a/web/apps/dashboard/package.json b/web/apps/dashboard/package.json index 053e8118..b44436d0 100644 --- a/web/apps/dashboard/package.json +++ b/web/apps/dashboard/package.json @@ -10,8 +10,8 @@ "@packages/eslint": "1.0.0", "@packages/prettier": "1.0.0", "@packages/tailwind": "1.0.0", - "solid-start-node": "^0.3.3", - "typescript": "^5.1.6", + "solid-start-node": "^0.3.4", + "typescript": "^5.2.2", "vite": "^4.4.9" }, "dependencies": { @@ -22,10 +22,10 @@ "@web3modal/html": "^2.7.1", "numerable": "^0.3.15", "solid-js": "^1.7.11", - "solid-start": "^0.3.3", + "solid-start": "^0.3.4", "undici": "^5.23.0", - "viem": "^1.6.0", - "zod": "^3.22.1" + "viem": "^1.7.0", + "zod": "^3.22.2" }, "engines": { "node": ">=18" diff --git a/web/apps/exchange-landing/package.json b/web/apps/exchange-landing/package.json index 02d625ec..7b4fac27 100644 --- a/web/apps/exchange-landing/package.json +++ b/web/apps/exchange-landing/package.json @@ -10,8 +10,8 @@ "@packages/eslint": "1.0.0", "@packages/prettier": "1.0.0", "@packages/tailwind": "1.0.0", - "solid-start-node": "^0.3.3", - "typescript": "^5.1.6", + "solid-start-node": "^0.3.4", + "typescript": "^5.2.2", "vite": "^4.4.9", "vite-plugin-pwa": "^0.16.4" }, @@ -22,9 +22,9 @@ "@web3modal/ethereum": "^2.7.1", "@web3modal/html": "^2.7.1", "solid-js": "^1.7.11", - "solid-start": "^0.3.3", + "solid-start": "^0.3.4", "undici": "^5.23.0", - "viem": "^1.6.0" + "viem": "^1.7.0" }, "engines": { "node": ">=18" diff --git a/web/apps/exchange/package.json b/web/apps/exchange/package.json index d0abd51c..e445aa52 100644 --- a/web/apps/exchange/package.json +++ b/web/apps/exchange/package.json @@ -10,8 +10,8 @@ "@packages/eslint": "1.0.0", "@packages/prettier": "1.0.0", "@packages/tailwind": "1.0.0", - "solid-start-node": "^0.3.3", - "typescript": "^5.1.6", + "solid-start-node": "^0.3.4", + "typescript": "^5.2.2", "vite": "^4.4.9", "vite-plugin-environment": "^1.1.3", "vite-plugin-pwa": "^0.16.4" @@ -25,10 +25,10 @@ "lightweight-charts": "^4.0.1", "numerable": "^0.3.15", "solid-js": "^1.7.11", - "solid-start": "^0.3.3", + "solid-start": "^0.3.4", "undici": "^5.23.0", - "viem": "^1.6.0", - "zod": "^3.22.1" + "viem": "^1.7.0", + "zod": "^3.22.2" }, "engines": { "node": ">=18" diff --git a/web/apps/exchange/src/components/App/State/OpenOrders.tsx b/web/apps/exchange/src/components/App/State/OpenOrders.tsx index 9251cf32..abcb81ee 100644 --- a/web/apps/exchange/src/components/App/State/OpenOrders.tsx +++ b/web/apps/exchange/src/components/App/State/OpenOrders.tsx @@ -6,7 +6,7 @@ import params from "@packages/utils/params"; import { PrivateOrder } from "@packages/types/order"; import { z } from "zod"; import { Uuid } from "@packages/types/primitives/uuid"; -import { useAssets } from "~/components/providers/AssetsProvider"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; import { Market } from "~/components/providers/MarketProvider"; import { format } from "numerable"; import { formatTemplate } from "@packages/utils/precision"; diff --git a/web/apps/exchange/src/components/App/State/OrderHistory.tsx b/web/apps/exchange/src/components/App/State/OrderHistory.tsx index 9bdf48ad..501731ec 100644 --- a/web/apps/exchange/src/components/App/State/OrderHistory.tsx +++ b/web/apps/exchange/src/components/App/State/OrderHistory.tsx @@ -5,7 +5,7 @@ import { Asset } from "@packages/types/asset"; import { Market } from "~/components/providers/MarketProvider"; import { ev, finv, fmul } from "@packages/types/primitives/fraction"; import { Uuid } from "@packages/types/primitives/uuid"; -import { useAssets } from "~/components/providers/AssetsProvider"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; import { PrivateOrder } from "@packages/types/order"; import { api } from "~/root"; import params from "@packages/utils/params"; diff --git a/web/apps/exchange/src/components/App/State/TradeHistory.tsx b/web/apps/exchange/src/components/App/State/TradeHistory.tsx index b42bacbd..9162ec30 100644 --- a/web/apps/exchange/src/components/App/State/TradeHistory.tsx +++ b/web/apps/exchange/src/components/App/State/TradeHistory.tsx @@ -3,7 +3,7 @@ import { createStore } from "solid-js/store"; import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; import { Asset } from "@packages/types/asset"; import { Market } from "~/components/providers/MarketProvider"; -import { useAssets } from "~/components/providers/AssetsProvider"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; import { Uuid } from "@packages/types/primitives/uuid"; import { format } from "numerable"; import { formatTemplate } from "@packages/utils/precision"; diff --git a/web/apps/exchange/src/components/Assets.tsx b/web/apps/exchange/src/components/Assets.tsx index cbef66d4..8fd372e1 100644 --- a/web/apps/exchange/src/components/Assets.tsx +++ b/web/apps/exchange/src/components/Assets.tsx @@ -1,7 +1,7 @@ import { base } from "~/root"; import { joinPaths } from "solid-start/islands/server-router"; import { Index, Match, Switch, createMemo, createSignal } from "solid-js"; -import { useAssets } from "~/components/providers/AssetsProvider"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; import SearchInput from "~/components/Inputs/SearchInput"; import { usePrecision } from "@packages/components/providers/PrecisionProvider"; import { Dynamic } from "solid-js/web"; @@ -72,12 +72,7 @@ export default function Assets() {
diff --git a/web/apps/exchange/src/components/Assets/AssetInfo.tsx b/web/apps/exchange/src/components/Assets/AssetInfo.tsx index f46489b0..170a7c37 100644 --- a/web/apps/exchange/src/components/Assets/AssetInfo.tsx +++ b/web/apps/exchange/src/components/Assets/AssetInfo.tsx @@ -65,7 +65,7 @@ export function AssetInfo(props: {
{`${props.asset?.name} (${props.asset?.symbol})`}
- {balance() != undefined + {balance() ? format(ev(balance()!), formatTemplate(props.precision ?? 3)) : "---"}
diff --git a/web/apps/exchange/src/components/Assets/Deposit.tsx b/web/apps/exchange/src/components/Assets/Deposit.tsx index c1ef6b87..d5b3c40b 100644 --- a/web/apps/exchange/src/components/Assets/Deposit.tsx +++ b/web/apps/exchange/src/components/Assets/Deposit.tsx @@ -2,18 +2,12 @@ import NumberInput from "../Inputs/NumberInput"; import { Show, createEffect, createSignal } from "solid-js"; import { useSession } from "@packages/components/providers/SessionProvider"; import { Asset } from "@packages/types/asset"; -import { - Fraction, - ev, - fFromBigint, - fmul, -} from "@packages/types/primitives/fraction"; +import { Fraction, fFromBigint } from "@packages/types/primitives/fraction"; import TextInput from "../Inputs/TextInput"; import { useWallet } from "@packages/components/providers/WalletProvider"; -import { ABI as TREASURY_ABI } from "~/contract/treasury"; -import { ABI as ERC20_ABI } from "~/contract/erc20"; import { Address } from "viem"; import { useContractAddress } from "@packages/components/providers/ContractAddressProvider"; +import { handleDeposit } from "@packages/utils/handlers/depositPermit"; export default function CreateDeposit(asset?: Asset, precision?: number) { return () => ( @@ -23,18 +17,6 @@ export default function CreateDeposit(asset?: Asset, precision?: number) { ); } -const splitSig = (sig: string) => { - const pureSig = sig.replace("0x", ""); - const r = "0x" + pureSig.substring(0, 64); - const s = "0x" + pureSig.substring(64, 128); - const v = parseInt(pureSig.substring(128, 130), 16); - return { - r, - s, - v, - }; -}; - export function Deposit(props: { asset: Asset; precision: number }) { const contractAddress = useContractAddress(); const [amount, setAmount] = createSignal(fFromBigint(0n)); @@ -80,77 +62,15 @@ export function Deposit(props: { asset: Asset; precision: number }) { select-none items-center justify-center rounded-md text-markets-label transition-colors duration-75 `} onClick={async () => { - const address_value = address(); - const value = BigInt( - Math.floor(ev(fmul(props.asset.decimals, amount()))), - ); - if (wallet && address_value && wallet.address) { - const nonce = (await wallet.publicClient?.readContract({ - address: props.asset.address as Address, - abi: ERC20_ABI, - functionName: "nonces", - account: wallet.address as Address, - args: [wallet.address as Address], - })) as bigint; - - const deadline = - ((await wallet.publicClient?.getBlock())?.timestamp ?? 0n) + - 3600n; - - const domain = { - name: props.asset.name, - version: "1", - chainId: BigInt(wallet.selected_network.network.id), - verifyingContract: props.asset.address as Address, - }; - - const permit = { - owner: wallet.address as Address, - spender: contractAddress!() as Address, - value, - nonce, - deadline, - }; - - const signature = await wallet.walletClient?.signTypedData({ - account: wallet.address as Address, - domain, - types: { - Permit: [ - { name: "owner", type: "address" }, - { name: "spender", type: "address" }, - { name: "value", type: "uint256" }, - { name: "nonce", type: "uint256" }, - { name: "deadline", type: "uint256" }, - ], - EIP712Domain: [ - { name: "name", type: "string" }, - { name: "version", type: "string" }, - { name: "chainId", type: "uint256" }, - { name: "verifyingContract", type: "address" }, - ], - }, - primaryType: "Permit", - message: permit, + const asset = props.asset; + const treasury = contractAddress!(); + if (asset && treasury) { + await handleDeposit({ + asset: props.asset, + amount: amount(), + wallet, + treasury_address: treasury, }); - if (signature) { - const { r, s, v } = splitSig(signature); - await wallet.walletClient?.writeContract({ - chain: wallet.selected_network.network, - address: contractAddress!() as Address, - abi: TREASURY_ABI, - functionName: "depositPermit", - account: wallet.address as Address, - args: [ - props.asset.address as Address, - value, - deadline, - v, - r, - s, - ], - }); - } } }} > diff --git a/web/apps/exchange/src/components/Assets/Withdraw.tsx b/web/apps/exchange/src/components/Assets/Withdraw.tsx index 9ab0f2eb..62612232 100644 --- a/web/apps/exchange/src/components/Assets/Withdraw.tsx +++ b/web/apps/exchange/src/components/Assets/Withdraw.tsx @@ -2,19 +2,12 @@ import NumberInput from "~/components/Inputs/NumberInput"; import { Show, createSignal } from "solid-js"; import { useSession } from "@packages/components/providers/SessionProvider"; import { Asset } from "@packages/types/asset"; -import { - Fraction, - ev, - fFromBigint, - fmul, -} from "@packages/types/primitives/fraction"; +import { Fraction, fFromBigint } from "@packages/types/primitives/fraction"; import TextInput from "~/components/Inputs/TextInput"; -import { api } from "~/root"; -import { WithdrawRequest, WithdrawResponse } from "@packages/types/mod"; import { useWallet } from "@packages/components/providers/WalletProvider"; import { Address } from "viem"; -import { ABI as TREASURY_ABI } from "~/contract/treasury"; import { useContractAddress } from "@packages/components/providers/ContractAddressProvider"; +import { handleWithdraw } from "@packages/utils/handlers/withdrawPermit"; export default function CreateWithdraw(asset?: Asset, precision?: number) { return () => ( @@ -24,18 +17,6 @@ export default function CreateWithdraw(asset?: Asset, precision?: number) { ); } -const splitSig = (sig: string) => { - const pureSig = sig.replace("0x", ""); - const r = "0x" + pureSig.substring(0, 64); - const s = "0x" + pureSig.substring(64, 128); - const v = parseInt(pureSig.substring(128, 130), 16); - return { - r, - s, - v, - }; -}; - export function Withdraw(props: { asset: Asset; precision: number }) { const contractAddress = useContractAddress(); const [amount, setAmount] = createSignal(fFromBigint(0n)); @@ -77,48 +58,16 @@ export function Withdraw(props: { asset: Asset; precision: number }) { select-none items-center justify-center rounded-md text-markets-label transition-colors duration-75 `} onClick={async () => { - const address_value = address(); - const value = BigInt( - Math.floor(ev(fmul(props.asset.decimals, amount()))), - ); - const deadline = new Date(new Date().getTime() + 60 * 1000); - if (wallet && address_value && wallet.address) { - const response = await fetch(`${api}/private/withdraw`, { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - credentials: "same-origin", - body: JSON.stringify( - WithdrawRequest.parse({ - spender: address(), - asset: props.asset.address, - amount: amount(), - deadline, - }), - (_, v) => (typeof v === "bigint" ? v.toString() : v), - ), - }) - .then((r) => r.json()) - .then((r) => WithdrawResponse.parse(r)); - - const { r, s, v } = splitSig(response.response); - await wallet.walletClient?.writeContract({ - chain: wallet.selected_network.network, - address: contractAddress!() as Address, - abi: TREASURY_ABI, - functionName: "withdrawPermit", - account: wallet.address as Address, - args: [ - props.asset.address as Address, - value, - Math.floor(deadline.getTime() / 1000), - v, - r, - s, - address(), - ], + const asset = props.asset; + const treasury = contractAddress!(); + const addr = address(); + if (asset && treasury && addr) { + await handleWithdraw({ + address_value: addr, + asset: asset, + amount: amount(), + wallet, + treasury_address: treasury, }); } }} diff --git a/web/apps/exchange/src/components/providers/MarketProvider.tsx b/web/apps/exchange/src/components/providers/MarketProvider.tsx index 802d2568..0817df20 100644 --- a/web/apps/exchange/src/components/providers/MarketProvider.tsx +++ b/web/apps/exchange/src/components/providers/MarketProvider.tsx @@ -9,7 +9,7 @@ import { import { useParams } from "solid-start"; import { Asset } from "@packages/types/asset"; import { Uuid } from "@packages/types/primitives/uuid"; -import { useAssets } from "~/components/providers/AssetsProvider"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; export type Market = { quote_asset?: Asset; base_asset?: Asset }; diff --git a/web/apps/exchange/src/routes/index.tsx b/web/apps/exchange/src/routes/index.tsx index 8bd4d7fe..e946bf5b 100644 --- a/web/apps/exchange/src/routes/index.tsx +++ b/web/apps/exchange/src/routes/index.tsx @@ -1,4 +1,4 @@ -import { AssetsProvider } from "~/components/providers/AssetsProvider"; +import { AssetsProvider } from "@packages/components/providers/AssetsProvider"; import { MarketProvider } from "~/components/providers/MarketProvider"; import { Outlet } from "solid-start"; import MainMenu from "~/components/MainMenu"; @@ -18,7 +18,7 @@ export default function Index() {
- + diff --git a/web/apps/processor/package.json b/web/apps/processor/package.json index f749cd95..4eae4275 100644 --- a/web/apps/processor/package.json +++ b/web/apps/processor/package.json @@ -10,8 +10,8 @@ "@packages/eslint": "1.0.0", "@packages/prettier": "1.0.0", "@packages/tailwind": "1.0.0", - "solid-start-node": "^0.3.3", - "typescript": "^5.1.6", + "solid-start-node": "^0.3.4", + "typescript": "^5.2.2", "vite": "^4.4.9", "vite-plugin-pwa": "^0.16.4" }, @@ -23,10 +23,10 @@ "@web3modal/html": "^2.7.1", "numerable": "^0.3.15", "solid-js": "^1.7.11", - "solid-start": "^0.3.3", + "solid-start": "^0.3.4", "undici": "^5.23.0", - "viem": "^1.6.0", - "zod": "^3.22.1" + "viem": "^1.7.0", + "zod": "^3.22.2" }, "engines": { "node": ">=18" diff --git a/web/apps/processor/public/gfx/arrow_down-dark.svg b/web/apps/processor/public/gfx/arrow_down-dark.svg new file mode 100644 index 00000000..f1dc9516 --- /dev/null +++ b/web/apps/processor/public/gfx/arrow_down-dark.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/arrow_down-light.svg b/web/apps/processor/public/gfx/arrow_down-light.svg new file mode 100644 index 00000000..868dd28d --- /dev/null +++ b/web/apps/processor/public/gfx/arrow_down-light.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/assets_arrow_down.svg b/web/apps/processor/public/gfx/assets_arrow_down.svg deleted file mode 100644 index 4bb56e2c..00000000 --- a/web/apps/processor/public/gfx/assets_arrow_down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/apps/processor/public/gfx/assets_arrow_up.svg b/web/apps/processor/public/gfx/assets_arrow_up.svg deleted file mode 100644 index ced5b910..00000000 --- a/web/apps/processor/public/gfx/assets_arrow_up.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/web/apps/processor/public/gfx/assets_clock.svg b/web/apps/processor/public/gfx/assets_clock.svg deleted file mode 100644 index 33a23910..00000000 --- a/web/apps/processor/public/gfx/assets_clock.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/web/apps/processor/public/gfx/assets_transfer.svg b/web/apps/processor/public/gfx/assets_transfer.svg deleted file mode 100644 index 2a0ee49d..00000000 --- a/web/apps/processor/public/gfx/assets_transfer.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/apps/processor/public/gfx/bell-dark.svg b/web/apps/processor/public/gfx/bell-dark.svg new file mode 100644 index 00000000..6a1d7558 --- /dev/null +++ b/web/apps/processor/public/gfx/bell-dark.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/bell-light.svg b/web/apps/processor/public/gfx/bell-light.svg new file mode 100644 index 00000000..0e5c4d69 --- /dev/null +++ b/web/apps/processor/public/gfx/bell-light.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/cancel.svg b/web/apps/processor/public/gfx/cancel.svg deleted file mode 100644 index 0ac1485f..00000000 --- a/web/apps/processor/public/gfx/cancel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/apps/processor/public/gfx/deposit-dark.svg b/web/apps/processor/public/gfx/deposit-dark.svg new file mode 100644 index 00000000..b2e61c45 --- /dev/null +++ b/web/apps/processor/public/gfx/deposit-dark.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/deposit-light.svg b/web/apps/processor/public/gfx/deposit-light.svg new file mode 100644 index 00000000..6d1689c9 --- /dev/null +++ b/web/apps/processor/public/gfx/deposit-light.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/deposit.svg b/web/apps/processor/public/gfx/deposit.svg new file mode 100644 index 00000000..e540f906 --- /dev/null +++ b/web/apps/processor/public/gfx/deposit.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/home-dark.svg b/web/apps/processor/public/gfx/home-dark.svg new file mode 100644 index 00000000..0da772a6 --- /dev/null +++ b/web/apps/processor/public/gfx/home-dark.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/home-light.svg b/web/apps/processor/public/gfx/home-light.svg new file mode 100644 index 00000000..5c321bfc --- /dev/null +++ b/web/apps/processor/public/gfx/home-light.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/home.svg b/web/apps/processor/public/gfx/home.svg deleted file mode 100644 index be9e9e61..00000000 --- a/web/apps/processor/public/gfx/home.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/web/apps/processor/public/gfx/left_arrow.svg b/web/apps/processor/public/gfx/left_arrow.svg new file mode 100644 index 00000000..cf2ed402 --- /dev/null +++ b/web/apps/processor/public/gfx/left_arrow.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/logo.svg b/web/apps/processor/public/gfx/logo.svg deleted file mode 100644 index 33129d83..00000000 --- a/web/apps/processor/public/gfx/logo.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - diff --git a/web/apps/processor/public/gfx/mode-dark.svg b/web/apps/processor/public/gfx/mode-dark.svg new file mode 100644 index 00000000..e5e06192 --- /dev/null +++ b/web/apps/processor/public/gfx/mode-dark.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/mode-light.svg b/web/apps/processor/public/gfx/mode-light.svg new file mode 100644 index 00000000..1e1c48bf --- /dev/null +++ b/web/apps/processor/public/gfx/mode-light.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/plus.svg b/web/apps/processor/public/gfx/plus.svg new file mode 100644 index 00000000..f6029f78 --- /dev/null +++ b/web/apps/processor/public/gfx/plus.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/right_arrow.svg b/web/apps/processor/public/gfx/right_arrow.svg new file mode 100644 index 00000000..ec1b759c --- /dev/null +++ b/web/apps/processor/public/gfx/right_arrow.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/search.svg b/web/apps/processor/public/gfx/search.svg index 27f9632e..0de245d9 100644 --- a/web/apps/processor/public/gfx/search.svg +++ b/web/apps/processor/public/gfx/search.svg @@ -1,3 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/settings-dark.svg b/web/apps/processor/public/gfx/settings-dark.svg new file mode 100644 index 00000000..1cce825c --- /dev/null +++ b/web/apps/processor/public/gfx/settings-dark.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/settings-light.svg b/web/apps/processor/public/gfx/settings-light.svg new file mode 100644 index 00000000..e51081f9 --- /dev/null +++ b/web/apps/processor/public/gfx/settings-light.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/side_menu_assets.svg b/web/apps/processor/public/gfx/side_menu_assets.svg deleted file mode 100644 index 36549bbc..00000000 --- a/web/apps/processor/public/gfx/side_menu_assets.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/web/apps/processor/public/gfx/side_menu_spot.svg b/web/apps/processor/public/gfx/side_menu_spot.svg deleted file mode 100644 index 8d3e11a3..00000000 --- a/web/apps/processor/public/gfx/side_menu_spot.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/apps/processor/public/gfx/star.svg b/web/apps/processor/public/gfx/star.svg deleted file mode 100644 index ee8ec3d0..00000000 --- a/web/apps/processor/public/gfx/star.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/apps/processor/public/gfx/transfer-dark.svg b/web/apps/processor/public/gfx/transfer-dark.svg new file mode 100644 index 00000000..f460ad28 --- /dev/null +++ b/web/apps/processor/public/gfx/transfer-dark.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/transfer-light.svg b/web/apps/processor/public/gfx/transfer-light.svg new file mode 100644 index 00000000..b589b04c --- /dev/null +++ b/web/apps/processor/public/gfx/transfer-light.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/transfer.svg b/web/apps/processor/public/gfx/transfer.svg index 7bd5b54b..21e26eef 100644 --- a/web/apps/processor/public/gfx/transfer.svg +++ b/web/apps/processor/public/gfx/transfer.svg @@ -1,7 +1,5 @@ - - - - - - transfer_fill - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/user.svg b/web/apps/processor/public/gfx/user.svg deleted file mode 100644 index 9ed25f60..00000000 --- a/web/apps/processor/public/gfx/user.svg +++ /dev/null @@ -1,4 +0,0 @@ - - Svg Vector Icons : http://www.onlinewebfonts.com/icon - - \ No newline at end of file diff --git a/web/apps/processor/public/gfx/wallet.svg b/web/apps/processor/public/gfx/wallet.svg deleted file mode 100644 index 457c5bde..00000000 --- a/web/apps/processor/public/gfx/wallet.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/web/apps/processor/public/gfx/walletconnect.svg b/web/apps/processor/public/gfx/walletconnect.svg deleted file mode 100644 index d90457ad..00000000 --- a/web/apps/processor/public/gfx/walletconnect.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/apps/processor/public/gfx/withdraw-dark.svg b/web/apps/processor/public/gfx/withdraw-dark.svg new file mode 100644 index 00000000..41eec500 --- /dev/null +++ b/web/apps/processor/public/gfx/withdraw-dark.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/withdraw-light.svg b/web/apps/processor/public/gfx/withdraw-light.svg new file mode 100644 index 00000000..3e65c5bd --- /dev/null +++ b/web/apps/processor/public/gfx/withdraw-light.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/public/gfx/withdraw.svg b/web/apps/processor/public/gfx/withdraw.svg new file mode 100644 index 00000000..83cb5efd --- /dev/null +++ b/web/apps/processor/public/gfx/withdraw.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/web/apps/processor/src/components/Account.tsx b/web/apps/processor/src/components/Account.tsx deleted file mode 100644 index 5f65955e..00000000 --- a/web/apps/processor/src/components/Account.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { onMount } from "solid-js"; -import SearchInput from "~/components/Inputs/SearchInput"; -import { createStore } from "solid-js/store"; -import { api } from "~/root"; -import { UserUpdateRequest } from "@packages/types/mod"; -import { useSession } from "@packages/components/providers/SessionProvider"; -import { User } from "@packages/types/user"; - -interface UserData { - name?: string; - email?: string; - phone?: string; -} - -export default function Account() { - const [userData, setUserData] = createStore({}); - const session = useSession(); - - onMount(async () => { - const response = await fetch(`${api}/private/user`, { - method: "GET", - credentials: "same-origin", - }) - .then((r) => r.json()) - .then((r) => User.parse(r)); - - setUserData({ - name: response.name ?? undefined, - email: response.email ?? undefined, - phone: response.phone ?? undefined, - }); - }); - - return ( -
- setUserData({ name: e.target.value })} - /> - setUserData({ email: e.target.value })} - /> - setUserData({ phone: e.target.value })} - /> -
{ - if (session()) { - await fetch(`${api}/private/user`, { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - credentials: "same-origin", - body: JSON.stringify( - UserUpdateRequest.parse({ - name: userData.name, - email: userData.email, - phone: userData.phone, - }), - (_, v) => (typeof v === "bigint" ? v.toString() : v), - ), - }).then((r) => r.text()); - } - }} - > - Submit -
-
- ); -} diff --git a/web/apps/processor/src/components/App.tsx b/web/apps/processor/src/components/App.tsx deleted file mode 100644 index 8e738013..00000000 --- a/web/apps/processor/src/components/App.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useSession } from "@packages/components/providers/SessionProvider"; -import { usePrecision } from "@packages/components/providers/PrecisionProvider"; -import { useAssets } from "~/components/providers/AssetsProvider"; -import { Dynamic } from "solid-js/web"; -import CreateWealth from "~/components/App/Wealth"; - -export default function App() { - const assets = useAssets(); - const session = useSession(); - const precision = usePrecision(); - - return ( -
- -
- ); -} diff --git a/web/apps/processor/src/components/App/Wealth.tsx b/web/apps/processor/src/components/App/Wealth.tsx deleted file mode 100644 index d71da6be..00000000 --- a/web/apps/processor/src/components/App/Wealth.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Index, Show, batch, onMount } from "solid-js"; -import { createStore } from "solid-js/store"; -import { Asset } from "@packages/types/asset"; -import { Uuid } from "@packages/types/primitives/uuid"; -import { AssetInfo } from "~/components/App/Wealth/AssetInfo"; -import { A } from "@solidjs/router"; -import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; - -export default function CreateWealth( - assets: Map, - session: SessionResponse | undefined, - precision: number, -) { - return () => ( - }> - - - ); -} - -export function Wealth(props: { - session?: SessionResponse; - assets?: Map; - precision?: number; -}) { - const [assetsStore, setAssetsStore] = createStore<{ [key: Uuid]: Asset }>({}); - - onMount(async () => { - batch(() => { - props.assets?.forEach((e) => { - setAssetsStore({ [e.id]: e }); - }); - }); - }); - - return ( -
- - {(element) => ( - - - - )} - -
- ); -} diff --git a/web/apps/processor/src/components/App/Wealth/AssetInfo.tsx b/web/apps/processor/src/components/App/Wealth/AssetInfo.tsx deleted file mode 100644 index 96780960..00000000 --- a/web/apps/processor/src/components/App/Wealth/AssetInfo.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { format } from "numerable"; -import { Show, createSignal, onCleanup, onMount } from "solid-js"; -import { joinPaths } from "solid-start/islands/server-router"; -import { api, base } from "~/root"; -import { Asset } from "@packages/types/asset"; -import { ev } from "@packages/types/primitives/fraction"; -import { Valut } from "@packages/types/valut"; -import subscribeEvents from "@packages/utils/subscribeEvents"; -import params from "@packages/utils/params"; -import { formatTemplate } from "@packages/utils/precision"; -import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; -import { Value } from "@packages/types/primitives/value"; - -export default function CreateAssetInfo( - session?: SessionResponse, - asset?: Asset, - precision?: number, -) { - return () => ( - - - - ); -} - -export function AssetInfo(props: { - session?: SessionResponse; - asset?: Asset; - precision?: number; -}) { - const [balance, setBalance] = createSignal(undefined); - - let eventsource: EventSource | undefined; - - onMount(async () => { - if (props.session && props.asset && props.precision) { - const asset = props.asset; - - eventsource = await subscribeEvents( - `${api}/private/balance`, - params({ asset_id: asset.id }), - params({ asset_id: asset.id }), - (data) => { - setBalance(Valut.parse(data).balance); - }, - ); - } - }); - - onCleanup(() => { - eventsource?.close(); - }); - - return ( -
-
- -
-
-
{`${props.asset?.name} (${props.asset?.symbol})`}
-
- {balance()?.Finite - ? format( - ev(balance()?.Finite), - formatTemplate(props.precision ?? 3), - ) - : "---"} -
-
-
- ); -} diff --git a/web/apps/processor/src/components/Asset.tsx b/web/apps/processor/src/components/Asset.tsx deleted file mode 100644 index 68e3d9f3..00000000 --- a/web/apps/processor/src/components/Asset.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { useAsset } from "~/components/providers/AssetProvider"; -import { useSession } from "@packages/components/providers/SessionProvider"; -import { usePrecision } from "@packages/components/providers/PrecisionProvider"; -import CreateAssetInfo from "~/components/Asset/AssetInfo"; -import { Dynamic } from "solid-js/web"; -import CreateActions from "~/components/Asset/Actions"; - -export default function Asset() { - const asset = useAsset(); - const session = useSession(); - const precision = usePrecision(); - - return ( -
-
- -
-
- -
-
- ); -} diff --git a/web/apps/processor/src/components/Asset/Actions.tsx b/web/apps/processor/src/components/Asset/Actions.tsx deleted file mode 100644 index c0c2efba..00000000 --- a/web/apps/processor/src/components/Asset/Actions.tsx +++ /dev/null @@ -1,205 +0,0 @@ -import { Index, Show, createEffect, createSignal } from "solid-js"; -import { joinPaths } from "solid-start/islands/server-router"; -import { api, base } from "~/root"; -import { Asset } from "@packages/types/asset"; -import { Fraction, fFromBigint } from "@packages/types/primitives/fraction"; -import params from "@packages/utils/params"; -import NumberInput from "~/components/Inputs/NumberInput"; -import { MintBurnRequest, TransferRequest } from "@packages/types/mod"; -import SearchInput from "~/components/Inputs/SearchInput"; -import { z } from "zod"; -import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; -import { User } from "@packages/types/user"; - -export const UserRecognitionResult = z.object({ - score: z.number(), - user: User, -}); -export type UserRecognitionResult = z.infer; - -const querySearch = async (input: string) => { - return await fetch(`${api}/public/users/search_user?${params({ input })}`) - .then((r) => r.json()) - .then((r) => z.array(UserRecognitionResult).parse(r)); -}; - -export default function CreateActions( - asset?: Asset, - session?: SessionResponse, - precision?: number, -) { - return () => ( - - - - ); -} - -export function Actions(props: { - session?: SessionResponse; - asset?: Asset; - precision?: number; -}) { - const [amount, setAmount] = createSignal(fFromBigint(0n)); - const [search, setSearch] = createSignal(""); - const [users, setUsers] = createSignal([]); - const [selectedUser, setSelectedUser] = createSignal( - undefined, - ); - - createEffect(async () => { - if (search()) { - setUsers(await querySearch(search())); - } - }); - - return ( - <> -
- { - setAmount(f); - }} - /> -
-
{ - if (props.session) { - await fetch(`${api}/private/burn`, { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - credentials: "same-origin", - body: JSON.stringify( - MintBurnRequest.parse({ - asset_id: props.asset?.id, - amount: amount(), - }), - (_, v) => (typeof v === "bigint" ? v.toString() : v), - ), - }).then((r) => r.text()); - } - }} - > - Burn -
-
{ - if (props.session) { - await fetch(`${api}/private/mint`, { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - credentials: "same-origin", - body: JSON.stringify( - MintBurnRequest.parse({ - asset_id: props.asset?.id, - amount: amount(), - }), - (_, v) => (typeof v === "bigint" ? v.toString() : v), - ), - }).then((r) => r.text()); - } - }} - > - Mint -
-
-
{ - if (props.session && selectedUser() != undefined) { - await fetch(`${api}/private/transfer`, { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - credentials: "same-origin", - body: JSON.stringify( - TransferRequest.parse({ - taker_id: selectedUser()?.id, - asset_id: props.asset?.id, - amount: amount(), - }), - (_, v) => (typeof v === "bigint" ? v.toString() : v), - ), - }).then((r) => r.text()); - } - }} - > - Transfer -
- { - setSearch(f.target.value); - }} - /> -
-
- - {(element) => ( -
{ - setSelectedUser(element().user); - }} - > -
- user -
-
-
id: {element().user.id}
-
- address: {element().user.address} -
-
-
- )} -
-
-
-
- - ); -} diff --git a/web/apps/processor/src/components/Asset/AssetInfo.tsx b/web/apps/processor/src/components/Asset/AssetInfo.tsx deleted file mode 100644 index e2b22982..00000000 --- a/web/apps/processor/src/components/Asset/AssetInfo.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { format } from "numerable"; -import { Show, createSignal, onCleanup, onMount } from "solid-js"; -import { joinPaths } from "solid-start/islands/server-router"; -import { api, base } from "~/root"; -import { Asset } from "@packages/types/asset"; -import { ev } from "@packages/types/primitives/fraction"; -import { Valut } from "@packages/types/valut"; -import subscribeEvents from "@packages/utils/subscribeEvents"; -import params from "@packages/utils/params"; -import { formatTemplate } from "@packages/utils/precision"; -import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; -import { Value } from "@packages/types/primitives/value"; - -export default function CreateAssetInfo( - asset?: Asset, - session?: SessionResponse, - precision?: number, -) { - return () => ( - - - - ); -} - -export function AssetInfo(props: { - session?: SessionResponse; - asset?: Asset; - precision?: number; -}) { - const [balance, setBalance] = createSignal(undefined); - - let eventsource: EventSource | undefined; - - onMount(async () => { - if (props.session && props.asset && props.precision) { - const asset = props.asset; - - eventsource = await subscribeEvents( - `${api}/private/balance`, - params({ asset_id: asset.id }), - params({ asset_id: asset.id }), - (data) => { - setBalance(Valut.parse(data).balance); - }, - ); - } - }); - - onCleanup(() => { - eventsource?.close(); - }); - - return ( -
-
- -
-
-
{props.asset?.name}
-
{props.asset?.symbol}
-
-
- {balance()?.Finite - ? format(ev(balance()?.Finite), formatTemplate(props.precision ?? 3)) - : "---"} -
-
- ); -} diff --git a/web/apps/processor/src/components/Atoms/Buttons/ActionButton.tsx b/web/apps/processor/src/components/Atoms/Buttons/ActionButton.tsx new file mode 100644 index 00000000..a137de24 --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Buttons/ActionButton.tsx @@ -0,0 +1,17 @@ +export interface IActionButton { + text?: string; + onClick?: () => void; +} + +export default function ActionButton(props: IActionButton) { + return ( +
+
{props.text}
+
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/Buttons/ArrowDownButton.tsx b/web/apps/processor/src/components/Atoms/Buttons/ArrowDownButton.tsx new file mode 100644 index 00000000..00aa009d --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Buttons/ArrowDownButton.tsx @@ -0,0 +1,40 @@ +import { Match, Switch } from "solid-js"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; +import { + ColorMode, + useColorMode, +} from "@packages/components/providers/ColorModeProvider"; + +export interface IArrowDownButton { + class?: string; + onClick: () => void; +} + +export default function ArrowDownButton(props: IArrowDownButton) { + const colorMode = useColorMode(); + + return ( + + ); +} diff --git a/web/apps/processor/src/components/Atoms/Buttons/NewButton.tsx b/web/apps/processor/src/components/Atoms/Buttons/NewButton.tsx new file mode 100644 index 00000000..39260270 --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Buttons/NewButton.tsx @@ -0,0 +1,15 @@ +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export default function NewButton(props: { class?: string }) { + return ( + + ); +} diff --git a/web/apps/processor/src/components/Atoms/Buttons/NotificationsButton.tsx b/web/apps/processor/src/components/Atoms/Buttons/NotificationsButton.tsx new file mode 100644 index 00000000..e9e189db --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Buttons/NotificationsButton.tsx @@ -0,0 +1,32 @@ +import { Match, Switch } from "solid-js"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; +import { + ColorMode, + useColorMode, +} from "@packages/components/providers/ColorModeProvider"; + +export interface INotificationsButton { + highlighted?: boolean; + class?: string; +} + +export default function NotificationsButton(props: INotificationsButton) { + const colorMode = useColorMode(); + + return ( + + ); +} diff --git a/web/apps/processor/src/components/Header/WalletButton.tsx b/web/apps/processor/src/components/Atoms/Buttons/WalletButton.tsx similarity index 60% rename from web/apps/processor/src/components/Header/WalletButton.tsx rename to web/apps/processor/src/components/Atoms/Buttons/WalletButton.tsx index d6f308bc..f07b53a7 100644 --- a/web/apps/processor/src/components/Header/WalletButton.tsx +++ b/web/apps/processor/src/components/Atoms/Buttons/WalletButton.tsx @@ -1,4 +1,3 @@ -import { joinPaths } from "solid-start/islands/server-router"; import { setSession, login, @@ -15,10 +14,15 @@ import { createEffect, untrack } from "solid-js"; export default function WalletButton(props: { base_url: string; api_url: string; + class?: string; }) { const wallet = useWallet(); const session = useSession(); + createEffect(() => { + console.log(wallet.walletClient); + }); + createEffect(async () => { if (wallet.walletClient && untrack(() => !session())) { setSession(await login(props.api_url, wallet.walletClient)); @@ -26,42 +30,26 @@ export default function WalletButton(props: { }); return ( -
{ if (!wallet.walletClient) { await walletClientConnect(); } else if (session()) { setSession(await logout(props.api_url)); } else { + console.log("logging in if"); setSession(await login(props.api_url, wallet.walletClient)); } }} > - {!session() ? ( - wallet - ) : ( - user - )} -
+
{!wallet.walletClient && !session() - ? "CONNECT WALLET" + ? "CONNECT" : !session() ? "LOGIN" : firstLastChars(session()?.address ?? "", 6, 6)}
-
+ ); } diff --git a/web/apps/processor/src/components/Atoms/Currencies/Currencies.tsx b/web/apps/processor/src/components/Atoms/Currencies/Currencies.tsx new file mode 100644 index 00000000..e35df1ce --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Currencies/Currencies.tsx @@ -0,0 +1,26 @@ +import Currency from "~/components/Atoms/Currencies/Currency"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; +import { useSelectedAsset } from "~/components/providers/SelectedAssetProvider"; +import { Index, createMemo } from "solid-js"; + +export default function Currencies() { + const assets = useAssets(); + const assetsList = createMemo(() => [...assets().values()]); + const selectedAssets = useSelectedAsset(); + + return ( +
+ + {(element) => ( + { + selectedAssets.setSelectedAsset(element()); + }} + /> + )} + +
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/Currencies/Currency.tsx b/web/apps/processor/src/components/Atoms/Currencies/Currency.tsx new file mode 100644 index 00000000..d395c951 --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Currencies/Currency.tsx @@ -0,0 +1,53 @@ +import Picture from "~/components/Atoms/Picture"; +import { Asset } from "@packages/types/asset"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export interface ICurrency { + asset: Asset; + selected: boolean; + onClick?: () => void; +} + +export default function Currency(props: ICurrency) { + return ( +
{ + if (props.onClick) { + props.onClick(); + } + }} + > +
+
+ +
+

+ {props.asset.name} +

+

+ {props.asset.symbol} +

+
+
+
+

+ {0.01} +

+
+
+
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/Currency.tsx b/web/apps/processor/src/components/Atoms/Currency.tsx new file mode 100644 index 00000000..55edea93 --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Currency.tsx @@ -0,0 +1,83 @@ +import Picture from "~/components/Atoms/Picture"; +import { Asset } from "@packages/types/asset"; +import { api } from "~/root"; +import { useSession } from "@packages/components/providers/SessionProvider"; +import { usePrecision } from "@packages/components/providers/PrecisionProvider"; +import { createSignal, onCleanup, onMount } from "solid-js"; +import params from "@packages/utils/params"; +import { Fraction, ev } from "@packages/types/primitives/fraction"; +import { Valut } from "@packages/types/valut"; +import subscribeEvents from "@packages/utils/subscribeEvents"; +import { format } from "numerable"; +import { formatTemplate } from "@packages/utils/precision"; + +export interface ICurrency { + asset: Asset; + selected: boolean; + onClick?: () => void; +} + +export default function Currency(props: ICurrency) { + const session = useSession(); + const precision = usePrecision(); + const [balance, setBalance] = createSignal(null); + + let eventsource: EventSource | undefined; + + onMount(async () => { + if (session() && props.asset && precision()) { + eventsource = await subscribeEvents( + `${api}/private/balance`, + params({ asset_id: props.asset.id }), + params({ asset_id: props.asset.id }), + (data) => { + setBalance(Fraction.parse(Valut.parse(data).balance.Finite)); + }, + ); + } + }); + + onCleanup(() => { + eventsource?.close(); + }); + + return ( +
{ + if (props.onClick) { + props.onClick(); + } + }} + > +
+
+ +
+

+ {props.asset.name} +

+

+ {props.asset.symbol} +

+
+
+
+

+ {balance() + ? format(ev(balance()!), formatTemplate(precision() ?? 3)) + : "---"} +

+
+
+
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/Picture.tsx b/web/apps/processor/src/components/Atoms/Picture.tsx new file mode 100644 index 00000000..06afb8c7 --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Picture.tsx @@ -0,0 +1,39 @@ +import { Match, Switch } from "solid-js"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export interface IPicture { + src: string; + alt?: string; + size?: number; + class?: string; + skeleton?: boolean; +} + +export default function Picture(props: IPicture) { + return ( +
+ + + {props.alt + + +
+ + +
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/Profile.tsx b/web/apps/processor/src/components/Atoms/Profile.tsx new file mode 100644 index 00000000..fe39fcca --- /dev/null +++ b/web/apps/processor/src/components/Atoms/Profile.tsx @@ -0,0 +1,16 @@ +import Picture from "~/components/Atoms/Picture"; + +export interface IProfile { + name: string; + img: string; + class?: string; +} + +export default function Profile(props: IProfile) { + return ( +
+ +

{props.name}

+
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/SearchBar.tsx b/web/apps/processor/src/components/Atoms/SearchBar.tsx new file mode 100644 index 00000000..5beeb3ba --- /dev/null +++ b/web/apps/processor/src/components/Atoms/SearchBar.tsx @@ -0,0 +1,26 @@ +import { createSignal } from "solid-js"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export interface ISearchBar { + placeholder?: string; + onInput: (input: string) => void; +} + +export default function SearchBar(props: ISearchBar) { + return ( + + ); +} diff --git a/web/apps/processor/src/components/Atoms/TransferElement.tsx b/web/apps/processor/src/components/Atoms/TransferElement.tsx new file mode 100644 index 00000000..e98ea67d --- /dev/null +++ b/web/apps/processor/src/components/Atoms/TransferElement.tsx @@ -0,0 +1,65 @@ +import { formatDate } from "@packages/utils/formatDate"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; +import { formatHumanReadable } from "../Inputs/NumberInput"; +import { DisplayTransferDirection } from "@packages/types/transfer"; +import { Match, Switch } from "solid-js"; +import Picture from "./Picture"; + +export interface ITransferElement { + name: string; + otherName: string; + date: Date; + amount: number; + symbol: string; + asset_icon_path: string; + direction: DisplayTransferDirection; +} + +export default function TransferElement(props: ITransferElement) { + return ( +
+
+ +
+
+
{props.name}
+ + + + + + + + +
{props.otherName}
+
+

+ {`${props.date.getHours().toString().padStart(2, "0")}:${props.date + .getMinutes() + .toString() + .padStart(2, "0")} ${formatDate(props.date)}`} +

+
+
+

+ {`${ + props.direction == DisplayTransferDirection.Income ? "+" : "-" + }${formatHumanReadable(props.amount.toString(), 3)}`} +

+

+ {props.symbol} +

+
+
+
+ ); +} diff --git a/web/apps/processor/src/components/Atoms/UserElement.tsx b/web/apps/processor/src/components/Atoms/UserElement.tsx new file mode 100644 index 00000000..dde10f83 --- /dev/null +++ b/web/apps/processor/src/components/Atoms/UserElement.tsx @@ -0,0 +1,23 @@ +import { formatDate } from "@packages/utils/formatDate"; +import { Address } from "@packages/components/providers/SessionProvider/models"; +import { Uuid } from "@packages/types/primitives/uuid"; + +export interface IUserElement { + name: string; + address: Address; +} + +export default function UserElement(props: IUserElement) { + return ( +
+
+
name:
+
{props.name}
+
+
+
address:
+
{props.address}
+
+
+ ); +} diff --git a/web/apps/processor/src/components/Deposit.tsx b/web/apps/processor/src/components/Deposit.tsx new file mode 100644 index 00000000..2e561268 --- /dev/null +++ b/web/apps/processor/src/components/Deposit.tsx @@ -0,0 +1,21 @@ +import Header from "~/components/Header"; +import DepositDashboard from "~/components/ExternalTransfers/DepositDashboard"; +import { ContractAddressProvider } from "@packages/components/providers/ContractAddressProvider"; +import { createSignal } from "solid-js"; + +export default function Deposit() { + const [search, setSearch] = createSignal(); + + return ( + +
+
+
+
+
+ +
+
+
+ ); +} diff --git a/web/apps/processor/src/components/ExternalTransfers/DepositDashboard.tsx b/web/apps/processor/src/components/ExternalTransfers/DepositDashboard.tsx new file mode 100644 index 00000000..3e12523f --- /dev/null +++ b/web/apps/processor/src/components/ExternalTransfers/DepositDashboard.tsx @@ -0,0 +1,125 @@ +import CurrencyDisplay from "~/components/Home/CurrencyDisplay"; +import NumberInput from "~/components/Inputs/NumberInput"; +import { usePrecision } from "@packages/components/providers/PrecisionProvider"; +import { useSelectedAsset } from "~/components/providers/SelectedAssetProvider"; +import { Index, createSignal, onCleanup, onMount } from "solid-js"; +import { Fraction, ev } from "@packages/types/primitives/fraction"; +import ActionButton from "~/components/Atoms/Buttons/ActionButton"; +import { handleDeposit } from "@packages/utils/handlers/depositPermit"; +import { useWallet } from "@packages/components/providers/WalletProvider"; +import { useContractAddress } from "@packages/components/providers/ContractAddressProvider"; +import TransferElement, { ITransferElement } from "../Atoms/TransferElement"; +import { createStore } from "solid-js/store"; +import subscribeEvents from "@packages/utils/subscribeEvents"; +import { api } from "~/root"; +import params from "@packages/utils/params"; +import { DisplayTransfer } from "@packages/types/transfer"; +import firstLastChars from "@packages/utils/firstLastChars"; +import { z } from "zod"; + +export default function DepositDashboard() { + const precision = usePrecision(); + const { selectedAsset } = useSelectedAsset(); + const [amount, setAmount] = createSignal( + Fraction.parse({ numer: 0, denom: 1 }), + ); + const wallet = useWallet(); + const treasury_address = useContractAddress(); + const [transfers, setTransfers] = createStore([]); + + let eventsource: EventSource | undefined; + + const convertTransfer = (element: DisplayTransfer): ITransferElement => { + return { + name: element.user_name || firstLastChars(element.user_address, 4, 4), + otherName: + element.other_user_name || + firstLastChars(element.other_user_address, 4, 4), + amount: ev(element.amount), + date: element.created_at, + symbol: element.asset_symbol, + direction: element.direction, + asset_icon_path: element.asset_icon_path, + }; + }; + + onMount(async () => { + eventsource = await subscribeEvents( + `${api}/private/transfers/specific`, + params({ + other_user_id: "00000000-0000-0000-0000-000000000000", + limit: 10, + offset: 0, + }), + params({ other_user_id: "00000000-0000-0000-0000-000000000000" }), + (data) => { + setTransfers((state) => + z + .array(DisplayTransfer) + .parse(data) + .map(convertTransfer) + .concat(state), + ); + }, + ); + }); + + onCleanup(() => { + eventsource?.close(); + }); + + return ( +
+ +
+ { + setAmount(f); + }} + /> + { + const asset = selectedAsset(); + const treasury = treasury_address!(); + if (asset && treasury) { + await handleDeposit({ + asset: asset, + amount: amount(), + wallet, + treasury_address: treasury, + }); + } + }} + /> +
+

+ Deposits +

+
+
+
+ + {(element) => ( + + )} + +
+
+
+
+ ); +} diff --git a/web/apps/processor/src/components/ExternalTransfers/WithdrawDashboard.tsx b/web/apps/processor/src/components/ExternalTransfers/WithdrawDashboard.tsx new file mode 100644 index 00000000..d0d1a9c3 --- /dev/null +++ b/web/apps/processor/src/components/ExternalTransfers/WithdrawDashboard.tsx @@ -0,0 +1,127 @@ +import CurrencyDisplay from "~/components/Home/CurrencyDisplay"; +import NumberInput from "~/components/Inputs/NumberInput"; +import { usePrecision } from "@packages/components/providers/PrecisionProvider"; +import { useSelectedAsset } from "~/components/providers/SelectedAssetProvider"; +import { Index, createSignal, onCleanup, onMount } from "solid-js"; +import { Fraction, ev } from "@packages/types/primitives/fraction"; +import ActionButton from "~/components/Atoms/Buttons/ActionButton"; +import { handleWithdraw } from "@packages/utils/handlers/withdrawPermit"; +import { useWallet } from "@packages/components/providers/WalletProvider"; +import { useContractAddress } from "@packages/components/providers/ContractAddressProvider"; +import TransferElement, { ITransferElement } from "../Atoms/TransferElement"; +import { createStore } from "solid-js/store"; +import { DisplayTransfer } from "@packages/types/transfer"; +import firstLastChars from "@packages/utils/firstLastChars"; +import subscribeEvents from "@packages/utils/subscribeEvents"; +import params from "@packages/utils/params"; +import { api } from "~/root"; +import { z } from "zod"; + +export default function WithdrawDashboard() { + const precision = usePrecision(); + const { selectedAsset } = useSelectedAsset(); + const [amount, setAmount] = createSignal( + Fraction.parse({ numer: 0, denom: 1 }), + ); + const wallet = useWallet(); + const [withdrawAddress, setWithdrawAddress] = createSignal(wallet.address!); + const treasury_address = useContractAddress(); + const [transfers, setTransfers] = createStore([]); + + let eventsource: EventSource | undefined; + + const convertTransfer = (element: DisplayTransfer): ITransferElement => { + return { + name: element.user_name || firstLastChars(element.user_address, 4, 4), + otherName: + element.other_user_name || + firstLastChars(element.other_user_address, 4, 4), + amount: ev(element.amount), + date: element.created_at, + symbol: element.asset_symbol, + direction: element.direction, + asset_icon_path: element.asset_icon_path, + }; + }; + + onMount(async () => { + eventsource = await subscribeEvents( + `${api}/private/transfers/specific`, + params({ + other_user_id: "00000000-0000-0000-0000-000000000000", + limit: 10, + offset: 0, + }), + params({ other_user_id: "00000000-0000-0000-0000-000000000000" }), + (data) => { + setTransfers((state) => + z + .array(DisplayTransfer) + .parse(data) + .map(convertTransfer) + .concat(state), + ); + }, + ); + }); + + onCleanup(() => { + eventsource?.close(); + }); + + return ( +
+ +
+ { + setAmount(f); + }} + /> + { + const asset = selectedAsset(); + const treasury = treasury_address!(); + if (asset && treasury) { + await handleWithdraw({ + address_value: withdrawAddress(), + asset: asset, + amount: amount(), + wallet, + treasury_address: treasury, + }); + } + }} + /> +
+

+ Withdraws +

+
+
+
+ + {(element) => ( + + )} + +
+
+
+
+ ); +} diff --git a/web/apps/processor/src/components/Header.tsx b/web/apps/processor/src/components/Header.tsx index ffba7095..12bf7002 100644 --- a/web/apps/processor/src/components/Header.tsx +++ b/web/apps/processor/src/components/Header.tsx @@ -1,25 +1,30 @@ -import { A } from "solid-start"; -import { joinPaths } from "solid-start/islands/server-router"; +import SearchBar from "~/components/Atoms/SearchBar"; +import WalletButton from "~/components/Atoms/Buttons/WalletButton"; import { api, base } from "~/root"; -import WalletButton from "~/components/Header/WalletButton"; +import { Setter } from "solid-js"; -export default function Header() { +export default function Header(props: { + class?: string; + text?: string; + setSearch: Setter; +}) { return ( -
- -
-
- ksox logo -
-
KSOX PAY
-
-
-
- +
+
+ {props.text} +
+
+ +
+
+ { + props.setSearch(input); + }} + />
); diff --git a/web/apps/processor/src/components/Home.tsx b/web/apps/processor/src/components/Home.tsx new file mode 100644 index 00000000..61909cc0 --- /dev/null +++ b/web/apps/processor/src/components/Home.tsx @@ -0,0 +1,18 @@ +import { createSignal } from "solid-js"; +import Header from "~/components/Header"; +import AccountDashboard from "~/components/Home/AccountDashboard"; + +export default function Home() { + const [search, setSearch] = createSignal(); + + return ( +
+
+
+
+
+ +
+
+ ); +} diff --git a/web/apps/processor/src/components/Home/AccountDashboard.tsx b/web/apps/processor/src/components/Home/AccountDashboard.tsx new file mode 100644 index 00000000..0280bf1e --- /dev/null +++ b/web/apps/processor/src/components/Home/AccountDashboard.tsx @@ -0,0 +1,91 @@ +import CurrencyDisplay from "~/components/Home/CurrencyDisplay"; +import DepositWithdrawPanel from "~/components/Home/DepositWithdrawPanel"; +import { Index, createSignal, onCleanup, onMount } from "solid-js"; +import TransferElement, { ITransferElement } from "../Atoms/TransferElement"; +import subscribeEvents from "@packages/utils/subscribeEvents"; +import { api } from "~/root"; +import params from "@packages/utils/params"; +import { z } from "zod"; +import { DisplayTransfer } from "@packages/types/transfer"; +import firstLastChars from "@packages/utils/firstLastChars"; +import { ev } from "@packages/types/primitives/fraction"; +import { Dynamic } from "solid-js/web"; +import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; +import { session } from "@packages/components/providers/SessionProvider"; + +export default function AccountDashboard() { + return ( +
+ + +

+ Transfers +

+
+
+ +
+
+
+ ); +} + +export function CreateTransfers(session: SessionResponse | undefined) { + return () => { + const [transfers, setTransfers] = createSignal([]); + + let eventsource: EventSource | undefined; + + const convertTransfer = (element: DisplayTransfer): ITransferElement => { + return { + name: element.user_name || firstLastChars(element.user_address, 4, 4), + otherName: + element.other_user_name || + firstLastChars(element.other_user_address, 4, 4), + amount: ev(element.amount), + date: element.created_at, + symbol: element.asset_symbol, + direction: element.direction, + asset_icon_path: element.asset_icon_path, + }; + }; + + onMount(async () => { + if (session) { + eventsource = await subscribeEvents( + `${api}/private/transfers/display`, + params({ limit: 10, offset: 0 }), + params({}), + (data) => { + setTransfers([ + ...z.array(DisplayTransfer).parse(data).map(convertTransfer), + ...transfers(), + ]); + }, + ); + } + }); + + onCleanup(() => { + eventsource?.close(); + }); + + return ( +
+ + {(element) => ( + + )} + +
+ ); + }; +} diff --git a/web/apps/processor/src/components/Home/CurrenciesModal.tsx b/web/apps/processor/src/components/Home/CurrenciesModal.tsx new file mode 100644 index 00000000..8fd287f8 --- /dev/null +++ b/web/apps/processor/src/components/Home/CurrenciesModal.tsx @@ -0,0 +1,30 @@ +import { createSignal } from "solid-js"; +import Currencies from "~/components/Atoms/Currencies/Currencies"; + +export default function Modal() { + const [isVisible, setIsVisible] = createSignal(false); + + return ( +
+ {/* Backdrop */} +
+ + {/* Modal */} +
+ {/* Modal content */} +

Currencies

+ +
+
+ ); +} diff --git a/web/apps/processor/src/components/Home/CurrencyDisplay.tsx b/web/apps/processor/src/components/Home/CurrencyDisplay.tsx new file mode 100644 index 00000000..9f278825 --- /dev/null +++ b/web/apps/processor/src/components/Home/CurrencyDisplay.tsx @@ -0,0 +1,121 @@ +import { useSelectedAsset } from "~/components/providers/SelectedAssetProvider"; +import { joinPaths } from "solid-start/islands/server-router"; +import Picture from "~/components/Atoms/Picture"; +import { api, base } from "~/root"; +import ArrowDownButton from "~/components/Atoms/Buttons/ArrowDownButton"; +import { + Index, + Setter, + Show, + createMemo, + createSignal, + onCleanup, + onMount, +} from "solid-js"; +import HalfScreenModal from "~/components/Modals/HalfScreenModal"; +import Currency from "~/components/Atoms/Currency"; +import { useAssets } from "@packages/components/providers/AssetsProvider"; +import subscribeEvents from "@packages/utils/subscribeEvents"; +import { useSession } from "@packages/components/providers/SessionProvider"; +import { usePrecision } from "@packages/components/providers/PrecisionProvider"; +import params from "@packages/utils/params"; +import { Valut } from "@packages/types/valut"; +import { format } from "numerable"; +import { Fraction, ev } from "@packages/types/primitives/fraction"; +import { formatTemplate } from "@packages/utils/precision"; +import { Asset } from "@packages/types/asset"; +import { Dynamic } from "solid-js/web"; +import { SessionResponse } from "@packages/components/providers/SessionProvider/models"; + +export default function CurrencyDisplay() { + const session = useSession(); + const precision = usePrecision(); + const assets = useAssets(); + const { selectedAsset, setSelectedAsset } = useSelectedAsset(); + + const [modal, setModal] = createSignal(false); + const assetsList = createMemo(() => [...assets().values()]); + + return ( +
+ + + setModal(false)}> + No items
}> + {(item) => ( + { + setSelectedAsset(item()); + }} + /> + )} + + + +
+ ); +} + +const CreateCurrencyDisplayAssetView = ( + precision: number, + session: SessionResponse | undefined, + selectedAsset: Asset | undefined, + setModal: Setter +) => { + return () => { + const [balance, setBalance] = createSignal(null); + let eventsource: EventSource | undefined; + + onMount(async () => { + if (session && selectedAsset && precision) { + eventsource = await subscribeEvents( + `${api}/private/balance`, + params({ asset_id: selectedAsset.id }), + params({ asset_id: selectedAsset.id }), + (data) => { + setBalance(Fraction.parse(Valut.parse(data).balance.Finite)); + } + ); + } + }); + + onCleanup(() => { + eventsource?.close(); + }); + + return ( +
+
+
+

+ {balance() + ? format(ev(balance()!), formatTemplate(precision ?? 3)) + : "---"} +

+

+ {selectedAsset?.symbol} +

+ setModal(true)} /> +
+

+ {selectedAsset?.name} +

+
+ +
+ ); + }; +}; diff --git a/web/apps/processor/src/components/Home/DepositWithdrawPanel.tsx b/web/apps/processor/src/components/Home/DepositWithdrawPanel.tsx new file mode 100644 index 00000000..52bbf547 --- /dev/null +++ b/web/apps/processor/src/components/Home/DepositWithdrawPanel.tsx @@ -0,0 +1,36 @@ +import { A } from "@solidjs/router"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export default function DepositWithdrawPanel() { + return ( + + ); +} diff --git a/web/apps/processor/src/components/Inputs/NumberInput.tsx b/web/apps/processor/src/components/Inputs/NumberInput.tsx index 4afad56a..f641a733 100644 --- a/web/apps/processor/src/components/Inputs/NumberInput.tsx +++ b/web/apps/processor/src/components/Inputs/NumberInput.tsx @@ -15,7 +15,7 @@ export interface NumberInputComponent { onChange?: (f: Fraction) => void; } -function formatHumanReadable(input: string, precision: number) { +export function formatHumanReadable(input: string, precision: number) { // Remove all non-digit and non-dot characters let formatted = precision > 0 @@ -49,7 +49,7 @@ function formatHumanReadable(input: string, precision: number) { return formatted; } -function humanReadableToBigint(input: string) { +export function humanReadableToBigint(input: string) { const decimalNumber = input.replace(/,/g, ""); const index = decimalNumber.indexOf("."); const decimalPlaces = @@ -70,7 +70,7 @@ export default function NumberInput(props: NumberInputComponent) { return (
{ @@ -87,7 +87,7 @@ export default function NumberInput(props: NumberInputComponent) { ["class"]; disabled?: boolean; disabledClass?: JSX.HTMLAttributes["class"]; - onInput?: ( - e: Event & { - currentTarget: HTMLInputElement; - target: HTMLInputElement; - }, - ) => void; - onChange?: ( - e: Event & { - currentTarget: HTMLInputElement; - target: HTMLInputElement; - }, - ) => void; + onInput?: (e: Event) => void; + onChange?: (e: Event) => void; } export default function SearchInput(props: SearchInputComponent) { @@ -48,7 +38,7 @@ export default function SearchInput(props: SearchInputComponent) { spellcheck={true} ref={inputDOM} value={props.value ?? ""} - placeholder="Find user" + placeholder="Search" disabled={props.disabled} onInput={(ev) => (props.onInput ? props.onInput(ev) : {})} onChange={(ev) => (props.onChange ? props.onChange(ev) : {})} diff --git a/web/apps/processor/src/components/Inputs/Slider.tsx b/web/apps/processor/src/components/Inputs/Slider.tsx new file mode 100644 index 00000000..225fb7de --- /dev/null +++ b/web/apps/processor/src/components/Inputs/Slider.tsx @@ -0,0 +1,106 @@ +import { JSX, createUniqueId } from "solid-js"; +import { + Fraction, + ev, + fFromBigint, + fmax, + fmin, + fmul, +} from "@packages/types/primitives/fraction"; + +export interface SliderComponent { + value: Fraction; + class?: JSX.HTMLAttributes["class"]; + inputClass?: JSX.HTMLAttributes["class"]; + disabled?: boolean; + disabledClass?: JSX.HTMLAttributes["class"]; + onInput?: (e: Fraction) => void; +} + +export default function Slider(props: SliderComponent) { + let sliderDOM!: HTMLInputElement; + let popupDOM!: HTMLInputElement; + + function popupPosition(sliderDOM: HTMLInputElement, popupDOM: HTMLElement) { + const sliderRect = sliderDOM.getBoundingClientRect(); + const popupRect = popupDOM.getBoundingClientRect(); + return Math.max( + Math.min( + sliderRect.left + + (sliderRect.width * sliderDOM.valueAsNumber) / 1000 - + popupRect.width / 2, + sliderRect.left + sliderRect.width - popupRect.width, + ), + sliderRect.left, + ); + } + + function handler(this: HTMLInputElement) { + popupDOM.innerHTML = Math.floor(this.valueAsNumber / 10).toString() + "%"; + const left = popupPosition(this, popupDOM); + popupDOM.style.left = left + "px"; + } + + function mouseDown() { + popupDOM.style.display = "block"; + popupDOM.innerHTML = + Math.floor(sliderDOM.valueAsNumber / 10).toString() + "%"; + const sliderRect = sliderDOM.getBoundingClientRect(); + const popupRect = popupDOM.getBoundingClientRect(); + popupDOM.style.top = sliderRect.top - popupRect.height - 5 + "px"; + const left = popupPosition(sliderDOM, popupDOM); + popupDOM.style.left = left + "px"; + sliderDOM.addEventListener("input", handler); + } + function mouseUp() { + popupDOM.style.display = "none"; + sliderDOM.removeEventListener("input", handler); + } + + const id = createUniqueId(); + + return ( +
+ + ); +} diff --git a/web/apps/processor/src/components/Inputs/TextInput.tsx b/web/apps/processor/src/components/Inputs/TextInput.tsx new file mode 100644 index 00000000..c604335a --- /dev/null +++ b/web/apps/processor/src/components/Inputs/TextInput.tsx @@ -0,0 +1,64 @@ +import { createUniqueId, JSX } from "solid-js"; + +export interface TextInputComponent { + value?: string; + left?: JSX.Element; + right?: JSX.Element; + class?: JSX.HTMLAttributes["class"]; + disabled?: boolean; + disabledClass?: JSX.HTMLAttributes["class"]; + precision?: number; + onInput?: (f: string) => void; + onChange?: (f: string) => void; +} + +export default function TextInput(props: TextInputComponent) { + let inputDOM!: HTMLInputElement; + + const id = createUniqueId(); + + return ( +
{ + inputDOM.focus(); + }} + > + +
+ { + if (props.onInput != undefined) { + props.onInput(e.target.value); + } + }} + onChange={(e) => { + if (props.onChange != undefined) { + props.onChange(e.target.value); + } + }} + onFocus={(e) => { + (e.target as HTMLInputElement).select(); + }} + /> +
+
+ {props.right} +
+
+ ); +} diff --git a/web/apps/processor/src/components/Modals/HalfScreenModal.tsx b/web/apps/processor/src/components/Modals/HalfScreenModal.tsx new file mode 100644 index 00000000..6428e790 --- /dev/null +++ b/web/apps/processor/src/components/Modals/HalfScreenModal.tsx @@ -0,0 +1,26 @@ +import { JSX } from "solid-js"; + +export interface IHalfScreenModal { + children: JSX.Element; + close: () => void; +} + +export default function HalfScreenModal(props: IHalfScreenModal) { + return ( +
{ + if (event.target !== event.currentTarget) return; // Ensure the click was directly on the parent, not a child + props.close(); + }} + > +
+ {props.children} +
+
+ ); +} diff --git a/web/apps/processor/src/components/Nav.tsx b/web/apps/processor/src/components/Nav.tsx new file mode 100644 index 00000000..b18a9191 --- /dev/null +++ b/web/apps/processor/src/components/Nav.tsx @@ -0,0 +1,67 @@ +import { A } from "solid-start"; +import { useNav, Nav } from "~/components/providers/NavProvider"; +import NavButton from "~/components/Nav/NavButton"; +import { + ColorMode, + useColorMode, +} from "@packages/components/providers/ColorModeProvider"; +import { Match, Switch } from "solid-js"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export default function SideNavigation() { + const nav = useNav(); + const colorMode = useColorMode(); + return ( + + ); +} diff --git a/web/apps/processor/src/components/Nav/NavButton.tsx b/web/apps/processor/src/components/Nav/NavButton.tsx new file mode 100644 index 00000000..45166651 --- /dev/null +++ b/web/apps/processor/src/components/Nav/NavButton.tsx @@ -0,0 +1,24 @@ +import { JSX } from "solid-js"; + +export interface NavButtonProps { + icon: JSX.Element; + name: string; + highlighted?: boolean; +} + +export default function NavButton(props: NavButtonProps) { + return ( +
+
+ {props.icon} +
+
+ {props.name} +
+
+ ); +} diff --git a/web/apps/processor/src/components/Navigation.tsx b/web/apps/processor/src/components/Navigation.tsx deleted file mode 100644 index 4fa2da03..00000000 --- a/web/apps/processor/src/components/Navigation.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { A } from "solid-start"; -import NavButton from "~/components/Navigation/NavButton"; -import { useNav, Nav } from "~/components/providers/NavProvider"; - -export default function Navigation() { - const nav = useNav(); - return ( - - ); -} diff --git a/web/apps/processor/src/components/Navigation/NavButton.tsx b/web/apps/processor/src/components/Navigation/NavButton.tsx deleted file mode 100644 index 843b0df6..00000000 --- a/web/apps/processor/src/components/Navigation/NavButton.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { base } from "~/root"; -import { joinPaths } from "solid-start/islands/server-router"; - -interface NavButtonProps { - imgPath: string; - name: string; - highlighted?: boolean; -} - -export default function NavButton(props: NavButtonProps) { - return ( -
-
- -
-
- {props.name} -
-
- ); -} diff --git a/web/apps/processor/src/components/SideNav.tsx b/web/apps/processor/src/components/SideNav.tsx new file mode 100644 index 00000000..49d99a33 --- /dev/null +++ b/web/apps/processor/src/components/SideNav.tsx @@ -0,0 +1,152 @@ +import { A } from "solid-start"; +import { useNav, Nav } from "~/components/providers/NavProvider"; +import SideNavButton from "~/components/SideNav/SideNavButton"; +import { + ColorMode, + useColorMode, +} from "@packages/components/providers/ColorModeProvider"; +import { Match, Switch, createMemo } from "solid-js"; +import { joinPaths } from "solid-start/islands/server-router"; +import { base } from "~/root"; + +export default function SideNavigation() { + const nav = useNav(); + const colorMode = useColorMode(); + + const mode = createMemo(() => { + switch (colorMode.colorMode()) { + case ColorMode.Light: + return "Dark Mode"; + case ColorMode.Dark: + return "Light Mode"; + } + }); + + return ( +
+ + + + + + + + + + } + /> + + + + + + + + + + + } + /> + + + + + + + + + + + } + /> + + + + + + + + + + + } + /> + + + + + + + + + + } + onClick={() => { + const values = Object.values(ColorMode); + colorMode.setColorMode( + values[(values.indexOf(colorMode.colorMode()) + 1) % values.length], + ); + }} + /> +
+ ); +} diff --git a/web/apps/processor/src/components/SideNav/SideNavButton.tsx b/web/apps/processor/src/components/SideNav/SideNavButton.tsx new file mode 100644 index 00000000..59753263 --- /dev/null +++ b/web/apps/processor/src/components/SideNav/SideNavButton.tsx @@ -0,0 +1,34 @@ +import { JSX } from "solid-js"; + +export interface SideNavButtonProps { + icon: JSX.Element; + name: string; + highlighted?: boolean; + onClick?: () => void; +} + +export default function SideNavButton(props: SideNavButtonProps) { + return ( + + ); +} diff --git a/web/apps/processor/src/components/Transfer.tsx b/web/apps/processor/src/components/Transfer.tsx new file mode 100644 index 00000000..6449c751 --- /dev/null +++ b/web/apps/processor/src/components/Transfer.tsx @@ -0,0 +1,18 @@ +import { createEffect, createSignal } from "solid-js"; +import Header from "~/components/Header"; +import UserDasboard from "~/components/Transfer/UserDashboard"; + +export default function Transfer() { + const [search, setSearch] = createSignal(); + + return ( +
+
+
+
+
+ +
+
+ ); +} diff --git a/web/apps/processor/src/components/Transfer/UserDashboard.tsx b/web/apps/processor/src/components/Transfer/UserDashboard.tsx new file mode 100644 index 00000000..3327fb46 --- /dev/null +++ b/web/apps/processor/src/components/Transfer/UserDashboard.tsx @@ -0,0 +1,59 @@ +import CurrencyDisplay from "~/components/Home/CurrencyDisplay"; +import DepositWithdrawPanel from "~/components/Home/DepositWithdrawPanel"; +import { Accessor, Index, createEffect, createSignal } from "solid-js"; +import UserElement, { IUserElement } from "../Atoms/UserElement"; +import { api } from "~/root"; +import params from "@packages/utils/params"; +import { User, UserRecognitionResult } from "@packages/types/user"; +import { z } from "zod"; +import { A } from "@solidjs/router"; +import { useSelectedUser } from "../providers/SelectedUserProvider"; + +export default function UserDasboard(props: { search?: string }) { + const [users, setUsers] = createSignal([]); + const selectedUser = useSelectedUser(); + + createEffect(async () => { + const response = await fetch( + `${api}/public/users/search_user?${params({ + input: props.search, + })}`, + { + method: "GET", + credentials: "same-origin", + }, + ) + .then((r) => r.json()) + .then((r) => z.array(UserRecognitionResult).parse(r)); + + setUsers(response); + }); + + return ( +
+ +

+ Users +

+
+ +
+
+ ); +} diff --git a/web/apps/processor/src/components/TransferTo.tsx b/web/apps/processor/src/components/TransferTo.tsx new file mode 100644 index 00000000..c7ab5124 --- /dev/null +++ b/web/apps/processor/src/components/TransferTo.tsx @@ -0,0 +1,19 @@ +import { createEffect, createSignal } from "solid-js"; +import Header from "~/components/Header"; +import UserDasboard from "~/components/Transfer/UserDashboard"; +import TransferToDashboard from "./TransferTo/TransferToDashboard"; + +export default function TransferTo() { + const [search, setSearch] = createSignal(); + + return ( +
+
+
+
+
+ +
+
+ ); +} diff --git a/web/apps/processor/src/components/TransferTo/TransferToDashboard.tsx b/web/apps/processor/src/components/TransferTo/TransferToDashboard.tsx new file mode 100644 index 00000000..7be1a9a5 --- /dev/null +++ b/web/apps/processor/src/components/TransferTo/TransferToDashboard.tsx @@ -0,0 +1,93 @@ +import { useWallet } from "@packages/components/providers/WalletProvider"; +import CurrencyDisplay from "~/components/Home/CurrencyDisplay"; +import { useSelectedAsset } from "../providers/SelectedAssetProvider"; +import firstLastChars from "@packages/utils/firstLastChars"; +import { api, base } from "~/root"; +import { joinPaths } from "solid-start/islands/server-router"; +import { useParams } from "@solidjs/router"; +import NumberInput from "../Inputs/NumberInput"; +import ActionButton from "../Atoms/Buttons/ActionButton"; +import { usePrecision } from "@packages/components/providers/PrecisionProvider"; +import { Index, createSignal, onCleanup, onMount } from "solid-js"; +import { Fraction, ev } from "@packages/types/primitives/fraction"; +import { useContractAddress } from "@packages/components/providers/ContractAddressProvider"; +import { TransferRequest } from "@packages/types/mod"; +import { useSelectedUser } from "../providers/SelectedUserProvider"; +import { useSession } from "@packages/components/providers/SessionProvider"; +import TransferElement, { ITransferElement } from "../Atoms/TransferElement"; +import { DisplayTransfer } from "@packages/types/transfer"; +import subscribeEvents from "@packages/utils/subscribeEvents"; +import { z } from "zod"; +import { Dynamic } from "solid-js/web"; +import { CreateTransfers } from "../Home/AccountDashboard"; + +export default function TransferToDashboard(props: { search?: string }) { + const wallet = useWallet(); + const params = useParams(); + const selectedUser = useSelectedUser(); + const session = useSession(); + const precision = usePrecision(); + const { selectedAsset } = useSelectedAsset(); + const [amount, setAmount] = createSignal( + Fraction.parse({ numer: 0, denom: 1 }), + ); + + return ( +
+ +
+
{firstLastChars(wallet.address ?? "", 8, 8)}
+ +
{firstLastChars(params.address ?? "", 8, 8)}
+
+
+ { + setAmount(f); + }} + /> + { + const asset = selectedAsset(); + const to_user = params.address; + if (asset && to_user) { + console.log(amount()); + await fetch(`${api}/private/transfer`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + credentials: "same-origin", + body: JSON.stringify( + TransferRequest.parse({ + from_user_address: session()?.address, + to_user_address: to_user, + asset_id: selectedAsset()?.id, + amount: amount(), + }), + (_, v) => (typeof v === "bigint" ? v.toString() : v), + ), + }).then((r) => r.text()); + } + }} + /> +
+
+
+ +
+
+
+ ); +} diff --git a/web/apps/processor/src/components/Wallet.tsx b/web/apps/processor/src/components/Wallet.tsx new file mode 100644 index 00000000..7fbdab78 --- /dev/null +++ b/web/apps/processor/src/components/Wallet.tsx @@ -0,0 +1,3 @@ +export default function Wallet() { + return
; +} diff --git a/web/apps/processor/src/components/Withdraw.tsx b/web/apps/processor/src/components/Withdraw.tsx new file mode 100644 index 00000000..7fa214b7 --- /dev/null +++ b/web/apps/processor/src/components/Withdraw.tsx @@ -0,0 +1,21 @@ +import Header from "~/components/Header"; +import { ContractAddressProvider } from "@packages/components/providers/ContractAddressProvider"; +import WithdrawDashboard from "~/components/ExternalTransfers/WithdrawDashboard"; +import { createSignal } from "solid-js"; + +export default function Deposit() { + const [search, setSearch] = createSignal(); + + return ( + +
+
+
+
+
+ +
+
+
+ ); +} diff --git a/web/apps/processor/src/components/providers/AssetProvider.tsx b/web/apps/processor/src/components/providers/AssetProvider.tsx deleted file mode 100644 index 88d0575f..00000000 --- a/web/apps/processor/src/components/providers/AssetProvider.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { - Accessor, - createContext, - createEffect, - createSignal, - JSX, - useContext, -} from "solid-js"; -import { useParams } from "solid-start"; -import { Asset } from "@packages/types/asset"; -import { Uuid } from "@packages/types/primitives/uuid"; -import { useAssets } from "~/components/providers/AssetsProvider"; - -const [asset, setAsset] = createSignal(undefined); -const AssetContext = createContext>(asset); -export function AssetProvider(props: { children: JSX.Element }) { - const params = useParams<{ assetId?: Uuid }>(); - const assets = useAssets(); - - createEffect(() => { - if (assets && params.assetId) { - setAsset(assets().get(params.assetId)); - } - }); - - return ( - - {props.children} - - ); -} -export function useAsset() { - return useContext>(AssetContext); -} diff --git a/web/apps/processor/src/components/providers/AssetsProvider.tsx b/web/apps/processor/src/components/providers/AssetsProvider.tsx deleted file mode 100644 index 1f553e02..00000000 --- a/web/apps/processor/src/components/providers/AssetsProvider.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { - Accessor, - createContext, - createSignal, - JSX, - onMount, - useContext, -} from "solid-js"; -import { z } from "zod"; -import { api } from "~/root"; -import { Asset } from "@packages/types/asset"; -import { Uuid } from "@packages/types/primitives/uuid"; - -const fetchAssets = async () => { - return await fetch(`${api}/public/assets`) - .then((r) => r.json()) - .then((r) => z.array(Asset).parse(r)) - .then((r) => { - const map = new Map(); - r.forEach((asset) => map.set(asset.id, asset)); - return map; - }); -}; - -const [assets, setAssets] = createSignal>(new Map()); -const AssetsContext = createContext>>(assets); -export function AssetsProvider(props: { children: JSX.Element }) { - onMount(async () => { - const x = await fetchAssets(); - setAssets(x); - }); - - return ( - - {props.children} - - ); -} -export function useAssets() { - return useContext>>(AssetsContext); -} diff --git a/web/apps/processor/src/components/providers/NavProvider.tsx b/web/apps/processor/src/components/providers/NavProvider.tsx index 862d2641..5b75e349 100644 --- a/web/apps/processor/src/components/providers/NavProvider.tsx +++ b/web/apps/processor/src/components/providers/NavProvider.tsx @@ -7,12 +7,16 @@ import { } from "solid-js"; export enum Nav { - App, - Account, - Asset, + Home, + Transfer, + TransferTo, + Settings, + Notifications, + Deposit, + Withdraw, } -export const [nav, setNav] = createSignal