vm.deal(alice, 100 ether); // 给账户 alice 100个eth。
vm.deal(Currency.unwrap(currency0), alice, 100 ether); // 给账户 alice 100个currency0, 100 ether 代表 100 * 10^18
vm.warp(1741000000); // 将时间戳跳到特定时间。
using StateLibrary for IPoolManager; // 将 StateLibrary 库中定义的函数,“附加”到 IPoolManager 类型上。
如果一个函数需要进行货币操作,必须要带上payable关键字,这样才能正常接收msg.value
角色切换器
startPrank(address) → “接下来用这个地址身份执行操作”
stopPrank() → “恢复为原来的测试合约身份”
keccak256(...) returns (bytes32) // 使用以太坊的(Keccak-256)计算HASH值。紧密打包参数。
库可以被看作是使用它的合约的一个隐式的父类
using C for string;
library C {
function a() returns (address) {
return address(this);
}
}
contract A {
function a(string cc) constant returns (address) {
return cc.a();
}
}
fallback function,当有人
external,public,internal,privateMoreSolidity为函数提供了四种可见性:external,public,internal,private。
声明为external的可以从其它合约或通过Transaction进行调用,所以声明为external的函数是合约对外接口的一部分。
函数默认声明为public。
public的函数既允许以internal的方式调用,也允许以external的方式调用。
在当前的合约或继承的合约中,只允许以internal的方式调用。
只能在当前合约中被访问(不可在被继承的合约中访问)。
我们可以在合约的调用函数前加this.来强制以external方式的调用。需要注意的是这里的this的用法与大多数语言的都不一致。
pragma solidity ^0.4.0;
contract A{
function f() internal{}
function callInternally(){
f();
}
//以`external`的方式调用
//f()只能以`internal`的方式调用
//Untitled3:7:9: Error: Member "f" not found or not visible after argument-dependent lookup in contract A
function callExternally(){
//this.f();
}
}
memory, storage, calldataMore默认的函数参数,包括返回的参数,他们是memory
pragma solidity ^0.4.0;
contract SimpleAssign{
struct S{string a;uint b;}
//默认参数是memory
function assign(S s) internal{
//默认的变量是storage的指针
//Type struct MemoryToLocalVar.S memory is not implicitly convertible to expected type struct MemoryToLocalVar.S storage pointer.
//S tmp = s;
}
}
存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收。
memory之间是引用传递,并不会拷贝数据。
默认的局部变量是storage的。
数据将永远存在于区块链上。
一般只有外部函数的参数(不包括返回参数)被强制指定为calldata.这种数据位置是只读的,不会持久化到区块链。
right?
F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
相当于
F3Ddatasets.EventReturns memory _eventData_;
_eventData_ = determinePID(_eventData_);
BSC Testnet / Binance Smart Chain Testnet:
https://data-seed-prebsc-1-s1.binance.org:8545/
97
tBNB / BNB
https://testnet.bscscan.com
FAIL: SafeCastOverflow()使用常量参数试试:
(BalanceDelta delta) = modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);
(BalanceDelta delta2) = modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);
[FAIL: HookAddressNotValid(0x44440000000000000000000000000000000010cF)] setUp() (gas: 0)Permissions相关实现代码出错 比如afterRemoveLiquidityReturnDelta为true,而afterRemoveLiquidity为false
[Revert] EvmError: RevertDeployDynamicFee::run()
├─ [0] console::log("步骤 1: 脚本开始执行") [staticcall]
│ └─ ← [Stop]
├─ [0] console::log("步骤 1: 开始寻找合适的 salt (可能需要几秒)...") [staticcall]
│ └─ ← [Stop]
├─ [0] console::log("预期合约地址:", AddressConstants: [0x09a20b348A38a4AAE85929B80B79369141B69fc7]) [staticcall]
│ └─ ← [Stop]
├─ [0] console::log(0x000000000000000000000000000000000000000000000000000000000000fb36) [staticcall]
│ └─ ← [Stop]
├─ [0] VM::startBroadcast()
│ └─ ← [Return]
├─ [38736] Create2Deployer::create2()
│ ├─ [1991] → new AddressConstants@0x09a20b348A38a4AAE85929B80B79369141B69fc7
│ │ └─ ← [Revert] 0xe65af6a000000000000000000000000009a20b348a38a4aae85929b80b79369141b69fc4
│ └─ ← [Revert] EvmError: Revert
└─ ← [Revert] EvmError: Revert
Solution:
deploy.s.sol的flags要和发布的sol对应上
There was an error fetching data required for your transaction. Error: Unpredictable gas limit, id: a640d8c6-fd35-4a67-bec4-8d83eb9c7ace`
Solution: 合约文件结构内容太复杂导致无法估算gas费