瀏覽代碼

Implement msg.sig

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 4 年之前
父節點
當前提交
bf6b821473
共有 3 個文件被更改,包括 47 次插入1 次删除
  1. 1 1
      src/emit/mod.rs
  2. 32 0
      src/emit/solana.rs
  3. 14 0
      tests/solana_tests/builtin.rs

+ 1 - 1
src/emit/mod.rs

@@ -2570,7 +2570,7 @@ pub trait TargetRuntime<'a> {
                     ns,
                 )
                 .into(),
-            Expression::Builtin(_, _, Builtin::Signature, _) => {
+            Expression::Builtin(_, _, Builtin::Signature, _) if ns.target != Target::Solana => {
                 // need to byte-reverse selector
                 let selector = bin.build_alloca(function, bin.context.i32_type(), "selector");
 

+ 32 - 0
src/emit/solana.rs

@@ -3255,6 +3255,38 @@ impl<'a> TargetRuntime<'a> for SolanaTarget {
                     .left()
                     .unwrap()
             }
+            ast::Expression::Builtin(_, _, ast::Builtin::Signature, _) => {
+                let sol_params = self.sol_parameters(binary);
+
+                let input = binary
+                    .builder
+                    .build_load(
+                        binary
+                            .builder
+                            .build_struct_gep(sol_params, 5, "input")
+                            .unwrap(),
+                        "data",
+                    )
+                    .into_pointer_value();
+
+                let selector = binary.builder.build_load(
+                    binary.builder.build_pointer_cast(
+                        input,
+                        binary.context.i32_type().ptr_type(AddressSpace::Generic),
+                        "selector",
+                    ),
+                    "selector",
+                );
+
+                let bswap = binary.llvm_bswap(32);
+
+                binary
+                    .builder
+                    .build_call(bswap, &[selector], "")
+                    .try_as_basic_value()
+                    .left()
+                    .unwrap()
+            }
             ast::Expression::Builtin(_, _, ast::Builtin::SignatureVerify, args) => {
                 assert_eq!(args.len(), 3);
 

+ 14 - 0
tests/solana_tests/builtin.rs

@@ -18,6 +18,9 @@ fn builtins() {
             function msg_data(uint32 x) public returns (bytes) {
                 return msg.data;
             }
+            function sig() public returns (bytes4) {
+                return msg.sig;
+            }
         }"#,
     );
 
@@ -62,4 +65,15 @@ fn builtins() {
                 .unwrap()
         )]
     );
+
+    let returns = vm.function("sig", &[], &[], 0);
+
+    if let Token::FixedBytes(v) = &returns[0] {
+        println!("{}", hex::encode(v));
+    }
+
+    assert_eq!(
+        returns,
+        vec![Token::FixedBytes(hex::decode("00a7029b").unwrap())]
+    );
 }