pragmasolidity^0.8.0;libraryERC1967MinimalTransparentUpgradeableProxyLib{functioninitCodeFor20ByteFactoryAddress()internalviewreturns(bytesmemory){returnabi.encodePacked(bytes13(0x607f3d8160093d39f33d3d3373),address(this),bytes32(0x14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc),bytes32(0x3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b),bytes32(0x3d356020355560408036111560525736038060403d373d3d355af43d6000803e),bytes7(0x6052573d6000fd));}functioninitCodeFor14ByteFactoryAddress()internalviewreturns(bytesmemory){returnabi.encodePacked(bytes13(0x60793d8160093d39f33d3d336d),uint112(uint160(address(this))),bytes32(0x14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc),bytes32(0x3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b),bytes32(0x3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e),bytes7(0x604c573d6000fd));}functioninitCode()internalviewreturns(bytesmemory){if(uint160(address(this))>>112!=0){returninitCodeFor20ByteFactoryAddress();}else{returninitCodeFor14ByteFactoryAddress();}}functiondeploy(addressimplementation,bytesmemoryinitializationData)internalreturns(addressinstance){bytesmemorym=initCode();assembly{instance:=create(0,add(m,0x20),mload(m))}require(instance!=address(0),"Deployment failed.");// 部署失败。
upgrade(instance,implementation,initializationData);}functionupgrade(addressinstance,addressimplementation,bytesmemoryupgradeData)internal{(boolsuccess,)=instance.call(abi.encodePacked(// The new implementation address, converted to a 32-byte word.
uint256(uint160(implementation)),// ERC-1967 implementation slot.
bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc),// Optional calldata to be forwarded to the implementation
// via delegatecall after setting the implementation slot.
upgradeData));require(success,"Upgrade failed.");// 升级失败。
}}
最小化 ERC-1967 透明可升级代理实现(I-变体)
pragmasolidity^0.8.0;libraryERC1967IMinimalTransparentUpgradeableProxyLib{functioninitCodeFor20ByteFactoryAddress()internalviewreturns(bytesmemory){returnabi.encodePacked(bytes19(0x60923d8160093d39f33658146083573d3d3373),address(this),bytes20(0x14605D57363d3d37363D7f360894a13ba1A32106),bytes32(0x67c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d6000803e60),bytes32(0x58573d6000fd5b3d6000f35b3d35602035556040360380156058578060403d37),bytes32(0x3d3d355af43d6000803e6058573d6000fd5b602060293d393d51543d52593df3));}functioninitCodeFor14ByteFactoryAddress()internalviewreturns(bytesmemory){returnabi.encodePacked(bytes19(0x608c3d8160093d39f3365814607d573d3d336d),uint112(uint160(address(this))),bytes20(0x14605757363d3D37363d7F360894A13Ba1A32106),bytes32(0x67c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d6000803e60),bytes32(0x52573d6000fd5b3d6000f35b3d35602035556040360380156052578060403d37),bytes32(0x3d3d355af43d6000803e6052573d6000fd5b602060233d393d51543d52593df3));}functioninitCode()internalviewreturns(bytesmemory){if(uint160(address(this))>>112!=0){returninitCodeFor20ByteFactoryAddress();}else{returninitCodeFor14ByteFactoryAddress();}}functiondeploy(addressimplementation,bytesmemoryinitializationData)internalreturns(addressinstance){bytesmemorym=initCode();assembly{instance:=create(0,add(m,0x20),mload(m))}require(instance!=address(0),"Deployment failed.");// 部署失败。
upgrade(instance,implementation,initializationData);}functionupgrade(addressinstance,addressimplementation,bytesmemoryupgradeData)internal{(boolsuccess,)=instance.call(abi.encodePacked(// The new implementation address, converted to a 32-byte word.
uint256(uint160(implementation)),// ERC-1967 implementation slot.
bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc),// Optional calldata to be forwarded to the implementation
// via delegatecall after setting the implementation slot.
upgradeData));require(success,"Upgrade failed.");// 升级失败。
}}
最小化 ERC-1967 UUPS 代理实现
最小化 ERC-1967 UUPS 代理实现(基本变体)
pragmasolidity^0.8.0;libraryERC1967MinimalUUPSProxyLib{functioninitCode(addressimplementation,bytesmemoryargs)internalpurereturns(bytesmemory){uint256n=0x003d+args.length;require(n<=0xffff,"Immutable args too long.");// 不可变参数太长。
returnabi.encodePacked(bytes1(0x61),uint16(n),bytes7(0x3d8160233d3973),implementation,bytes2(0x6009),bytes32(0x5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076),bytes32(0xcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f3),args);}functiondeploy(addressimplementation,bytesmemoryargs)internalreturns(addressinstance){bytesmemorym=initCode(implementation,args);assembly{instance:=create(0,add(m,0x20),mload(m))}require(instance!=address(0),"Deployment failed.");// 部署失败。
}}
最小化 ERC-1967 UUPS 代理实现(I-变体)
pragmasolidity^0.8.0;libraryERC1967IMinimalUUPSProxyLib{functioninitCode(addressimplementation,bytesmemoryargs)internalpurereturns(bytesmemory){uint256n=0x0052+args.length;require(n<=0xffff,"Immutable args too long.");// 不可变参数太长。
returnabi.encodePacked(bytes1(0x61),uint16(n),bytes7(0x3d8160233d3973),implementation,bytes23(0x600f5155f3365814604357363d3d373d3d363d7f360894),bytes32(0xa13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af4),bytes32(0x3d6000803e603e573d6000fd5b3d6000f35b6020600f3d393d51543d52593df3),args);}functiondeploy(addressimplementation,bytesmemoryargs)internalreturns(addressinstance){bytesmemorym=initCode(implementation,args);assembly{instance:=create(0,add(m,0x20),mload(m))}require(instance!=address(0),"Deployment failed.");// 部署失败。
}}
最小化 ERC-1967 信标代理实现
最小化 ERC-1967 信标代理实现(基本变体)
pragmasolidity^0.8.0;libraryERC1967MinimalBeaconProxyLib{functioninitCode(addressbeacon,bytesmemoryargs)internalpurereturns(bytesmemory){uint256n=0x0052+args.length;require(n<=0xffff,"Immutable args too long.");// 不可变参数太长。
returnabi.encodePacked(bytes1(0x61),uint16(n),bytes7(0x3d8160233d3973),beacon,bytes23(0x60195155f3363d3d373d3d363d602036600436635c60da),bytes32(0x1b60e01b36527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6c),bytes32(0xb3582b35133d50545afa5036515af43d6000803e604d573d6000fd5b3d6000f3),args);}functiondeploy(addressbeacon,bytesmemoryargs)internalreturns(addressinstance){bytesmemorym=initCode(beacon,args);assembly{instance:=create(0,add(m,0x20),mload(m))}require(instance!=address(0),"Deployment failed.");// 部署失败。
}}
最小化 ERC-1967 信标代理实现(I-变体)
pragmasolidity^0.8.0;libraryERC1967IMinimalBeaconProxyLib{functioninitCode(addressbeacon,bytesmemoryargs)internalpurereturns(bytesmemory){uint256n=0x0057+args.length;require(n<=0xffff,"Immutable args too long.");// 不可变参数太长。
returnabi.encodePacked(bytes1(0x61),uint16(n),bytes7(0x3d8160233d3973),beacon,bytes28(0x60195155f3363d3d373d3d363d602036600436635c60da1b60e01b36),bytes32(0x527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b3513),bytes32(0x3d50545afa361460525736515af43d600060013e6052573d6001fd5b3d6001f3),args);}functiondeploy(addressbeacon,bytesmemoryargs)internalreturns(addressinstance){bytesmemorym=initCode(beacon,args);assembly{instance:=create(0,add(m,0x20),mload(m))}require(instance!=address(0),"Deployment failed.");// 部署失败。
}}