`
文章列表

compound

    博客分类:
  • defi
2.compound 2.1 存钱:不会1:1给ctoken,是1:50左右的比例,最开始是1/0.02,把用户转账过来的token存到资金池里,根据当前时刻的汇率给用户发放cToken 2.2 抵押系数:对于抵押品cToken来说每个市场都有一个抵押系数(Collateral Factor,或者叫抵押 ...

aave

    博客分类:
  • defi
aave:去中心化借贷系统,aave借款人必须先提供抵押品才能借款。此外,他们只能借到他们发布的抵押品的价值。 1.用户抵押获取1:1的aToken,作为凭证.并且aToken无法交易 2.当用户从协议中贷出资产,获得 1:1 数量的 debt tokens.其中包括稳定利率债务币和浮动利率债务币 (usersStableRate * currentBalance + amount * rate) / (currentBalance + amount) 2.1 固定利率借贷:用户以固定利率借贷资产,将以当前固定利率来计息,不随市场波动,但不同时间贷款的固定利率可能是不同的,任何人每借一次钱, ...

multicall

multicall的solidity调用与ethers.js调用 // contracts/Box.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Multicall.sol"; import "hardhat/console.sol"; contract TestMulticall { function testMulticall(address addr) external ...

检查是否是721

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; contract MyTokenCheck { using ERC165Checker for address; bytes4 private ...
2.栈和内存操作码 2.1 POP:取出栈顶元素 2.2 PUSH:向栈顶加入数据(可以直接在后边跟一个数字来指定要加入的字节数,取值范围为1到32,即最大为一个"字") 2.3 MLOAD:从内存中取出一个"字" 2.4 MSTORE:存储一个"字"到内存中 2.5 JUMP:修改程序计数器(PC)的位置 2.6 PC:程序计数器(program counter) 2.7 MSIZE:目前已激活(已使用)的内存大小(以"字"为单位) 2.8 GAS:可用的gas数量(当前交易内) 2.9 DUP:复制栈里的元素到栈 ...

计算合约地址

EVM会根据发送者地址和nonce经过RLP编码后再进行keccak256得到hash的低160位(即96到255)共计20字节作为生成合约的地址 const rlp = require("rlp"); const keccak = require("keccak"); function calculateContractAddr(sender,nonce){ // var nonce = 0x00; //The nonce must be a hex literal! // var sender = "0xf39F ...

标准修饰符

1.internal:类似c++中的protected,通过JUMP指令实现,参数以内存指针传递,消耗gas最少 2.external:函数参数直接从calldata读取,内存分配比较便宜 3.public:会自动创建getter,通过jump指令调用,会复制函数参数到memory(因为不知道调用者是external还是internal),也这是比external更消耗gas的一个原因 4.private:私有,仅当前合约能访问 5.constant:被修饰的函数没有能力改变区块链上的状态变量,它们可以读取状态变量返回给调用者 6.view:不能修改,类似constant 7.pure:不能读写 ...

ABI编码函数

1. abi.encode()returns(bytes):对给定参数进行编码 2. abi.encodePacked()returns(bytes):对给定参数进行紧打包编码 3. abi.encodeWithSelector(bytes4 selector,...) returns(bytes):对给定参数进行编码,并以给定的函数选择器作为起始的4字段数据一起返回 4. abi.encodeWithSignature(string signature,...) returns (bytes):等价于abi.encodeWithSelector(bytes4(keccak256(signatu ...

数据位置

1.函数参数包括返回的参数默认是memory 2.局部变量默认是storage,状态变量强制是storage 3.外部函数的参数强制是calldata与memory类似,是一块只读且不会永久存储的位置

随机数

https://www.paradigm.xyz/2023/01/eth-rng#introduction

extcodesize

extcodesize取出的byte code长度,若长度大于0就表示是合约发出的,等于0还不一定是EOA地址,因为在合约的构造函数发出,其byte code尚未初始化,仍为0 // SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; contract GatekeeperTwoAttack { constructor(address addr,address addr2){ //构造函数 at ...

Elevator

Elevator.sol // SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; interface Building { function isLastFloor(uint256) external returns (bool); } contract Elevator { bool public top; uint256 public floor; function test(uin ...

AccessControl

// SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "hardhat/console.sol&qu ...

revert

1.和require类似,在一些复杂代码时可以结合error使用 // SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; contract Revert { error TooEarly(uint time); error TooLate(uint time); function test(uint t)external{ if(t<100){ rever ...
// SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; contract Vault { bool public locked; bytes32 private password; uint256 private data; constructor(bytes32 _password) public { locked = true; password = _password; ...
Global site tag (gtag.js) - Google Analytics